@memberjunction/server 6.2.0-edge.2 → 6.2.0-edge.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/config.d.ts +2189 -71
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +123 -3
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +11 -23
- package/dist/context.js.map +1 -1
- package/dist/generated/graphql-schemas/__mj.d.ts +928 -0
- package/dist/generated/graphql-schemas/__mj.d.ts.map +1 -1
- package/dist/generated/graphql-schemas/__mj.js +8482 -3649
- package/dist/generated/graphql-schemas/__mj.js.map +1 -1
- package/dist/generic/ResolverBase.d.ts +43 -3
- package/dist/generic/ResolverBase.d.ts.map +1 -1
- package/dist/generic/ResolverBase.js +142 -27
- package/dist/generic/ResolverBase.js.map +1 -1
- package/dist/generic/RunViewResolver.d.ts +4 -0
- package/dist/generic/RunViewResolver.d.ts.map +1 -1
- package/dist/generic/RunViewResolver.js +33 -1
- package/dist/generic/RunViewResolver.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +115 -49
- package/dist/index.js.map +1 -1
- package/dist/postgresqlCompat.d.ts +8 -0
- package/dist/postgresqlCompat.d.ts.map +1 -0
- package/dist/postgresqlCompat.js +19 -0
- package/dist/postgresqlCompat.js.map +1 -0
- package/dist/postgresqlPoolSettings.d.ts +108 -0
- package/dist/postgresqlPoolSettings.d.ts.map +1 -0
- package/dist/postgresqlPoolSettings.js +134 -0
- package/dist/postgresqlPoolSettings.js.map +1 -0
- package/dist/resolvers/AdhocQueryResolver.d.ts +23 -18
- package/dist/resolvers/AdhocQueryResolver.d.ts.map +1 -1
- package/dist/resolvers/AdhocQueryResolver.js +77 -167
- package/dist/resolvers/AdhocQueryResolver.js.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.d.ts +7 -23
- package/dist/resolvers/EntityRecordNameResolver.d.ts.map +1 -1
- package/dist/resolvers/EntityRecordNameResolver.js +9 -47
- package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
- package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
- package/dist/resolvers/GetDataResolver.js +9 -0
- package/dist/resolvers/GetDataResolver.js.map +1 -1
- package/dist/resolvers/HumanHandoffResolver.d.ts +107 -0
- package/dist/resolvers/HumanHandoffResolver.d.ts.map +1 -0
- package/dist/resolvers/HumanHandoffResolver.js +324 -0
- package/dist/resolvers/HumanHandoffResolver.js.map +1 -0
- package/dist/resolvers/MeetingResolver.d.ts +69 -0
- package/dist/resolvers/MeetingResolver.d.ts.map +1 -0
- package/dist/resolvers/MeetingResolver.js +381 -0
- package/dist/resolvers/MeetingResolver.js.map +1 -0
- package/dist/resolvers/RealtimeBridgeResolver.d.ts +34 -1
- package/dist/resolvers/RealtimeBridgeResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeBridgeResolver.js +202 -7
- package/dist/resolvers/RealtimeBridgeResolver.js.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts +1 -83
- package/dist/resolvers/RealtimeClientSessionResolver.d.ts.map +1 -1
- package/dist/resolvers/RealtimeClientSessionResolver.js +4 -206
- package/dist/resolvers/RealtimeClientSessionResolver.js.map +1 -1
- package/dist/resolvers/adhocTimeout.d.ts +7 -0
- package/dist/resolvers/adhocTimeout.d.ts.map +1 -0
- package/dist/resolvers/adhocTimeout.js +12 -0
- package/dist/resolvers/adhocTimeout.js.map +1 -0
- package/dist/resolvers/meetings/index.d.ts +5 -0
- package/dist/resolvers/meetings/index.d.ts.map +1 -0
- package/dist/resolvers/meetings/index.js +5 -0
- package/dist/resolvers/meetings/index.js.map +1 -0
- package/dist/resolvers/meetings/meetingHelpers.d.ts +17 -0
- package/dist/resolvers/meetings/meetingHelpers.d.ts.map +1 -0
- package/dist/resolvers/meetings/meetingHelpers.js +212 -0
- package/dist/resolvers/meetings/meetingHelpers.js.map +1 -0
- package/dist/resolvers/meetings/meetingMutations.d.ts +12 -0
- package/dist/resolvers/meetings/meetingMutations.d.ts.map +1 -0
- package/dist/resolvers/meetings/meetingMutations.js +418 -0
- package/dist/resolvers/meetings/meetingMutations.js.map +1 -0
- package/dist/resolvers/meetings/meetingQueries.d.ts +7 -0
- package/dist/resolvers/meetings/meetingQueries.d.ts.map +1 -0
- package/dist/resolvers/meetings/meetingQueries.js +113 -0
- package/dist/resolvers/meetings/meetingQueries.js.map +1 -0
- package/dist/resolvers/meetings/meetingTypes.d.ts +89 -0
- package/dist/resolvers/meetings/meetingTypes.d.ts.map +1 -0
- package/dist/resolvers/meetings/meetingTypes.js +345 -0
- package/dist/resolvers/meetings/meetingTypes.js.map +1 -0
- package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
- package/dist/rest/ViewOperationsHandler.js +8 -5
- package/dist/rest/ViewOperationsHandler.js.map +1 -1
- package/dist/services/TaskGraphActionRunner.d.ts +8 -0
- package/dist/services/TaskGraphActionRunner.d.ts.map +1 -1
- package/dist/services/TaskGraphActionRunner.js +27 -1
- package/dist/services/TaskGraphActionRunner.js.map +1 -1
- package/dist/services/WorkQueueHostService.d.ts +36 -0
- package/dist/services/WorkQueueHostService.d.ts.map +1 -0
- package/dist/services/WorkQueueHostService.js +97 -0
- package/dist/services/WorkQueueHostService.js.map +1 -0
- package/dist/services/workQueueConfig.d.ts +103 -0
- package/dist/services/workQueueConfig.d.ts.map +1 -0
- package/dist/services/workQueueConfig.js +48 -0
- package/dist/services/workQueueConfig.js.map +1 -0
- package/dist/types.d.ts +5 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +95 -94
- package/src/__tests__/AdhocQueryResolver.bugs.test.ts +14 -35
- package/src/__tests__/AdhocQueryResolver.pagination.test.ts +6 -2
- package/src/__tests__/AdhocQueryResolver.scopeGuard.test.ts +3 -3
- package/src/__tests__/EntityRecordNameResolver.fieldSecurity.test.ts +27 -72
- package/src/__tests__/HumanHandoffResolver.test.ts +233 -0
- package/src/__tests__/MeetingResolver.test.ts +374 -0
- package/src/__tests__/RealtimeBridgeResolver.test.ts +240 -2
- package/src/__tests__/ResolverBase.adhocReadScope.test.ts +96 -0
- package/src/__tests__/ResolverBase.filterEscaping.test.ts +21 -2
- package/src/__tests__/ResolverBase.includeBinaryFields.test.ts +291 -0
- package/src/__tests__/TaskGraphActionRunner.durablePayload.test.ts +41 -0
- package/src/__tests__/WorkQueueHostService.test.ts +133 -0
- package/src/__tests__/adhocTimeoutClamp.test.ts +26 -0
- package/src/__tests__/postgresqlPoolSettings.test.ts +131 -0
- package/src/__tests__/translateBracketsToPG.test.ts +20 -0
- package/src/config.ts +130 -3
- package/src/context.ts +11 -24
- package/src/generated/graphql-schemas/__mj.ts +22138 -18770
- package/src/generic/ResolverBase.ts +171 -27
- package/src/generic/RunViewResolver.ts +33 -2
- package/src/index.ts +127 -50
- package/src/postgresqlCompat.ts +21 -0
- package/src/postgresqlPoolSettings.ts +213 -0
- package/src/resolvers/AdhocQueryResolver.ts +88 -188
- package/src/resolvers/EntityRecordNameResolver.ts +9 -51
- package/src/resolvers/GetDataResolver.ts +10 -0
- package/src/resolvers/HumanHandoffResolver.ts +304 -0
- package/src/resolvers/MeetingResolver.ts +438 -0
- package/src/resolvers/RealtimeBridgeResolver.ts +227 -13
- package/src/resolvers/RealtimeClientSessionResolver.ts +6 -252
- package/src/resolvers/adhocTimeout.ts +12 -0
- package/src/resolvers/meetings/index.ts +4 -0
- package/src/resolvers/meetings/meetingHelpers.ts +307 -0
- package/src/resolvers/meetings/meetingMutations.ts +535 -0
- package/src/resolvers/meetings/meetingQueries.ts +172 -0
- package/src/resolvers/meetings/meetingTypes.ts +238 -0
- package/src/rest/ViewOperationsHandler.ts +8 -5
- package/src/services/TaskGraphActionRunner.ts +29 -1
- package/src/services/WorkQueueHostService.ts +129 -0
- package/src/services/workQueueConfig.ts +52 -0
- package/src/types.ts +5 -0
- package/dist/resolvers/adhoc-query-helpers.d.ts +0 -33
- package/dist/resolvers/adhoc-query-helpers.d.ts.map +0 -1
- package/dist/resolvers/adhoc-query-helpers.js +0 -50
- package/dist/resolvers/adhoc-query-helpers.js.map +0 -1
- package/src/__tests__/adhoc-query-helpers.test.ts +0 -50
- package/src/resolvers/adhoc-query-helpers.ts +0 -67
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import {
|
|
2
|
+
IMetadataProvider,
|
|
3
|
+
LogError,
|
|
4
|
+
RunView,
|
|
5
|
+
UserInfo,
|
|
6
|
+
} from '@memberjunction/core';
|
|
7
|
+
import { EscapeSQLString, UUIDsEqual } from '@memberjunction/global';
|
|
8
|
+
import type {
|
|
9
|
+
MJMeetingEntity,
|
|
10
|
+
MJMeetingParticipantEntity,
|
|
11
|
+
MJPhoneNumberEntity,
|
|
12
|
+
MJInteractionEntity,
|
|
13
|
+
MJInteractionEventEntity,
|
|
14
|
+
} from '@memberjunction/core-entities';
|
|
15
|
+
import { MeetingDialInService } from '@memberjunction/livekit-room-server';
|
|
16
|
+
import { NotificationEngine } from '@memberjunction/notifications';
|
|
17
|
+
import { MeetingParticipantType, MeetingType } from './meetingTypes.js';
|
|
18
|
+
|
|
19
|
+
export async function LoadMeetingEntity(
|
|
20
|
+
id: string,
|
|
21
|
+
user: UserInfo,
|
|
22
|
+
provider: IMetadataProvider,
|
|
23
|
+
): Promise<MJMeetingEntity | null> {
|
|
24
|
+
const rv = provider ? RunView.FromMetadataProvider(provider) : new RunView();
|
|
25
|
+
const escapedID = EscapeSQLString(id.trim());
|
|
26
|
+
const res = await rv.RunView<MJMeetingEntity>(
|
|
27
|
+
{
|
|
28
|
+
EntityName: 'MJ: Meetings',
|
|
29
|
+
ExtraFilter: `ID = '${escapedID}'`,
|
|
30
|
+
ResultType: 'entity_object',
|
|
31
|
+
},
|
|
32
|
+
user,
|
|
33
|
+
);
|
|
34
|
+
if (res.Success && res.Results && res.Results.length > 0) {
|
|
35
|
+
return res.Results[0];
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export async function LoadParticipants(
|
|
41
|
+
meetingID: string,
|
|
42
|
+
user: UserInfo,
|
|
43
|
+
provider: IMetadataProvider,
|
|
44
|
+
): Promise<MeetingParticipantType[]> {
|
|
45
|
+
const rv = provider ? RunView.FromMetadataProvider(provider) : new RunView();
|
|
46
|
+
const escapedID = EscapeSQLString(meetingID.trim());
|
|
47
|
+
const res = await rv.RunView<MJMeetingParticipantEntity>(
|
|
48
|
+
{
|
|
49
|
+
EntityName: 'MJ: Meeting Participants',
|
|
50
|
+
ExtraFilter: `MeetingID = '${escapedID}'`,
|
|
51
|
+
ResultType: 'entity_object',
|
|
52
|
+
},
|
|
53
|
+
user,
|
|
54
|
+
);
|
|
55
|
+
if (!res.Success || !res.Results) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
return res.Results.map((p) => MapParticipantToType(p));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export async function IsUserHostOrCoHost(
|
|
62
|
+
meeting: MJMeetingEntity,
|
|
63
|
+
user: UserInfo,
|
|
64
|
+
provider: IMetadataProvider,
|
|
65
|
+
): Promise<boolean> {
|
|
66
|
+
if (UUIDsEqual(meeting.HostUserID, user.ID)) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
const rv = provider ? RunView.FromMetadataProvider(provider) : new RunView();
|
|
70
|
+
const escapedID = EscapeSQLString(meeting.ID);
|
|
71
|
+
const escapedUserID = EscapeSQLString(user.ID);
|
|
72
|
+
const res = await rv.RunView<MJMeetingParticipantEntity>(
|
|
73
|
+
{
|
|
74
|
+
EntityName: 'MJ: Meeting Participants',
|
|
75
|
+
ExtraFilter: `MeetingID = '${escapedID}' AND UserID = '${escapedUserID}' AND Role IN ('Host', 'CoHost')`,
|
|
76
|
+
ResultType: 'entity_object',
|
|
77
|
+
},
|
|
78
|
+
user,
|
|
79
|
+
);
|
|
80
|
+
return Boolean(res.Success && res.Results && res.Results.length > 0);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export async function ResolveDefaultPhoneNumber(
|
|
84
|
+
user: UserInfo,
|
|
85
|
+
provider: IMetadataProvider,
|
|
86
|
+
): Promise<MJPhoneNumberEntity | null> {
|
|
87
|
+
const rv = provider ? RunView.FromMetadataProvider(provider) : new RunView();
|
|
88
|
+
const res = await rv.RunView<MJPhoneNumberEntity>(
|
|
89
|
+
{
|
|
90
|
+
EntityName: 'MJ: Phone Numbers',
|
|
91
|
+
ExtraFilter: "Status = 'Active'",
|
|
92
|
+
OrderBy: '__mj_CreatedAt ASC',
|
|
93
|
+
ResultType: 'entity_object',
|
|
94
|
+
},
|
|
95
|
+
user,
|
|
96
|
+
);
|
|
97
|
+
if (res.Success && res.Results && res.Results.length > 0) {
|
|
98
|
+
return res.Results[0];
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export async function GenerateUniqueDialInCode(
|
|
104
|
+
phoneNumberID: string,
|
|
105
|
+
user: UserInfo,
|
|
106
|
+
provider: IMetadataProvider,
|
|
107
|
+
): Promise<string | undefined> {
|
|
108
|
+
return MeetingDialInService.Instance.GenerateUniqueDialInCode(phoneNumberID, user, provider);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export async function EnsureMeetingInteraction(
|
|
112
|
+
meeting: MJMeetingEntity,
|
|
113
|
+
user: UserInfo,
|
|
114
|
+
provider: IMetadataProvider,
|
|
115
|
+
): Promise<MJInteractionEntity | null> {
|
|
116
|
+
try {
|
|
117
|
+
const rv = provider ? RunView.FromMetadataProvider(provider) : new RunView();
|
|
118
|
+
const escapedRoom = EscapeSQLString(meeting.RoomName);
|
|
119
|
+
|
|
120
|
+
const existing = await rv.RunView<MJInteractionEntity>(
|
|
121
|
+
{
|
|
122
|
+
EntityName: 'MJ: Interactions',
|
|
123
|
+
ExtraFilter: `RoomName = '${escapedRoom}'`,
|
|
124
|
+
ResultType: 'entity_object',
|
|
125
|
+
},
|
|
126
|
+
user,
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
if (existing.Success && existing.Results && existing.Results.length > 0) {
|
|
130
|
+
return existing.Results[0];
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const entity = await provider.GetEntityObject<MJInteractionEntity>('MJ: Interactions', user);
|
|
134
|
+
entity.Channel = 'Meeting';
|
|
135
|
+
entity.Direction = 'Inbound';
|
|
136
|
+
entity.Status = 'Active';
|
|
137
|
+
entity.RoomName = meeting.RoomName;
|
|
138
|
+
entity.StartedAt = new Date();
|
|
139
|
+
entity.AnsweredAt = new Date();
|
|
140
|
+
entity.RecordingEnabled = meeting.RecordingPolicy === 'Automatic' || meeting.RecordingPolicy === 'Allowed';
|
|
141
|
+
|
|
142
|
+
if (await entity.Save()) {
|
|
143
|
+
await RecordInteractionEvent(entity.ID, 'Created', user, provider, { MeetingID: meeting.ID, RoomName: meeting.RoomName });
|
|
144
|
+
await RecordInteractionEvent(entity.ID, 'Answered', user, provider);
|
|
145
|
+
return entity;
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
} catch (err) {
|
|
149
|
+
LogError(`[MeetingResolver] ensureMeetingInteraction failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export async function RecordInteractionEvent(
|
|
155
|
+
interactionID: string,
|
|
156
|
+
eventType: MJInteractionEventEntity['EventType'],
|
|
157
|
+
user: UserInfo,
|
|
158
|
+
provider: IMetadataProvider,
|
|
159
|
+
details?: Record<string, unknown>,
|
|
160
|
+
): Promise<void> {
|
|
161
|
+
try {
|
|
162
|
+
const eventEntity = await provider.GetEntityObject<MJInteractionEventEntity>('MJ: Interaction Events', user);
|
|
163
|
+
eventEntity.InteractionID = interactionID;
|
|
164
|
+
eventEntity.EventType = eventType;
|
|
165
|
+
eventEntity.ActorUserID = user.ID;
|
|
166
|
+
eventEntity.OccurredAt = new Date();
|
|
167
|
+
if (details) {
|
|
168
|
+
eventEntity.Details = JSON.stringify(details);
|
|
169
|
+
}
|
|
170
|
+
await eventEntity.Save();
|
|
171
|
+
} catch (err) {
|
|
172
|
+
LogError(`[MeetingResolver] recordInteractionEvent (${eventType}) failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export async function CloseMeetingInteraction(
|
|
177
|
+
roomName: string,
|
|
178
|
+
user: UserInfo,
|
|
179
|
+
provider: IMetadataProvider,
|
|
180
|
+
): Promise<void> {
|
|
181
|
+
try {
|
|
182
|
+
const rv = provider ? RunView.FromMetadataProvider(provider) : new RunView();
|
|
183
|
+
const escapedRoom = EscapeSQLString(roomName);
|
|
184
|
+
|
|
185
|
+
const res = await rv.RunView<MJInteractionEntity>(
|
|
186
|
+
{
|
|
187
|
+
EntityName: 'MJ: Interactions',
|
|
188
|
+
ExtraFilter: `RoomName = '${escapedRoom}' AND Status = 'Active'`,
|
|
189
|
+
ResultType: 'entity_object',
|
|
190
|
+
},
|
|
191
|
+
user,
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
if (res.Success && res.Results && res.Results.length > 0) {
|
|
195
|
+
const interaction = res.Results[0];
|
|
196
|
+
interaction.Status = 'Ended';
|
|
197
|
+
interaction.EndedAt = new Date();
|
|
198
|
+
await interaction.Save();
|
|
199
|
+
await RecordInteractionEvent(interaction.ID, 'Ended', user, provider);
|
|
200
|
+
}
|
|
201
|
+
} catch (err) {
|
|
202
|
+
LogError(`[MeetingResolver] closeMeetingInteraction failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export async function SendMeetingInviteNotification(
|
|
207
|
+
meeting: MJMeetingEntity,
|
|
208
|
+
targetUserID: string,
|
|
209
|
+
contextUser: UserInfo,
|
|
210
|
+
provider: IMetadataProvider,
|
|
211
|
+
): Promise<void> {
|
|
212
|
+
try {
|
|
213
|
+
await NotificationEngine.Instance.Config(false, contextUser, provider);
|
|
214
|
+
const inviter = contextUser.Name?.trim() || contextUser.Email || 'Someone';
|
|
215
|
+
await NotificationEngine.Instance.SendNotification(
|
|
216
|
+
{
|
|
217
|
+
userId: targetUserID,
|
|
218
|
+
typeNameOrId: 'Meeting Invitation',
|
|
219
|
+
title: `Invitation: ${meeting.Title}`,
|
|
220
|
+
message: `${inviter} invited you to the meeting "${meeting.Title}".`,
|
|
221
|
+
resourceConfiguration: { type: 'meeting', meetingID: meeting.ID, roomName: meeting.RoomName },
|
|
222
|
+
},
|
|
223
|
+
contextUser,
|
|
224
|
+
);
|
|
225
|
+
} catch (err) {
|
|
226
|
+
LogError(`[MeetingResolver] sendMeetingInviteNotification failed for user ${targetUserID}: ${err instanceof Error ? err.message : String(err)}`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
export function NormalizeParticipantRole(
|
|
231
|
+
roleInput?: string,
|
|
232
|
+
defaultRole: MJMeetingParticipantEntity['Role'] = 'Attendee',
|
|
233
|
+
): MJMeetingParticipantEntity['Role'] {
|
|
234
|
+
switch (roleInput?.trim().toLowerCase()) {
|
|
235
|
+
case 'host':
|
|
236
|
+
return 'Host';
|
|
237
|
+
case 'cohost':
|
|
238
|
+
return 'CoHost';
|
|
239
|
+
case 'agent':
|
|
240
|
+
return 'Agent';
|
|
241
|
+
case 'attendee':
|
|
242
|
+
default:
|
|
243
|
+
return defaultRole;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export function NormalizeRecordingPolicy(
|
|
248
|
+
policyInput?: string,
|
|
249
|
+
): MJMeetingEntity['RecordingPolicy'] {
|
|
250
|
+
switch (policyInput?.trim().toLowerCase()) {
|
|
251
|
+
case 'allowed':
|
|
252
|
+
return 'Allowed';
|
|
253
|
+
case 'automatic':
|
|
254
|
+
return 'Automatic';
|
|
255
|
+
case 'off':
|
|
256
|
+
default:
|
|
257
|
+
return 'Off';
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
export function MapMeetingToType(m: MJMeetingEntity, participants?: MeetingParticipantType[]): MeetingType {
|
|
262
|
+
return {
|
|
263
|
+
ID: m.ID,
|
|
264
|
+
Title: m.Title,
|
|
265
|
+
Description: m.Description ?? undefined,
|
|
266
|
+
HostUserID: m.HostUserID,
|
|
267
|
+
HostUserName: m.HostUser ?? undefined,
|
|
268
|
+
RoomName: m.RoomName,
|
|
269
|
+
Status: m.Status,
|
|
270
|
+
ScheduledStartAt: m.ScheduledStartAt ?? undefined,
|
|
271
|
+
ScheduledEndAt: m.ScheduledEndAt ?? undefined,
|
|
272
|
+
StartedAt: m.StartedAt ?? undefined,
|
|
273
|
+
EndedAt: m.EndedAt ?? undefined,
|
|
274
|
+
AllowPhoneDialIn: m.AllowPhoneDialIn,
|
|
275
|
+
DialInPhoneNumberID: m.DialInPhoneNumberID ?? undefined,
|
|
276
|
+
DialInPhoneNumber: m.DialInPhoneNumber ?? undefined,
|
|
277
|
+
DialInCode: m.DialInCode ?? undefined,
|
|
278
|
+
RecordingPolicy: m.RecordingPolicy,
|
|
279
|
+
ConversationID: m.ConversationID ?? undefined,
|
|
280
|
+
Participants: participants,
|
|
281
|
+
CreatedAt: m.__mj_CreatedAt,
|
|
282
|
+
UpdatedAt: m.__mj_UpdatedAt,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
export function MapParticipantToType(
|
|
287
|
+
p: MJMeetingParticipantEntity,
|
|
288
|
+
userNameFallback?: string | null,
|
|
289
|
+
userEmailFallback?: string | null,
|
|
290
|
+
): MeetingParticipantType {
|
|
291
|
+
return {
|
|
292
|
+
ID: p.ID,
|
|
293
|
+
MeetingID: p.MeetingID,
|
|
294
|
+
UserID: p.UserID ?? undefined,
|
|
295
|
+
UserName: p.User ?? userNameFallback ?? undefined,
|
|
296
|
+
UserEmail: userEmailFallback ?? undefined,
|
|
297
|
+
AgentID: p.AgentID ?? undefined,
|
|
298
|
+
AgentName: p.Agent ?? undefined,
|
|
299
|
+
ExternalName: p.ExternalName ?? undefined,
|
|
300
|
+
ExternalEmail: p.ExternalEmail ?? undefined,
|
|
301
|
+
ExternalPhone: p.ExternalPhone ?? undefined,
|
|
302
|
+
Role: p.Role,
|
|
303
|
+
InviteStatus: p.InviteStatus,
|
|
304
|
+
JoinedAt: p.JoinedAt ?? undefined,
|
|
305
|
+
LeftAt: p.LeftAt ?? undefined,
|
|
306
|
+
};
|
|
307
|
+
}
|