88import com .back .domain .user .repository .UserRepository ;
99import com .back .global .exception .CustomException ;
1010import com .back .global .exception .ErrorCode ;
11- import com .back .global .security .user .CustomUserDetails ;
12- import jakarta .validation .Valid ;
1311import lombok .RequiredArgsConstructor ;
1412import org .springframework .stereotype .Service ;
1513import org .springframework .transaction .annotation .Transactional ;
@@ -26,9 +24,10 @@ public class TodoService {
2624 private final UserRepository userRepository ;
2725
2826 // ==================== 생성 ===================
27+ @ Transactional
2928 public TodoResponseDto createTodo (Long userId , TodoRequestDto request ) {
30- User user = userRepository . findById (userId )
31- . orElseThrow (() -> new CustomException ( ErrorCode . USER_NOT_FOUND ));
29+ User user = findUserById (userId );
30+
3231 Todo todo = new Todo (
3332 user ,
3433 request .description (),
@@ -40,21 +39,68 @@ public TodoResponseDto createTodo(Long userId, TodoRequestDto request) {
4039 }
4140
4241 // ==================== 조회 ===================
43- // 유저의 특정 날짜의 모든 할 일 조회
42+ //유저의 특정 날짜의 모든 할 일 조회
4443 public List <TodoResponseDto > getTodosByDate (Long userId , LocalDate date ) {
4544 List <Todo > todos = todoRepository .findByUserIdAndDate (userId , date );
4645 return todos .stream ()
4746 .map (TodoResponseDto ::from )
4847 .collect (Collectors .toList ());
4948 }
50- // 유저의 전체 할 일 조회
49+
50+ //유저의 전체 할 일 조회
5151 public List <TodoResponseDto > getAllTodos (Long userId ) {
5252 List <Todo > todos = todoRepository .findByUserId (userId );
5353 return todos .stream ()
5454 .map (TodoResponseDto ::from )
5555 .collect (Collectors .toList ());
5656 }
57+
5758 // ==================== 수정 ===================
59+ // 할 일 내용 수정
60+ @ Transactional
61+ public TodoResponseDto updateTodo (Long userId , Long todoId , TodoRequestDto requestDto ) {
62+ User user = findUserById (userId );
63+ Todo todo = findTodoByIdAndUser (todoId , user );
64+
65+ todo .updateDescription (requestDto .description ());
66+
67+ return TodoResponseDto .from (todo );
68+ }
69+
70+ // 할 일 완료 상태 토글
71+ @ Transactional
72+ public TodoResponseDto toggleTodoComplete (Long userId , Long todoId ) {
73+ User user = findUserById (userId );
74+ Todo todo = findTodoByIdAndUser (todoId , user );
75+ todo .toggleComplete ();
76+ return TodoResponseDto .from (todo );
77+ }
5878
5979 // ==================== 삭제 ===================
60- }
80+ // 할 일 삭제
81+ @ Transactional
82+ public void deleteTodo (Long userId , Long todoId ) {
83+ User user = findUserById (userId );
84+ Todo todo = findTodoByIdAndUser (todoId , user );
85+ todoRepository .delete (todo );
86+ }
87+
88+ // ==================== 유틸 ===================
89+ // 유저 조회
90+ private User findUserById (Long userId ) {
91+ return userRepository .findById (userId )
92+ .orElseThrow (() -> new CustomException (ErrorCode .USER_NOT_FOUND ));
93+ }
94+
95+ // 할 일 조회 및 소유권 확인
96+ private Todo findTodoByIdAndUser (Long todoId , User user ) {
97+ Todo todo = todoRepository .findById (todoId )
98+ .orElseThrow (() -> new CustomException (ErrorCode .TODO_NOT_FOUND ));
99+
100+ if (!todo .getUser ().getId ().equals (user .getId ())) {
101+ throw new CustomException (ErrorCode .TODO_FORBIDDEN );
102+ }
103+
104+ return todo ;
105+ }
106+ }
0 commit comments