@campxdev/server-shared 2.0.1 → 2.0.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/dist/microsoft/services/teams-meetings-graph.service.d.ts +9 -0
- package/dist/microsoft/services/teams-meetings-graph.service.d.ts.map +1 -1
- package/dist/microsoft/services/teams-meetings-graph.service.js +92 -24
- package/dist/microsoft/services/teams-meetings-graph.service.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,6 +5,7 @@ interface MeetingData {
|
|
|
5
5
|
startDateTime: string;
|
|
6
6
|
endDateTime: string;
|
|
7
7
|
attendees?: string[];
|
|
8
|
+
coOrganizers?: string[];
|
|
8
9
|
}
|
|
9
10
|
export declare class TeamsMeetingsGraphService {
|
|
10
11
|
private readonly graphBaseService;
|
|
@@ -21,6 +22,14 @@ export declare class TeamsMeetingsGraphService {
|
|
|
21
22
|
* Delete single Teams online meeting
|
|
22
23
|
*/
|
|
23
24
|
deleteTeamsOnlineMeeting(meetingId: string, institutionConfig: InstitutionMicrosoftConfig, institutionId: string): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Get Teams meeting participants/attendance report
|
|
27
|
+
*/
|
|
28
|
+
getTeamsMeetingParticipants(meetingId: string, institutionConfig: InstitutionMicrosoftConfig, institutionId: string): Promise<any[]>;
|
|
29
|
+
/**
|
|
30
|
+
* Transform Microsoft Graph attendance records to our expected format
|
|
31
|
+
*/
|
|
32
|
+
private transformAttendanceRecords;
|
|
24
33
|
private buildOnlineMeetingRequest;
|
|
25
34
|
/**
|
|
26
35
|
* Validate meeting data before sending to Microsoft Graph
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"teams-meetings-graph.service.d.ts","sourceRoot":"","sources":["../../../src/microsoft/services/teams-meetings-graph.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAC/F,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAM3E,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"teams-meetings-graph.service.d.ts","sourceRoot":"","sources":["../../../src/microsoft/services/teams-meetings-graph.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAC/F,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAM3E,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,qBACa,yBAAyB;IACxB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAAhB,gBAAgB,EAAE,yBAAyB;IAExE;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA0B/B;;OAEG;IACG,wBAAwB,CAC5B,WAAW,EAAE,WAAW,EACxB,iBAAiB,EAAE,0BAA0B,EAC7C,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,kBAAkB,CAAC;IAgC9B;;OAEG;IACG,wBAAwB,CAC5B,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,0BAA0B,EAC7C,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IAmBhB;;OAEG;IACG,2BAA2B,CAC/B,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,0BAA0B,EAC7C,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,GAAG,EAAE,CAAC;IAsEjB;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAiBlC,OAAO,CAAC,yBAAyB;IAqCjC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA+C3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,KAAK,MAAM,GAEjB;CACF"}
|
|
@@ -22,8 +22,6 @@ let TeamsMeetingsGraphService = class TeamsMeetingsGraphService {
|
|
|
22
22
|
*/
|
|
23
23
|
getServiceAccountUserId(institutionConfig) {
|
|
24
24
|
const serviceAccountId = institutionConfig.microsoftTeamsServiceAccountId;
|
|
25
|
-
this.logger.log(`Retrieving service account ID from institution config`);
|
|
26
|
-
this.logger.log(`Service account ID: ${serviceAccountId ? `${serviceAccountId.substring(0, 8)}...` : 'NOT SET'}`);
|
|
27
25
|
if (!serviceAccountId) {
|
|
28
26
|
this.logger.error('Microsoft Teams Service Account ID is not configured for this institution');
|
|
29
27
|
throw new Error('Microsoft Teams Service Account ID is required for Teams meeting creation. Please configure it in institution settings.');
|
|
@@ -31,9 +29,8 @@ let TeamsMeetingsGraphService = class TeamsMeetingsGraphService {
|
|
|
31
29
|
// Validate format (should be either email or GUID)
|
|
32
30
|
const isEmail = serviceAccountId.includes('@');
|
|
33
31
|
const isGuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(serviceAccountId);
|
|
34
|
-
this.logger.log(`Service account ID format - isEmail: ${isEmail}, isGuid: ${isGuid}`);
|
|
35
32
|
if (!isEmail && !isGuid) {
|
|
36
|
-
this.logger.warn(`Service account ID format may be invalid. Expected email or GUID format
|
|
33
|
+
this.logger.warn(`Service account ID format may be invalid. Expected email or GUID format.`);
|
|
37
34
|
}
|
|
38
35
|
return serviceAccountId;
|
|
39
36
|
}
|
|
@@ -45,27 +42,21 @@ let TeamsMeetingsGraphService = class TeamsMeetingsGraphService {
|
|
|
45
42
|
const serviceAccountId = this.getServiceAccountUserId(institutionConfig);
|
|
46
43
|
const requestBody = this.buildOnlineMeetingRequest(meetingData);
|
|
47
44
|
this.logger.log(`Creating Teams meeting: ${meetingData.subject}`);
|
|
48
|
-
this.logger.log(`
|
|
49
|
-
this.logger.log(`API Endpoint: /users/${serviceAccountId}/onlineMeetings`);
|
|
50
|
-
this.logger.log(`Request Body: ${JSON.stringify(requestBody, null, 2)}`);
|
|
51
|
-
this.logger.log(`Meeting Data Input: ${JSON.stringify(meetingData, null, 2)}`);
|
|
45
|
+
this.logger.log(`Using service account: ${serviceAccountId.substring(0, 8)}...`);
|
|
52
46
|
try {
|
|
53
47
|
const response = await graphClient
|
|
54
48
|
.api(`/users/${serviceAccountId}/onlineMeetings`)
|
|
49
|
+
.header('Prefer', 'include-unknown-enum-members')
|
|
55
50
|
.post(requestBody);
|
|
56
51
|
this.logger.log(`Teams meeting created successfully with ID: ${response.id}`);
|
|
57
|
-
this.logger.log(`
|
|
52
|
+
this.logger.log(`Meeting join URL: ${response.joinWebUrl}`);
|
|
58
53
|
return response;
|
|
59
54
|
}
|
|
60
55
|
catch (error) {
|
|
61
|
-
this.logger.error(`Failed to create Teams meeting.
|
|
62
|
-
this.logger.error(`Error
|
|
63
|
-
this.logger.error(`Error Message: ${error.message}`);
|
|
64
|
-
this.logger.error(`Status Code: ${error.statusCode}`);
|
|
65
|
-
this.logger.error(`Request Body that failed: ${JSON.stringify(requestBody, null, 2)}`);
|
|
66
|
-
this.logger.error(`Service Account ID used: ${serviceAccountId}`);
|
|
56
|
+
this.logger.error(`Failed to create Teams meeting: ${meetingData.subject}`);
|
|
57
|
+
this.logger.error(`Error: ${error.code} - ${error.message} (Status: ${error.statusCode})`);
|
|
67
58
|
if (error.body) {
|
|
68
|
-
this.logger.error(`
|
|
59
|
+
this.logger.error(`Additional error details: ${error.body}`);
|
|
69
60
|
}
|
|
70
61
|
throw error;
|
|
71
62
|
}
|
|
@@ -86,21 +77,100 @@ let TeamsMeetingsGraphService = class TeamsMeetingsGraphService {
|
|
|
86
77
|
throw error;
|
|
87
78
|
}
|
|
88
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* Get Teams meeting participants/attendance report
|
|
82
|
+
*/
|
|
83
|
+
async getTeamsMeetingParticipants(meetingId, institutionConfig, institutionId) {
|
|
84
|
+
const graphClient = await this.graphBaseService.getApplicationGraphClient(institutionConfig, institutionId);
|
|
85
|
+
const serviceAccountId = this.getServiceAccountUserId(institutionConfig);
|
|
86
|
+
this.logger.log(`Fetching attendance reports for Teams meeting: ${meetingId}`);
|
|
87
|
+
this.logger.log(`Meeting ID length: ${meetingId.length} characters`);
|
|
88
|
+
this.logger.log(`Using service account: ${serviceAccountId}`);
|
|
89
|
+
try {
|
|
90
|
+
this.logger.log(`Retrieving meeting details from Microsoft Graph API`);
|
|
91
|
+
const meetingResponse = await graphClient
|
|
92
|
+
.api(`/users/${serviceAccountId}/onlineMeetings/${meetingId}`)
|
|
93
|
+
.get();
|
|
94
|
+
this.logger.log(`Successfully retrieved meeting details. Subject: ${meetingResponse.subject || 'N/A'}`);
|
|
95
|
+
// First get attendance reports to find the report ID
|
|
96
|
+
const attendanceReportsResponse = await graphClient
|
|
97
|
+
.api(`/users/${serviceAccountId}/onlineMeetings/${meetingId}/attendanceReports`)
|
|
98
|
+
.get();
|
|
99
|
+
this.logger.log(`Found ${attendanceReportsResponse.value?.length || 0} attendance reports`);
|
|
100
|
+
if (!attendanceReportsResponse.value || attendanceReportsResponse.value.length === 0) {
|
|
101
|
+
this.logger.log('No attendance reports found - meeting may not have ended or no participants joined');
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
// Get the latest attendance report (meetings can have multiple reports)
|
|
105
|
+
const latestReport = attendanceReportsResponse.value[attendanceReportsResponse.value.length - 1];
|
|
106
|
+
const reportId = latestReport.id;
|
|
107
|
+
this.logger.log(`Using attendance report ID: ${reportId}`);
|
|
108
|
+
// Use the direct attendance records API
|
|
109
|
+
const attendanceRecordsResponse = await graphClient
|
|
110
|
+
.api(`/users/${serviceAccountId}/onlineMeetings/${meetingId}/attendanceReports/${reportId}/attendanceRecords`)
|
|
111
|
+
.get();
|
|
112
|
+
const attendanceRecords = attendanceRecordsResponse.value || [];
|
|
113
|
+
this.logger.log(`Found ${attendanceRecords.length} attendance records`);
|
|
114
|
+
// Transform the attendance records to our expected format
|
|
115
|
+
const participants = this.transformAttendanceRecords(attendanceRecords);
|
|
116
|
+
this.logger.log(`Successfully processed ${participants.length} participants`);
|
|
117
|
+
return participants;
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
this.logger.error(`Failed to fetch Teams meeting attendance for ${meetingId}:`);
|
|
121
|
+
this.logger.error(`Error code: ${error.code}`);
|
|
122
|
+
this.logger.error(`Error message: ${error.message}`);
|
|
123
|
+
this.logger.error(`Status code: ${error.statusCode}`);
|
|
124
|
+
if (error.body) {
|
|
125
|
+
this.logger.error(`Error details: ${JSON.stringify(JSON.parse(error.body), null, 2)}`);
|
|
126
|
+
}
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Transform Microsoft Graph attendance records to our expected format
|
|
132
|
+
*/
|
|
133
|
+
transformAttendanceRecords(attendanceRecords) {
|
|
134
|
+
return attendanceRecords.map((record) => ({
|
|
135
|
+
displayName: record.identity?.displayName || 'Unknown',
|
|
136
|
+
userPrincipalName: record.identity?.user?.userPrincipalName || record.emailAddress || '',
|
|
137
|
+
emailAddress: record.emailAddress || record.identity?.user?.userPrincipalName || '',
|
|
138
|
+
role: record.role || 'attendee',
|
|
139
|
+
joinedDateTime: record.attendanceIntervals?.[0]?.joinDateTime || null,
|
|
140
|
+
leftDateTime: record.attendanceIntervals?.[record.attendanceIntervals?.length - 1]?.leaveDateTime || null,
|
|
141
|
+
totalAttendanceInSeconds: record.totalAttendanceInSeconds || 0,
|
|
142
|
+
attendanceIntervals: record.attendanceIntervals || [],
|
|
143
|
+
identity: record.identity,
|
|
144
|
+
}));
|
|
145
|
+
}
|
|
89
146
|
// Private methods
|
|
90
147
|
buildOnlineMeetingRequest(meetingData) {
|
|
91
148
|
this.logger.log(`Building online meeting request for: ${meetingData.subject}`);
|
|
92
|
-
this.logger.log(`Input meeting data: ${JSON.stringify(meetingData, null, 2)}`);
|
|
93
149
|
// Validate required fields
|
|
94
150
|
this.validateMeetingData(meetingData);
|
|
95
151
|
const requestBody = {
|
|
96
152
|
subject: meetingData.subject,
|
|
97
153
|
startDateTime: meetingData.startDateTime,
|
|
98
154
|
endDateTime: meetingData.endDateTime,
|
|
155
|
+
allowedPresenters: 'roleIsPresenter', // Allow role-based presenters
|
|
156
|
+
allowMeetingChat: 'enabled',
|
|
157
|
+
allowTeamworkReactions: true,
|
|
158
|
+
participants: {
|
|
159
|
+
attendees: [],
|
|
160
|
+
},
|
|
99
161
|
};
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
162
|
+
// Add faculty as presenters if provided
|
|
163
|
+
if (meetingData.coOrganizers && meetingData.coOrganizers.length > 0) {
|
|
164
|
+
this.logger.log(`Adding ${meetingData.coOrganizers.length} faculty members as attendees to meeting`);
|
|
165
|
+
this.logger.log(`Faculty emails: ${meetingData.coOrganizers.join(', ')}`);
|
|
166
|
+
// Construct attendees according to calendar event format
|
|
167
|
+
requestBody.participants.attendees = meetingData.coOrganizers.map((email) => ({
|
|
168
|
+
upn: email,
|
|
169
|
+
role: 'coorganizer',
|
|
170
|
+
identity: { '@odata.type': '#microsoft.graph.identitySet' },
|
|
171
|
+
}));
|
|
172
|
+
}
|
|
173
|
+
this.logger.log(`Meeting request built successfully`);
|
|
104
174
|
return requestBody;
|
|
105
175
|
}
|
|
106
176
|
/**
|
|
@@ -138,11 +208,9 @@ let TeamsMeetingsGraphService = class TeamsMeetingsGraphService {
|
|
|
138
208
|
}
|
|
139
209
|
}
|
|
140
210
|
if (errors.length > 0) {
|
|
141
|
-
this.logger.error(`Meeting data validation failed
|
|
142
|
-
errors.forEach((error) => this.logger.error(`- ${error}`));
|
|
211
|
+
this.logger.error(`Meeting data validation failed: ${errors.join('; ')}`);
|
|
143
212
|
throw new Error(`Invalid meeting data: ${errors.join('; ')}`);
|
|
144
213
|
}
|
|
145
|
-
this.logger.log(`Meeting data validation passed`);
|
|
146
214
|
}
|
|
147
215
|
/**
|
|
148
216
|
* Validate if a string is a valid ISO 8601 datetime
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"teams-meetings-graph.service.js","sourceRoot":"","sources":["../../../src/microsoft/services/teams-meetings-graph.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAE5C,iFAA2E;
|
|
1
|
+
{"version":3,"file":"teams-meetings-graph.service.js","sourceRoot":"","sources":["../../../src/microsoft/services/teams-meetings-graph.service.ts"],"names":[],"mappings":"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"}
|