Skip to content

Commit 86d6c00

Browse files
authored
[T3-120] 추천 루틴 단건 조회 API (#36)
* fix: 추천 루틴 엔티티 실행시간 변수명 수정 * fix: 추천 루틴 엔티티 실행시간 변수명 수정에 따른 sql 수정 * feat: 추천 루틴 단건 조회 API * chore: 서브모듈 업데이트 * remove: 불필요한 dto 제거 * fix: swagger 명세 수정 * fix: 추천 루틴 단건조회 로직 수정 * fix: 추천루틴 엔티티 필드명 변경에 따른 수정(time -> executionTime)
1 parent 7efe7b2 commit 86d6c00

10 files changed

Lines changed: 56 additions & 5 deletions

File tree

config

src/main/java/bitnagil/bitnagil_backend/changedRoutine/service/ChangedRoutineFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public ChangedRoutine createChangedRoutineForOnboarding(
2525
return ChangedRoutine.builder()
2626
.changedRoutinePk(new HistoryPk(UUID.randomUUID(), 1L))
2727
.changedRoutineName(recommendedRoutine.getRecommendedRoutineName())
28-
.changedExecutionTime(recommendedRoutine.getTime())
28+
.changedExecutionTime(recommendedRoutine.getExecutionTime())
2929
.originalRoutineDate(today) // 원본 루틴 날짜는 현재 날짜로 설정
3030
.changedRoutineDate(today) // 변경된 루틴 날짜도 현재 날짜로 설정
3131
.historyStartDateTime(now)

src/main/java/bitnagil/bitnagil_backend/recommendedRoutine/controller/RecommendedRoutineController.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@
44
import bitnagil.bitnagil_backend.global.response.CustomResponseDto;
55
import bitnagil.bitnagil_backend.recommendedRoutine.controller.spec.RecommendedRoutineSpec;
66
import bitnagil.bitnagil_backend.recommendedRoutine.response.RecommendedRoutineSearchResponse;
7+
import bitnagil.bitnagil_backend.recommendedRoutine.response.RecommendedRoutineSearchResult;
78
import bitnagil.bitnagil_backend.recommendedRoutine.service.RecommendedRoutineService;
89
import bitnagil.bitnagil_backend.user.domain.User;
910
import lombok.RequiredArgsConstructor;
1011
import org.springframework.web.bind.annotation.GetMapping;
12+
import org.springframework.web.bind.annotation.PathVariable;
1113
import org.springframework.web.bind.annotation.RequestMapping;
1214
import org.springframework.web.bind.annotation.RestController;
1315

@@ -17,8 +19,15 @@
1719
public class RecommendedRoutineController implements RecommendedRoutineSpec {
1820
private final RecommendedRoutineService recommendedRoutineService;
1921

22+
// 추천 루틴 전체 조회
2023
@GetMapping("")
2124
public CustomResponseDto<RecommendedRoutineSearchResponse> searchRecommendedRoutines(@CurrentUser User user) {
2225
return CustomResponseDto.from(recommendedRoutineService.searchRecommendedRoutines(user));
2326
}
27+
28+
// 추천 루틴 단건 조회
29+
@GetMapping("/{recommendedRoutineId}")
30+
public CustomResponseDto<RecommendedRoutineSearchResult> searchRecommendedRoutine(@PathVariable Long recommendedRoutineId) {
31+
return CustomResponseDto.from(recommendedRoutineService.searchRecommendedRoutine(recommendedRoutineId));
32+
}
2433
}

src/main/java/bitnagil/bitnagil_backend/recommendedRoutine/controller/spec/RecommendedRoutineSpec.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55
import bitnagil.bitnagil_backend.global.swagger.ApiErrorCodeExamples;
66
import bitnagil.bitnagil_backend.global.swagger.ApiTags;
77
import bitnagil.bitnagil_backend.recommendedRoutine.response.RecommendedRoutineSearchResponse;
8+
import bitnagil.bitnagil_backend.recommendedRoutine.response.RecommendedRoutineSearchResult;
89
import bitnagil.bitnagil_backend.user.domain.User;
910
import io.swagger.v3.oas.annotations.Operation;
11+
import io.swagger.v3.oas.annotations.Parameter;
12+
import io.swagger.v3.oas.annotations.Parameters;
1013
import io.swagger.v3.oas.annotations.tags.Tag;
1114

1215
@Tag(name = ApiTags.RECOMMENDED_ROUTINE)
@@ -18,4 +21,12 @@ public interface RecommendedRoutineSpec {
1821
})
1922
CustomResponseDto<RecommendedRoutineSearchResponse> searchRecommendedRoutines(User user);
2023

24+
@Operation(summary = "추천 루틴 단건을 조회합니다.")
25+
@ApiErrorCodeExamples({
26+
ErrorCode.NOT_FOUND_RECOMMENDED_ROUTINE
27+
})
28+
@Parameters({
29+
@Parameter(name = "recommendedRoutineId", description = "추천 루틴 ID", required = true, example = "1")
30+
})
31+
public CustomResponseDto<RecommendedRoutineSearchResult> searchRecommendedRoutine(Long recommendedRoutineId);
2132
}

