/// <inheritdoc /> public async Task RescindInfractionAsync(long infractionId, string reason) { AuthorizationService.RequireClaims(AuthorizationClaim.ModerationRescind); var infraction = await InfractionRepository.ReadAsync(infractionId); if (infraction == null) { throw new ArgumentException("Infraction does not exist", nameof(infractionId)); } switch (infraction.Type) { case InfractionType.Mute: await DoDiscordUnMuteAsync(infraction.Subject.Id); break; case InfractionType.Ban: await DoDiscordUnBanAsync(infraction.Subject.Id); break; } var actionId = await ModerationActionRepository.CreateAsync(new ModerationActionCreationData() { Type = ModerationActionType.InfractionRescinded, CreatedById = AuthorizationService.CurrentUserId.Value, Reason = reason, InfractionId = infractionId }); // TODO: Log action to a channel, pulled from IModerationConfigRepository. }
public void Constructor_Always_InvokesBaseConstructor() { var modixContext = Substitute.For <ModixContext>(); var uut = new ModerationActionRepository(modixContext); uut.ModixContext.ShouldBeSameAs(modixContext); }
/// <inheritdoc /> public async Task CreateInfractionAsync(InfractionType type, ulong subjectId, string reason, TimeSpan?duration) { AuthorizationService.RequireClaims(_createInfractionClaimsByType[type]); switch (type) { case InfractionType.Mute: await DoDiscordMuteAsync(subjectId); break; case InfractionType.Ban: await DoDiscordBanAsync(subjectId); break; } var actionId = await ModerationActionRepository.CreateAsync(new ModerationActionCreationData() { Type = ModerationActionType.InfractionCreated, CreatedById = AuthorizationService.CurrentUserId.Value, Reason = reason }); var infractionId = await InfractionRepository.CreateAsync(new InfractionCreationData() { Type = type, SubjectId = subjectId, Duration = duration, CreateActionId = actionId }); await ModerationActionRepository.UpdateAsync(actionId, data => { data.InfractionId = infractionId; }); // TODO: Log action to a channel, pulled from IModerationConfigRepository. // TODO: Implement InfractionAutoExpirationBehavior (or whatever) to automatically rescind infractions, based on Duration, and notify it here that a new infraction has been created, if it has a duration. }
/// <inheritdoc /> public Task <IReadOnlyCollection <ModerationActionSummary> > SearchModerationActionsAsync(ModerationActionSearchCriteria searchCriteria) => ModerationActionRepository.SearchSummariesAsync(searchCriteria);
/// <inheritdoc /> public Task <ModerationActionSummary> GetModerationActionSummaryAsync(long moderationActionId) { AuthorizationService.RequireClaims(AuthorizationClaim.ModerationRead); return(ModerationActionRepository.ReadSummaryAsync(moderationActionId)); }
/// <inheritdoc /> public Task <ModerationActionSummary> GetModerationActionSummaryAsync(long moderationActionId) { return(ModerationActionRepository.ReadSummaryAsync(moderationActionId)); }
/// <inheritdoc /> public async Task <ServiceResult <IReadOnlyCollection <ModerationActionSummary> > > SearchModerationActionsAsync(ModerationActionSearchCriteria searchCriteria) => await AuthorizationService.CheckClaims(AuthorizationClaim.ModerationRead) .ShortCircuitAsync(ModerationActionRepository.SearchSummariesAsync(searchCriteria));
/// <inheritdoc /> public async Task <ServiceResult <ModerationActionSummary> > GetModerationActionSummaryAsync(long moderationActionId) => await AuthorizationService.CheckClaims(AuthorizationClaim.ModerationRead) .ShortCircuitAsync(ModerationActionRepository.ReadSummaryAsync(moderationActionId));