todo-minimal-api.git

git clone https://git.crispbyte.dev/todo-minimal-api.git

commit
f8508a5
parent
203e3ad
author
CheddarCrisp
date
2024-02-12 20:12:30 +0100 CET
Extract service code
3 files changed,  +65, -37
M TodoMinimal.WebApi/Program.cs
+7, -34
 1@@ -26,57 +26,30 @@ if (app.Environment.IsDevelopment())
 2 app.UseCors();
 3 
 4 var repo = new TodoRepo();
 5+var service = new TodoService(BASE_URL, repo);
 6 
 7-app.MapGet("/", () =>
 8-{
 9-    return repo.All().Select(x => MapTodo(x));
10-})
11+app.MapGet("/", service.All)
12 .WithName("GetTodos")
13 .WithOpenApi();
14 
15-app.MapGet("/{id}", (Guid id) =>
16-{
17-    return MapTodo(repo.Find(id));
18-})
19+app.MapGet("/{id}", service.Find)
20 .WithName("GetTodo")
21 .WithOpenApi();
22 
23-app.MapPost("/", (Todo todo) =>
24-{
25-    return MapTodo(repo.Add(todo));
26-})
27+app.MapPost("/", service.Add)
28 .WithName("CreateTodo")
29 .WithOpenApi();
30 
31-app.MapDelete("/", () => {
32-    repo.Clear();
33-})
34+app.MapDelete("/", service.Clear)
35 .WithName("DeleteTodos")
36 .WithOpenApi();
37 
38-app.MapPatch("/{id}", (Guid id, ApiTodo todo) =>
39-{
40-    return MapTodo(repo.Update(id, todo.Title, todo.Order, todo.Completed));
41-})
42+app.MapPatch("/{id}", service.Update)
43 .WithName("UpdateTodo")
44 .WithOpenApi();
45 
46-app.MapDelete("/{id}", (Guid id) => {
47-    repo.Delete(id);
48-})
49+app.MapDelete("/{id}", service.Delete)
50 .WithName("DeleteTodo")
51 .WithOpenApi();
52 
53 app.Run(BASE_URL);
54-
55-ApiTodo MapTodo(Todo todo) {
56-    return new(
57-        todo.Order,
58-        todo.Title,
59-        todo.Completed,
60-        $"{BASE_URL}/{todo.Id}"
61-    );
62-}
63-
64-public record ApiTodo(int? Order, string? Title, bool? Completed, string Url);
65-
M TodoMinimal.WebApi/TodoRepo.cs
+2, -3
 1@@ -4,9 +4,8 @@ public class TodoRepo {
 2     private List<Todo> todos = new();
 3 
 4     public Todo Add(Todo todo) {
 5-        var newTodo = todo with { Id = Guid.NewGuid() };
 6-        todos.Add(newTodo);
 7-        return newTodo;
 8+        todos.Add(todo);
 9+        return todo;
10     }
11 
12     public IEnumerable<Todo> All() {
A TodoMinimal.WebApi/TodoService.cs
+56, -0
 1@@ -0,0 +1,56 @@
 2+using System.Text;
 3+
 4+public record TodoDTO(int? Order, string? Title, bool? Completed, string Url);
 5+
 6+public class TodoService {
 7+    private string baseUrl;
 8+    private TodoRepo repo;
 9+    public TodoService(string baseUrl, TodoRepo repo) {
10+        this.baseUrl = baseUrl;
11+        this.repo = repo;
12+    }
13+
14+    public IEnumerable<TodoDTO> All() {
15+        return repo.All().Select(MapTodo);
16+    }
17+
18+    public TodoDTO Find(Guid id) {
19+        return MapTodo(
20+            repo.Find(id)
21+        );
22+    }
23+
24+    public TodoDTO Add(TodoDTO todo) {
25+        return MapTodo(
26+            repo.Add(new(
27+                Guid.NewGuid(),
28+                todo.Order ?? 0,
29+                todo.Title ?? "default",
30+                todo.Completed ?? false
31+            ))
32+        );
33+    }
34+
35+    public void Clear() {
36+        repo.Clear();
37+    }
38+
39+    public TodoDTO Update(Guid id, TodoDTO todo) {
40+        return MapTodo(
41+            repo.Update(id, todo.Title, todo.Order, todo.Completed)
42+        );
43+    }
44+
45+    public void Delete(Guid id) {
46+        repo.Delete(id);
47+    }
48+
49+    private TodoDTO MapTodo(Todo todo) {
50+        return new(
51+        todo.Order,
52+        todo.Title,
53+        todo.Completed,
54+        $"{baseUrl}/{todo.Id}"
55+    );
56+    }
57+}