From 045964ffb775fdadb69bbc42f52368fd0d42c2ed Mon Sep 17 00:00:00 2001 From: sam Date: Mon, 27 Jan 2025 16:25:49 +0100 Subject: [PATCH] feat(backend): report detail endpoint --- .../Moderation/ReportsController.cs | 29 +++++++++++++++++++ Foxnouns.Backend/Dto/Moderation.cs | 6 ++++ 2 files changed, 35 insertions(+) diff --git a/Foxnouns.Backend/Controllers/Moderation/ReportsController.cs b/Foxnouns.Backend/Controllers/Moderation/ReportsController.cs index c46defb..2bd2b2d 100644 --- a/Foxnouns.Backend/Controllers/Moderation/ReportsController.cs +++ b/Foxnouns.Backend/Controllers/Moderation/ReportsController.cs @@ -220,7 +220,36 @@ public class ReportsController( return Ok(reports.Select(moderationRenderer.RenderReport)); } + [HttpGet("reports/{id}")] + [Authorize("user.moderation")] + [Limit(RequireModerator = true)] + public async Task GetReportAsync(Snowflake id, CancellationToken ct = default) + { + Report? report = await db + .Reports.Include(r => r.Reporter) + .Include(r => r.TargetUser) + .Include(r => r.TargetMember) + .FirstOrDefaultAsync(r => r.Id == id, ct); + if (report == null) + throw new ApiError.NotFound("No report with that ID found."); + + return Ok( + new ReportDetailResponse( + Report: moderationRenderer.RenderReport(report), + User: await userRenderer.RenderUserAsync( + report.TargetUser, + renderMembers: false, + ct: ct + ), + Member: report.TargetMember != null + ? memberRenderer.RenderMember(report.TargetMember) + : null + ) + ); + } + [HttpPost("reports/{id}/ignore")] + [Authorize("user.moderation")] [Limit(RequireModerator = true)] public async Task IgnoreReportAsync( Snowflake id, diff --git a/Foxnouns.Backend/Dto/Moderation.cs b/Foxnouns.Backend/Dto/Moderation.cs index 58a38a6..e45c166 100644 --- a/Foxnouns.Backend/Dto/Moderation.cs +++ b/Foxnouns.Backend/Dto/Moderation.cs @@ -35,6 +35,12 @@ public record ReportResponse( JObject? Snapshot ); +public record ReportDetailResponse( + ReportResponse Report, + UserResponse User, + [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] MemberResponse? Member +); + public record AuditLogResponse( Snowflake Id, AuditLogEntity Moderator,