@campxdev/server-shared 2.0.1 → 2.0.2
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 +8 -0
- package/dist/microsoft/services/teams-meetings-graph.service.d.ts.map +1 -1
- package/dist/microsoft/services/teams-meetings-graph.service.js +74 -24
- package/dist/microsoft/services/teams-meetings-graph.service.js.map +1 -1
- package/package.json +1 -1
|
@@ -21,6 +21,14 @@ export declare class TeamsMeetingsGraphService {
|
|
|
21
21
|
* Delete single Teams online meeting
|
|
22
22
|
*/
|
|
23
23
|
deleteTeamsOnlineMeeting(meetingId: string, institutionConfig: InstitutionMicrosoftConfig, institutionId: string): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Get Teams meeting participants/attendance report
|
|
26
|
+
*/
|
|
27
|
+
getTeamsMeetingParticipants(meetingId: string, institutionConfig: InstitutionMicrosoftConfig, institutionId: string): Promise<any[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Transform Microsoft Graph attendance records to our expected format
|
|
30
|
+
*/
|
|
31
|
+
private transformAttendanceRecords;
|
|
24
32
|
private buildOnlineMeetingRequest;
|
|
25
33
|
/**
|
|
26
34
|
* 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;CACtB;AAED,qBACa,yBAAyB;IACxB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAAhB,gBAAgB,EAAE,yBAAyB;IAExE;;OAEG;IACH,OAAO,CAAC,uBAAuB;
|
|
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;CACtB;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;IA+B9B;;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;IAgBjC;;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,20 @@ 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`)
|
|
55
49
|
.post(requestBody);
|
|
56
50
|
this.logger.log(`Teams meeting created successfully with ID: ${response.id}`);
|
|
57
|
-
this.logger.log(`
|
|
51
|
+
this.logger.log(`Meeting join URL: ${response.joinWebUrl}`);
|
|
58
52
|
return response;
|
|
59
53
|
}
|
|
60
54
|
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}`);
|
|
55
|
+
this.logger.error(`Failed to create Teams meeting: ${meetingData.subject}`);
|
|
56
|
+
this.logger.error(`Error: ${error.code} - ${error.message} (Status: ${error.statusCode})`);
|
|
67
57
|
if (error.body) {
|
|
68
|
-
this.logger.error(`
|
|
58
|
+
this.logger.error(`Additional error details: ${error.body}`);
|
|
69
59
|
}
|
|
70
60
|
throw error;
|
|
71
61
|
}
|
|
@@ -86,10 +76,75 @@ let TeamsMeetingsGraphService = class TeamsMeetingsGraphService {
|
|
|
86
76
|
throw error;
|
|
87
77
|
}
|
|
88
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Get Teams meeting participants/attendance report
|
|
81
|
+
*/
|
|
82
|
+
async getTeamsMeetingParticipants(meetingId, institutionConfig, institutionId) {
|
|
83
|
+
const graphClient = await this.graphBaseService.getApplicationGraphClient(institutionConfig, institutionId);
|
|
84
|
+
const serviceAccountId = this.getServiceAccountUserId(institutionConfig);
|
|
85
|
+
this.logger.log(`Fetching attendance reports for Teams meeting: ${meetingId}`);
|
|
86
|
+
this.logger.log(`Meeting ID length: ${meetingId.length} characters`);
|
|
87
|
+
this.logger.log(`Using service account: ${serviceAccountId}`);
|
|
88
|
+
try {
|
|
89
|
+
this.logger.log(`Retrieving meeting details from Microsoft Graph API`);
|
|
90
|
+
const meetingResponse = await graphClient
|
|
91
|
+
.api(`/users/${serviceAccountId}/onlineMeetings/${meetingId}`)
|
|
92
|
+
.get();
|
|
93
|
+
this.logger.log(`Successfully retrieved meeting details. Subject: ${meetingResponse.subject || 'N/A'}`);
|
|
94
|
+
// First get attendance reports to find the report ID
|
|
95
|
+
const attendanceReportsResponse = await graphClient
|
|
96
|
+
.api(`/users/${serviceAccountId}/onlineMeetings/${meetingId}/attendanceReports`)
|
|
97
|
+
.get();
|
|
98
|
+
this.logger.log(`Found ${attendanceReportsResponse.value?.length || 0} attendance reports`);
|
|
99
|
+
if (!attendanceReportsResponse.value || attendanceReportsResponse.value.length === 0) {
|
|
100
|
+
this.logger.log('No attendance reports found - meeting may not have ended or no participants joined');
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
// Get the latest attendance report (meetings can have multiple reports)
|
|
104
|
+
const latestReport = attendanceReportsResponse.value[attendanceReportsResponse.value.length - 1];
|
|
105
|
+
const reportId = latestReport.id;
|
|
106
|
+
this.logger.log(`Using attendance report ID: ${reportId}`);
|
|
107
|
+
// Use the direct attendance records API
|
|
108
|
+
const attendanceRecordsResponse = await graphClient
|
|
109
|
+
.api(`/users/${serviceAccountId}/onlineMeetings/${meetingId}/attendanceReports/${reportId}/attendanceRecords`)
|
|
110
|
+
.get();
|
|
111
|
+
const attendanceRecords = attendanceRecordsResponse.value || [];
|
|
112
|
+
this.logger.log(`Found ${attendanceRecords.length} attendance records`);
|
|
113
|
+
// Transform the attendance records to our expected format
|
|
114
|
+
const participants = this.transformAttendanceRecords(attendanceRecords);
|
|
115
|
+
this.logger.log(`Successfully processed ${participants.length} participants`);
|
|
116
|
+
return participants;
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
this.logger.error(`Failed to fetch Teams meeting attendance for ${meetingId}:`);
|
|
120
|
+
this.logger.error(`Error code: ${error.code}`);
|
|
121
|
+
this.logger.error(`Error message: ${error.message}`);
|
|
122
|
+
this.logger.error(`Status code: ${error.statusCode}`);
|
|
123
|
+
if (error.body) {
|
|
124
|
+
this.logger.error(`Error details: ${JSON.stringify(JSON.parse(error.body), null, 2)}`);
|
|
125
|
+
}
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Transform Microsoft Graph attendance records to our expected format
|
|
131
|
+
*/
|
|
132
|
+
transformAttendanceRecords(attendanceRecords) {
|
|
133
|
+
return attendanceRecords.map((record) => ({
|
|
134
|
+
displayName: record.identity?.displayName || 'Unknown',
|
|
135
|
+
userPrincipalName: record.identity?.user?.userPrincipalName || record.emailAddress || '',
|
|
136
|
+
emailAddress: record.emailAddress || record.identity?.user?.userPrincipalName || '',
|
|
137
|
+
role: record.role || 'attendee',
|
|
138
|
+
joinedDateTime: record.attendanceIntervals?.[0]?.joinDateTime || null,
|
|
139
|
+
leftDateTime: record.attendanceIntervals?.[record.attendanceIntervals?.length - 1]?.leaveDateTime || null,
|
|
140
|
+
totalAttendanceInSeconds: record.totalAttendanceInSeconds || 0,
|
|
141
|
+
attendanceIntervals: record.attendanceIntervals || [],
|
|
142
|
+
identity: record.identity,
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
89
145
|
// Private methods
|
|
90
146
|
buildOnlineMeetingRequest(meetingData) {
|
|
91
147
|
this.logger.log(`Building online meeting request for: ${meetingData.subject}`);
|
|
92
|
-
this.logger.log(`Input meeting data: ${JSON.stringify(meetingData, null, 2)}`);
|
|
93
148
|
// Validate required fields
|
|
94
149
|
this.validateMeetingData(meetingData);
|
|
95
150
|
const requestBody = {
|
|
@@ -97,10 +152,7 @@ let TeamsMeetingsGraphService = class TeamsMeetingsGraphService {
|
|
|
97
152
|
startDateTime: meetingData.startDateTime,
|
|
98
153
|
endDateTime: meetingData.endDateTime,
|
|
99
154
|
};
|
|
100
|
-
this.logger.log(`
|
|
101
|
-
// Skip participants for now - students will join via LMS link
|
|
102
|
-
this.logger.log(`Skipping participants - students will join via LMS link`);
|
|
103
|
-
this.logger.log(`Final request body: ${JSON.stringify(requestBody, null, 2)}`);
|
|
155
|
+
this.logger.log(`Meeting request built successfully`);
|
|
104
156
|
return requestBody;
|
|
105
157
|
}
|
|
106
158
|
/**
|
|
@@ -138,11 +190,9 @@ let TeamsMeetingsGraphService = class TeamsMeetingsGraphService {
|
|
|
138
190
|
}
|
|
139
191
|
}
|
|
140
192
|
if (errors.length > 0) {
|
|
141
|
-
this.logger.error(`Meeting data validation failed
|
|
142
|
-
errors.forEach((error) => this.logger.error(`- ${error}`));
|
|
193
|
+
this.logger.error(`Meeting data validation failed: ${errors.join('; ')}`);
|
|
143
194
|
throw new Error(`Invalid meeting data: ${errors.join('; ')}`);
|
|
144
195
|
}
|
|
145
|
-
this.logger.log(`Meeting data validation passed`);
|
|
146
196
|
}
|
|
147
197
|
/**
|
|
148
198
|
* 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;AAcpE,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IACP;IAA7B,YAA6B,gBAA2C;QAA3C,qBAAgB,GAAhB,gBAAgB,CAA2B;IAAG,CAAC;IAE5E;;OAEG;IACK,uBAAuB,CAAC,iBAA6C;QAC3E,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,8BAA8B,CAAC;QAE1E,IAAI,CAAC,
|
|
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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"}
|