Skip to content

Commit 0294709

Browse files
author
Vincent Wilms
committed
Fixes #249: Clean up MeResponse
1 parent 2c0dac0 commit 0294709

File tree

8 files changed

+222
-220
lines changed

8 files changed

+222
-220
lines changed

openapi.json

Lines changed: 55 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1365,6 +1365,42 @@
13651365
}
13661366
}
13671367
},
1368+
"/api/v1/users/tokens": {
1369+
"get": {
1370+
"tags": [
1371+
"Users"
1372+
],
1373+
"summary": "Gets all personal access tokens.",
1374+
"operationId": "Users_GetTokens",
1375+
"parameters": [
1376+
{
1377+
"name": "userId",
1378+
"in": "query",
1379+
"description": "The optional user identifier. If not specified, the current user will be used.",
1380+
"schema": {
1381+
"type": "string",
1382+
"nullable": true
1383+
},
1384+
"x-position": 1
1385+
}
1386+
],
1387+
"responses": {
1388+
"200": {
1389+
"description": "",
1390+
"content": {
1391+
"application/json": {
1392+
"schema": {
1393+
"type": "object",
1394+
"additionalProperties": {
1395+
"$ref": "#/components/schemas/PersonalAccessToken"
1396+
}
1397+
}
1398+
}
1399+
}
1400+
}
1401+
}
1402+
}
1403+
},
13681404
"/api/v1/users/tokens/create": {
13691405
"post": {
13701406
"tags": [
@@ -1686,42 +1722,6 @@
16861722
}
16871723
}
16881724
},
1689-
"/api/v1/users/{userId}/tokens": {
1690-
"get": {
1691-
"tags": [
1692-
"Users"
1693-
],
1694-
"summary": "Gets all personal access tokens.",
1695-
"operationId": "Users_GetTokens",
1696-
"parameters": [
1697-
{
1698-
"name": "userId",
1699-
"in": "path",
1700-
"required": true,
1701-
"description": "The identifier of the user.",
1702-
"schema": {
1703-
"type": "string"
1704-
},
1705-
"x-position": 1
1706-
}
1707-
],
1708-
"responses": {
1709-
"200": {
1710-
"description": "",
1711-
"content": {
1712-
"application/json": {
1713-
"schema": {
1714-
"type": "object",
1715-
"additionalProperties": {
1716-
"$ref": "#/components/schemas/PersonalAccessToken"
1717-
}
1718-
}
1719-
}
1720-
}
1721-
}
1722-
}
1723-
}
1724-
},
17251725
"/api/v1/writers/descriptions": {
17261726
"get": {
17271727
"tags": [
@@ -2280,23 +2280,31 @@
22802280
"type": "string",
22812281
"description": "The user id."
22822282
},
2283-
"userName": {
2283+
"user": {
2284+
"description": "The user.",
2285+
"oneOf": [
2286+
{
2287+
"$ref": "#/components/schemas/NexusUser"
2288+
}
2289+
]
2290+
}
2291+
}
2292+
},
2293+
"NexusUser": {
2294+
"type": "object",
2295+
"description": "Represents a user.",
2296+
"additionalProperties": false,
2297+
"properties": {
2298+
"name": {
22842299
"type": "string",
22852300
"description": "The user name."
22862301
},
22872302
"claims": {
2288-
"type": "object",
2289-
"description": "A map of claims.",
2290-
"additionalProperties": {
2303+
"type": "array",
2304+
"description": "The list of claims.",
2305+
"items": {
22912306
"$ref": "#/components/schemas/NexusClaim"
22922307
}
2293-
},
2294-
"personalAccessTokens": {
2295-
"type": "object",
2296-
"description": "A list of personal access tokens.",
2297-
"additionalProperties": {
2298-
"$ref": "#/components/schemas/PersonalAccessToken"
2299-
}
23002308
}
23012309
}
23022310
},
@@ -2352,17 +2360,6 @@
23522360
"description": "The claim value."
23532361
}
23542362
}
2355-
},
2356-
"NexusUser": {
2357-
"type": "object",
2358-
"description": "Represents a user.",
2359-
"additionalProperties": false,
2360-
"properties": {
2361-
"name": {
2362-
"type": "string",
2363-
"description": "The user name."
2364-
}
2365-
}
23662363
}
23672364
}
23682365
}

src/Nexus.UI/Components/UserSettingsView.razor

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ MaxWidth="MaxWidth.Medium">
382382

