public async Task <Player> Enlist([FromBody] PlayerEnlistment model)
        {
            AuthorizeAny(
                () => Actor.IsRegistrar,
                () => model.UserId == Actor.Id,
                () => PlayerService.MapId(model.PlayerId).Result == Actor.Id
                );

            await Validate(model);

            return(await PlayerService.Enlist(model, Actor.IsRegistrar));
        }
Exemple #2
0
        private async Task _validate(PlayerEnlistment model)
        {
            if (model.Code.IsEmpty())
            {
                throw new InvalidInvitationCode();
            }

            if (model.PlayerId.NotEmpty() && (await Exists(model.PlayerId)).Equals(false))
            {
                throw new ResourceNotFound();
            }

            if (model.UserId.NotEmpty() && (await UserExists(model.UserId)).Equals(false))
            {
                throw new ResourceNotFound();
            }

            await Task.CompletedTask;
        }
Exemple #3
0
        public async Task <Player> Enlist(PlayerEnlistment model, bool sudo = false)
        {
            var manager = await Store.List()
                          .Include(p => p.Game)
                          .FirstOrDefaultAsync(
                p => p.InviteCode == model.Code
                )
            ;

            if (manager is not Data.Player)
            {
                throw new InvalidInvitationCode();
            }

            var player = model.PlayerId.NotEmpty()
                ? await Store.Retrieve(model.PlayerId)
                : await Store.List().FirstOrDefaultAsync(p =>
                                                         p.UserId == model.UserId &&
                                                         p.GameId == manager.GameId
                                                         )
            ;

            if (player is not Data.Player)
            {
                //returns the model, but we want the entity
                var tmp = await Register(new NewPlayer {
                    UserId = model.UserId,
                    GameId = manager.GameId
                });

                player = await Store.Retrieve(tmp.Id);
            }

            if (player.Id == manager.Id)
            {
                return(Mapper.Map <Player>(player));
            }

            if (!sudo && !manager.Game.RegistrationActive)
            {
                throw new RegistrationIsClosed();
            }

            if (!sudo && manager.SessionBegin.Year > 1)
            {
                throw new RegistrationIsClosed();
            }

            if (!sudo && manager.Game.RequireSponsoredTeam && !manager.Sponsor.Equals(player.Sponsor))
            {
                throw new RequiresSameSponsor();
            }

            int count = await Store.List().CountAsync(p => p.TeamId == manager.TeamId);

            if (!sudo && manager.Game.AllowTeam && count >= manager.Game.MaxTeamSize)
            {
                throw new TeamIsFull();
            }

            player.TeamId       = manager.TeamId;
            player.Name         = manager.Name;
            player.ApprovedName = manager.ApprovedName;
            player.Role         = PlayerRole.Member;

            await Store.Update(player);

            return(Mapper.Map <Player>(player));
        }