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); }
public async Task HandleEmail(DTO.EMail.Message <object> email) { await this.mailer.SendEmail(email.TransactionalType, email.Recipient, email.Data); }
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); }
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); }