feat(backend): return settings in GET /users/@me

This commit is contained in:
sam 2025-04-06 15:32:26 +02:00
parent 3527acb8ba
commit 22be49976a
Signed by: sam
GPG key ID: B4EF20DDE721CAA1
4 changed files with 18 additions and 12 deletions

View file

@ -46,7 +46,15 @@ public class UsersController(
{ {
User user = await db.ResolveUserAsync(userRef, CurrentToken, ct); User user = await db.ResolveUserAsync(userRef, CurrentToken, ct);
return Ok( return Ok(
await userRenderer.RenderUserAsync(user, CurrentUser, CurrentToken, true, true, ct: ct) await userRenderer.RenderUserAsync(
user,
CurrentUser,
CurrentToken,
renderMembers: true,
renderAuthMethods: true,
renderSettings: true,
ct: ct
)
); );
} }
@ -261,15 +269,6 @@ public class UsersController(
return Ok(user.CustomPreferences); return Ok(user.CustomPreferences);
} }
[HttpGet("@me/settings")]
[Authorize("user.read_hidden")]
[ProducesResponseType<UserSettings>(statusCode: StatusCodes.Status200OK)]
public async Task<IActionResult> GetUserSettingsAsync(CancellationToken ct = default)
{
User user = await db.Users.FirstAsync(u => u.Id == CurrentUser!.Id, ct);
return Ok(user.Settings);
}
[HttpPatch("@me/settings")] [HttpPatch("@me/settings")]
[Authorize("user.read_hidden", "user.update")] [Authorize("user.read_hidden", "user.update")]
[ProducesResponseType<UserSettings>(statusCode: StatusCodes.Status200OK)] [ProducesResponseType<UserSettings>(statusCode: StatusCodes.Status200OK)]

View file

@ -49,7 +49,8 @@ public record UserResponse(
[property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] Instant? LastSidReroll, [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] Instant? LastSidReroll,
[property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] string? Timezone, [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] string? Timezone,
[property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] bool? Suspended, [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] bool? Suspended,
[property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] bool? Deleted [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] bool? Deleted,
[property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] UserSettings? Settings
); );
public record CustomPreferenceResponse( public record CustomPreferenceResponse(

View file

@ -33,6 +33,7 @@ public class UserRendererService(
bool renderMembers = true, bool renderMembers = true,
bool renderAuthMethods = false, bool renderAuthMethods = false,
string? overrideSid = null, string? overrideSid = null,
bool renderSettings = false,
CancellationToken ct = default CancellationToken ct = default
) => ) =>
await RenderUserInnerAsync( await RenderUserInnerAsync(
@ -42,6 +43,7 @@ public class UserRendererService(
renderMembers, renderMembers,
renderAuthMethods, renderAuthMethods,
overrideSid, overrideSid,
renderSettings,
ct ct
); );
@ -52,6 +54,7 @@ public class UserRendererService(
bool renderMembers = true, bool renderMembers = true,
bool renderAuthMethods = false, bool renderAuthMethods = false,
string? overrideSid = null, string? overrideSid = null,
bool renderSettings = false,
CancellationToken ct = default CancellationToken ct = default
) )
{ {
@ -62,6 +65,7 @@ public class UserRendererService(
renderMembers = renderMembers && (!user.ListHidden || tokenCanReadHiddenMembers); renderMembers = renderMembers && (!user.ListHidden || tokenCanReadHiddenMembers);
renderAuthMethods = renderAuthMethods && tokenPrivileged; renderAuthMethods = renderAuthMethods && tokenPrivileged;
renderSettings = renderSettings && tokenHidden;
IEnumerable<Member> members = renderMembers IEnumerable<Member> members = renderMembers
? await db.Members.Where(m => m.UserId == user.Id).OrderBy(m => m.Name).ToListAsync(ct) ? await db.Members.Where(m => m.UserId == user.Id).OrderBy(m => m.Name).ToListAsync(ct)
@ -117,7 +121,8 @@ public class UserRendererService(
tokenHidden ? user.LastSidReroll : null, tokenHidden ? user.LastSidReroll : null,
tokenHidden ? user.Timezone ?? "<none>" : null, tokenHidden ? user.Timezone ?? "<none>" : null,
tokenHidden ? user is { Deleted: true, DeletedBy: not null } : null, tokenHidden ? user is { Deleted: true, DeletedBy: not null } : null,
tokenHidden ? user.Deleted : null tokenHidden ? user.Deleted : null,
renderSettings ? user.Settings : null
); );
} }

View file

@ -28,6 +28,7 @@ export type MeUser = UserWithMembers & {
timezone: string; timezone: string;
suspended: boolean; suspended: boolean;
deleted: boolean; deleted: boolean;
settings: UserSettings;
}; };
export type UserWithMembers = User & { members: PartialMember[] | null }; export type UserWithMembers = User & { members: PartialMember[] | null };