package [Link].
controller;
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link].*;
import [Link];
import [Link];
import [Link];
import [Link];
@RestController
@RequestMapping("/api/v1/tasks")
@RequiredArgsConstructor
@Validated
@Tag(name = "Task Management API", description = "APIs for managing tasks")
public class TaskController {
private final TaskService taskService;
// Request/Response DTOs
@[Link]
public static class TaskRequest {
private String title;
private String description;
private Priority priority;
private String category;
private Set<String> tags;
private LocalDateTime dueDate;
}
@[Link]
public static class TaskResponse {
private String id;
private String title;
private String description;
private Priority priority;
private String category;
private Set<String> tags;
private LocalDateTime dueDate;
private Status status;
}
// Create a new task
@PostMapping
@Operation(summary = "Create a new task")
@ApiResponse(responseCode = "201", description = "Task created successfully")
public ResponseEntity<TaskResponse> createTask(@Valid @RequestBody TaskRequest
request) {
Task task = [Link](
[Link](),
[Link](),
[Link](),
[Link](),
[Link](),
[Link]()
);
return new ResponseEntity<>(convertToResponse(task), [Link]);
}
// Get all tasks
@GetMapping
@Operation(summary = "Get all tasks")
public ResponseEntity<List<TaskResponse>> getAllTasks(
@RequestParam(required = false) String category,
@RequestParam(required = false) Status status,
@RequestParam(required = false) Priority priority) {
List<Task> tasks = [Link](category, status, priority);
List<TaskResponse> response = [Link]()
.map(this::convertToResponse)
.toList();
return [Link](response);
}
// Get task by ID
@GetMapping("/{id}")
@Operation(summary = "Get task by ID")
public ResponseEntity<TaskResponse> getTaskById(@PathVariable String id) {
return [Link](id)
.map(task -> [Link](convertToResponse(task)))
.orElse([Link]().build());
}
// Update task
@PutMapping("/{id}")
@Operation(summary = "Update an existing task")
public ResponseEntity<TaskResponse> updateTask(
@PathVariable String id,
@Valid @RequestBody TaskRequest request) {
Task updatedTask = [Link](
id,
[Link](),
[Link](),
[Link](),
[Link](),
[Link](),
[Link]()
);
return [Link](convertToResponse(updatedTask));
}
// Update task status
@PatchMapping("/{id}/status")
@Operation(summary = "Update task status")
public ResponseEntity<TaskResponse> updateTaskStatus(
@PathVariable String id,
@RequestParam Status status) {
Task updatedTask = [Link](id, status);
return [Link](convertToResponse(updatedTask));
}
// Delete task
@DeleteMapping("/{id}")
@Operation(summary = "Delete a task")
@ApiResponse(responseCode = "204", description = "Task deleted successfully")
public ResponseEntity<Void> deleteTask(@PathVariable String id) {
[Link](id);
return [Link]().build();
}
// Get tasks by tag
@GetMapping("/tags/{tag}")
@Operation(summary = "Get tasks by tag")
public ResponseEntity<List<TaskResponse>> getTasksByTag(@PathVariable String
tag) {
List<Task> tasks = [Link](tag);
List<TaskResponse> response = [Link]()
.map(this::convertToResponse)
.toList();
return [Link](response);
}
// Get tasks statistics
@GetMapping("/statistics")
@Operation(summary = "Get task statistics")
public ResponseEntity<Map<String, Integer>> getTaskStatistics() {
return [Link]([Link]());
}
// Get next pending task
@GetMapping("/next")
@Operation(summary = "Get next pending task")
public ResponseEntity<TaskResponse> getNextPendingTask() {
return [Link]([Link]())
.map(task -> [Link](convertToResponse(task)))
.orElse([Link]().build());
}
// Exception handling
@ExceptionHandler([Link])
public ResponseEntity<String> handleException(Exception e) {
return new ResponseEntity<>([Link](),
HttpStatus.INTERNAL_SERVER_ERROR);
}
// Utility method to convert Task to TaskResponse
private TaskResponse convertToResponse(Task task) {
TaskResponse response = new TaskResponse();
[Link]([Link]());
[Link]([Link]());
[Link]([Link]());
[Link]([Link]());
[Link]([Link]());
[Link]([Link]());
[Link]([Link]());
[Link]([Link]());
return response;
}
}