using Dapper; using Npgsql; namespace SDG_Backend_Barracuda.Models; public record Game(int Id, string Name, string URL); public record GameInformation(string Name, string URL); public interface IGameModel : IDatabaseModel { } public class GameModel(NpgsqlDataSource dataSource) : IGameModel, IEndpointRouteHandler { public static void MapEndpoints(IEndpointRouteBuilder router) { var gameEndpoint = router.MapGroup("/game"); gameEndpoint.MapPost("/", async (GameInformation input, IGameModel model) => { var newGame = await model.Create(input); return Results.Created($"/game/{newGame.Id}", newGame); }); gameEndpoint.MapGet("/", async (IGameModel model) => Results.Ok(await model.GetAll())); gameEndpoint.MapGet("/{id}", async (int id, IGameModel model) => await model.GetById(id) is { } g ? Results.Ok(g) : Results.NotFound()); gameEndpoint.MapPut("/{id}", async (int id, GameInformation input, IGameModel model) => await model.Update(id, input) is { } g ? Results.Ok(g) : Results.NotFound()); gameEndpoint.MapDelete("/{id}", async (int id, IGameModel model) => await model.Delete(id) ? Results.NoContent() : Results.NotFound()); } public async Task> GetAll() { await using var connection = await dataSource.OpenConnectionAsync(); var sql = """SELECT * FROM "Game";"""; return await connection.QueryAsync(sql); } public async Task GetById(int id) { await using var connection = await dataSource.OpenConnectionAsync(); var sql = """SELECT * FROM "Game" WHERE "Id" = @Id;"""; return await connection.QueryFirstOrDefaultAsync(sql, new { Id = id }); } public async Task Create(GameInformation input) { await using var connection = await dataSource.OpenConnectionAsync(); var sql = """INSERT INTO "Game" ("Name", "URL") VALUES (@Name, @URL) RETURNING "Id", "Name", "URL";"""; return await connection.QuerySingleAsync(sql, input); } public async Task Update(int id, GameInformation input) { await using var connection = await dataSource.OpenConnectionAsync(); var sql = """UPDATE "Game" SET "Name" = @Name, "URL" = @URL WHERE "Id" = @Id RETURNING "Id", "Name", "URL";"""; return await connection.QueryFirstOrDefaultAsync(sql, new { Id = id, input.Name, input.URL }); } public async Task Delete(int id) { await using var connection = await dataSource.OpenConnectionAsync(); var sql = """DELETE FROM "Game" WHERE "Id" = @Id;"""; var rowsAffected = await connection.ExecuteAsync(sql, new { Id = id }); return rowsAffected > 0; } }