using GameList.Data; using GameList.Domain; using Microsoft.EntityFrameworkCore; namespace GameList.Endpoints; public static class ResultsEndpoints { public static void MapResultsEndpoints(this IEndpointRouteBuilder app) { app.MapGet( "/api/results", async (HttpContext ctx, AppDbContext db) => { var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db); if (player is null) return Results.Unauthorized(); var appState = await db.AppState.AsNoTracking().FirstAsync(); if (!appState.ResultsOpen) return Results.BadRequest(new { error = "Results are locked until the admin enables them." }); var phase = await EndpointHelpers.GetPhase(db, player.Id); if (phase != Phase.Results) return EndpointHelpers.PhaseMismatch(Phase.Results, phase); var results = await db .Suggestions.AsNoTracking() .Include(s => s.Player) .Include(s => s.Votes) .Select(s => new { s.Id, s.Name, Author = s.Player!.DisplayName, s.MinPlayers, s.MaxPlayers, Total = s.Votes.Sum(v => v.Score), Count = s.Votes.Count, Average = s.Votes.Count == 0 ? 0 : s.Votes.Average(v => v.Score), Votes = s.Votes.Select(v => v.Score).ToList(), MyVote = s.Votes .Where(v => v.PlayerId == player.Id) .Select(v => (int?)v.Score) .FirstOrDefault(), s.ScreenshotUrl, s.YoutubeUrl, s.GameUrl, s.Description, s.Genre, }) .OrderByDescending(r => r.Average) .ToListAsync(); return Results.Ok(results); } ); } }