/// <inheritdoc /> public async Task AddClaimMapping(IGuildUser user, ClaimMappingType type, AuthorizationClaim claim) { RequireAuthenticatedUser(); RequireClaims(AuthorizationClaim.AuthorizationConfigure); using (var transaction = await ClaimMappingRepository.BeginCreateTransactionAsync()) { if (await ClaimMappingRepository.AnyAsync(new ClaimMappingSearchCriteria() { Types = new[] { type }, GuildId = user.Guild.Id, UserId = user.Id, Claims = new[] { claim }, IsDeleted = false, })) { throw new InvalidOperationException($"A claim mapping of type {type} to claim {claim} for user {user.GetDisplayName()} already exists"); } await ClaimMappingRepository.CreateAsync(new ClaimMappingCreationData() { GuildId = user.Guild.Id, Type = type, UserId = user.Id, Claim = claim, CreatedById = CurrentUserId.Value }); transaction.Commit(); } }
/// <inheritdoc /> public async Task AutoConfigureGuildAsync(IGuild guild) { if (await ClaimMappingRepository.AnyAsync(guild.Id)) { return; } await UserService.TrackUserAsync(DiscordClient.CurrentUser); foreach (var claim in Enum.GetValues(typeof(AuthorizationClaim)).Cast <AuthorizationClaim>()) { foreach (var role in guild.Roles.Where(x => x.Permissions.Administrator)) { await ClaimMappingRepository.CreateAsync(new ClaimMappingCreationData() { Type = ClaimMappingType.Granted, GuildId = guild.Id, RoleId = role.Id, UserId = null, Claim = claim, CreatedById = DiscordClient.CurrentUser.Id }); } await ClaimMappingRepository.CreateAsync(new ClaimMappingCreationData() { Type = ClaimMappingType.Granted, GuildId = guild.Id, RoleId = null, UserId = DiscordClient.CurrentUser.Id, Claim = claim, CreatedById = DiscordClient.CurrentUser.Id }); } }
/// <inheritdoc /> public async Task ModifyClaimMapping(ulong roleId, AuthorizationClaim claim, ClaimMappingType?newType) { RequireAuthenticatedUser(); RequireClaims(AuthorizationClaim.AuthorizationConfigure); var foundClaims = await ClaimMappingRepository.SearchBriefsAsync(new ClaimMappingSearchCriteria { Claims = new[] { claim }, RoleIds = new[] { roleId }, GuildId = CurrentGuildId }); using (var transaction = await ClaimMappingRepository.BeginCreateTransactionAsync()) { foreach (var existing in foundClaims) { await ClaimMappingRepository.TryDeleteAsync(existing.Id, CurrentUserId.Value); } if (newType.HasValue) { await ClaimMappingRepository.CreateAsync(new ClaimMappingCreationData() { GuildId = CurrentGuildId.Value, Type = newType.Value, RoleId = roleId, Claim = claim, CreatedById = CurrentUserId.Value }); } transaction.Commit(); } }
/// <inheritdoc /> public async Task AutoConfigureGuildAsync(IGuild guild) { if (await ClaimMappingRepository.AnyAsync(new ClaimMappingSearchCriteria() { GuildId = guild.Id, IsDeleted = false, })) { return; } // Need the bot user to exist, before we start adding claims, created by the bot user. await UserService.TrackUserAsync(DiscordClient.CurrentUser); using (var transaction = await ClaimMappingRepository.BeginCreateTransactionAsync()) { foreach (var claim in Enum.GetValues(typeof(AuthorizationClaim)).Cast <AuthorizationClaim>()) { foreach (var role in guild.Roles.Where(x => x.Permissions.Administrator)) { await ClaimMappingRepository.CreateAsync(new ClaimMappingCreationData() { Type = ClaimMappingType.Granted, GuildId = guild.Id, RoleId = role.Id, UserId = null, Claim = claim, CreatedById = DiscordClient.CurrentUser.Id }); } } transaction.Commit(); } }