Ejemplo n.º 1
0
        public async Task <ServiceResult> ResendInvite(Guid inviteId)
        {
            var result = new ServiceResult();
            var invite = await this.context.TeamInvites.FirstOrDefaultAsync(i => i.Id == inviteId);

            if (invite == null)
            {
                result.Error = Shared.ErrorKey.Invite.NotFound;
                return(result);
            }

            var team = await this.context.Teams.Include(t => t.Competition).FirstOrDefaultAsync(t => t.Id == invite.TeamId);

            var message = new DTO.EMail.Message <DTO.EMail.TeamInvite>(invite.Email, TransactionalEmail.TeamInvite, new DTO.EMail.TeamInvite(invite.Id, team.Competition.Id, team.Competition.Name, team.Competition.Slug, team.Id, team.Name, team.Slug));

            await this.backgroundWorker.SendMessage(this.queues.Email, message);

            // Do Send Stuff
            result.Succeed();
            return(result);
        }
Ejemplo n.º 2
0
 public async Task HandleEmail(DTO.EMail.Message <object> email)
 {
     await this.mailer.SendEmail(email.TransactionalType, email.Recipient, email.Data);
 }
Ejemplo n.º 3
0
        public async Task <ServiceResult> InviteMember(Guid teamId, string invitee)
        {
            var result = new ServiceResult();
            var team   = await this.context.Teams
                         .Include(t => t.TeamInvites)
                         .ThenInclude(t => t.UserProfile)
                         .Include(t => t.TeamMemberships)
                         .ThenInclude(t => t.UserProfile)
                         .Include(t => t.Competition)
                         .FirstOrDefaultAsync(t => t.Id == teamId);

            // Check if Team Exists
            if (team == null)
            {
                result.Error = Shared.ErrorKey.Team.TeamNotFound;
                return(result);
            }

            var invitedUser = await this.context.UserProfiles.FirstOrDefaultAsync(u => u.UserName == invitee || u.Email == invitee);

            // Check if User is already a member
            if (invitedUser != null && team.HasMember(invitedUser.Id))
            {
                result.Error = Shared.ErrorKey.Team.AlreadyInTeam;
                return(result);
            }

            // Check if there is already an invite for the user
            if (team.HasInvite(invitee) || (invitedUser != null && team.HasInvite(invitedUser.Id)))
            {
                result.Error = Shared.ErrorKey.Invite.AlreadyInvited;
                return(result);
            }

            var competition = team.Competition;

            if (competition == null)
            {
                result.Error = Shared.ErrorKey.Competition.NotFound;
                return(result);
            }

            if (!team.HasOpenSpots())
            {
                result.Error = Shared.ErrorKey.Competition.MaxTeamSize;
                return(result);
            }

            var invite = await this.DangerouslyCreateInvite(teamId, invitee);

            if (invite == null)
            {
                result.Error = Shared.ErrorKey.Invite.InvalidRecipient;
                return(result);
            }

            team.TeamInvites.Add(invite);

            this.context.Teams.Update(team);
            var message = new DTO.EMail.Message <DTO.EMail.TeamInvite>(invite.Email, TransactionalEmail.TeamInvite, new DTO.EMail.TeamInvite(invite.Id, team.Competition.Id, team.Competition.Name, team.Competition.Slug, team.Id, team.Name, team.Slug));

            await this.backgroundWorker.SendMessage(this.queues.Email, message);

            result.Succeed();
            return(result);
        }
Ejemplo n.º 4
0
        public async Task <ServiceResult> CreateTeam(Guid competitionId, DTO.Team.Create teamData, Guid userId)
        {
            var result = new ServiceResult();


            var competition = await this.context.Competitions.FirstOrDefaultAsync(t => t.Id == competitionId);

            if (competition == null)
            {
                result.Error = Shared.ErrorKey.Competition.NotFound;
                return(result);
            }

            // Check if name is taken
            if (context.Teams.Any(t => string.Equals(teamData.Name, t.Name, StringComparison.CurrentCultureIgnoreCase) && t.CompetitionId == competitionId && t.TeamState != TeamState.Disbanded))
            {
                result.Error = Shared.ErrorKey.Team.NameTaken;
                return(result);
            }

            // Check User Existence
            var user = await context.UserProfiles.Include(u => u.TeamMemberships).ThenInclude(m => m.Team).FirstOrDefaultAsync(u => u.Id == userId);

            if (user == null)
            {
                result.Error = Shared.ErrorKey.UserProfile.UserNotFound;
            }

            // Check if user is already in team for this competition
            if (user.HasTeam(competitionId))
            {
                result.Error = Shared.ErrorKey.UserProfile.AlreadyInCompetitionTeam;
                return(result);
            }

            var profanityCheck = await this.profanityValidator.Check(teamData.Name);

            if (profanityCheck.Severity == ProfanityFilterSeverity.Blacklist)
            {
                this.slackClient.SendMessage($"[SEVERITY 1] User {user.UserName} ({userId}) tried to create a Team called {teamData.Name} in Competition {competition.Name} ({competition.Id}), we blocked this action", Shared.ExternalResources.Slack.ProfanityFilterChannel);

                result.Error = Shared.ErrorKey.ProfanityFilter.BlacklistedWord;
                return(result);
            }
            else if (profanityCheck.Severity == ProfanityFilterSeverity.Suspicious)
            {
                this.slackClient.SendMessage($"[SEVERITY 2] User {user.UserName} ({userId}) created a Team called {teamData.Name} in Competition {competition.Name} ({competition.Id})", Shared.ExternalResources.Slack.ProfanityFilterChannel);
            }


            var team = await this.DangerouslyCreateTeam(competitionId, teamData, user.Id);

            this.context.Teams.Add(team);
            foreach (var invite in team.TeamInvites.ToList())
            {
                var message = new DTO.EMail.Message <DTO.EMail.TeamInvite>(invite.Email, TransactionalEmail.TeamInvite, new DTO.EMail.TeamInvite(invite.Id, competition.Id, competition.Name, competition.Slug, team.Id, team.Name, team.Slug));
                await this.backgroundWorker.SendMessage(this.queues.Email, message);
            }

            this.cacheBreaker.Break(Shared.Cache.Competition.Detail(competition.Id));
            result.Succeed();

            return(result);
        }