Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions src/main/java/kwonyonghoon/todogo/dto/AddTaskRequest.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@
@Getter
public class AddTaskRequest {

public String title;
public String description;
public LocalDateTime deadline;
public Boolean status;
public Long userId;
private String title;
private String description;
private LocalDateTime deadline;
private Boolean status;
private Long userId;

public Task toEntity(User user){
return Task.builder()
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/kwonyonghoon/todogo/dto/AddUserRequest.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package kwonyonghoon.todogo.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class AddUserRequest {

private String phoneNumber;
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/kwonyonghoon/todogo/dto/TaskResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,17 @@
@Getter
public class TaskResponse {

private final Long userId;
private final Long taskNumber;
private final String title;
private final String description;
private final LocalDateTime deadline;
private final Boolean status;
private final UserResponse user;

public TaskResponse(Task task) {
this.userId = task.getId().getUserId();
this.taskNumber = task.getId().getTaskNumber();
this.title = task.getTitle();
this.description = task.getDescription();
this.deadline = task.getDeadline();
Expand Down
8 changes: 6 additions & 2 deletions src/main/java/kwonyonghoon/todogo/dto/UserResponse.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package kwonyonghoon.todogo.dto;

import kwonyonghoon.todogo.user.User;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import kwonyonghoon.todogo.user.User;

@Getter
@NoArgsConstructor(force = true)
@AllArgsConstructor
public class UserResponse {

private final Long id;
Expand All @@ -17,5 +22,4 @@ public UserResponse(User user) {
this.phoneNumber = user.getPhoneNumber();
this.name = user.getName();
}

}
12 changes: 6 additions & 6 deletions src/main/java/kwonyonghoon/todogo/task/Task.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,8 @@
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Task {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false)
private Long id;
@EmbeddedId
private TaskId id;

@CreatedDate
@Column(name = "created_at")
Expand All @@ -42,16 +40,18 @@ public class Task {
private Boolean status;

@ManyToOne(fetch = FetchType.LAZY)
@MapsId("userId")
@JoinColumn(name = "user_id", nullable = false)
private User user;

@Builder
public Task(String title, String description, LocalDateTime deadline, Boolean status, User user) {
public Task(User user, Long taskNumber, String title, String description, LocalDateTime deadline, Boolean status) {
this.id = new TaskId(user.getId(), taskNumber);
this.user = user;
this.title = title;
this.description = description;
this.deadline = deadline;
this.status = status;
this.user = user;
}

public void update(String title, String description, LocalDateTime deadline, Boolean status) {
Expand Down
39 changes: 25 additions & 14 deletions src/main/java/kwonyonghoon/todogo/task/TaskApiController.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ public class TaskApiController {

@PostMapping("/api/tasks")
public ResponseEntity<TaskResponse> addTask(@RequestBody AddTaskRequest request){
User user = userRepository.findById(request.getUserId())
.orElseThrow(() -> new IllegalArgumentException("해당 유저가 존재하지 않습니다."));
Task task = request.toEntity(user);
// User user = userRepository.findById(request.getUserId())
// .orElseThrow(() -> new IllegalArgumentException("해당 유저가 존재하지 않습니다."));
// Task task = request.toEntity(user);
Task savedTask = taskService.save(request);

return ResponseEntity.status(HttpStatus.CREATED)
Expand All @@ -41,28 +41,39 @@ public ResponseEntity<List<TaskResponse>> findAllTasks(){
.body(tasks);
}

@GetMapping("/api/tasks/{id}")
public ResponseEntity<TaskResponse> findTaskById(@PathVariable Long id){
Task task = taskService.findById(id);
@GetMapping("/api/users/{userId}/tasks/{taskNumber}")
public ResponseEntity<TaskResponse> findTask(
@PathVariable Long userId,
@PathVariable Long taskNumber){

TaskId taskId = new TaskId(userId, taskNumber);
Task task = taskService.findById(taskId);

return ResponseEntity.ok()
.body(new TaskResponse(task));
}

@DeleteMapping("/api/tasks/{id}")
public ResponseEntity<Void> deleteTask(@PathVariable Long id){
taskService.delete(id);
@DeleteMapping("/api/users/{userId}/tasks/{taskNumber}")
public ResponseEntity<Void> deleteTask(
@PathVariable Long userId,
@PathVariable Long taskNumber){

TaskId taskId = new TaskId(userId, taskNumber);
taskService.delete(taskId);

return ResponseEntity.ok()
.build();
}

@PutMapping("/api/tasks/{id}")
public ResponseEntity<TaskResponse> updateTask(@PathVariable Long id, @RequestBody UpdateTaskRequest request){
Task updatedTask = taskService.update(id, request);
@PutMapping("/api/users/{userId}/tasks/{taskNumber}")
public ResponseEntity<TaskResponse> updateTask(
@PathVariable Long userId,
@PathVariable Long taskNumber,
@RequestBody UpdateTaskRequest request){

return ResponseEntity.ok()
.body(new TaskResponse(updatedTask));
TaskId taskId = new TaskId(userId, taskNumber);
Task updatedTask = taskService.update(taskId, request);
return ResponseEntity.ok().body(new TaskResponse(updatedTask));
}

@GetMapping("/api/tasks/user/{uuid}")
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/kwonyonghoon/todogo/task/TaskId.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package kwonyonghoon.todogo.task;

import jakarta.persistence.Embeddable;
import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Embeddable
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class TaskId implements Serializable {

private Long userId;
private Long taskNumber;

}
3 changes: 2 additions & 1 deletion src/main/java/kwonyonghoon/todogo/task/TaskRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;

public interface TaskRepository extends JpaRepository<Task, Long> {
public interface TaskRepository extends JpaRepository<Task, TaskId> {
List<Task> findAllByUser(User user);
Long countByUser(User user);
}
33 changes: 29 additions & 4 deletions src/main/java/kwonyonghoon/todogo/task/TaskService.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,24 +21,49 @@ public Task save(AddTaskRequest request){
User user = userRepository.findById(request.getUserId())
.orElseThrow(()-> new IllegalArgumentException("User not found"));

return taskRepository.save(request.toEntity(user));
Long nextTaskNumber = getNextTaskNumber(user);

if(nextTaskNumber == null){
throw new IllegalArgumentException("TaskNumber는 Null이 될 수 없습니다");
}

Task task = Task.builder().
title(request.getTitle())
.description(request.getDescription())
.deadline(request.getDeadline())
.status(request.getStatus())
.user(user)
.taskNumber(nextTaskNumber)
.build();

return taskRepository.save(task);
}

public Long getNextTaskNumber(User user){
Long nextTaskNumber = taskRepository.countByUser(user) + 1;

if(nextTaskNumber == null){
throw new IllegalArgumentException("TaskNumber는 Null이 될 수 없습니다");
}

return nextTaskNumber;
}

public List<Task> findAll(){
return taskRepository.findAll();
}

public Task findById(Long id){
public Task findById(TaskId id){
return taskRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("not found: " + id));
}

public void delete(Long id){
public void delete(TaskId id){
taskRepository.deleteById(id);
}

@Transactional
public Task update(Long id, UpdateTaskRequest request){
public Task update(TaskId id, UpdateTaskRequest request){
Task task = taskRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("not found: " + id));

Expand Down
6 changes: 3 additions & 3 deletions src/main/resources/data.sql
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
INSERT INTO USER_TABLE (uuid, phone_number, name) VALUES('123e4567-e89b-12d3-a456-426614174000', '010-1234-5678', '홍길동')
INSERT INTO task (title, description, deadline, status, user_id) VALUES ('제목 1', '내용 1', '2025-4-14 17:30:30', false, 1)
INSERT INTO task (title, description, deadline, status, user_id) VALUES ('제목 2', '내용 2', '2025-4-15 17:30:30', true, 1)
INSERT INTO task (title, description, deadline, status, user_id) VALUES ('제목 3', '내용 3', '2025-4-16 17:30:30', false, 1)
INSERT INTO task (title, description, deadline, status, user_id, task_number) VALUES ('제목 1', '내용 1', '2025-4-14 17:30:30', false, 1, 1)
INSERT INTO task (title, description, deadline, status, user_id, task_number) VALUES ('제목 2', '내용 2', '2025-4-15 17:30:30', true, 1, 2)
INSERT INTO task (title, description, deadline, status, user_id, task_number) VALUES ('제목 3', '내용 3', '2025-4-16 17:30:30', false, 1, 3)
Loading
Loading