Exemple #1
0
        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}")));
        }