46 lines
1.5 KiB
C#
46 lines
1.5 KiB
C#
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);
|
|
});
|
|
}
|
|
}
|