383383
try
384384
{
385-
_accessTokenMap = (await Client.V1.Users.GetMeAsync()).PersonalAccessTokens;
385+
_accessTokenMap = await Client.V1.Users.GetTokensAsync();
386386
}
387387
catch (Exception ex)
388388
{
@@ -452,7 +452,7 @@ MaxWidth="MaxWidth.Medium">
452452
_newAccessTokenIsAdmin = false;
453453
_newAccessTokenClaims.Clear();
454454
_newAccessTokenClaims.Add(new ClaimData(default, default));
455-
_accessTokenMap = (await Client.V1.Users.GetMeAsync()).PersonalAccessTokens;
455+
_accessTokenMap = await Client.V1.Users.GetTokensAsync();
456456
}
457457
catch (Exception ex)
458458
{
@@ -468,7 +468,7 @@ MaxWidth="MaxWidth.Medium">
468468
try
469469
{
470470
await Client.V1.Users.DeleteTokenAsync(id, CancellationToken.None);
471-
_accessTokenMap = (await Client.V1.Users.GetMeAsync()).PersonalAccessTokens;
471+
_accessTokenMap = await Client.V1.Users.GetTokensAsync();
472472
}
473473
catch (Exception ex)
474474
{

src/Nexus.UI/Core/NexusDemoClient.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System.Net;
55
using System.Runtime.InteropServices;
6+
using System.Security.Claims;
67
using System.Text.Json;
78
using Nexus.Api;
89
using Nexus.Api.V1;
@@ -461,20 +462,18 @@ public Task<MeResponse> GetMeAsync(CancellationToken cancellationToken = default
461462
{
462463
var meResponse = new MeResponse(
463464
UserId: "test@nexus",
464-
UserName: "Star Lord",
465-
Claims: new Dictionary<string, NexusClaim>(),
466-
PersonalAccessTokens: new Dictionary<string, PersonalAccessToken>()
465+
new NexusUser("Star Lord", Enumerable.Empty<NexusClaim>().ToList())
467466
);
468467

469468
return Task.FromResult(meResponse);
470469
}
471470

472-
public IReadOnlyDictionary<string, PersonalAccessToken> GetTokens(string userId)
471+
public IReadOnlyDictionary<string, PersonalAccessToken> GetTokens(string? userId)
473472
{
474473
throw new NotImplementedException();
475474
}
476475

477-
public Task<IReadOnlyDictionary<string, PersonalAccessToken>> GetTokensAsync(string userId, CancellationToken cancellationToken = default)
476+
public Task<IReadOnlyDictionary<string, PersonalAccessToken>> GetTokensAsync(string? userId, CancellationToken cancellationToken = default)
478477
{
479478
throw new NotImplementedException();
480479
}

src/Nexus.UI/Services/NexusAuthenticationStateProvider.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ public override async Task<AuthenticationState> GetAuthenticationStateAsync()
2828
var meResponse = await _client.V1.Users.GetMeAsync();
2929

3030
List<Claim> claims = [
31-
new(NAME_CLAIM, meResponse.UserName),
32-
.. meResponse.Claims.Select(x => new Claim(x.Value.Type, x.Value.Value))
31+
new(NAME_CLAIM, meResponse.User.Name),
32+
.. meResponse.User.Claims.Select(x => new Claim(x.Type, x.Value))
3333
];
3434

3535
identity = new ClaimsIdentity(

src/Nexus/API/v1/UsersController.cs

Lines changed: 37 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ ITokenService tokenService
3939
// GET /api/users/me
4040
// GET /api/users/reauthenticate
4141
// GET /api/users/accept-license?catalogId=X
42+
// GET /api/users/tokens
4243
// POST /api/users/tokens/create
4344
// DELETE /api/users/tokens/{tokenId}
4445

@@ -51,8 +52,6 @@ ITokenService tokenService
5152
// POST /api/users/{userId}/claims
5253
// DELETE /api/users/claims/{claimId}
5354

54-
// GET /api/users/{userId}/tokens
55-
5655
private readonly IDBService _dbService = dBService;
5756

5857
private readonly ITokenService _tokenService = tokenService;
@@ -126,27 +125,9 @@ public async Task<ActionResult<MeResponse>> GetMeAsync()
126125
if (user is null)
127126
return NotFound($"Could not find user {userId}.");
128127

129-
var translatedClaimsMap = user.Claims
130-
.ToDictionary(entry => entry.Id, entry => new NexusClaim(
131-
id: default,
132-
type: entry.Type,
133-
value: entry.Value
134-
));
135-
136-
var tokenMap = await _tokenService.GetAllAsync(userId);
137-
138-
var translatedTokenMap = tokenMap
139-
.ToDictionary(entry => entry.Value.Id, entry => new PersonalAccessToken(
140-
entry.Value.Description,
141-
entry.Value.Expires,
142-
entry.Value.Claims
143-
));
144-
145128
return new MeResponse(
146129
user.Id,
147-
user.Name,
148-
translatedClaimsMap,
149-
translatedTokenMap
130+
user
150131
);
151132
}
152133

@@ -192,6 +173,41 @@ .. Enum.GetNames<NexusClaims>(),
192173
return Redirect("/");
193174
}
194175

176+
/// <summary>
177+
/// Gets all personal access tokens.
178+
/// </summary>
179+
/// <param name="userId">The optional user identifier. If not specified, the current user will be used.</param>
180+
[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]
181+
[HttpGet("tokens")]
182+
public async Task<ActionResult<IReadOnlyDictionary<Guid, PersonalAccessToken>>> GetTokensAsync(
183+
[FromQuery] string? userId = default
184+
)
185+
{
186+
if (TryAuthenticate(userId, out var actualUserId, out var response))
187+
{
188+
var user = await _dbService.FindUserAsync(actualUserId);
189+
190+
if (user is null)
191+
return NotFound($"Could not find user {userId}.");
192+
193+
var tokenMap = await _tokenService.GetAllAsync(actualUserId);
194+
195+
var translatedTokenMap = tokenMap
196+
.ToDictionary(entry => entry.Value.Id, entry => new PersonalAccessToken(
197+
entry.Value.Description,
198+
entry.Value.Expires,
199+
entry.Value.Claims
200+
));
201+
202+
return translatedTokenMap;
203+
}
204+
205+
else
206+
{
207+
return response;
208+
}
209+
}
210+
195211
/// <summary>
196212
/// Creates a personal access token.
197213
/// </summary>
@@ -402,32 +418,6 @@ public async Task<ActionResult> DeleteClaimAsync(
402418
return Ok();
403419
}
404420

405-
/// <summary>
406-
/// Gets all personal access tokens.
407-
/// </summary>
408-
/// <param name="userId">The identifier of the user.</param>
409-
[Authorize(Policy = NexusPolicies.RequireAdmin)]
410-
[HttpGet("{userId}/tokens")]
411-
public async Task<ActionResult<IReadOnlyDictionary<Guid, PersonalAccessToken>>> GetTokensAsync(
412-
string userId)
413-
{
414-
var user = await _dbService.FindUserAsync(userId);
415-
416-
if (user is null)
417-
return NotFound($"Could not find user {userId}.");
418-
419-
var tokenMap = await _tokenService.GetAllAsync(userId);
420-
421-
var translatedTokenMap = tokenMap
422-
.ToDictionary(entry => entry.Value.Id, entry => new PersonalAccessToken(
423-
entry.Value.Description,
424-
entry.Value.Expires,
425-
entry.Value.Claims
426-
));
427-
428-
return translatedTokenMap;
429-
}
430-
431421
private bool TryAuthenticate(
432422
string? requestedId,
433423
out string userId,

src/Nexus/Core/Models_Public_v1.cs

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,10 @@ public class NexusUser(
2525
/// </summary>
2626
public string Name { get; set; } = name;
2727

28-
#pragma warning disable CS1591
29-
30-
[JsonIgnore]
28+
/// <summary>
29+
/// The list of claims.
30+
/// </summary>
3131
public List<NexusClaim> Claims { get; set; } = [];
32-
33-
#pragma warning restore CS1591
34-
3532
}
3633

3734
/// <summary>
@@ -254,12 +251,8 @@ public record JobStatus(
254251
/// A me response.
255252
/// </summary>
256253
/// <param name="UserId">The user id.</param>
257-
/// <param name="UserName">The user name.</param>
258-
/// <param name="Claims">A map of claims.</param>
259-
/// <param name="PersonalAccessTokens">A list of personal access tokens.</param>
254+
/// <param name="User">The user.</param>
260255
public record MeResponse(
261256
string UserId,
262-
string UserName,
263-
IReadOnlyDictionary<Guid, NexusClaim> Claims,
264-
IReadOnlyDictionary<Guid, PersonalAccessToken> PersonalAccessTokens
257+
NexusUser User
265258
);

0 commit comments

Comments
 (0)