From 6a02a3fc8cf751a57f38d0632766f4561144e28c Mon Sep 17 00:00:00 2001
From: "thibault.capt" <thibault.capt@etu.hesge.ch>
Date: Sat, 22 Feb 2025 18:48:43 +0100
Subject: [PATCH] (feat): add store

---
 Documents/JournalDeBord.md                    |  1 +
 .../backend/controller/TodoController.java    | 10 ++++++--
 todo-workspace/frontend/angular.json          |  4 +---
 .../todo-list/todo-list.component.html        | 19 +++++++++------
 .../features/todo-list/todo-list.component.ts | 23 ++++---------------
 5 files changed, 26 insertions(+), 31 deletions(-)

diff --git a/Documents/JournalDeBord.md b/Documents/JournalDeBord.md
index 9ebab1e..244184e 100644
--- a/Documents/JournalDeBord.md
+++ b/Documents/JournalDeBord.md
@@ -22,3 +22,4 @@
 | 18.02.2025              | Modal pour ajouter une voiture                               | -                                                                         | -                                       | Angular garage -> Je me rends compte que c'est trop gros pour un "petit projet". Je recommence pour une TODO list |
 | 19.02.2025              | Essayer de finir le front de la TODO's list                  | -                                                                         | -                                       | -                                                                                                                 |
 | 20.02.2025              | Finir de back + lier front et back                           | -                                                                         | -                                       | -                                                                                                                 |
+| 22.02.2025              | Utiliser un store pour les données front                     | -                                                                         | -                                       | loading infini => voir pourquoi                                                                                   |
diff --git a/todo-workspace/backend/src/main/java/com/hepia/backend/controller/TodoController.java b/todo-workspace/backend/src/main/java/com/hepia/backend/controller/TodoController.java
index cfc41a9..30ee4d0 100644
--- a/todo-workspace/backend/src/main/java/com/hepia/backend/controller/TodoController.java
+++ b/todo-workspace/backend/src/main/java/com/hepia/backend/controller/TodoController.java
@@ -31,13 +31,19 @@ public class TodoController {
     }
 
     @DeleteMapping("/{id}")
-    public ResponseEntity<Void> delete(@PathVariable Long id) {
+    public ResponseEntity<Long> delete(@PathVariable Long id) {
+        if (!todoRepository.existsById(id)){
+            return ResponseEntity.notFound().build();
+        }
         todoRepository.deleteById(id);
-        return ResponseEntity.noContent().build();
+        return ResponseEntity.ok(id);
     }
 
     @PatchMapping("/{id}")
     public ResponseEntity<Todo> toggleCompleted(@PathVariable Long id) {
+        if (!todoRepository.existsById(id)){
+            return ResponseEntity.notFound().build();
+        }
         Todo todo = todoRepository.findById(id).orElseThrow();
         todo.setCompleted(!todo.isCompleted());
         Todo updated = todoRepository.save(todo);
diff --git a/todo-workspace/frontend/angular.json b/todo-workspace/frontend/angular.json
index 21d3913..2a1de19 100644
--- a/todo-workspace/frontend/angular.json
+++ b/todo-workspace/frontend/angular.json
@@ -3,9 +3,7 @@
   "version": 1,
   "cli": {
     "packageManager": "pnpm",
-    "schematicCollections": [
-      "angular-eslint"
-    ],
+    "schematicCollections": ["angular-eslint"],
     "analytics": false
   },
   "newProjectRoot": "projects",
diff --git a/todo-workspace/frontend/src/app/features/todo-list/todo-list.component.html b/todo-workspace/frontend/src/app/features/todo-list/todo-list.component.html
index 40f14a2..e3b7c93 100644
--- a/todo-workspace/frontend/src/app/features/todo-list/todo-list.component.html
+++ b/todo-workspace/frontend/src/app/features/todo-list/todo-list.component.html
@@ -6,14 +6,19 @@
 
     <!-- Liste des tâches -->
     <div class="flex-grow flex items-center justify-center py-5">
-      <ul class="list text-gray-600 text-lg">
-        @for (todo of todos(); track todo.id) {
-          <app-todo-list-item [todo]="todo" (toggleCompleted)="toggleCompleted($event)" (remove)="remove($event)" />
-        }
-      </ul>
+      @if (store.isLoading()) {
+        <span class="loading loading-spinner loading-xl"></span>
+      } @else {
+        <ul class="list text-gray-600 text-lg">
+          @let todos = store.todos();
+          @for (todo of todos; track todo.id) {
+            <app-todo-list-item [todo]="todo" (toggleCompleted)="toggleCompleted($event)" (remove)="remove($event)" />
+          }
+        </ul>
 
-      @if (!todos()?.length) {
-        <p class="text-gray-600 text-lg">Ajoute ta première tâche 👆</p>
+        @if (!todos?.length) {
+          <p class="text-gray-600 text-lg">Ajoute ta première tâche 👆</p>
+        }
       }
     </div>
   </div>
diff --git a/todo-workspace/frontend/src/app/features/todo-list/todo-list.component.ts b/todo-workspace/frontend/src/app/features/todo-list/todo-list.component.ts
index 812ebcc..1c9e337 100644
--- a/todo-workspace/frontend/src/app/features/todo-list/todo-list.component.ts
+++ b/todo-workspace/frontend/src/app/features/todo-list/todo-list.component.ts
@@ -1,7 +1,4 @@
 import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
-import { TodoService } from '@core/ports/todo.service';
-import { toSignal } from '@angular/core/rxjs-interop';
-import { BehaviorSubject, switchMap, tap } from 'rxjs';
 import { FormsModule } from '@angular/forms';
 import { Todo } from '@core/models/todo';
 import { AddTodoFormComponent } from '@features/todo-list/components/add-todo-form.component';
@@ -16,30 +13,18 @@ import { TodoStore } from '@core/todo.store';
   providers: [TodoStore],
 })
 export default class TodoListComponent {
-  // TODO: Implement the logic with TodoStore
-  private reload$$ = new BehaviorSubject<void>(void 0);
-  private readonly todoService = inject(TodoService);
-  todos = toSignal(this.reload$$.pipe(switchMap(() => this.todoService.getAll())));
+  protected readonly store = inject(TodoStore);
 
   addTodo(todoName: string) {
     if (!todoName) return;
-    this.todoService
-      .add(todoName)
-      .pipe(tap(() => this.reload$$.next()))
-      .subscribe();
+    this.store.add(todoName);
   }
 
   toggleCompleted(todo: Todo) {
-    this.todoService
-      .toggleCompleted(todo.id)
-      .pipe(tap(() => this.reload$$.next()))
-      .subscribe();
+    this.store.toggleCompleted(todo.id);
   }
 
   remove(todo: Todo) {
-    this.todoService
-      .remove(todo.id)
-      .pipe(tap(() => this.reload$$.next()))
-      .subscribe();
+    this.store.remove(todo.id);
   }
 }
-- 
GitLab