diff --git a/TodoMinimal.WebApi/Program.cs b/TodoMinimal.WebApi/Program.cs index f3fb10b..7cecca2 100644 --- a/TodoMinimal.WebApi/Program.cs +++ b/TodoMinimal.WebApi/Program.cs @@ -26,57 +26,30 @@ if (app.Environment.IsDevelopment()) app.UseCors(); var repo = new TodoRepo(); +var service = new TodoService(BASE_URL, repo); -app.MapGet("/", () => -{ - return repo.All().Select(x => MapTodo(x)); -}) +app.MapGet("/", service.All) .WithName("GetTodos") .WithOpenApi(); -app.MapGet("/{id}", (Guid id) => -{ - return MapTodo(repo.Find(id)); -}) +app.MapGet("/{id}", service.Find) .WithName("GetTodo") .WithOpenApi(); -app.MapPost("/", (Todo todo) => -{ - return MapTodo(repo.Add(todo)); -}) +app.MapPost("/", service.Add) .WithName("CreateTodo") .WithOpenApi(); -app.MapDelete("/", () => { - repo.Clear(); -}) +app.MapDelete("/", service.Clear) .WithName("DeleteTodos") .WithOpenApi(); -app.MapPatch("/{id}", (Guid id, ApiTodo todo) => -{ - return MapTodo(repo.Update(id, todo.Title, todo.Order, todo.Completed)); -}) +app.MapPatch("/{id}", service.Update) .WithName("UpdateTodo") .WithOpenApi(); -app.MapDelete("/{id}", (Guid id) => { - repo.Delete(id); -}) +app.MapDelete("/{id}", service.Delete) .WithName("DeleteTodo") .WithOpenApi(); app.Run(BASE_URL); - -ApiTodo MapTodo(Todo todo) { - return new( - todo.Order, - todo.Title, - todo.Completed, - $"{BASE_URL}/{todo.Id}" - ); -} - -public record ApiTodo(int? Order, string? Title, bool? Completed, string Url); - diff --git a/TodoMinimal.WebApi/TodoRepo.cs b/TodoMinimal.WebApi/TodoRepo.cs index ad4ca40..bd00b45 100644 --- a/TodoMinimal.WebApi/TodoRepo.cs +++ b/TodoMinimal.WebApi/TodoRepo.cs @@ -4,9 +4,8 @@ public class TodoRepo { private List todos = new(); public Todo Add(Todo todo) { - var newTodo = todo with { Id = Guid.NewGuid() }; - todos.Add(newTodo); - return newTodo; + todos.Add(todo); + return todo; } public IEnumerable All() { diff --git a/TodoMinimal.WebApi/TodoService.cs b/TodoMinimal.WebApi/TodoService.cs new file mode 100644 index 0000000..6bddc28 --- /dev/null +++ b/TodoMinimal.WebApi/TodoService.cs @@ -0,0 +1,56 @@ +using System.Text; + +public record TodoDTO(int? Order, string? Title, bool? Completed, string Url); + +public class TodoService { + private string baseUrl; + private TodoRepo repo; + public TodoService(string baseUrl, TodoRepo repo) { + this.baseUrl = baseUrl; + this.repo = repo; + } + + public IEnumerable All() { + return repo.All().Select(MapTodo); + } + + public TodoDTO Find(Guid id) { + return MapTodo( + repo.Find(id) + ); + } + + public TodoDTO Add(TodoDTO todo) { + return MapTodo( + repo.Add(new( + Guid.NewGuid(), + todo.Order ?? 0, + todo.Title ?? "default", + todo.Completed ?? false + )) + ); + } + + public void Clear() { + repo.Clear(); + } + + public TodoDTO Update(Guid id, TodoDTO todo) { + return MapTodo( + repo.Update(id, todo.Title, todo.Order, todo.Completed) + ); + } + + public void Delete(Guid id) { + repo.Delete(id); + } + + private TodoDTO MapTodo(Todo todo) { + return new( + todo.Order, + todo.Title, + todo.Completed, + $"{baseUrl}/{todo.Id}" + ); + } +} \ No newline at end of file