using Microsoft.EntityFrameworkCore; using WebMinRouteGroup.Data; namespace WebMinRouteGroup; public static class TodoEndpointsV1 { public static RouteGroupBuilder MapTodosApiV1(this RouteGroupBuilder group) { group.MapGet("/", GetAllTodos); group.MapGet("/{id}", GetTodo); group.MapPost("/", CreateTodo) .AddEndpointFilter(async (efiContext, next) => { var param = efiContext.GetArgument(0); var validationErrors = Utilities.IsValid(param); if (validationErrors.Any()) { return Results.ValidationProblem(validationErrors); } return await next(efiContext); }); group.MapPut("/{id}", UpdateTodo); group.MapDelete("/{id}", DeleteTodo); return group; } // get all todos public static async Task GetAllTodos(TodoGroupDbContext database) { var todos = await database.Todos.ToListAsync(); return TypedResults.Ok(todos); } // get todo by id public static async Task GetTodo(int id, TodoGroupDbContext database) { var todo = await database.Todos.FindAsync(id); if (todo != null) { return TypedResults.Ok(todo); } return TypedResults.NotFound(); } // create todo public static async Task CreateTodo(TodoDto todo, TodoGroupDbContext database) { var newTodo = new Todo { Title = todo.Title, Description = todo.Description, IsDone = todo.IsDone }; await database.Todos.AddAsync(newTodo); await database.SaveChangesAsync(); return TypedResults.Created($"/todos/v1/{newTodo.Id}", newTodo); } // update todo public static async Task UpdateTodo(Todo todo, TodoGroupDbContext database) { var existingTodo = await database.Todos.FindAsync(todo.Id); if (existingTodo != null) { existingTodo.Title = todo.Title; existingTodo.Description = todo.Description; existingTodo.IsDone = todo.IsDone; await database.SaveChangesAsync(); return TypedResults.Created($"/todos/v1/{existingTodo.Id}", existingTodo); } return TypedResults.NotFound(); } // delete todo public static async Task DeleteTodo(int id, TodoGroupDbContext database) { var todo = await database.Todos.FindAsync(id); if (todo != null) { database.Todos.Remove(todo); await database.SaveChangesAsync(); return TypedResults.NoContent(); } return TypedResults.NotFound(); } }