public async Task <IActionResult> RejectedOrRemoveUser([FromBody] ManageUserTeamViewModel model)
        {
            logger.LogInformation($"POST Request {HttpContext.Request.Headers[":path"]}. Body: {JsonConvert.SerializeObject(model)}");

            if (!await accessChecker.CanManageTeamOrSelfInTeam(model.TeamId, model.UserId))
            {
                throw new HttpStatusException(HttpStatusCode.Forbidden, CommonErrorMessages.Forbidden);
            }

            var team = await context.Teams
                       .Include(t => t.Image)
                       .Include(u => u.UserTeams)
                       .ThenInclude(ut => ut.User)
                       .FirstOrDefaultAsync(u => u.Id == model.TeamId);

            var userTeam = team?.UserTeams.FirstOrDefault(ut => ut.UserId == model.UserId);

            if (userTeam == null)
            {
                throw new HttpStatusException(HttpStatusCode.NotFound, UserErrorMessages.NotFound,
                                              UserErrorMessages.DebugNotFoundUserTeam(model.UserId, model.TeamId));
            }

            userTeam.UserAction = userTeam.UserAction switch
            {
                UserActionEnum.SentRequest => UserActionEnum.RejectedTeamRequest,
                UserActionEnum.JoinedTeam => UserActionEnum.QuitTeam,
                UserActionEnum.ConsideringOffer => UserActionEnum.RejectedTeamRequest,
                _ => throw new HttpStatusException(HttpStatusCode.BadRequest,
                                                   TeamErrorMessages.QuitDeclineTeam,
                                                   TeamErrorMessages.InvalidUserAction(model.UserId, userTeam, team.Id,
                                                                                       UserActionEnum.SentRequest, UserActionEnum.JoinedTeam, UserActionEnum.ConsideringOffer))
            };

            //По этому свойству отображается капитан в команде. А так как капитан может самоустраниться, то нужно менять свойство
            userTeam.IsOwner = false;

            try
            {
                context.Update(userTeam);
                await context.SaveChangesAsync();
            }
            catch (Exception)
            {
                throw new HttpStatusException(HttpStatusCode.InternalServerError, CommonErrorMessages.SaveChanges);
            }

            await RejectedOrRemoveUserNotify(model.UserId, team, userTeam.UserAction);

            return(Json(team));
        }
        public async Task <IActionResult> JoinTeam([FromBody] ManageUserTeamViewModel model)
        {
            logger.LogInformation($"POST Request {HttpContext.Request.Headers[":path"]}. Body: {JsonConvert.SerializeObject(model)}");

            var user = await context.Users
                       .Include(x => x.UserTeams)
                       .FirstOrDefaultAsync(u => u.Id == model.UserId);

            var userTeam = user.UserTeams.First(x => x.TeamId == model.TeamId);

            switch (userTeam.UserAction)
            {
            case UserActionEnum.ConsideringOffer when !await accessChecker.CanManageTeamOrSelfInTeam(model.TeamId, model.UserId):
            case UserActionEnum.SentRequest when !await accessChecker.CanManageTeam(model.TeamId):
                throw new HttpStatusException(HttpStatusCode.Forbidden, CommonErrorMessages.Forbidden);
            }

            var userIsNotAllowedToJoinTeam = userTeam.UserAction != UserActionEnum.ConsideringOffer &&
                                             userTeam.UserAction != UserActionEnum.SentRequest;

            if (userIsNotAllowedToJoinTeam)
            {
                var debugMsg = TeamErrorMessages.InvalidUserAction(model.UserId, userTeam, model.TeamId, UserActionEnum.SentRequest);

                throw new HttpStatusException(HttpStatusCode.BadRequest, UserErrorMessages.AppendToTeam, debugMsg);
            }

            var wasAction = userTeam.UserAction;

            userTeam.UserAction = UserActionEnum.JoinedTeam;

            try
            {
                context.Update(user);
                await context.SaveChangesAsync();
            }
            catch (Exception)
            {
                throw new HttpStatusException(HttpStatusCode.InternalServerError, CommonErrorMessages.SaveChanges);
            }

            var team = await context.Teams
                       .Include(t => t.Image)
                       .Include(x => x.UserTeams)
                       .ThenInclude(y => y.User)
                       .FirstOrDefaultAsync(x => x.Id == model.TeamId);

            await JoinTeamNotify(model.UserId, team, user, wasAction);

            return(Json(team));
        }
        //Пользователь сам отменяет заявку в команду (из профиля)
        public async Task <IActionResult> CancelRequestTeam(long teamId)
        {
            logger.LogInformation($"POST Request {HttpContext.Request.Headers[":path"]}");

            if (!accessChecker.IsConfirm(out var profileId))
            {
                throw new HttpStatusException(HttpStatusCode.Forbidden, CommonErrorMessages.Forbidden);
            }

            var user = context.Users
                       .Include(x => x.UserTeams)
                       .ThenInclude(x => x.Team)
                       .ThenInclude(y => y.Event)
                       .FirstOrDefault(x => x.Id == profileId);
            var userTeam = user?.UserTeams.FirstOrDefault(ut => ut.TeamId == teamId);

            if (userTeam == null)
            {
                throw new HttpStatusException(HttpStatusCode.NotFound, UserErrorMessages.NotFound, UserErrorMessages.DebugNotFoundUserTeam(profileId, teamId));
            }

            if (userTeam.UserAction != UserActionEnum.SentRequest)
            {
                var debugMsg = TeamErrorMessages.InvalidUserAction(profileId, userTeam, teamId, UserActionEnum.SentRequest);

                throw new HttpStatusException(HttpStatusCode.NotFound, UserErrorMessages.NotFound, debugMsg);
            }

            try
            {
                context.Remove(userTeam);
                await context.SaveChangesAsync();
            }
            catch (Exception)
            {
                throw new HttpStatusException(HttpStatusCode.NotFound, CommonErrorMessages.SaveChanges);
            }

            var activeUserTeams = user.GetActiveUserTeams();

            if (activeUserTeams.IsNullOrEmpty())
            {
                throw new HttpStatusException(HttpStatusCode.NoContent, "");
            }

            return(Json(activeUserTeams));
        }
        public async Task <IActionResult> CancelRequestUser([FromBody] ManageUserTeamViewModel model)
        {
            logger.LogInformation($"POST Request {HttpContext.Request.Headers[":path"]}. Body: {JsonConvert.SerializeObject(model)}");

            var team = await context.Teams
                       .Include(t => t.Image)
                       .Include(u => u.UserTeams)
                       .ThenInclude(ut => ut.User)
                       .FirstOrDefaultAsync(u => u.Id == model.TeamId);

            var userTeam = team?.UserTeams.FirstOrDefault(ut => ut.UserId == model.UserId);

            if (userTeam == null)
            {
                throw new HttpStatusException(HttpStatusCode.BadRequest, UserErrorMessages.NotFoundUserTeam,
                                              UserErrorMessages.DebugNotFoundUserTeam(model.UserId, model.TeamId));
            }

            switch (userTeam.UserAction)
            {
            case UserActionEnum.ConsideringOffer when !await accessChecker.CanManageTeam(model.TeamId):
            case UserActionEnum.SentRequest when !await accessChecker.CanManageTeamOrSelfInTeam(model.TeamId, model.UserId):
                throw new HttpStatusException(HttpStatusCode.Forbidden, CommonErrorMessages.Forbidden);
            }

            if (userTeam.UserAction != UserActionEnum.ConsideringOffer && userTeam.UserAction != UserActionEnum.SentRequest)
            {
                throw new HttpStatusException(HttpStatusCode.BadRequest,
                                              TeamErrorMessages.QuitDeclineTeam,
                                              TeamErrorMessages.InvalidUserAction(model.UserId, userTeam, model.TeamId,
                                                                                  UserActionEnum.ConsideringOffer, UserActionEnum.SentRequest));
            }

            try
            {
                context.Remove(userTeam);
                await context.SaveChangesAsync();
            }
            catch (Exception)
            {
                throw new HttpStatusException(HttpStatusCode.InternalServerError, CommonErrorMessages.SaveChanges);
            }

            return(Json(team));
        }
        //Пользователь выходит из команды / отказывается от приглашения (из профиля)
        public async Task <IActionResult> QuitOrDeclineTeam(long teamId)
        {
            logger.LogInformation($"GET Request {HttpContext.Request.Headers[":path"]}");

            if (!accessChecker.IsConfirm(out var profileId))
            {
                throw new HttpStatusException(HttpStatusCode.Forbidden, CommonErrorMessages.Forbidden);
            }

            var user = await context.Users
                       .Include(x => x.UserTeams)
                       .ThenInclude(x => x.Team)
                       .ThenInclude(y => y.Event)
                       .FirstOrDefaultAsync(x => x.Id == profileId);

            var userTeam = user.UserTeams
                           .First(y => y.TeamId == teamId);

            userTeam.UserAction = userTeam.UserAction switch
            {
                UserActionEnum.ConsideringOffer => UserActionEnum.RejectedTeamRequest,
                UserActionEnum.JoinedTeam => UserActionEnum.QuitTeam,
                _ => throw new HttpStatusException(HttpStatusCode.BadRequest,
                                                   TeamErrorMessages.QuitDeclineTeam,
                                                   TeamErrorMessages.InvalidUserAction(profileId, userTeam, teamId,
                                                                                       UserActionEnum.ConsideringOffer, UserActionEnum.JoinedTeam)
                                                   )
            };

            try
            {
                context.Update(user);
                await context.SaveChangesAsync();
            }
            catch (Exception)
            {
                throw new HttpStatusException(HttpStatusCode.NotFound, UserErrorMessages.NotFound);
            }

            await QuitOrDeclineTeamNotify(teamId, user, userTeam);

            return(Json(user.GetActiveUserTeams()));
        }
        // Принимает приглашение (из профиля)
        public async Task <IActionResult> JoinTeam(long teamId)
        {
            logger.LogInformation($"GET Request {HttpContext.Request.Headers[":path"]}");

            if (!accessChecker.IsConfirm(out var profileId))
            {
                throw new HttpStatusException(HttpStatusCode.Forbidden, CommonErrorMessages.Forbidden);
            }

            var user = await context.Users
                       .Include(x => x.UserTeams)
                       .ThenInclude(x => x.Team)
                       .ThenInclude(y => y.Event)
                       .FirstOrDefaultAsync(u => u.Id == profileId);

            var userTeam = user?.UserTeams.First(x => x.TeamId == teamId);

            if (userTeam?.UserAction != UserActionEnum.ConsideringOffer)
            {
                throw new HttpStatusException(HttpStatusCode.BadRequest, UserErrorMessages.AppendToTeam,
                                              TeamErrorMessages.InvalidUserAction(user.Id, userTeam, teamId, UserActionEnum.ConsideringOffer));
            }

            userTeam.UserAction = UserActionEnum.JoinedTeam;

            try
            {
                context.Update(user);
                await context.SaveChangesAsync();
            }
            catch (Exception)
            {
                throw new HttpStatusException(HttpStatusCode.InternalServerError, CommonErrorMessages.SaveChanges);
            }

            await JoinTeamNotify(teamId, user, userTeam.Team);

            return(Json(user.GetActiveUserTeams()));
        }
