Skip to content

Commit

Permalink
chore(rethinkdb): NewMeeting: Phase 1a (#10216)
Browse files Browse the repository at this point in the history
Signed-off-by: Matt Krick <matt.krick@gmail.com>
  • Loading branch information
mattkrick committed Sep 27, 2024
1 parent 203835e commit 6273411
Show file tree
Hide file tree
Showing 107 changed files with 905 additions and 446 deletions.
10 changes: 5 additions & 5 deletions codegen.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
"PingableServices": "./types/PingableServices#PingableServicesSource",
"ProcessRecurrenceSuccess": "./types/ProcessRecurrenceSuccess#ProcessRecurrenceSuccessSource",
"RemoveAuthIdentitySuccess": "./types/RemoveAuthIdentitySuccess#RemoveAuthIdentitySuccessSource",
"RetrospectiveMeeting": "../../database/types/MeetingRetrospective#default",
"RetrospectiveMeeting": "../../postgres/types/Meeting#RetrospectiveMeeting",
"SAML": "./types/SAML#SAMLSource",
"SetIsFreeMeetingTemplateSuccess": "./types/SetIsFreeMeetingTemplateSuccess#SetIsFreeMeetingTemplateSuccessSource",
"SignupsPayload": "./types/SignupsPayload#SignupsPayloadSource",
Expand Down Expand Up @@ -73,7 +73,7 @@
"EndTeamPromptSuccess": "./types/EndTeamPromptSuccess#EndTeamPromptSuccessSource",
"AcceptRequestToJoinDomainSuccess": "./types/AcceptRequestToJoinDomainSuccess#AcceptRequestToJoinDomainSuccessSource",
"AcceptTeamInvitationPayload": "./types/AcceptTeamInvitationPayload#AcceptTeamInvitationPayloadSource",
"ActionMeeting": "../../database/types/MeetingAction#default",
"ActionMeeting": "../../postgres/types/Meeting#CheckInMeeting",
"ActionMeetingMember": "../../database/types/ActionMeetingMember#default as ActionMeetingMemberDB",
"AddApprovedOrganizationDomainsSuccess": "./types/AddApprovedOrganizationDomainsSuccess#AddApprovedOrganizationDomainsSuccessSource",
"AddPokerTemplateSuccess": "./types/AddPokerTemplateSuccess#AddPokerTemplateSuccessSource",
Expand Down Expand Up @@ -143,7 +143,7 @@
"Threadable": "./types/Threadable#ThreadableSource",
"OrgIntegrationProviders": "./types/OrgIntegrationProviders#OrgIntegrationProvidersSource",
"OrganizationUser": "../../postgres/types/index#OrganizationUser as OrganizationUserDB",
"PokerMeeting": "../../database/types/MeetingPoker#default as MeetingPoker",
"PokerMeeting": "../../postgres/types/Meeting#PokerMeeting",
"PokerMeetingMember": "../../database/types/MeetingPokerMeetingMember#default as PokerMeetingMemberDB",
"PokerTemplate": "../../database/types/PokerTemplate#default as PokerTemplateDB",
"RRule": "rrule-rust#RRuleSet",
Expand All @@ -159,7 +159,7 @@
"ResetReflectionGroupsSuccess": "./types/ResetReflectionGroupsSuccess#ResetReflectionGroupsSuccessSource",
"RetroReflection": "../../postgres/types/index#RetroReflection as RetroReflectionDB",
"RetroReflectionGroup": "./types/RetroReflectionGroup#RetroReflectionGroupSource",
"RetrospectiveMeeting": "../../database/types/MeetingRetrospective#default",
"RetrospectiveMeeting": "../../postgres/types/Meeting#RetrospectiveMeeting",
"RetrospectiveMeetingMember": "../../database/types/RetroMeetingMember#default",
"SAML": "./types/SAML#SAMLSource",
"SetMeetingSettingsPayload": "../types/SetMeetingSettingsPayload#SetMeetingSettingsPayloadSource",
Expand All @@ -182,7 +182,7 @@
"TeamMemberIntegrationAuthOAuth1": "../../postgres/queries/getTeamMemberIntegrationAuth#TeamMemberIntegrationAuth",
"TeamMemberIntegrationAuthOAuth2": "../../postgres/queries/getTeamMemberIntegrationAuth#TeamMemberIntegrationAuth",
"TeamMemberIntegrations": "./types/TeamMemberIntegrations#TeamMemberIntegrationsSource",
"TeamPromptMeeting": "../../database/types/MeetingTeamPrompt#default as MeetingTeamPromptDB",
"TeamPromptMeeting": "../../postgres/types/Meeting#TeamPromptMeeting",
"TeamPromptMeetingMember": "../../database/types/TeamPromptMeetingMember#default as TeamPromptMeetingMemberDB",
"TeamPromptResponse": "../../postgres/types/index#TeamPromptResponse as TeamPromptResponseDB",
"TemplateDimension": "../../postgres/types/index#TemplateDimension as TemplateDimensionDB",
Expand Down
19 changes: 8 additions & 11 deletions packages/client/modules/demo/ClientGraphQLServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,15 @@ import stringSimilarity from 'string-similarity'
import {ReactableEnum} from '~/__generated__/AddReactjiToReactableMutation.graphql'
import {DragReflectionDropTargetTypeEnum} from '~/__generated__/EndDraggingReflectionMutation.graphql'
import {PALETTE} from '~/styles/paletteV3'
import DiscussPhase from '../../../server/database/types/DiscussPhase'
import DiscussStage from '../../../server/database/types/DiscussStage'
import NewMeetingPhase from '../../../server/database/types/GenericMeetingPhase'
import NewMeetingStage from '../../../server/database/types/GenericMeetingStage'
import GoogleAnalyzedEntity from '../../../server/database/types/GoogleAnalyzedEntity'
import ReflectPhase from '../../../server/database/types/ReflectPhase'
import ITask from '../../../server/database/types/Task'
import {NewMeetingStage} from '../../../server/graphql/private/resolverTypes'
import {
DiscussPhase,
DiscussStage,
NewMeetingPhase
} from '../../../server/postgres/types/NewMeetingPhase'
import {
ExternalLinks,
MeetingSettingsThreshold,
Expand Down Expand Up @@ -100,11 +102,7 @@ export type DemoReflectionGroup = {
voterIds: string[]
}

export type IDiscussPhase = Omit<DiscussPhase, 'readyToAdvance' | 'endAt' | 'startAt'> & {
readyToAdvance: any
startAt: string | Date
endAt: string | Date
}
export type IDiscussPhase = DiscussPhase

export type IReflectPhase = Omit<ReflectPhase, 'endAt' | 'startAt'> & {
startAt: string | Date
Expand Down Expand Up @@ -1048,7 +1046,6 @@ class ClientGraphQLServer extends (EventEmitter as GQLDemoEmitter) {
reflectionGroupId: newReflectionGroupId,
updatedAt: now
})
this.db.newMeeting.nextAutoGroupThreshold = null
const nextTitle = getGroupSmartTitle([reflection as DemoReflection])
newReflectionGroup.smartTitle = nextTitle
newReflectionGroup.title = nextTitle
Expand Down Expand Up @@ -1523,7 +1520,7 @@ class ClientGraphQLServer extends (EventEmitter as GQLDemoEmitter) {
},
EndRetrospectiveMutation: ({meetingId}: {meetingId: string}, userId: string) => {
const phases = this.db.newMeeting.phases as INewMeetingPhase[]
const lastPhase = phases[phases.length - 1] as IDiscussPhase
const lastPhase = phases[phases.length - 1]!
const currentStage = lastPhase.stages.find(
(stage) => stage.startAt && !stage.endAt
) as IDiscussStage
Expand Down
2 changes: 1 addition & 1 deletion packages/client/modules/demo/initDB.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {SlackNotificationEventEnum} from '~/__generated__/SlackNotificationList_viewer.graphql'
import {PALETTE} from '~/styles/paletteV3'
import RetrospectiveMeeting from '../../../server/database/types/MeetingRetrospective'
import ITask from '../../../server/database/types/Task'
import {RetrospectiveMeeting} from '../../../server/postgres/types/Meeting'
import JiraProjectId from '../../shared/gqlIds/JiraProjectId'
import demoUserAvatar from '../../styles/theme/images/avatar-user.svg'
import {ExternalLinks, MeetingSettingsThreshold, RetroDemo} from '../../types/constEnums'
Expand Down
4 changes: 4 additions & 0 deletions packages/client/types/generics.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,10 @@ type DeepNonNullableObject<T> = {
[P in keyof T]-?: DeepNonNullable<NonNullable<T[P]>>
}

export type NonNullableProps<T> = {
[K in keyof T]: NonNullable<T[K]>
}

// export type DeepNullableObject<T> = {
// [P in keyof T]: T[P] extends Array<infer U>
// ? Array<DeepNullable<U>> | null
Expand Down
2 changes: 1 addition & 1 deletion packages/client/utils/meetings/lookups.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React from 'react'
import {MeetingTypeEnum} from '~/../server/postgres/types/Meeting'
import {NewMeetingPhaseTypeEnum} from '~/__generated__/ActionMeetingSidebar_meeting.graphql'
import {MeetingTypeEnum} from '../../__generated__/SummarySheet_meeting.graphql'
import CardsSVG from '../../components/CardsSVG'
import {ACTION, POKER, RETROSPECTIVE, TEAM_PROMPT} from '../constants'

Expand Down
3 changes: 1 addition & 2 deletions packages/embedder/indexing/retrospectiveDiscussionTopic.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import {isMeetingRetrospective} from 'parabol-server/database/types/MeetingRetrospective'
import {DataLoaderInstance} from 'parabol-server/dataloader/RootDataLoader'
import prettier from 'prettier'
import {Comment} from '../../server/postgres/types'
Expand Down Expand Up @@ -73,7 +72,7 @@ export const createTextFromRetrospectiveDiscussionTopic = async (
dataLoader.get('retroReflectionGroups').load(reflectionGroupId),
dataLoader.get('retroReflectionsByGroupId').load(reflectionGroupId)
])
if (!isMeetingRetrospective(newMeeting)) throw new Error('Meeting is not a retro')
if (newMeeting.meetingType !== 'retrospective') throw new Error('Meeting is not a retro')
// It should never be undefined, but our data integrity in RethinkDB is bad
const templateId = newMeeting?.templateId ?? ''

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import {SubscriptionChannel} from '../../../client/types/constEnums'
import makeAppURL from '../../../client/utils/makeAppURL'
import appOrigin from '../../../server/appOrigin'
import {DataLoaderInstance} from '../../../server/dataloader/RootDataLoader'
import {isRetroMeeting} from '../../../server/graphql/meetingTypePredicates'
import {
buildCommentContentBlock,
createAIComment
Expand All @@ -25,7 +24,7 @@ const makeSimilarDiscussionLink = async (
dataLoader.get('retroReflectionGroups').loadNonNull(reflectionGroupId)
])

if (!meeting || !isRetroMeeting(meeting)) throw new Error('invalid meeting type')
if (!meeting || meeting.meetingType !== 'retrospective') throw new Error('invalid meeting type')
const {phases, name: meetingName} = meeting
const {title: topic} = reflectionGroup
const discussPhase = getPhase(phases, 'discuss')
Expand Down
6 changes: 5 additions & 1 deletion packages/server/__tests__/processRecurrence.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import ReflectPhase from '../database/types/ReflectPhase'
import TeamPromptResponsesPhase from '../database/types/TeamPromptResponsesPhase'
import generateUID from '../generateUID'
import {insertMeetingSeries as insertMeetingSeriesQuery} from '../postgres/queries/insertMeetingSeries'
import {RetroMeetingPhase} from '../postgres/types/NewMeetingPhase'
import {getUserTeams, sendIntranet, signUp} from './common'

const PROCESS_RECURRENCE = `
Expand Down Expand Up @@ -273,7 +274,10 @@ RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR,SA,SU`
id: meetingId,
teamId,
meetingCount: 0,
phases: [new ReflectPhase(teamId, []), new DiscussPhase(undefined)],
phases: [
new ReflectPhase(teamId, []) as RetroMeetingPhase,
new DiscussPhase(undefined) as RetroMeetingPhase
],
facilitatorUserId: userId,
scheduledEndTime: new Date(Date.now() - ms('5m')),
meetingSeriesId,
Expand Down
14 changes: 7 additions & 7 deletions packages/server/database/types/GenericMeetingStage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,17 @@ export interface GenericMeetingStageInput {

export default class GenericMeetingStage {
id: string
isAsync: boolean | undefined | null
isAsync?: boolean | undefined | null
isComplete = false
isNavigable: boolean
isNavigableByFacilitator: boolean
startAt: Date | undefined
endAt: Date | undefined = undefined
scheduledEndTime: Date | undefined | null
suggestedEndTime: Date | undefined
suggestedTimeLimit: number | undefined
startAt?: Date | undefined
endAt?: Date | undefined = undefined
scheduledEndTime?: Date | undefined | null
suggestedEndTime?: Date | undefined
suggestedTimeLimit?: number | undefined
viewCount: number
readyToAdvance: string[] | undefined = []
readyToAdvance?: string[] | undefined = []
phaseType: string
constructor(input: GenericMeetingStageInput) {
const {durations, phaseType, id, isNavigable, isNavigableByFacilitator, startAt, viewCount} =
Expand Down
35 changes: 18 additions & 17 deletions packages/server/database/types/Meeting.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
import generateUID from '../../generateUID'
import {MeetingTypeEnum} from '../../postgres/types/Meeting'
import {NewMeetingPhase} from '../../postgres/types/NewMeetingPhase'
import GenericMeetingPhase from './GenericMeetingPhase'

interface Input {
id?: string
id?: string | null
teamId: string
meetingType: MeetingTypeEnum
meetingCount: number
name?: string
name?: string | null
// Every meeting has at least one phase
phases: [GenericMeetingPhase, ...GenericMeetingPhase[]]
phases: [NewMeetingPhase, ...NewMeetingPhase[]]
facilitatorUserId: string
showConversionModal?: boolean
meetingSeriesId?: number
showConversionModal?: boolean | null
meetingSeriesId?: number | null
scheduledEndTime?: Date | null
summary?: string
sentimentScore?: number
summary?: string | null
sentimentScore?: number | null
}

const namePrefix = {
Expand All @@ -29,23 +30,23 @@ export default abstract class Meeting {
updatedAt = new Date()
createdBy: string | null
endedAt: Date | undefined | null = undefined
facilitatorStageId: string | undefined
facilitatorUserId: string
facilitatorStageId: string
facilitatorUserId: string | null
meetingCount: number
meetingNumber: number
name: string
summarySentAt: Date | undefined = undefined
summarySentAt: Date | undefined | null = undefined
teamId: string
meetingType: MeetingTypeEnum
phases: GenericMeetingPhase[]
showConversionModal?: boolean
meetingSeriesId?: number
showConversionModal?: boolean | null
meetingSeriesId?: number | null
scheduledEndTime?: Date | null
summary?: string
sentimentScore?: number
usedReactjis?: Record<string, number>
slackTs?: string
engagement?: number
summary?: string | null
sentimentScore?: number | null
usedReactjis?: Record<string, number> | null
slackTs?: string | number | null
engagement?: number | null

constructor(input: Input) {
const {
Expand Down
10 changes: 1 addition & 9 deletions packages/server/database/types/MeetingAction.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
import AgendaItemsPhase from './AgendaItemsPhase'
import CheckInPhase from './CheckInPhase'
import GenericMeetingPhase from './GenericMeetingPhase'
import {CheckInMeetingPhase} from '../../postgres/types/NewMeetingPhase'
import Meeting from './Meeting'
import UpdatesPhase from './UpdatesPhase'

type CheckInMeetingPhase = CheckInPhase | UpdatesPhase | GenericMeetingPhase | AgendaItemsPhase
interface Input {
id?: string
teamId: string
Expand All @@ -14,10 +10,6 @@ interface Input {
facilitatorUserId: string
}

export function isMeetingAction(meeting: Meeting): meeting is MeetingAction {
return meeting.meetingType === 'action'
}

export default class MeetingAction extends Meeting {
meetingType!: 'action'
taskCount?: number
Expand Down
11 changes: 2 additions & 9 deletions packages/server/database/types/MeetingPoker.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,17 @@
import CheckInPhase from './CheckInPhase'
import EstimatePhase from './EstimatePhase'
import GenericMeetingPhase from './GenericMeetingPhase'
import {PokerMeetingPhase} from '../../postgres/types/NewMeetingPhase'
import Meeting from './Meeting'

type PokerPhase = CheckInPhase | EstimatePhase | GenericMeetingPhase
interface Input {
id: string
teamId: string
meetingCount: number
name: string
phases: [PokerPhase, ...PokerPhase[]]
phases: [PokerMeetingPhase, ...PokerMeetingPhase[]]
facilitatorUserId: string
templateId: string
templateRefId: string
}

export function isMeetingPoker(meeting: Meeting): meeting is MeetingPoker {
return meeting.meetingType === 'poker'
}

export default class MeetingPoker extends Meeting {
meetingType!: 'poker'
templateId: string
Expand Down
45 changes: 16 additions & 29 deletions packages/server/database/types/MeetingRetrospective.ts
Original file line number Diff line number Diff line change
@@ -1,44 +1,31 @@
import GenericMeetingPhase from './GenericMeetingPhase'
import {AutogroupReflectionGroupType, TranscriptBlock} from '../../postgres/types'
import {RetroMeetingPhase} from '../../postgres/types/NewMeetingPhase'
import Meeting from './Meeting'

export type AutogroupReflectionGroupType = {
groupTitle: string
reflectionIds: string[]
}

export type TranscriptBlock = {
speaker: string
words: string
}

interface Input {
id?: string
id?: string | null
teamId: string
meetingCount: number
name: string
phases: [GenericMeetingPhase, ...GenericMeetingPhase[]]
phases: [RetroMeetingPhase, ...RetroMeetingPhase[]]
facilitatorUserId: string
showConversionModal?: boolean
showConversionModal?: boolean | null
templateId: string
totalVotes: number
maxVotesPerGroup: number
disableAnonymity: boolean
transcription?: TranscriptBlock[]
autogroupReflectionGroups?: AutogroupReflectionGroupType[]
resetReflectionGroups?: AutogroupReflectionGroupType[]
transcription?: TranscriptBlock[] | null
autogroupReflectionGroups?: AutogroupReflectionGroupType[] | null
resetReflectionGroups?: AutogroupReflectionGroupType[] | null
recallBotId?: string
videoMeetingURL?: string
meetingSeriesId?: number
videoMeetingURL?: string | null
meetingSeriesId?: number | null
scheduledEndTime?: Date | null
}

export function isMeetingRetrospective(meeting: Meeting): meeting is MeetingRetrospective {
return meeting.meetingType === 'retrospective'
}

export default class MeetingRetrospective extends Meeting {
meetingType!: 'retrospective'
showConversionModal?: boolean
showConversionModal?: boolean | null
autoGroupThreshold?: number | null
nextAutoGroupThreshold?: number | null
totalVotes: number
Expand All @@ -50,11 +37,11 @@ export default class MeetingRetrospective extends Meeting {
templateId: string
topicCount?: number
reflectionCount?: number
transcription?: TranscriptBlock[]
recallBotId?: string
videoMeetingURL?: string
autogroupReflectionGroups?: AutogroupReflectionGroupType[]
resetReflectionGroups?: AutogroupReflectionGroupType[]
transcription?: TranscriptBlock[] | null
recallBotId?: string | null
videoMeetingURL?: string | null
autogroupReflectionGroups?: AutogroupReflectionGroupType[] | null
resetReflectionGroups?: AutogroupReflectionGroupType[] | null

constructor(input: Input) {
const {
Expand Down
Loading

0 comments on commit 6273411

Please sign in to comment.