Skip to content

Commit 99bbd8b

Browse files
authored
Merge pull request #65 from YAPP-Github/feat/T3-163
[T3-163] '오늘만 삭제' 루틴 및 루틴 수정 v2 반영
2 parents 9e8f359 + 2d7a5b9 commit 99bbd8b

11 files changed

Lines changed: 224 additions & 34 deletions

File tree

src/main/java/bitnagil/bitnagil_backend/global/errorcode/ErrorCode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public enum ErrorCode {
5656
// 루틴 관련 에러 코드
5757
NOT_FOUND_ROUTINE("RT001", HttpStatus.NOT_FOUND, "존재하지 않는 루틴입니다."),
5858
ROUTINE_USER_NOT_MATCHED("RT002", HttpStatus.FORBIDDEN, "루틴의 유저 정보와 로그인 유저 정보가 일치하지 않습니다."),
59+
NOT_FOUND_ROUTINE_INFO("RT003", HttpStatus.NOT_FOUND, "존재하지 않는 루틴 정보입니다."),
5960

6061
// 서브 루틴 관련 에러 코드
6162
NOT_FOUND_SUB_ROUTINE("SR001", HttpStatus.NOT_FOUND, "해당 복합 키에 맞는 서브 루틴이 존재하지 않습니다."),

src/main/java/bitnagil/bitnagil_backend/routine/controller/RoutineController.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public class RoutineController implements RoutineSpec {
3434

3535
private final RoutineService routineService;
3636

37+
@Deprecated()
3738
@PostMapping("")
3839
public CustomResponseDto<Object> registerRoutine(@CurrentUser User user,
3940
@RequestBody RegisterRoutineRequest registerRoutineRequest) {
@@ -42,6 +43,7 @@ public CustomResponseDto<Object> registerRoutine(@CurrentUser User user,
4243
return CustomResponseDto.from(null);
4344
}
4445

46+
@Deprecated()
4547
@PatchMapping("")
4648
public CustomResponseDto<Object> updateRoutine(@CurrentUser User user,
4749
@RequestBody UpdateRoutineRequest updateRoutineRequest) {
@@ -60,6 +62,7 @@ public CustomResponseDto<Object> deleteRoutine(@CurrentUser User user, @PathVari
6062
/*
6163
* 유저가 선택한 요일(당일)만 삭제하는 API입니다.
6264
*/
65+
@Deprecated()
6366
@DeleteMapping("/day")
6467
public CustomResponseDto<Object> deleteRoutineByDay(@CurrentUser User user,
6568
@RequestBody DeleteRoutineByDayRequest deleteRoutineByDayRequest) {
@@ -72,6 +75,7 @@ public CustomResponseDto<Object> deleteRoutineByDay(@CurrentUser User user,
7275
* 회원이 보유한 특정 기간(start_date, end_date)의 루틴을 조회하는 API입니다.
7376
*/
7477
@GetMapping
78+
@Deprecated()
7579
public CustomResponseDto<RoutineSearchResponse> getRoutines(@CurrentUser User user,
7680
@RequestParam @NotNull LocalDate startDate,
7781
@RequestParam @NotNull LocalDate endDate) {
@@ -82,6 +86,7 @@ public CustomResponseDto<RoutineSearchResponse> getRoutines(@CurrentUser User us
8286
* 루틴 완료 여부 업데이트
8387
* 새 엔티티를 생성할 수도, 부분 수정할 수도 있기에 PATCH를 쓰지 않고 POST를 씁니다.
8488
*/
89+
@Deprecated()
8590
@PostMapping("/completions")
8691
public CustomResponseDto<Object> updateRoutineCompletionStatus(@CurrentUser User user,
8792
@RequestBody UpdateRoutineCompletionRequest updateRoutineCompletionRequest) {
@@ -91,6 +96,7 @@ public CustomResponseDto<Object> updateRoutineCompletionStatus(@CurrentUser User
9196
}
9297

9398
// 루틴 수정 페이지에서 사용되는 루틴 단건 조회 API
99+
@Deprecated()
94100
@GetMapping("{routineId}")
95101
public CustomResponseDto<RoutineSearchResultDto> getRoutine(@CurrentUser User user, @PathVariable UUID routineId) {
96102

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package bitnagil.bitnagil_backend.routineInfoV2.request;
2+
3+
import java.time.DayOfWeek;
4+
import java.time.LocalDate;
5+
import java.time.LocalTime;
6+
import java.util.List;
7+
8+
import bitnagil.bitnagil_backend.routineV2.domain.enums.UpdateApplyDate;
9+
import io.swagger.v3.oas.annotations.media.Schema;
10+
import jakarta.validation.constraints.NotNull;
11+
import lombok.Getter;
12+
import lombok.NoArgsConstructor;
13+
14+
@Getter
15+
@NoArgsConstructor
16+
@Schema(description = "루틴 정보 수정 DTO")
17+
public class RoutineInfoV2UpdateRequest {
18+
19+
@Schema(description = "루틴 ID 값입니다.",
20+
example = "3",
21+
required = true)
22+
@NotNull
23+
private String routineId;
24+
25+
@Schema(description = "오늘/내일 중 반영 시작할 날짜",
26+
example = "TODAY",
27+
required = true)
28+
@NotNull
29+
private UpdateApplyDate updateApplyDate;
30+
31+
@Schema(description = "루틴 이름입니다.",
32+
example = "아침 준비",
33+
required = true)
34+
@NotNull
35+
private String routineName;
36+
37+
@Schema(description = "반복 요일에 대한 리스트입니다. (반복요일이 없으면 당일 루틴입니다.)",
38+
example = "[\"MONDAY\", \"FRIDAY\"]",
39+
required = true)
40+
@NotNull
41+
private List<DayOfWeek> repeatDay;
42+
43+
@Schema(description = "루틴 시작 일자입니다.",
44+
example = "2025-08-01")
45+
private LocalDate routineStartDate;
46+
47+
@Schema(description = "루틴 시작 일자입니다.",
48+
example = "2025-08-31")
49+
private LocalDate routineEndDate;
50+
51+
@Schema(description = "루틴 시작 시간입니다.",
52+
example = "08:15:00",
53+
required = true)
54+
@NotNull
55+
private LocalTime executionTime;
56+
57+
@Schema(description = "세부 루틴 이름에 대한 리스트입니다.",
58+
example = "[\"손 씻기\", \"세수 하기\", \"양치 하기\"]")
59+
private List<String> subRoutineName;
60+
}

src/main/java/bitnagil/bitnagil_backend/routineV2/controller/RoutineV2Controller.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package bitnagil.bitnagil_backend.routineV2.controller;
22

3-
import bitnagil.bitnagil_backend.routineV2.request.UpdateRoutineCompletionRequest;
3+
import bitnagil.bitnagil_backend.routineInfoV2.request.RoutineInfoV2UpdateRequest;
4+
import bitnagil.bitnagil_backend.routineV2.request.RoutineV2UpdateCompletionRequest;
45
import bitnagil.bitnagil_backend.routineV2.response.RoutineV2SearchResponse;
56
import bitnagil.bitnagil_backend.routineV2.response.RoutineV2SearchResultDto;
67
import jakarta.validation.constraints.NotNull;
@@ -9,7 +10,7 @@
910
import bitnagil.bitnagil_backend.global.annotation.CurrentUser;
1011
import bitnagil.bitnagil_backend.global.response.CustomResponseDto;
1112
import bitnagil.bitnagil_backend.routineV2.controller.spec.RoutineV2Spec;
12-
import bitnagil.bitnagil_backend.routineV2.request.RegisterRoutineV2Request;
13+
import bitnagil.bitnagil_backend.routineV2.request.RoutineV2RegisterRequest;
1314
import bitnagil.bitnagil_backend.routineV2.service.RoutineV2Service;
1415
import bitnagil.bitnagil_backend.user.domain.User;
1516
import lombok.RequiredArgsConstructor;
@@ -38,20 +39,36 @@ public CustomResponseDto<RoutineV2SearchResultDto> getRoutine(@CurrentUser User
3839
return CustomResponseDto.from(routineV2Service.getRoutine(user, routineId));
3940
}
4041

42+
// 루틴을 새롭게 등록하는 API 입니다.
4143
@PostMapping("")
42-
public CustomResponseDto<Object> registerRoutine(@CurrentUser User user, @RequestBody RegisterRoutineV2Request request) {
44+
public CustomResponseDto<Object> registerRoutine(@CurrentUser User user, @RequestBody RoutineV2RegisterRequest request) {
4345
routineV2Service.registerRoutineV2(user, request);
4446

4547
return CustomResponseDto.from(null);
4648
}
4749

50+
// 루틴 당일(오늘)만 삭제하는 API 입니다.
51+
@DeleteMapping("/{routineId}")
52+
public CustomResponseDto<Object> deleteRoutineByDay(@CurrentUser User user, @PathVariable Long routineId) {
53+
routineV2Service.deleteRoutineByDay(user, routineId);
54+
55+
return CustomResponseDto.from(null);
56+
}
57+
58+
@PatchMapping("")
59+
public CustomResponseDto<Object> updateRoutineInfo(@CurrentUser User user, @RequestBody RoutineInfoV2UpdateRequest request) {
60+
routineV2Service.updateRoutineInfo(user, request);
61+
62+
return CustomResponseDto.from(null);
63+
}
64+
4865
/*
4966
* 루틴 완료 여부를 갱신하는 API 입니다.
5067
* 멱등성이 보장되는 업데이트 API이므로 PUT Method를 사용했습니다.
5168
*/
52-
@PutMapping("")
69+
@PutMapping("/completions")
5370
public CustomResponseDto<Object> updateRoutineCompletionStatus(
54-
@CurrentUser User user, @RequestBody UpdateRoutineCompletionRequest request) {
71+
@CurrentUser User user, @RequestBody RoutineV2UpdateCompletionRequest request) {
5572

5673
routineV2Service.updateRoutineCompletionStatus(user, request);
5774

src/main/java/bitnagil/bitnagil_backend/routineV2/controller/spec/RoutineV2Spec.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
import bitnagil.bitnagil_backend.global.response.CustomResponseDto;
66
import bitnagil.bitnagil_backend.global.swagger.ApiErrorCodeExamples;
77
import bitnagil.bitnagil_backend.global.swagger.ApiTags;
8-
import bitnagil.bitnagil_backend.routineV2.request.RegisterRoutineV2Request;
9-
import bitnagil.bitnagil_backend.routineV2.request.UpdateRoutineCompletionRequest;
8+
import bitnagil.bitnagil_backend.routineV2.request.RoutineV2RegisterRequest;
9+
import bitnagil.bitnagil_backend.routineInfoV2.request.RoutineInfoV2UpdateRequest;
10+
import bitnagil.bitnagil_backend.routineV2.request.RoutineV2UpdateCompletionRequest;
1011
import bitnagil.bitnagil_backend.routineV2.response.RoutineV2SearchResponse;
1112
import bitnagil.bitnagil_backend.routineV2.response.RoutineV2SearchResultDto;
1213
import bitnagil.bitnagil_backend.user.domain.User;
@@ -17,8 +18,8 @@
1718
import jakarta.validation.constraints.NotNull;
1819

1920
import java.time.LocalDate;
20-
import java.util.UUID;
2121

22+
import org.springframework.web.bind.annotation.PathVariable;
2223
import org.springframework.web.bind.annotation.RequestBody;
2324

2425
@Tag(name = ApiTags.ROUTINEV2)
@@ -38,10 +39,18 @@ public interface RoutineV2Spec {
3839

3940

4041
@Operation(summary = "루틴 정보 등록 및 루틴 시작, 종료일자 사이에서 반복요일에 해당하는 날짜로 루틴 데이터를 생성합니다.")
41-
CustomResponseDto<Object> registerRoutine(User user, RegisterRoutineV2Request request);
42+
CustomResponseDto<Object> registerRoutine(User user, RoutineV2RegisterRequest request);
43+
44+
@Operation(summary = "루틴 정보를 업데이트합니다.")
45+
@ApiErrorCodeExamples({ErrorCode.NOT_FOUND_ROUTINE, ErrorCode.NOT_FOUND_ROUTINE_INFO})
46+
CustomResponseDto<Object> updateRoutineInfo(User user, RoutineInfoV2UpdateRequest request);
4247

4348
@Operation(summary = "여러 루틴의 완료 여부를 갱신합니다. (여러 루틴의 완료 여부를 리스트로 만들어 요청하는 방식입니다.)")
4449
@ApiErrorCodeExamples({ErrorCode.NOT_FOUND_ROUTINE})
4550
CustomResponseDto<Object> updateRoutineCompletionStatus(
46-
@CurrentUser User user, @RequestBody UpdateRoutineCompletionRequest request);
51+
@CurrentUser User user, @RequestBody RoutineV2UpdateCompletionRequest request);
52+
53+
@Operation(summary = "오늘만 루틴을 삭제합니다.")
54+
@ApiErrorCodeExamples({ErrorCode.NOT_FOUND_ROUTINE})
55+
CustomResponseDto<Object> deleteRoutineByDay(User user, Long routineId);
4756
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package bitnagil.bitnagil_backend.routineV2.domain.enums;
2+
3+
import bitnagil.bitnagil_backend.enums.EnumType;
4+
import lombok.Getter;
5+
import lombok.RequiredArgsConstructor;
6+
7+
@RequiredArgsConstructor
8+
@Getter
9+
public enum UpdateApplyDate implements EnumType {
10+
11+
TODAY("오늘부터 적용"),
12+
TOMORROW("내일부터 적용");
13+
14+
private final String description;
15+
}

src/main/java/bitnagil/bitnagil_backend/routineV2/repository/RoutineV2Repository.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,28 @@ Optional<RoutineV2> findByUserAndRoutineId(
5050
List<RoutineV2> findByRoutineInfoAndRoutineDateAfter(RoutineInfoV2 routineInfoV2, LocalDate date);
5151

5252
/**
53-
* 루틴을 물리 삭제하기 위한 JPQL
53+
* 다수의 루틴을 물리 삭제하기 위한 JPQL
5454
* 메모리 로드 비용 줄이기 위해 routineIds를 파라미터로 채택
5555
*/
5656
@Modifying
5757
@Query("DELETE FROM RoutineV2 r WHERE r.routineId IN :ids")
5858
void deleteAllPhysicallyByIds(@Param("ids") List<Long> routineIds);
59+
60+
/**
61+
* 단일 루틴을 물리 삭제하기 위한 JPQL
62+
* 메모리 로드 비용 줄이기 위해 routineIds를 파라미터로 채택
63+
*/
64+
@Modifying
65+
@Query("DELETE FROM RoutineV2 r WHERE r.routineId = :id")
66+
void deletePhysicallyById(@Param("id") Long routineId);
67+
68+
// startDate부터 endDate까지 routineDate 포함 데이터 모두 삭제
69+
@Modifying
70+
@Query("DELETE FROM RoutineV2 r WHERE r.routineDate BETWEEN :startDate AND :endDate AND "
71+
+ "r.routineInfo.routineInfoId = :routineInfoId")
72+
void deleteByRoutineDateBetweenAndRoutineInfo(
73+
@Param("startDate") LocalDate startDate,
74+
@Param("endDate") LocalDate endDate,
75+
@Param("routineInfoId") Long routineInfoId);
76+
5977
}

src/main/java/bitnagil/bitnagil_backend/routineV2/request/RegisterRoutineV2Request.java renamed to src/main/java/bitnagil/bitnagil_backend/routineV2/request/RoutineV2RegisterRequest.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,17 @@
88
import bitnagil.bitnagil_backend.recommendedRoutine.domain.enums.RecommendedRoutineType;
99
import io.swagger.v3.oas.annotations.media.Schema;
1010
import jakarta.validation.constraints.NotNull;
11+
import lombok.AllArgsConstructor;
12+
import lombok.Builder;
1113
import lombok.Getter;
1214
import lombok.NoArgsConstructor;
1315

1416
@Getter
17+
@Builder
1518
@NoArgsConstructor
19+
@AllArgsConstructor
1620
@Schema(description = "루틴 등록 요청 DTO")
17-
public class RegisterRoutineV2Request {
21+
public class RoutineV2RegisterRequest {
1822

1923
@Schema(description = "루틴 이름입니다.",
2024
example = "아침 준비",
@@ -29,15 +33,11 @@ public class RegisterRoutineV2Request {
2933
private List<DayOfWeek> repeatDay;
3034

3135
@Schema(description = "루틴 시작 일자입니다.",
32-
example = "2025-08-01",
33-
required = true)
34-
@NotNull
36+
example = "2025-08-01")
3537
private LocalDate routineStartDate;
3638

3739
@Schema(description = "루틴 시작 일자입니다.",
38-
example = "2025-08-31",
39-
required = true)
40-
@NotNull
40+
example = "2025-08-31")
4141
private LocalDate routineEndDate;
4242

4343
@Schema(description = "루틴 시작 시간입니다.",

src/main/java/bitnagil/bitnagil_backend/routineV2/request/UpdateRoutineCompletionInfo.java renamed to src/main/java/bitnagil/bitnagil_backend/routineV2/request/RoutineV2UpdateCompletionInfo.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
@Getter
1111
@NoArgsConstructor
12-
public class UpdateRoutineCompletionInfo {
12+
public class RoutineV2UpdateCompletionInfo {
1313

1414
@Schema(description = "루틴 완료 여부를 갱신할 루틴 ID 값입니다.",
1515
example = "4",

src/main/java/bitnagil/bitnagil_backend/routineV2/request/UpdateRoutineCompletionRequest.java renamed to src/main/java/bitnagil/bitnagil_backend/routineV2/request/RoutineV2UpdateCompletionRequest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
@Getter
1111
@NoArgsConstructor
1212
@Schema(description = "루틴 완료 여부 갱신 DTO")
13-
public class UpdateRoutineCompletionRequest {
13+
public class RoutineV2UpdateCompletionRequest {
1414

1515
@Schema(description = "루틴 완료 여부를 갱신할 루틴 정보 리스트입니다.",
1616
required = true)
1717
@NotNull
18-
List<UpdateRoutineCompletionInfo> routineCompletionInfos;
18+
List<RoutineV2UpdateCompletionInfo> routineCompletionInfos;
1919
}

0 commit comments

Comments
 (0)