EXPERIMENT -10
AIM OF THE EXPERIMENT: Spring Boot to do application.
Develop a simple task management system using Spring Boot to help users
organize their tasks efficiently. The system should allow users to create, update,
delete, and mark tasks as completed.
Code
[Link]
package [Link];
import [Link];
import [Link];
import [Link];
import [Link]; import
[Link];
import [Link];
public record
TodoListDto( UUID id,
List<TodoTaskDto> tasks,
LocalDateTime createdAt,
LocalDateTime updatedAt
){
public static TodoListDto toDto(TodoList todoList)
{ List<TodoTaskDto> tasks = [Link]()
.stream()
.map(TodoTaskDto::toDto)
.toList();
return new TodoListDto(
[Link](), tasks,
[Link](),
[Link]()
);
}
public static TodoList fromDto(TodoListDto todoListDto)
{ TodoList todoList = new TodoList(
null,
null,
null,
new ArrayList<>()
);
List<TodoTask> tasks = [Link]()
.stream()
.map(TodoTaskDto::fromDto)
.peek(todoTask -> [Link](todoList))
.toList();
[Link](tasks);
return todoList;
}
}
[Link]
package [Link];
import [Link];
public record TodoTaskDto(
String description,
boolean completed
){
public static TodoTaskDto toDto(TodoTask todoTask) { return
new TodoTaskDto(
[Link](),
[Link]()
);
}
public static TodoTask fromDto(TodoTaskDto todoTaskDto) { return new
TodoTask(
null,
[Link](),
[Link](), null
);
}
}
Control
package [Link];
import [Link];
import [Link]; import
[Link].*; import
[Link];
import [Link];
import [Link];
@RestController @RequestMapping("/api/todos")
@CrossOrigin("[Link]
@RequiredArgsConstructor
public class TodoController {
private final TodoService todoService;
@GetMapping("/{id}")
public ResponseEntity<TodoListDto> findTodoListById(@PathVariable UUID id) { TodoListDto
todoListDto = [Link](id);
if (todoListDto == null) {
return [Link]().build();
}
return [Link](todoListDto);
}
@PutMapping
public ResponseEntity<UUID> createTodoList(@RequestBody TodoListDto todoListDto) { UUID
todoListId = [Link](todoListDto);
return [Link](todoListId);
}
@PatchMapping
public ResponseEntity<?> updateTodoList(@RequestBody TodoListDto todoListDto) { boolean
updated = [Link](todoListDto);
if (updated) {
return [Link]().build();
}
return [Link]().build();
}
@DeleteMapping("/{id}")
public ResponseEntity<?> deleteTodoList(@PathVariable UUID id) { boolean
result = [Link](id);
if (result) {
return [Link]().build();
}
return [Link]().build();
}
}
Model
package [Link];
import [Link].*; import
[Link]; import
[Link];
import [Link];
import [Link];
import [Link]; import
[Link];
import [Link];
import [Link]; import
[Link];
import [Link];
@Entity
@Table(name = "todo_lists")
@Getter @AllArgsConstructor
@NoArgsConstructor
public class TodoList {
@Id
@UuidGenerator
@Column(name = "id", updatable = false, nullable = false) private
UUID id;
@CreationTimestamp
@Column(name = "created_at", nullable = false, updatable = false) private
LocalDateTime createdAt;
@UpdateTimestamp
private LocalDateTime updatedAt;
@OneToMany(mappedBy = "todoList", cascade = [Link], orphanRemoval = true, fetch =
[Link])
private List<TodoTask> tasks = new ArrayList<>();
public void clearTasks() {
[Link]();
}
public void addTasks(List<TodoTask> tasks) {
[Link](tasks);
}
}
Model Config
package [Link];
import [Link].*; import
[Link]; import
[Link];
import [Link];
import [Link];
@Entity @Getter
@NoArgsConstructor
@AllArgsConstructor @Table(name
= "todo_tasks") public class
TodoTask {
@Id
@GeneratedValue(strategy = [Link]) private
Long id;
private String description; private
boolean completed;
@Setter
@ManyToOne(fetch = [Link])
@JoinColumn(name = "todo_list_id") private
TodoList todoList;
}
Services
package [Link];
import [Link]; import
[Link]; import
[Link]; import
[Link]; import
[Link]; import
[Link];
import [Link];
import [Link];
import [Link];
@Service
@RequiredArgsConstructor public
class TodoService {
private final TodoRepository todoRepository;
public TodoListDto findTodoListById(UUID uniqueId) {
TodoList todoList = [Link](uniqueId).orElse(null);
if (todoList == null) { return
null;
}
return [Link](todoList);
}
public UUID createTodoList(TodoListDto todoListDto) {
if ([Link]() == null || [Link]().isEmpty()) { return
null;
}
TodoList todoList = [Link](todoListDto); todoList
= [Link](todoList);
return [Link]();
}
public boolean updateTodoList(TodoListDto todoListDto) { if
([Link]() == null || [Link]() == null) {
return false;
}
TodoList todoList = [Link]([Link]()).orElse(null); if
(todoList == null) {
return false;
}
List<TodoTask> taskList = [Link]()
.stream()
.map(TodoTaskDto::fromDto)
.peek(todoTask -> [Link](todoList))
.toList(); [Link]();
[Link](taskList);
[Link](todoList);
return true;
}
public boolean deleteTodoList(UUID id) { boolean
exists = [Link](id);
if (exists) { [Link](id);
return true;
}
return false;
}
}
TASK
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
@Service
@RequiredArgsConstructor public
class TodoCleanupTask {
private final TodoRepository todoRepository; @Transactional
@Scheduled(cron = "0 0 0 * * *") public
void cleanupOldTodoLists() {
LocalDateTime thirtyDaysAgo = [Link]().minusDays(30);
List<TodoList> oldTodoLists = [Link](thirtyDaysAgo);
[Link](oldTodoLists);
}
}
package [Link];
import [Link];
import [Link];
@SpringBootApplication
public class SpringTodoApplication {
public static void main(String[] args)
{ [Link]([Link], args);
}
}
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link]; import
[Link]; import
[Link];
import [Link];
import [Link];
import [Link];
import static [Link].*;
@SpringBootTest
@RunWith([Link])
public class TodoServiceTest {
@Autowired
private TodoService todoService;
private UUID existingTodoListId;
@Before
public void setUp() { List<TodoTaskDto>
tasks = [Link](
new TodoTaskDto("First task", false)
);
TodoListDto todoListDto = new TodoListDto(null, tasks, null, null);
existingTodoListId = [Link](todoListDto);
}
@Test
public void findTodoListByNotExistingId() {
TodoListDto todoListDto = [Link]([Link]());
assertNull(todoListDto);
}
@Test
public void findTodoListById() {
TodoListDto retrieved = [Link](existingTodoListId);
assertNotNull([Link]());
assertNotNull([Link]());
assertNotNull([Link]());
}
@Test
public void createTodoList()
{ List<TodoTaskDto> tasks = [Link](
new TodoTaskDto("First task", false)
);
TodoListDto todoListDto = new TodoListDto(null, tasks, null, null); UUID id =
[Link](todoListDto);
assertNotNull(id);
TodoTaskDto task = [Link]().get(0); TodoTaskDto
expectedTask = [Link](0);
assertEquals([Link](), [Link]());
assertEquals([Link](), [Link]());
}
@Test
public void updateNotExistingTodoList()
{ List<TodoTaskDto> tasks = [Link](
new TodoTaskDto("First task", true)
);
TodoListDto todoListDto = new TodoListDto([Link](), tasks, null, null); boolean updated
= [Link](todoListDto);
assertFalse(updated);
}
@Test
public void updateTodoList()
{ List<TodoTaskDto> tasks = [Link](
new TodoTaskDto("Updated task", true)
);
TodoListDto todoListDto = new TodoListDto(existingTodoListId, tasks, null, null); boolean
updated = [Link](todoListDto);
assertTrue(updated);
}
}
NAME- KUSAGRA RAJ
Reg.- 2201030103
GROUP- 5A
BRANCH- CSE