Exemplo n.º 1
0
        public async Task <IActionResult> Register(
            int cid, GymRegisterModel model,
            [FromServices] ITrainingStore training,
            [FromServices] UserManager userManager)
        {
            if (ViewData.ContainsKey("HasTeam"))
            {
                return(GoBackHome("Already registered"));
            }
            if (Contest.RegisterDefaultCategory == 0 || User.IsInRole("Blocked"))
            {
                return(GoBackHome("Error registration closed."));
            }

            string teamName;

            int[] uids;
            int   affId;
            var   uid = int.Parse(User.GetUserId());

            if (model.AsIndividual)
            {
                var affs = await Facade.Teams.ListAffiliationAsync(cid, false);

                string defaultAff = User.IsInRole("Student") ? "jlu" : "null";
                var    aff        = affs.FirstOrDefault(a => a.ExternalId == defaultAff);
                if (aff == null)
                {
                    return(GoBackHome("No default affiliation."));
                }
                affId = aff.AffiliationId;
                uids  = new[] { uid };

                var user = await userManager.GetUserAsync(User);

                if (user.StudentId.HasValue && user.StudentVerified)
                {
                    teamName = (await userManager.FindStudentAsync(user.StudentId.Value)).Name;
                }
                else
                {
                    teamName = user.NickName;
                }
                teamName ??= user.UserName;
            }
            else
            {
                var team = await training.FindTeamByIdAsync(model.TeamId);

                if (team == null)
                {
                    return(GoBackHome("Error team or team member."));
                }
                (teamName, affId) = (team.TeamName, team.AffiliationId);

                var users = await training.ListMembersAsync(team, true);

                uids = (model.UserIds ?? Enumerable.Empty <int>()).Append(uid).Distinct().ToArray();
                if (uids.Except(users.Select(g => g.UserId)).Any())
                {
                    return(GoBackHome("Error team or team member."));
                }
            }

            int tid = await Facade.Teams.CreateAsync(
                uids : uids,
                team : new Team
            {
                AffiliationId = affId,
                ContestId     = Contest.ContestId,
                CategoryId    = Contest.RegisterDefaultCategory,
                RegisterTime  = DateTimeOffset.Now,
                Status        = 1,
                TeamName      = teamName,
            });

            await HttpContext.AuditAsync("added", $"{tid}");

            StatusMessage = "Registration succeeded.";
            return(RedirectToAction(nameof(Home)));
        }