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