src/main/java/bitnagil/bitnagil_backend/recommendedRoutine/domain/RecommendedRoutine.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class RecommendedRoutine extends BaseTimeEntity {
2727
@Column(columnDefinition = "varchar(40)")
2828
private RecommendedRoutineType recommendedRoutineType; // 추천 루틴 타입 (분류에 해당)
2929

30-
private LocalTime time; // 시간
30+
private LocalTime executionTime; // 추천 루틴 실행시간
3131

3232
/**
3333
* 추천 루틴의 반복 요일은 코드레벨에서 설정한다.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,33 @@
11
package bitnagil.bitnagil_backend.recommendedRoutine.response;
22

33
import bitnagil.bitnagil_backend.recommendedRoutine.domain.enums.RecommendedRoutineLevel;
4+
import io.swagger.v3.oas.annotations.media.Schema;
45
import lombok.AllArgsConstructor;
56
import lombok.Builder;
67
import lombok.Getter;
78

9+
import java.time.LocalTime;
810
import java.util.List;
911

1012
@Getter
1113
@AllArgsConstructor
1214
@Builder
1315
public class RecommendedRoutineSearchResult {
1416
// 추천 루틴 ID
17+
@Schema(description = "추천 루틴 ID", example = "1")
1518
private Long recommendedRoutineId;
1619
// 추천 루틴 이름
20+
@Schema(description = "추천 루틴 이름", example = "물마시기")
1721
private String recommendedRoutineName;
1822
// 추천 루틴 설명
23+
@Schema(description = "추천 루틴 설명", example = "하루에 물을 많이 마셔보아요")
1924
private String recommendedRoutineDescription;
2025
// 추천 루틴 난이도
26+
@Schema(description = "추천 루틴 난이도", example = "LEVEL1")
2127
private RecommendedRoutineLevel recommendedRoutineLevel;
28+
// 추천 루틴 수행 시간
29+
@Schema(description = "추천 루틴 수행 시간", example = "08:00:00")
30+
private LocalTime executionTime; // HH:mm 형식으로 변환된 수행 시간
2231
// 추천 서브 루틴 리스트
2332
private List<RecommendedSubRoutineSearchResult> recommendedSubRoutineSearchResult;
2433
}

src/main/java/bitnagil/bitnagil_backend/recommendedRoutine/response/RecommendedSubRoutineSearchResult.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package bitnagil.bitnagil_backend.recommendedRoutine.response;
22

3+
import io.swagger.v3.oas.annotations.media.Schema;
34
import lombok.AllArgsConstructor;
45
import lombok.Builder;
56
import lombok.Getter;
@@ -11,6 +12,8 @@
1112
@AllArgsConstructor
1213
@Builder
1314
public class RecommendedSubRoutineSearchResult {
15+
@Schema(description = "추천 서브 루틴 ID", example = "1")
1416
private Long recommendedSubRoutineId; // 추천 서브 루틴 ID
17+
@Schema(description = "추천 서브 루틴 이름", example = "물 2L 마시기")
1518
private String recommendedSubRoutineName; // 추천 서브 루틴 이름
1619
}

src/main/java/bitnagil/bitnagil_backend/recommendedRoutine/service/RecommendedRoutineMapper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public RecommendedRoutineSearchResult toRecommendedRoutineSearchResult(
3737
.recommendedRoutineName(recommendedRoutine.getRecommendedRoutineName())
3838
.recommendedRoutineDescription(recommendedRoutine.getRecommendedRoutineDescription())
3939
.recommendedRoutineLevel(recommendedRoutine.getRecommendedRoutineLevel())
40+
.executionTime(recommendedRoutine.getExecutionTime())
4041
.recommendedSubRoutineSearchResult(recommendedSubRoutineResults)
4142
.build();
4243
}

src/main/java/bitnagil/bitnagil_backend/recommendedRoutine/service/RecommendedRoutineService.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ public RecommendedRoutineSearchResponse searchRecommendedRoutines(User user) {
5656
response.put(RecommendedRoutineType.PERSONALIZED, new ArrayList<>()); // 맞춤 루틴은 미리 초기화 한다.(감정구슬, 온보딩 결과를 넣기 위해)
5757

5858
// 영속성 객체에 user를 저장하기 위해 user를 조회
59-
6059
user = userRepository.findByUserPk(user.getUserPk())
6160
.orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_USER));
6261

@@ -72,6 +71,25 @@ public RecommendedRoutineSearchResponse searchRecommendedRoutines(User user) {
7271
.build();
7372
}
7473

74+
/**
75+
* 추천 루틴 단건 조회
76+
*/
77+
@Transactional(readOnly = true)
78+
public RecommendedRoutineSearchResult searchRecommendedRoutine(Long recommendedRoutineId) {
79+
RecommendedRoutine recommendedRoutine = recommendedRoutineRepository.findById(recommendedRoutineId)
80+
.orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_RECOMMENDED_ROUTINE));
81+
82+
List<RecommendedSubRoutineSearchResult> recommendedSubRoutineSearchResults = new ArrayList<>();
83+
// 추천 루틴에 해당하는 서브루틴 조회
84+
List<RecommendedSubRoutine> recommendedSubRoutines = recommendedSubRoutineRepository.findByRecommendedRoutine(recommendedRoutine);
85+
for (RecommendedSubRoutine recommendedSubRoutine : recommendedSubRoutines) {
86+
RecommendedSubRoutineSearchResult recommendedSubRoutineSearchResult = recommendedRoutineMapper.toRecommendedSubRoutineSearchResult(recommendedSubRoutine);
87+
recommendedSubRoutineSearchResults.add(recommendedSubRoutineSearchResult);
88+
}
89+
90+
return recommendedRoutineMapper.toRecommendedRoutineSearchResult(recommendedRoutine, recommendedSubRoutineSearchResults);
91+
}
92+
7593
private void addCategoryRecommendedRoutines(Map<RecommendedRoutineType, List<RecommendedRoutineSearchResult>> response) {
7694
RecommendedRoutineType[] values = RecommendedRoutineType.values();
7795

src/main/resources/data.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -757,7 +757,7 @@ VALUES
757757

758758

759759
-- recommended routine
760-
INSERT INTO recommended_routine (recommended_routine_type, time, recommended_routine_name, recommended_routine_description, recommended_routine_level, emotion, case_id, thumbnail_url, created_at, updated_at, deleted_at)
760+
INSERT INTO recommended_routine (recommended_routine_type, execution_time, recommended_routine_name, recommended_routine_description, recommended_routine_level, emotion, case_id, thumbnail_url, created_at, updated_at, deleted_at)
761761
VALUES
762762
('OUTING', '20:00:00', '저녁 산책하기', '하루를 정리하며 차분한 시간을 가질 수 있어요.', 'LEVEL3', 'VITALITY', 10, NULL, NOW(), NOW(), NULL),
763763
('REST', '08:00:00', '기지개 펴기', '굳은 몸을 풀어주면 기분 전환이 돼요.', ' LEVEL1', 'FATIGUE', 1, NULL, NOW(), NOW(), NULL),

0 commit comments

Comments
 (0)