// __ Impl ____________________________________________________________ private PlayerNotificationData GetPasswordResetNotifData(IDbConnection c, string email) { var user = GetUserForEmail(c, email); /*var mr = c.QueryMultiple(@" * SELECT u.id, u.name, u.email, u.mobile, u.emailConfirmed FROM users u WHERE email ilike @email; * SELECT id, name, logoImgUrl FROM organizations LIMIT 1; * ", new { email = email });*/ var mr = c.QueryFirst <PublicOrganization>(@"SELECT id, name, logoImgUrl FROM organizations LIMIT 1;"); var toUser = user; //var toUser = mr.ReadFirst<User>(); var fromUser = toUser; //var org = mr.ReadFirst<PublicOrganization>(); var org = mr; var activationLink = PlayersController.GetActivationLink(Request, mTokenManager, toUser); var result = new PlayerNotificationData { From = fromUser, To = toUser, Org = org, ActivationLink = activationLink, Images = new PlayerInviteImages { OrgLogo = Utils.GetUploadUrl(Request, org.LogoImgUrl, org.Id, "org"), } }; return(result); }
public async Task <IActionResult> TeamUploadAsync([FromForm] TeamFile file) { // JSON file => string var stringBuilder = new StringBuilder(); using (var reader = new StreamReader(file.File.OpenReadStream())) { while (reader.Peek() >= 0) { stringBuilder.AppendLine(await reader.ReadLineAsync()); } } string JSONString = stringBuilder.ToString(); // Set file content to Team Object JObject jObjectTeam = JObject.Parse(JSONString); Team team = jObjectTeam.ToObject <Team>(); long idTournamnet = file.IdTournament; return(DbOperation(conn => { CheckAuthLevel(UserLevel.OrgAdmin); if (team == null) { throw new NoDataException(); } long idTeam = team.Id; // var existTeamQuery = conn.Query($"SELECT * FROM teams WHERE id = {team.Id} OR name = '{team.Name}' OR keyname = '{team.KeyName}';"); // 🔎 External Org team can overrrite team.id values so will make query more restrictive var existTeamQuery = conn.Query($"SELECT * FROM teams WHERE id = {team.Id} AND name = '{team.Name}' AND keyname = '{team.KeyName}';"); bool teamExitst = existTeamQuery.Count() > 0; if (!teamExitst) { // Add team and add Team to Tournament Audit.Information(this, "{0}: Teams.CreateInTournament {idTournament} -> {Name}", GetUserId(), team.Name, idTournamnet); var teamId = conn.Insert(team); idTeam = teamId; conn.Insert(new TournamentTeam { IdTournament = idTournamnet, IdTeam = teamId }); } else { var existsTeamInTournamentQuery = conn.Query($"SELECT * FROM tournamentteams WHERE idtournament = {idTournamnet} AND idteam = '{idTeam}';"); bool existsTeamInTournament = existsTeamInTournamentQuery.Count() > 0; if (!existsTeamInTournament) { // Add team just into tournamnet Audit.Information(this, "{0}: Teams.AddToTournament {idTournament} -> {idTeam}", GetUserId(), idTournamnet, idTeam); conn.Insert(new TournamentTeam { IdTournament = idTournamnet, IdTeam = idTeam }); // TODO: Notify team admin (if any) her team has been added to the competition. } if (existsTeamInTournament) { return new Exception("Error.Team_already_exitsts_in_tournament"); } } // 🚧🚧🚧 Add players to team foreach (var player in team.Players) { if (player == null || player.UserData == null || player.TeamData == null) { throw new Exception("Malformed request"); } Audit.Information(this, "{0}: Players.CreatePlayer {Name} {Surname}", GetUserId(), player.Name, player.Surname); // User email should exists bool userExists = PlayersController.CheckUserExistsInGlobalDirectory(Request, player.UserData.Id, player.UserData.Email); if (!userExists) { throw new Exception($"{player.UserData.Email} does not exists in the global directory."); } var invite = new InviteInput { IdPlayer = player.Id, IdTeam = idTeam, InviteText = "Hi, we want to invite you to join our team." }; // 🚧 Lang DbTransaction((c, t) => { Audit.Information(this, "{0}: Players.Invite1: {IdTeam} {IdPlayer}", GetUserId(), invite.IdTeam, invite.IdPlayer); if (!IsOrganizationAdmin() && !IsTeamAdmin(invite.IdTeam, c)) { throw new UnauthorizedAccessException(); } // Validate player is not already on the team. var existingPlayer = c.ExecuteScalar <int>("SELECT COUNT(*) FROM teamplayers WHERE idteam = @idTeam AND idplayer = @idPlayer", invite, t); if (existingPlayer > 0) { throw new Exception("Error.PlayerAlreadyInTeam"); } invite.InviteText = mSanitizer.Sanitize(invite.InviteText); var userOrg = c.QueryFirstOrDefault <User>($"SELECT * FROM users WHERE id = {player.IdUser}"); var notifData = new PlayerNotificationData { }; if (userOrg == null) { // Insert player var newPlayer = PlayersController.InsertPlayer(c, t, player, player.IdUser, GetUserId(), false, null, UserEventType.PlayerImported); invite.IdPlayer = newPlayer.Id; // Importing player that not exists in current org users notifData = GetPlayerNotification(c, GetUserId(), invite.IdPlayer, invite.IdTeam, false, player.IdUser); } else { // Get current org player id becouse import Id can overlap var playerOrg = c.QueryFirstOrDefault <Player>($"SELECT * FROM players WHERE iduser = {userOrg.Id}"); if (playerOrg == null) { throw new Exception("Error.PlayerNotFound"); // Player should exist } invite.IdPlayer = playerOrg.Id; notifData = GetPlayerNotification(c, GetUserId(), invite.IdPlayer, invite.IdTeam); } // Create the teamplayers record var tp = new TeamPlayer { IdPlayer = invite.IdPlayer, IdTeam = invite.IdTeam, IsTeamAdmin = false, Status = 1 }; c.Insert(tp, t); // UserEvent c.Insert(new UserEvent { IdCreator = GetUserId(), IdUser = notifData.To.Id, Type = (int)UserEventType.PlayerInvitedToTeam, TimeStamp = DateTime.Now, Description = notifData.Team.Name }, t); notifData.InviteMessage = invite.InviteText; Audit.Information(this, "{0}: Players.Invite2: {1} {2}", GetUserId(), notifData.Team.Name, notifData.To.Name); mNotifications.NotifyEmail(Request, c, t, TemplateKeys.EmailPlayerInviteHtml, notifData); return true; }); } return true; })); }