public async Task <IActionResult> Vote(int mergeRequestId, bool _accept)
        {
            VoteMergeRequestDto dto = new VoteMergeRequestDto {
                Id = mergeRequestId, accept = _accept
            };
            ServiceResponse <MergeRequestInfoDto> response = await _mergeRequestService.Vote(dto);

            if (response.Success)
            {
                return(Ok(response));
            }
            return(NotFound(response));
        }
        public async Task <ServiceResponse <MergeRequestInfoDto> > Vote(VoteMergeRequestDto mergeRequestDto)
        {
            ServiceResponse <MergeRequestInfoDto> response = new ServiceResponse <MergeRequestInfoDto>();
            MergeRequest mergeRequest = await _context.MergeRequests.Include(mr => mr.ReceiverGroup)
                                        .ThenInclude(pg => pg.GroupMembers)
                                        .Include(mr => mr.SenderGroup)
                                        .ThenInclude(pg => pg.GroupMembers)
                                        .FirstOrDefaultAsync(mr => mr.Id == mergeRequestDto.Id);

            User user = await _context.Users
                        .FirstOrDefaultAsync(u => u.Id == GetUserId());

            if (mergeRequest == null)
            {
                response.Data    = null;
                response.Message = "There is no such merge request";
                response.Success = false;
                return(response);
            }
            if (mergeRequest.Resolved)
            {
                response.Data    = null;
                response.Message = "You cannot vote because the merge request is resolved already";
                response.Success = false;
                return(response);
            }
            if (mergeRequest.Accepted)
            {
                response.Data    = null;
                response.Message = "The merge request is accepted already";
                response.Success = false;
                return(response);
            }
            if (!mergeRequest.ReceiverGroup.GroupMembers.Any(pgu => pgu.UserId == GetUserId()) && !mergeRequest.SenderGroup.GroupMembers.Any(pgu => pgu.UserId == GetUserId()))
            {
                response.Data    = null;
                response.Message = "You cannot vote because you are not in the sender or receiver group";
                response.Success = false;
                return(response);
            }

            if (!IsUserInString(mergeRequest.VotedStudents, GetUserId()) && mergeRequestDto.accept == false)
            {
                mergeRequest.Resolved = true;
                _context.MergeRequests.Update(mergeRequest);
                await _context.SaveChangesAsync();

                response.Message = "Merge request is cancelled by the negative vote";
                return(response);
            }

            if (IsUserInString(mergeRequest.VotedStudents, GetUserId()) && mergeRequestDto.accept == false)
            {
                mergeRequest.VotedStudents = RemoveUserFromString(mergeRequest.VotedStudents, GetUserId());
                _context.MergeRequests.Update(mergeRequest);
                await _context.SaveChangesAsync();

                response.Message = "Your vote is taken back successfully.";
                return(response);
            }
            if (IsUserInString(mergeRequest.VotedStudents, GetUserId()) && mergeRequestDto.accept == true)
            {
                response.Success = false;
                response.Message = "User is already voted accepted for this request";
                return(response);
            }

            int acceptedNumber = 0;

            string[] voters = mergeRequest.VotedStudents.Split(' ');
            foreach (string s in voters)
            {
                if (s != "" && s != " ")
                {
                    acceptedNumber++;
                }
            }

            int maxSize = (await _context.Courses.FirstOrDefaultAsync(c => c.Id == mergeRequest.SenderGroup.AffiliatedCourseId)).MaxGroupSize;

            acceptedNumber++;
            mergeRequest.VotedStudents = AddUserToString(mergeRequest.VotedStudents, GetUserId());

            if (acceptedNumber >= mergeRequest.ReceiverGroup.GroupMembers.Count + mergeRequest.SenderGroup.GroupMembers.Count && mergeRequest.ReceiverGroup.GroupMembers.Count + mergeRequest.SenderGroup.GroupMembers.Count <= maxSize)
            {
                int newSize = mergeRequest.ReceiverGroup.GroupMembers.Count + mergeRequest.SenderGroup.GroupMembers.Count;
                mergeRequest.Accepted = true;
                _context.MergeRequests.Update(mergeRequest);
                await _context.SaveChangesAsync();

                int recId = mergeRequest.ReceiverGroupId;
                int senId = mergeRequest.SenderGroupId;

                var tmp = await _projectGroupService.CompleteMergeRequest(mergeRequest.Id);

                if (newSize >= maxSize)
                {
                    await DeleteAllMergeRequests(new DeleteAllMergeRequestsDto { projectGroupId = recId });
                    await DeleteAllMergeRequests(new DeleteAllMergeRequestsDto { projectGroupId = senId });
                }
                // _context.MergeRequests.Remove ( mergeRequest );
                await _context.SaveChangesAsync();

                response.Message = "Merge request is accepted from all members and groups are merged.";
                return(response);
            }

            _context.MergeRequests.Update(mergeRequest);
            await _context.SaveChangesAsync();

            response.Data = new MergeRequestInfoDto {
                Id = mergeRequestDto.Id, Accepted = mergeRequest.Accepted, Resolved = mergeRequest.Resolved, VotedStudents = mergeRequest.VotedStudents
            };
            response.Message = "You succesfully voted";

            return(response);
        }