Refactor phase reads to pure lookups and align admin docs

This commit is contained in:
2026-02-07 00:36:04 +01:00
parent fcd44de4e4
commit 81c04e0866
12 changed files with 124 additions and 42 deletions

View File

@@ -34,42 +34,53 @@ internal static class EndpointHelpers
return existing;
}
public static async Task<Phase> GetPhase(AppDbContext db, Guid playerId)
public static async Task<Phase> GetCurrentPhaseAsync(AppDbContext db, Guid playerId)
{
var player = await db.Players.FirstOrDefaultAsync(p => p.Id == playerId);
if (player is null)
var playerPhase = await db.Players
.AsNoTracking()
.Where(p => p.Id == playerId)
.Select(p => (Phase?)p.CurrentPhase)
.FirstOrDefaultAsync();
if (playerPhase is null)
return Phase.Suggest;
var state = await db.AppState.FirstAsync();
var resultsOpen = await db.AppState.AsNoTracking().Select(s => s.ResultsOpen).FirstAsync();
return GetCurrentPhase(playerPhase.Value, resultsOpen);
}
public static Phase GetCurrentPhase(Phase phase, bool resultsOpen)
{
var normalized = phase == Phase.Reveal ? Phase.Vote : phase;
if (resultsOpen)
return Phase.Results;
return normalized == Phase.Results ? Phase.Vote : normalized;
}
public static bool ReconcilePlayerPhase(Player player, bool resultsOpen)
{
var changed = false;
// Auto-upgrade any legacy Reveal phase to Vote to avoid blank screens
if (player.CurrentPhase == Phase.Reveal)
{
player.CurrentPhase = Phase.Vote;
changed = true;
}
// Keep phases aligned with results availability
if (state.ResultsOpen && player.CurrentPhase != Phase.Results)
if (resultsOpen && player.CurrentPhase != Phase.Results)
{
player.CurrentPhase = Phase.Results;
changed = true;
}
else if (!state.ResultsOpen && player.CurrentPhase == Phase.Results)
else if (!resultsOpen && player.CurrentPhase == Phase.Results)
{
player.CurrentPhase = Phase.Vote;
player.VotesFinal = false;
changed = true;
}
if (changed)
{
await db.SaveChangesAsync();
}
return player.CurrentPhase;
return changed;
}
public static IResult PhaseMismatch(Phase required, Phase current) =>