diff --git a/Foxnouns.Backend/Controllers/Authentication/FediverseAuthController.cs b/Foxnouns.Backend/Controllers/Authentication/FediverseAuthController.cs index 3dcc817..edc7b6a 100644 --- a/Foxnouns.Backend/Controllers/Authentication/FediverseAuthController.cs +++ b/Foxnouns.Backend/Controllers/Authentication/FediverseAuthController.cs @@ -44,7 +44,7 @@ public class FediverseAuthController( [ProducesResponseType(statusCode: StatusCodes.Status200OK)] public async Task GetFediverseUrlAsync( [FromQuery] string instance, - [FromQuery] bool forceRefresh = false + [FromQuery(Name = "force-refresh")] bool forceRefresh = false ) { if (instance.Any(c => c is '@' or ':' or '/') || !instance.Contains('.')) @@ -139,7 +139,7 @@ public class FediverseAuthController( [Authorize("*")] public async Task AddFediverseAccountAsync( [FromQuery] string instance, - [FromQuery] bool forceRefresh = false + [FromQuery(Name = "force-refresh")] bool forceRefresh = false ) { if (instance.Any(c => c is '@' or ':' or '/') || !instance.Contains('.')) diff --git a/Foxnouns.Backend/Controllers/Moderation/ReportsController.cs b/Foxnouns.Backend/Controllers/Moderation/ReportsController.cs index b8acc56..3e9f905 100644 --- a/Foxnouns.Backend/Controllers/Moderation/ReportsController.cs +++ b/Foxnouns.Backend/Controllers/Moderation/ReportsController.cs @@ -173,6 +173,9 @@ public class ReportsController( public async Task GetReportsAsync( [FromQuery] int? limit = null, [FromQuery] Snowflake? before = null, + [FromQuery] Snowflake? after = null, + [FromQuery(Name = "by-reporter")] Snowflake? byReporter = null, + [FromQuery(Name = "by-target")] Snowflake? byTarget = null, [FromQuery(Name = "include-closed")] bool includeClosed = false ) { @@ -187,11 +190,21 @@ public class ReportsController( IQueryable query = db .Reports.Include(r => r.Reporter) .Include(r => r.TargetUser) - .Include(r => r.TargetMember) - .OrderByDescending(r => r.Id); + .Include(r => r.TargetMember); + + if (byTarget != null && await db.Users.AnyAsync(u => u.Id == byTarget.Value)) + query = query.Where(r => r.TargetUserId == byTarget.Value); + + if (byReporter != null && await db.Users.AnyAsync(u => u.Id == byReporter.Value)) + query = query.Where(r => r.ReporterId == byReporter.Value); if (before != null) - query = query.Where(r => r.Id < before.Value); + query = query.Where(r => r.Id < before.Value).OrderByDescending(r => r.Id); + else if (after != null) + query = query.Where(r => r.Id > after.Value).OrderBy(r => r.Id); + else + query = query.OrderByDescending(r => r.Id); + if (!includeClosed) query = query.Where(r => r.Status == ReportStatus.Open); diff --git a/Foxnouns.Backend/Dto/User.cs b/Foxnouns.Backend/Dto/User.cs index c681001..f193811 100644 --- a/Foxnouns.Backend/Dto/User.cs +++ b/Foxnouns.Backend/Dto/User.cs @@ -48,6 +48,7 @@ public record UserResponse( [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] Instant? LastActive, [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] Instant? LastSidReroll, [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] string? Timezone, + [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] bool? Suspended, [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] bool? Deleted ); diff --git a/Foxnouns.Backend/Middleware/LimitMiddleware.cs b/Foxnouns.Backend/Middleware/LimitMiddleware.cs index 82613c5..1c5f522 100644 --- a/Foxnouns.Backend/Middleware/LimitMiddleware.cs +++ b/Foxnouns.Backend/Middleware/LimitMiddleware.cs @@ -23,25 +23,29 @@ public class LimitMiddleware : IMiddleware Endpoint? endpoint = ctx.GetEndpoint(); LimitAttribute? attribute = endpoint?.Metadata.GetMetadata(); + Token? token = ctx.GetToken(); + if (attribute == null) { + // Check for authorize attribute + // If it exists, and the user is deleted, throw an error. + if ( + endpoint?.Metadata.GetMetadata() != null + && token?.User.Deleted == true + ) + { + throw new ApiError.Forbidden("Deleted users cannot access this endpoint."); + } + await next(ctx); return; } - Token? token = ctx.GetToken(); - if ( - token?.User.Deleted == true - && (!attribute.UsableBySuspendedUsers || token.User.DeletedBy == null) - ) - { + if (token?.User.Deleted == true && !attribute.UsableBySuspendedUsers) throw new ApiError.Forbidden("Deleted users cannot access this endpoint."); - } if (attribute.RequireAdmin && token?.User.Role != UserRole.Admin) - { throw new ApiError.Forbidden("This endpoint can only be used by admins."); - } if ( attribute.RequireModerator diff --git a/Foxnouns.Backend/Services/ModerationRendererService.cs b/Foxnouns.Backend/Services/ModerationRendererService.cs index e5d8165..deed9c5 100644 --- a/Foxnouns.Backend/Services/ModerationRendererService.cs +++ b/Foxnouns.Backend/Services/ModerationRendererService.cs @@ -21,7 +21,6 @@ using Newtonsoft.Json.Linq; namespace Foxnouns.Backend.Services; public class ModerationRendererService( - DatabaseContext db, UserRendererService userRenderer, MemberRendererService memberRenderer ) diff --git a/Foxnouns.Backend/Services/UserRendererService.cs b/Foxnouns.Backend/Services/UserRendererService.cs index 7a00328..df40e1a 100644 --- a/Foxnouns.Backend/Services/UserRendererService.cs +++ b/Foxnouns.Backend/Services/UserRendererService.cs @@ -115,6 +115,7 @@ public class UserRendererService( tokenHidden ? user.LastActive : null, tokenHidden ? user.LastSidReroll : null, tokenHidden ? user.Timezone ?? "" : null, + tokenHidden ? user is { Deleted: true, DeletedBy: not null } : null, tokenHidden ? user.Deleted : null ); } diff --git a/Foxnouns.Frontend/src/lib/api/models/user.ts b/Foxnouns.Frontend/src/lib/api/models/user.ts index 29740e6..6cd8e4c 100644 --- a/Foxnouns.Frontend/src/lib/api/models/user.ts +++ b/Foxnouns.Frontend/src/lib/api/models/user.ts @@ -26,6 +26,7 @@ export type MeUser = UserWithMembers & { last_active: string; last_sid_reroll: string; timezone: string; + suspended: boolean; deleted: boolean; }; diff --git a/Foxnouns.Frontend/src/lib/components/Navbar.svelte b/Foxnouns.Frontend/src/lib/components/Navbar.svelte index 365ede2..68c1b14 100644 --- a/Foxnouns.Frontend/src/lib/components/Navbar.svelte +++ b/Foxnouns.Frontend/src/lib/components/Navbar.svelte @@ -21,10 +21,17 @@ {#if user && user.deleted} -
- {$t("nav.suspended-account-hint")} -
- {$t("nav.appeal-suspension-link")} +
+ {#if user.suspended} + {$t("nav.suspended-account-hint")} +
+ {$t("nav.appeal-suspension-link")} + {:else} + {$t("nav.deleted-account-hint")} +
+ {$t("nav.reactivate-account-link")} • + {$t("nav.delete-permanently-link")} + {/if}
{/if} @@ -66,7 +73,7 @@