Пример #1
0
        // __ 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);
        }
Пример #2
0
        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;
            }));
        }