Finalize API envelopes and close validation drift tasks

This commit is contained in:
2026-02-07 01:35:56 +01:00
parent f615ef3a4a
commit 20daecd3eb
15 changed files with 104 additions and 109 deletions

View File

@@ -36,7 +36,7 @@ public static class AdminEndpoints
{
var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db);
if (player is null)
return Results.Unauthorized();
return EndpointHelpers.UnauthorizedError();
return await service.LinkSuggestionsAsync(player, request);
});
@@ -45,7 +45,7 @@ public static class AdminEndpoints
{
var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db);
if (player is null)
return Results.Unauthorized();
return EndpointHelpers.UnauthorizedError();
return await service.UnlinkSuggestionsAsync(player, request);
});

View File

@@ -51,13 +51,12 @@ public static class AuthEndpoints
await PlayerIdentityExtensions.SignInPlayerAsync(ctx, player);
return Results.Ok(new
{
return Results.Ok(new AuthSessionResponse(
player.Id,
player.Username,
player.DisplayName,
player.IsAdmin
});
));
});
group.MapPost("/login", async ([FromBody] LoginRequest request, HttpContext ctx, AppDbContext db) =>
@@ -79,13 +78,12 @@ public static class AuthEndpoints
await PlayerIdentityExtensions.SignInPlayerAsync(ctx, player);
return Results.Ok(new
{
return Results.Ok(new AuthSessionResponse(
player.Id,
player.Username,
player.DisplayName,
player.IsAdmin
});
));
});
group.MapPost("/logout", async (HttpContext ctx) =>

View File

@@ -16,7 +16,7 @@ public static class ResultsEndpoints
{
var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db);
if (player is null)
return Results.Unauthorized();
return EndpointHelpers.UnauthorizedError();
return await service.GetResultsAsync(player);
});

View File

@@ -1,5 +1,6 @@
using GameList.Data;
using GameList.Domain;
using GameList.Contracts;
using Microsoft.EntityFrameworkCore;
namespace GameList.Endpoints;
@@ -14,21 +15,20 @@ public static class StateEndpoints
{
var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db);
if (player is null)
return Results.Unauthorized();
return EndpointHelpers.UnauthorizedError();
var state = await db.AppState.AsNoTracking().FirstAsync();
var phase = EndpointHelpers.GetCurrentPhase(player.CurrentPhase, state.ResultsOpen);
var summary = new
{
CurrentPhase = phase,
var summary = new StateSummaryResponse(
phase,
player.VotesFinal,
player.HasJoker,
state.ResultsOpen,
state.UpdatedAt,
Players = await db.Players.CountAsync(),
Suggestions = await db.Suggestions.CountAsync(),
Votes = await db.Votes.CountAsync()
};
await db.Players.CountAsync(),
await db.Suggestions.CountAsync(),
await db.Votes.CountAsync()
);
return Results.Ok(summary);
});
@@ -36,27 +36,26 @@ public static class StateEndpoints
{
var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db);
if (player is null)
return Results.Unauthorized();
return EndpointHelpers.UnauthorizedError();
var state = await db.AppState.AsNoTracking().FirstAsync();
var phase = EndpointHelpers.GetCurrentPhase(player.CurrentPhase, state.ResultsOpen);
return Results.Ok(new
{
return Results.Ok(new MeResponse(
player.Id,
player.DisplayName,
player.Username,
player.DisplayName,
player.IsAdmin,
CurrentPhase = phase,
phase,
player.VotesFinal,
player.HasJoker
});
));
});
group.MapPost("/me/phase/next", async (HttpContext ctx, AppDbContext db) =>
{
var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db);
if (player is null)
return Results.Unauthorized();
return EndpointHelpers.UnauthorizedError();
var appState = await db.AppState.FirstAsync();
var reconciled = EndpointHelpers.ReconcilePlayerPhase(player, appState.ResultsOpen);
@@ -72,18 +71,14 @@ public static class StateEndpoints
player.CurrentPhase = next;
player.VotesFinal = false; // moving forward clears any prior finalize
await db.SaveChangesAsync();
return Results.Ok(new
{
player.CurrentPhase,
appState.ResultsOpen
});
return Results.Ok(new PhaseTransitionResponse(player.CurrentPhase, appState.ResultsOpen));
});
group.MapPost("/me/phase/prev", async (HttpContext ctx, AppDbContext db) =>
{
var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db);
if (player is null)
return Results.Unauthorized();
return EndpointHelpers.UnauthorizedError();
var isAdmin = await EndpointHelpers.IsAdmin(ctx, db);
if (!isAdmin)
@@ -96,11 +91,7 @@ public static class StateEndpoints
player.CurrentPhase = PrevPhase(player.CurrentPhase);
player.VotesFinal = false;
await db.SaveChangesAsync();
return Results.Ok(new
{
player.CurrentPhase,
appState.ResultsOpen
});
return Results.Ok(new PhaseTransitionResponse(player.CurrentPhase, appState.ResultsOpen));
});
}

View File

@@ -15,7 +15,7 @@ public static class SuggestEndpoints
{
var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db);
if (player is null)
return Results.Unauthorized();
return EndpointHelpers.UnauthorizedError();
return await service.GetMineAsync(player);
});
@@ -24,7 +24,7 @@ public static class SuggestEndpoints
{
var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db);
if (player is null)
return Results.Unauthorized();
return EndpointHelpers.UnauthorizedError();
return await service.CreateAsync(player, request);
}).AddEndpointFilter(new PhaseOrJokerFilter());
@@ -33,7 +33,7 @@ public static class SuggestEndpoints
{
var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db);
if (player is null)
return Results.Unauthorized();
return EndpointHelpers.UnauthorizedError();
var isAdmin = await EndpointHelpers.IsAdmin(ctx, db);
return await service.DeleteAsync(player, isAdmin, id);
@@ -43,7 +43,7 @@ public static class SuggestEndpoints
{
var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db);
if (player is null)
return Results.Unauthorized();
return EndpointHelpers.UnauthorizedError();
var isAdmin = player.IsAdmin;
return await service.UpdateAsync(player, isAdmin, id, request);
@@ -53,7 +53,7 @@ public static class SuggestEndpoints
{
var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db);
if (player is null)
return Results.Unauthorized();
return EndpointHelpers.UnauthorizedError();
return await service.GetAllAsync(player);
});

View File

@@ -15,7 +15,7 @@ public static class VoteEndpoints
{
var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db);
if (player is null)
return Results.Unauthorized();
return EndpointHelpers.UnauthorizedError();
return await service.GetMineAsync(player);
});
@@ -24,7 +24,7 @@ public static class VoteEndpoints
{
var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db);
if (player is null)
return Results.Unauthorized();
return EndpointHelpers.UnauthorizedError();
return await service.UpsertAsync(player, request);
});
@@ -32,7 +32,7 @@ public static class VoteEndpoints
{
var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db);
if (player is null)
return Results.Unauthorized();
return EndpointHelpers.UnauthorizedError();
return await service.SetFinalizeAsync(player, request);
});