Esempio n. 7
0
        public async Task <IActionResult> Delete(long id)
        {
            logger.LogInformation($"DELETE Request {HttpContext.Request.Headers[":path"]}.");

            if (!await accessChecker.CanManageTeam(id))
            {
                throw new HttpStatusException(HttpStatusCode.Forbidden, CommonErrorMessages.Forbidden);
            }

            var team = await context.Teams.FirstOrDefaultAsync(t => t.Id == id);

            if (team == null)
            {
                throw new HttpStatusException(HttpStatusCode.BadRequest, TeamErrorMessages.NotFound, TeamErrorMessages.DebugNotFound(id));
            }

            try
            {
                context.Remove(team);
                await context.SaveChangesAsync();
            }
            catch (Exception)
            {
                throw new HttpStatusException(HttpStatusCode.InternalServerError, CommonErrorMessages.SaveChanges);
            }

            return(Json("Deleted"));
        }
Esempio n. 8
0
        public async Task <IActionResult> Edit([FromBody] EditTeamViewModel editTeamViewModel)
        {
            logger.LogInformation($"POST Request {HttpContext.Request.Headers[":path"]}. Body: {JsonConvert.SerializeObject(editTeamViewModel)}");

            var teamId = editTeamViewModel.Id;

            if (!await accessChecker.CanManageTeam(teamId))
            {
                throw new HttpStatusException(HttpStatusCode.Forbidden, CommonErrorMessages.Forbidden);
            }

            var team = await context.Teams.FirstOrDefaultAsync(t => t.Id == teamId);

            if (team == null)
            {
                throw new HttpStatusException(HttpStatusCode.BadRequest, TeamErrorMessages.NotFound, TeamErrorMessages.DebugNotFound(teamId));
            }

            var @event = await context.Events.FirstOrDefaultAsync(e => e.Id == editTeamViewModel.EventId);

            var config = new MapperConfiguration(cfg => cfg.CreateMap <EditTeamViewModel, Team>()
                                                 .ForMember("Event", opt => opt.MapFrom(_ => @event)));
            var mapper = new Mapper(config);

            mapper.Map(editTeamViewModel, team);

            try
            {
                context.Update(team);
                await context.SaveChangesAsync();
            }
            catch (Exception)
            {
                throw new HttpStatusException(HttpStatusCode.InternalServerError, CommonErrorMessages.SaveChanges);
            }

            return(Ok(team));
        }
        public async Task <IActionResult> SetTeam(long id, long teamId, bool isTeamOffer = true)
        {
            logger.LogInformation($"POST Request {HttpContext.Request.Headers[":path"]}");

            var dbTeam = await context.Teams
                         .Include(x => x.Image)
                         .Include(x => x.UserTeams)
                         .ThenInclude(x => x.User)
                         .Include(x => x.UserTeams)
                         .ThenInclude(x => x.Team)
                         .ThenInclude(x => x.Event)
                         .FirstOrDefaultAsync(x => x.Id == teamId);

            if (dbTeam == null)
            {
                throw new HttpStatusException(HttpStatusCode.NotFound, TeamErrorMessages.NotFound, TeamErrorMessages.DebugNotFound(teamId));
            }

            var userActionToSet = isTeamOffer
                                ? UserActionEnum.ConsideringOffer
                                : UserActionEnum.SentRequest;

            if (dbTeam.UserTeams.All(x => x.UserId != id))
            {
                dbTeam.UserTeams.Add(new UserTeam {
                    UserId = id, UserAction = userActionToSet
                });
            }
            else
            {
                var user = dbTeam.UserTeams.FirstOrDefault(x => x.UserId == id);
                if (user == null)
                {
                    throw new HttpStatusException(HttpStatusCode.NotFound, UserErrorMessages.NotFound, UserErrorMessages.DebugNotFound(id));
                }

                user.UserAction = userActionToSet;
            }

            try
            {
                context.Update(dbTeam);
                await context.SaveChangesAsync();
            }
            catch (Exception)
            {
                throw new HttpStatusException(HttpStatusCode.InternalServerError, CommonErrorMessages.SaveChanges);
            }

            await SetTeamNotify(id, dbTeam, userActionToSet);

            return(Json(dbTeam));
        }