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 phase = await EndpointHelpers.GetPhase(db); if (phase != Phase.Results) return EndpointHelpers.PhaseMismatch(Phase.Results, phase); var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db); if (player is null) return Results.Unauthorized(); 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), s.ScreenshotUrl, s.YoutubeUrl, s.GameUrl, s.Description, s.Genre }) .OrderByDescending(r => r.Total) .ToListAsync(); return Results.Ok(results); }); } }