From d0bdee193bd9ba858b5907729e8a6f8908ac7206 Mon Sep 17 00:00:00 2001 From: omkarbabar Date: Sun, 29 Jun 2025 19:29:04 +0530 Subject: [PATCH] refactor: add service layer, swagger, lombok support, and improve task list UI - Introduced TaskService interface and TaskServiceImpl for cleaner separation of concerns - Annotated TaskController with Swagger @Operation and @Tag for API documentation - Added springdoc-openapi-ui dependency for Swagger support - Integrated Lombok into the project to reduce boilerplate (e.g. @Data, @AllArgsConstructor) - Refactored Task model to use Lombok annotations - Modernized task list HTML structure with icon-only buttons and improved alignment - Centered and styled status columns using Bootstrap utilities - Applied semantic improvements and responsive structure in the Thymeleaf template --- pom.xml | 13 ++++++ .../controller/TaskController.java | 32 +++++++------- .../silversoth/task_manager/entity/Task.java | 32 +++----------- .../task_manager/service/TaskService.java | 12 ++++++ .../task_manager/service/TaskServiceImpl.java | 42 +++++++++++++++++++ src/main/resources/templates/index.html | 37 ++++++++++------ 6 files changed, 116 insertions(+), 52 deletions(-) create mode 100644 src/main/java/com/github/silversoth/task_manager/service/TaskService.java create mode 100644 src/main/java/com/github/silversoth/task_manager/service/TaskServiceImpl.java diff --git a/pom.xml b/pom.xml index 3a8be71..1e30211 100644 --- a/pom.xml +++ b/pom.xml @@ -52,6 +52,19 @@ spring-boot-starter-test test + + + org.springdoc + springdoc-openapi-ui + 1.7.0 + + + + org.projectlombok + lombok + provided + + diff --git a/src/main/java/com/github/silversoth/task_manager/controller/TaskController.java b/src/main/java/com/github/silversoth/task_manager/controller/TaskController.java index e449050..5c9532f 100644 --- a/src/main/java/com/github/silversoth/task_manager/controller/TaskController.java +++ b/src/main/java/com/github/silversoth/task_manager/controller/TaskController.java @@ -1,56 +1,60 @@ package com.github.silversoth.task_manager.controller; import com.github.silversoth.task_manager.dao.TaskRepository; +import com.github.silversoth.task_manager.service.TaskService; import org.springframework.stereotype.Controller; - import com.github.silversoth.task_manager.entity.Task; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; + @Controller +@Tag(name = "Task Controller", description = "Handles task operations for the web app") public class TaskController { - private final TaskRepository taskRepository; - public TaskController(TaskRepository taskRepository) { - this.taskRepository = taskRepository; - } + private final TaskService taskService; + public TaskController(TaskService taskService) { + this.taskService = taskService; + } + @Operation(summary = "Redirect root URL to tasks page") @GetMapping("/") public String homeRedirect() { return "redirect:/tasks"; } - + @Operation(summary = "List all tasks and show form") @GetMapping("/tasks") public String listTasks(Model model) { - model.addAttribute("tasks", taskRepository.findAll()); + model.addAttribute("tasks", taskService.getAllTasks()); model.addAttribute("task", new Task()); return "index"; } + @Operation(summary = "Save a new task") @PostMapping("/tasks") public String saveTask(@ModelAttribute Task task) { - taskRepository.save(task); + taskService.saveTask(task); return "redirect:/tasks"; } + @Operation(summary = "Delete a task by ID") @GetMapping("/tasks/delete/{id}") public String deleteTask(@PathVariable Long id) { - taskRepository.deleteById(id); + taskService.deleteTask(id); return "redirect:/tasks"; } + @Operation(summary = "Toggle completion status of a task") @GetMapping("/tasks/complete/{id}") public String completeTask(@PathVariable Long id) { - Task task = taskRepository.findById(id).orElse(null); - if (task != null) { - task.setCompleted(!task.isCompleted()); - taskRepository.save(task); - } + taskService.toggleTaskCompletion(id); return "redirect:/tasks"; } } diff --git a/src/main/java/com/github/silversoth/task_manager/entity/Task.java b/src/main/java/com/github/silversoth/task_manager/entity/Task.java index c8dd539..0345229 100644 --- a/src/main/java/com/github/silversoth/task_manager/entity/Task.java +++ b/src/main/java/com/github/silversoth/task_manager/entity/Task.java @@ -3,9 +3,15 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; @Entity +@Data +@AllArgsConstructor +@NoArgsConstructor public class Task { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -13,30 +19,4 @@ public class Task { private String description; private boolean completed; - - // Getters y setters - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public boolean isCompleted() { - return completed; - } - - public void setCompleted(boolean completed) { - this.completed = completed; - } } diff --git a/src/main/java/com/github/silversoth/task_manager/service/TaskService.java b/src/main/java/com/github/silversoth/task_manager/service/TaskService.java new file mode 100644 index 0000000..757305d --- /dev/null +++ b/src/main/java/com/github/silversoth/task_manager/service/TaskService.java @@ -0,0 +1,12 @@ +package com.github.silversoth.task_manager.service; + +import com.github.silversoth.task_manager.entity.Task; + +import java.util.List; + +public interface TaskService { + List getAllTasks(); + Task saveTask(Task task); + void deleteTask(Long id); + Task toggleTaskCompletion(Long id); +} diff --git a/src/main/java/com/github/silversoth/task_manager/service/TaskServiceImpl.java b/src/main/java/com/github/silversoth/task_manager/service/TaskServiceImpl.java new file mode 100644 index 0000000..8d4a4f9 --- /dev/null +++ b/src/main/java/com/github/silversoth/task_manager/service/TaskServiceImpl.java @@ -0,0 +1,42 @@ +package com.github.silversoth.task_manager.service; + +import com.github.silversoth.task_manager.dao.TaskRepository; +import com.github.silversoth.task_manager.entity.Task; +import org.springframework.stereotype.Service; +import java.util.List; + +@Service +public class TaskServiceImpl implements TaskService { + + private final TaskRepository taskRepository; + + public TaskServiceImpl(TaskRepository taskRepository) { + this.taskRepository = taskRepository; + } + + @Override + public List getAllTasks() { + return taskRepository.findAll(); + } + + @Override + public Task saveTask(Task task) { + return taskRepository.save(task); + } + + @Override + public void deleteTask(Long id) { + taskRepository.deleteById(id); + } + + @Override + public Task toggleTaskCompletion(Long id) { + Task task = taskRepository.findById(id).orElse(null); + if (task != null) { + task.setCompleted(!task.isCompleted()); + return taskRepository.save(task); + } + return null; + } +} + diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index 8f38eb2..0b9a844 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -4,36 +4,49 @@ Task Manager + + + + -

My Tasks

+
+

📝 My Tasks

+

Organize, track, and manage your tasks efficiently.

+
-
-
- - + +
+ +
- - +
+ - - - + + + - -
DescriptionCompletedActionsDescriptionCompletedActions
+ + Complete Eliminate
+