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)); }
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; }
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)); }