public async Task <IActionResult> Send(int requestedGroupId, string description) { AddJoinRequestDto dto = new AddJoinRequestDto { RequestedGroupId = requestedGroupId, CreatedAt = DateTime.Now, Description = description }; ServiceResponse <AddJoinRequestDto> response = await _joinRequestService.SendJoinRequest(dto); if (response.Success) { return(Ok(response)); } return(NotFound(response)); }
public async Task <ServiceResponse <AddJoinRequestDto> > SendJoinRequest(AddJoinRequestDto newJoinRequest) { ServiceResponse <AddJoinRequestDto> response = new ServiceResponse <AddJoinRequestDto>(); User user = await _context.Users.Include(u => u.ProjectGroups) .ThenInclude(g => g.ProjectGroup) .Include(u => u.OutgoingJoinRequests) .FirstOrDefaultAsync(u => u.Id == GetUserId()); ProjectGroup requestedGroup = await _context.ProjectGroups.Include(g => g.AffiliatedSection) .Include(g => g.GroupMembers).Include(g => g.IncomingJoinRequests) .FirstOrDefaultAsync(rg => rg.Id == newJoinRequest.RequestedGroupId); if (requestedGroup == null) { response.Data = null; response.Message = "There is no group with this id"; response.Success = false; return(response); } Section section = await _context.Sections.FirstOrDefaultAsync(s => (s.Id == requestedGroup.AffiliatedSectionId)); if (user == null) { response.Data = null; response.Message = "There is no user with this Id"; response.Success = false; return(response); } if (section == null) { response.Data = null; response.Message = "There is no section with this Id "; response.Success = false; return(response); } ProjectGroup userGroup = new ProjectGroup { AffiliatedSectionId = -1 }; foreach (ProjectGroupUser pgu in user.ProjectGroups) { if (pgu.ProjectGroup.AffiliatedCourseId == requestedGroup.AffiliatedCourseId && pgu.ProjectGroup.AffiliatedSectionId == requestedGroup.AffiliatedSectionId) { userGroup = pgu.ProjectGroup; break; } } if (userGroup.AffiliatedSectionId == -1) { response.Data = null; response.Message = "You are not in the same section with this group"; response.Success = false; return(response); } if (userGroup.Id == requestedGroup.Id) { response.Data = null; response.Message = "You are already in this group"; response.Success = false; return(response); } if (userGroup.ConfirmationState == true) { response.Data = null; response.Message = "Your group is finalized."; response.Success = false; return(response); } if (requestedGroup.ConfirmationState == true) { response.Data = null; response.Message = "The group you want to join is finalized."; response.Success = false; return(response); } if (requestedGroup.GroupMembers.Count >= _context.Courses.FirstOrDefault(c => c.Id == userGroup.AffiliatedCourseId).MaxGroupSize) { response.Data = null; response.Message = "The group you want to join is full."; response.Success = false; return(response); } if (requestedGroup.GroupMembers.Count == 0) { response.Data = null; response.Message = "The group is empty"; response.Success = false; return(response); } foreach (JoinRequest jr in requestedGroup.IncomingJoinRequests) { if (jr.RequestingStudentId == GetUserId() && !jr.Resolved) { response.Data = null; response.Message = "You already sent a join request to this group that is not resolved yet."; response.Success = false; return(response); } } JoinRequest createdJoinRequest = new JoinRequest { RequestingStudent = user, RequestingStudentId = user.Id, RequestedGroup = requestedGroup, RequestedGroupId = requestedGroup.Id, CreatedAt = newJoinRequest.CreatedAt, AcceptedNumber = 0, Accepted = false, Resolved = false, VotedStudents = "", Description = newJoinRequest.Description }; requestedGroup.IncomingJoinRequests.Add(createdJoinRequest); user.OutgoingJoinRequests.Add(createdJoinRequest); _context.ProjectGroups.Update(requestedGroup); _context.Users.Update(user); _context.JoinRequests.Add(createdJoinRequest); await _context.SaveChangesAsync(); response.Data = newJoinRequest; response.Message = "Join request is successfully sent"; response.Success = true; return(response); }