From d3c58fd6de47ce49de5ef9262d25e2f5a87d09d0 Mon Sep 17 00:00:00 2001
From: abdu <abdukiran@gmail.com>
Date: Sun, 13 Oct 2024 15:47:17 +0200
Subject: [PATCH] add delete button (frontend), add delete endpoint
 (controller), add delete method (service)

---
 frontend/src/components/MainPage.vue          | 24 ++++++++++++++++---
 .../todo/controller/UserController.java       | 12 ++++++++++
 .../com/cloudcomputing/todo/dto/TodoDTO.java  |  1 +
 .../com/cloudcomputing/todo/entity/Todo.java  |  3 +++
 .../todo/mapper/TodoMapper.java               |  2 ++
 .../todo/service/UserService.java             | 21 +++++++++++++++-
 6 files changed, 59 insertions(+), 4 deletions(-)

diff --git a/frontend/src/components/MainPage.vue b/frontend/src/components/MainPage.vue
index 10c800c..0e29fe4 100644
--- a/frontend/src/components/MainPage.vue
+++ b/frontend/src/components/MainPage.vue
@@ -26,6 +26,7 @@ export default {
         password: ''
       },
       todo: {
+        todoId: '',
         title: '',
         description: '',
         userId: '',
@@ -70,7 +71,24 @@ export default {
       });
 
       if(response.status === 201) {
-        this.items = await response.json()
+        const items = await response.json()
+        this.items = items.filter(item => item.completed === false)
+        this.completedItems = items.filter(item => item.completed === true)
+      }
+    },
+    async deleteTodo(todoId){
+      let url = `http://localhost:9876/user/deleteTodo?userId=${localStorage.getItem('userId')}&todoId=${todoId}`
+
+      const response = await fetch(url, {
+        method: 'DELETE',
+        headers: {
+          "Content-Type": "application/json"
+        },
+        credentials: 'include',  // Ensure credentials are included
+      })
+
+      if(response.status === 204) {
+        await this.getAllTodos()
       }
     },
     async signout(){
@@ -127,7 +145,7 @@ export default {
                       <div class="badge-container">
                         <div class="custom-badge-not-completed">running</div>
                       </div>
-                      <b-button variant="danger" @click.stop="deleteItem(index)">Delete</b-button>
+                      <b-button variant="danger" @click.stop="deleteTodo(item.todoId)">Delete</b-button>
                     </div>
                   </li>
                 </ul>
@@ -143,7 +161,7 @@ export default {
                       <div class="badge-container">
                         <div class="custom-badge-completed">completed</div>
                       </div>
-                      <b-button variant="danger" @click.stop="deleteItem(index)">Delete</b-button>
+                      <b-button variant="danger" @click.stop="deleteTodo(item.todoId)">Delete</b-button>
                     </div>
                   </li>
                 </ul>
diff --git a/src/main/java/com/cloudcomputing/todo/controller/UserController.java b/src/main/java/com/cloudcomputing/todo/controller/UserController.java
index e05a8d7..146f252 100644
--- a/src/main/java/com/cloudcomputing/todo/controller/UserController.java
+++ b/src/main/java/com/cloudcomputing/todo/controller/UserController.java
@@ -60,6 +60,18 @@ public class UserController {
         return new ResponseEntity<>(null, HttpStatus.UNAUTHORIZED);
     }
 
+    @DeleteMapping("/deleteTodo")
+    public ResponseEntity<List<TodoDTO>> deleteTodo(HttpServletRequest request, @RequestParam String userId, @RequestParam String todoId) {
+        System.out.println("controller here");
+        if(userService.validateSession(request)){
+            System.out.println("controller here - session valid");
+            List<TodoDTO> todos = userService.deleteTodo(userId, todoId);
+            return new ResponseEntity<>(todos, HttpStatus.NO_CONTENT);
+        }
+
+        return new ResponseEntity<>(null, HttpStatus.UNAUTHORIZED);
+    }
+
     @GetMapping("/getAllTodos")
     public ResponseEntity<List<TodoDTO>> getAllTodos(HttpServletRequest request, @RequestParam String userId) {
         if(userService.validateSession(request)){
diff --git a/src/main/java/com/cloudcomputing/todo/dto/TodoDTO.java b/src/main/java/com/cloudcomputing/todo/dto/TodoDTO.java
index aa5034a..35e33ab 100644
--- a/src/main/java/com/cloudcomputing/todo/dto/TodoDTO.java
+++ b/src/main/java/com/cloudcomputing/todo/dto/TodoDTO.java
@@ -6,6 +6,7 @@ import lombok.Setter;
 @Getter
 @Setter
 public class TodoDTO {
+    private String todoId;
     private String title;
     private String description;
     private String userId;
diff --git a/src/main/java/com/cloudcomputing/todo/entity/Todo.java b/src/main/java/com/cloudcomputing/todo/entity/Todo.java
index aecff56..11bf3ba 100644
--- a/src/main/java/com/cloudcomputing/todo/entity/Todo.java
+++ b/src/main/java/com/cloudcomputing/todo/entity/Todo.java
@@ -2,12 +2,15 @@ package com.cloudcomputing.todo.entity;
 
 import lombok.Getter;
 import lombok.Setter;
+import org.springframework.data.annotation.Id;
 import org.springframework.data.mongodb.core.mapping.Document;
 
 @Getter
 @Setter
 @Document
 public class Todo {
+    @Id
+    private String todoId;
     private String title;
     private String description;
     private String userId;
diff --git a/src/main/java/com/cloudcomputing/todo/mapper/TodoMapper.java b/src/main/java/com/cloudcomputing/todo/mapper/TodoMapper.java
index 1ef3a4f..647f263 100644
--- a/src/main/java/com/cloudcomputing/todo/mapper/TodoMapper.java
+++ b/src/main/java/com/cloudcomputing/todo/mapper/TodoMapper.java
@@ -9,6 +9,7 @@ public class TodoMapper {
 
     public TodoDTO entityToDto(Todo todo) {
         TodoDTO todoDTO = new TodoDTO();
+        todoDTO.setTodoId(todo.getTodoId());
         todoDTO.setTitle(todo.getTitle());
         todoDTO.setDescription(todo.getDescription());
         todoDTO.setUserId(todo.getUserId());
@@ -19,6 +20,7 @@ public class TodoMapper {
 
     public Todo dtoToEntity(TodoDTO dto){
         Todo todo = new Todo();
+        todo.setTodoId(dto.getTodoId());
         todo.setTitle(dto.getTitle());
         todo.setDescription(dto.getDescription());
         todo.setUserId(dto.getUserId());
diff --git a/src/main/java/com/cloudcomputing/todo/service/UserService.java b/src/main/java/com/cloudcomputing/todo/service/UserService.java
index 72def1a..853fd62 100644
--- a/src/main/java/com/cloudcomputing/todo/service/UserService.java
+++ b/src/main/java/com/cloudcomputing/todo/service/UserService.java
@@ -84,15 +84,34 @@ public class UserService {
     public List<TodoDTO> addTodo(TodoDTO todoDTO){
         Todo todo = todoMapper.dtoToEntity(todoDTO);
         todoRepository.save(todo);
-        List <Todo> todoList = todoRepository.findAllByUserId(todo.getUserId());
+        List<Todo> todoList = todoRepository.findAllByUserId(todo.getUserId());
         List<TodoDTO> todoDTOList = new ArrayList<>();
 
         todoList.forEach((todoItem) -> {
             todoDTOList.add(todoMapper.entityToDto(todoItem));
         });
+
+        return todoDTOList;
+    }
+
+
+    public List<TodoDTO> deleteTodo(String userId, String todoId) {
+        System.out.println("service here");
+        if(todoRepository.existsById(todoId)){
+            todoRepository.deleteById(todoId);
+        }
+
+        List<Todo> todoList = todoRepository.findAllByUserId(userId);
+        List<TodoDTO> todoDTOList = new ArrayList<>();
+
+        todoList.forEach((todoItem) -> {
+            todoDTOList.add(todoMapper.entityToDto(todoItem));
+        });
+
         return todoDTOList;
     }
 
+    //helper methods
     public boolean validateSession(HttpServletRequest request) {
         HttpSession session = request.getSession(false);
         System.out.println("Session ID: " + (session != null ? session.getId() : "null"));
-- 
GitLab