public async Task <IActionResult> CopyStudents(int groupId, CopyStudentsParameters parameters) { var destinationGroup = await groupsRepo.FindGroupByIdAsync(groupId).ConfigureAwait(false); if (destinationGroup == null) { return(NotFound(new ErrorResponse($"Group {groupId} not found"))); } var hasDestinationGroupEditAccess = await groupAccessesRepo.HasUserEditAccessToGroupAsync(destinationGroup.Id, UserId).ConfigureAwait(false); if (!hasDestinationGroupEditAccess) { return(StatusCode((int)HttpStatusCode.Forbidden, new ErrorResponse($"You have no edit access to group {groupId}"))); } var membersOfAllGroupsAvailableForUser = (await groupAccessesRepo.GetMembersOfAllGroupsAvailableForUserAsync(UserId).ConfigureAwait(false)) .Select(gm => gm.UserId); var studentsToCopySet = parameters.StudentIds.ToHashSet(); studentsToCopySet.IntersectWith(membersOfAllGroupsAvailableForUser); var newMembers = await groupMembersRepo.AddUsersToGroupAsync(groupId, studentsToCopySet).ConfigureAwait(false); await notificationsRepo.AddNotificationAsync( destinationGroup.CourseId, new GroupMembersHaveBeenAddedNotification(groupId, parameters.StudentIds, usersRepo), UserId ).ConfigureAwait(false); return(Ok(new SuccessResponseWithMessage($"{newMembers.Count} students have been copied to group {groupId}"))); }
public async Task <IActionResult> CopyStudents(int groupId, int destinationGroupId, CopyStudentsParameters parameters) { var destinationGroup = await groupsRepo.FindGroupByIdAsync(destinationGroupId).ConfigureAwait(false); if (destinationGroup == null) { return(NotFound(new ErrorResponse($"Group {destinationGroupId} not found"))); } var isDestinationGroupVisible = await groupAccessesRepo.IsGroupVisibleForUserAsync(destinationGroup, UserId).ConfigureAwait(false); if (!isDestinationGroupVisible) { return(StatusCode((int)HttpStatusCode.Forbidden, new ErrorResponse($"You have no access to group {destinationGroupId}"))); } var newMembers = await groupMembersRepo.CopyUsersFromOneGroupToAnotherAsync(groupId, destinationGroupId, parameters.UserIds).ConfigureAwait(false); await notificationsRepo.AddNotificationAsync( destinationGroup.CourseId, new GroupMembersHaveBeenAddedNotification(destinationGroupId, parameters.UserIds, usersRepo), UserId ).ConfigureAwait(false); return(Ok(new SuccessResponseWithMessage($"{newMembers.Count} students have been copied from group {groupId} to group {destinationGroupId}"))); }