diff --git a/meetings/tool/src/main/java/org/sakaiproject/meetings/controller/MeetingsController.java b/meetings/tool/src/main/java/org/sakaiproject/meetings/controller/MeetingsController.java index f16a2952729d..bc45c3e146ae 100644 --- a/meetings/tool/src/main/java/org/sakaiproject/meetings/controller/MeetingsController.java +++ b/meetings/tool/src/main/java/org/sakaiproject/meetings/controller/MeetingsController.java @@ -493,12 +493,32 @@ public Meeting updateMeeting(@RequestBody MeetingData data, @PathVariable String meeting.setDescription(data.getDescription()); meeting.setStartDate(Instant.parse(data.getStartDate())); meeting.setEndDate(Instant.parse(data.getEndDate())); - + + List coorganizerEmails = new ArrayList<>(); if (MS_TEAMS.equals(data.getProvider())) { String organizerEmail = meetingService.getMeetingProperty(meeting, ORGANIZER_USER); String onlineMeetingId = meetingService.getMeetingProperty(meeting, ONLINE_MEETING_ID); + + // Updating coorganizers + if (data.isCoorganizersEnabled()) { + List coorganizers = sakaiProxy.getSite(data.getSiteId()).getMembers() + .stream() + .filter(u -> { + boolean canUpdate = sakaiProxy.canUpdateSite("/site/" + data.getSiteId(), u.getUserId()); + log.debug("User: " + u.getUserId() + " canUpdate: " + canUpdate); + return canUpdate; + }) + .collect(Collectors.toList()); + + coorganizers.forEach(c -> log.debug("Filtered Coorganizer: " + c.getUserId())); + + coorganizerEmails = coorganizers.stream() + .map(member -> sakaiProxy.getUser(member.getUserId()).getEmail()) + .filter(StringUtils::isNotEmpty) + .collect(Collectors.toList()); + } if(StringUtils.isNotBlank(onlineMeetingId)) { - microsoftCommonService.updateOnlineMeeting(organizerEmail, onlineMeetingId, meeting.getTitle(), meeting.getStartDate(), meeting.getEndDate()); + microsoftCommonService.updateOnlineMeeting(organizerEmail, onlineMeetingId, meeting.getTitle(), meeting.getStartDate(), meeting.getEndDate(), coorganizerEmails); } } diff --git a/meetings/ui/src/main/frontend/src/components/sakai-input.vue b/meetings/ui/src/main/frontend/src/components/sakai-input.vue index b020175e3be1..19672d918025 100644 --- a/meetings/ui/src/main/frontend/src/components/sakai-input.vue +++ b/meetings/ui/src/main/frontend/src/components/sakai-input.vue @@ -173,5 +173,13 @@ export default { color: var(--sakai-text-color-disabled); } } + .form-check-coorganizers { + appearance: none; + height: 15px; + width: 15px; + border-radius: 3px; + background-color: var(--sakai-background-color-1); + border: 1px solid var(--sakai-color-black) !important; + } } diff --git a/meetings/ui/src/main/frontend/src/views/CreateMeeting.vue b/meetings/ui/src/main/frontend/src/views/CreateMeeting.vue index 070b4aa0a5ac..43da0304d96c 100644 --- a/meetings/ui/src/main/frontend/src/views/CreateMeeting.vue +++ b/meetings/ui/src/main/frontend/src/views/CreateMeeting.vue @@ -67,7 +67,7 @@
coorganizerEmails) throws MicrosoftCredentialsException; - void updateOnlineMeeting(String userEmail, String meetingId, String subject, Instant startDate, Instant endDate) throws MicrosoftCredentialsException; + void updateOnlineMeeting(String userEmail, String meetingId, String subject, Instant startDate, Instant endDate, List coorganizerEmails) throws MicrosoftCredentialsException; List getOnlineMeetingRecordings(String onlineMeetingId, List teamIdsList, boolean force) throws MicrosoftCredentialsException; // ---------------------------------------- ONE-DRIVE (APPLICATION) -------------------------------------------------------- diff --git a/microsoft-integration/impl/src/main/java/org/sakaiproject/microsoft/impl/MicrosoftCommonServiceImpl.java b/microsoft-integration/impl/src/main/java/org/sakaiproject/microsoft/impl/MicrosoftCommonServiceImpl.java index a3089d603566..7dd3b8d93e67 100644 --- a/microsoft-integration/impl/src/main/java/org/sakaiproject/microsoft/impl/MicrosoftCommonServiceImpl.java +++ b/microsoft-integration/impl/src/main/java/org/sakaiproject/microsoft/impl/MicrosoftCommonServiceImpl.java @@ -76,6 +76,7 @@ import com.microsoft.graph.tasks.LargeFileUploadTask; import com.microsoft.graph.tasks.LargeFileUploadResult; +import com.microsoft.graph.models.MeetingChatMode; import com.microsoft.graph.models.AadUserConversationMember; import com.microsoft.graph.models.CallRecordingEventMessageDetail; import com.microsoft.graph.models.CallRecordingStatus; @@ -1346,7 +1347,7 @@ public TeamsMeetingData createOnlineMeeting(String userEmail, String subject, In // Lobby Settings LobbyBypassSettings lobbySettings = new LobbyBypassSettings(); lobbySettings.scope = LobbyBypassScope.ORGANIZATION; - + // Online Meeting OnlineMeeting onlineMeeting = new OnlineMeeting(); if (startDate != null) { onlineMeeting.startDateTime = OffsetDateTime.ofInstant(startDate, ZoneId.systemDefault()); } @@ -1354,8 +1355,9 @@ public TeamsMeetingData createOnlineMeeting(String userEmail, String subject, In onlineMeeting.participants = participants; onlineMeeting.subject = subject; onlineMeeting.lobbyBypassSettings = lobbySettings; - onlineMeeting.allowedPresenters = OnlineMeetingPresenters.ROLE_IS_PRESENTER; - + onlineMeeting.allowedPresenters = OnlineMeetingPresenters.ORGANIZER; + onlineMeeting.allowMeetingChat = MeetingChatMode.ENABLED; + OnlineMeeting meeting = getGraphClient().users(organizerUser.getId()).onlineMeetings() .buildRequest() .post(onlineMeeting); @@ -1368,7 +1370,7 @@ public TeamsMeetingData createOnlineMeeting(String userEmail, String subject, In } @Override - public void updateOnlineMeeting(String userEmail, String meetingId, String subject, Instant startDate, Instant endDate) throws MicrosoftCredentialsException { + public void updateOnlineMeeting(String userEmail, String meetingId, String subject, Instant startDate, Instant endDate, List coorganizerEmails) throws MicrosoftCredentialsException { // Get organizer user MicrosoftUser organizerUser = getUserByEmail(userEmail); @@ -1378,7 +1380,31 @@ public void updateOnlineMeeting(String userEmail, String meetingId, String subje onlineMeeting.startDateTime = OffsetDateTime.ofInstant(startDate, ZoneId.systemDefault()); onlineMeeting.endDateTime = OffsetDateTime.ofInstant(endDate, ZoneId.systemDefault()); onlineMeeting.subject = subject; - + + MeetingParticipants participants = new MeetingParticipants(); + + // Coorganizers + List attendees = new ArrayList<>(); + if (coorganizerEmails != null) { + for (String coorganizerEmail : coorganizerEmails) { + if (!coorganizerEmail.equals(organizerUser.getEmail())) { + MicrosoftUser coorganizerUser = getUserByEmail(coorganizerEmail); + if (coorganizerUser != null) { + MeetingParticipantInfo coorganizer = new MeetingParticipantInfo(); + IdentitySet coorganizerIdentity = new IdentitySet(); + Identity coorganizerIden = new Identity(); + coorganizerIden.id = coorganizerUser.getId(); + coorganizerIden.displayName = coorganizerUser.getName(); + coorganizerIdentity.user = coorganizerIden; + coorganizer.identity = coorganizerIdentity; + coorganizer.role = OnlineMeetingRole.COORGANIZER; + attendees.add(coorganizer); + } + } + } + participants.attendees = attendees; + } + onlineMeeting.participants = participants; getGraphClient().users(organizerUser.getId()).onlineMeetings(meetingId) .buildRequest() .patch(onlineMeeting);