using GameList.Contracts; using GameList.Data; using Microsoft.AspNetCore.Mvc; using GameList.Infrastructure; namespace GameList.Endpoints; public static class SuggestEndpoints { public static void MapSuggestEndpoints(this IEndpointRouteBuilder app) { var group = app.MapGroup("/api/suggestions").WithTags("Suggestions").RequireAuthorization(); group.MapGet("/mine", async (HttpContext ctx, AppDbContext db, SuggestionWorkflowService service) => { var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db); if (player is null) return EndpointHelpers.UnauthorizedError(); var result = await service.GetMineAsync(player.Id); return result.ToHttpResult(Results.Ok); }).WithName("GetMySuggestions"); group.MapPost("/", async ([FromBody] SuggestionRequest request, HttpContext ctx, AppDbContext db, SuggestionWorkflowService service) => { var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db); if (player is null) return EndpointHelpers.UnauthorizedError(); var result = await service.CreateAsync( player.Id, new SuggestionInput( request.Name, request.Genre, request.Description, request.ScreenshotUrl, request.YoutubeUrl, request.GameUrl, request.MinPlayers, request.MaxPlayers ) ); return result.ToHttpResult(payload => Results.Created($"/api/suggestions/{payload.Id}", payload)); }).AddEndpointFilter(new PhaseOrJokerFilter()).WithName("CreateSuggestion"); group.MapDelete("/{id:int}", async (int id, HttpContext ctx, AppDbContext db, SuggestionWorkflowService service) => { var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db); if (player is null) return EndpointHelpers.UnauthorizedError(); var result = await service.DeleteAsync(player.Id, id); return result.ToHttpResult(Results.NoContent); }).WithName("DeleteSuggestion"); group.MapPut("/{id:int}", async (int id, [FromBody] SuggestionRequest request, HttpContext ctx, AppDbContext db, SuggestionWorkflowService service) => { var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db); if (player is null) return EndpointHelpers.UnauthorizedError(); var result = await service.UpdateAsync( player.Id, id, new SuggestionInput( request.Name, request.Genre, request.Description, request.ScreenshotUrl, request.YoutubeUrl, request.GameUrl, request.MinPlayers, request.MaxPlayers ) ); return result.ToHttpResult(Results.Ok); }).WithName("UpdateSuggestion"); group.MapGet("/all", async (HttpContext ctx, AppDbContext db, SuggestionWorkflowService service) => { var player = await EndpointHelpers.GetAuthenticatedPlayer(ctx, db); if (player is null) return EndpointHelpers.UnauthorizedError(); var result = await service.GetAllAsync(player.Id); return result.ToHttpResult(Results.Ok); }).WithName("GetAllSuggestions"); } }