Skip to content

Commit 7efe7b2

Browse files
authored
Merge pull request #33 from YAPP-Github/refactor/T3-117
[T3-117] Service 비즈니스 코드 책임 기반의 리팩터링
2 parents fbb10fe + b54d983 commit 7efe7b2

21 files changed

Lines changed: 820 additions & 572 deletions
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package bitnagil.bitnagil_backend.changedRoutine.service;
2+
3+
import java.time.LocalDate;
4+
import java.time.LocalDateTime;
5+
import java.util.UUID;
6+
7+
import org.springframework.stereotype.Service;
8+
9+
import bitnagil.bitnagil_backend.changedRoutine.domain.ChangedRoutine;
10+
import bitnagil.bitnagil_backend.changedRoutine.domain.ChangedSubRoutine;
11+
import bitnagil.bitnagil_backend.changedRoutine.domain.enums.ChangedDivCode;
12+
import bitnagil.bitnagil_backend.global.entity.HistoryPk;
13+
import bitnagil.bitnagil_backend.global.utils.TimeUtils;
14+
import bitnagil.bitnagil_backend.recommendedRoutine.domain.RecommendedRoutine;
15+
import bitnagil.bitnagil_backend.recommendedRoutine.domain.RecommendedSubRoutine;
16+
import bitnagil.bitnagil_backend.user.domain.User;
17+
18+
@Service
19+
public class ChangedRoutineFactory {
20+
21+
// 유저 초기 온보딩 시 추천 루틴을 등록할 때 변경 루틴에 저장
22+
public ChangedRoutine createChangedRoutineForOnboarding(
23+
User user, RecommendedRoutine recommendedRoutine, LocalDate today, LocalDateTime now) {
24+
25+
return ChangedRoutine.builder()
26+
.changedRoutinePk(new HistoryPk(UUID.randomUUID(), 1L))
27+
.changedRoutineName(recommendedRoutine.getRecommendedRoutineName())
28+
.changedExecutionTime(recommendedRoutine.getTime())
29+
.originalRoutineDate(today) // 원본 루틴 날짜는 현재 날짜로 설정
30+
.changedRoutineDate(today) // 변경된 루틴 날짜도 현재 날짜로 설정
31+
.historyStartDateTime(now)
32+
.historyEndDateTime(TimeUtils.END_DATE_TIME)
33+
.userId(user.getUserPk().getId())
34+
.changedDivCode(ChangedDivCode.ONBOARDING)
35+
.build();
36+
}
37+
38+
// 유저 초기 온보딩 시 추천 루틴을 등록할 때 변경 서브루틴에 저장
39+
public ChangedSubRoutine createChangedSubRoutineForOnboarding(
40+
int sortOrder, RecommendedSubRoutine recommendedSubRoutine, LocalDateTime now, ChangedRoutine changedRoutine) {
41+
42+
return ChangedSubRoutine.builder()
43+
.changedSubRoutinePk(new HistoryPk(UUID.randomUUID(), 1L))
44+
.changedSubRoutineName(recommendedSubRoutine.getSubRoutineName())
45+
.historyStartDateTime(now)
46+
.historyEndDateTime(TimeUtils.END_DATE_TIME)
47+
.changedRoutineId(changedRoutine.getChangedRoutinePk().getId())
48+
.sortOrder(sortOrder + 1) // 1부터 시작
49+
.build();
50+
}
51+
}

src/main/java/bitnagil/bitnagil_backend/emotionMarble/response/RecommendedSubRoutineDto.java

Lines changed: 0 additions & 18 deletions
This file was deleted.

src/main/java/bitnagil/bitnagil_backend/emotionMarble/response/RegisterEmotionMarbleResponse.java

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

3+
import bitnagil.bitnagil_backend.recommendedRoutine.response.RecommendedRoutineDto;
34
import io.swagger.v3.oas.annotations.media.Schema;
45
import lombok.AllArgsConstructor;
56
import lombok.Builder;
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package bitnagil.bitnagil_backend.emotionMarble.service;
2+
3+
import java.time.LocalDate;
4+
import java.time.LocalDateTime;
5+
import java.util.UUID;
6+
7+
import org.springframework.stereotype.Component;
8+
import org.springframework.stereotype.Service;
9+
10+
import bitnagil.bitnagil_backend.emotionMarble.domain.EmotionMarble;
11+
import bitnagil.bitnagil_backend.emotionMarble.request.RegisterEmotionMarbleRequest;
12+
import bitnagil.bitnagil_backend.global.entity.HistoryPk;
13+
import bitnagil.bitnagil_backend.onboarding.domain.Case;
14+
import bitnagil.bitnagil_backend.user.domain.User;
15+
16+
/**
17+
* 감정 구슬 관련 엔티티 생성 책임을 담당하는 클래스입니다.
18+
*/
19+
@Component
20+
public class EmotionMarbleFactory {
21+
22+
// 당일의 감정 구슬을 생성
23+
public EmotionMarble createTodayEmotionMarble(User user, RegisterEmotionMarbleRequest request, LocalDate nowDate,
24+
LocalDateTime nowDateTime, LocalDateTime endDateTime) {
25+
26+
return EmotionMarble.builder()
27+
.emotionMarblePk(new HistoryPk(UUID.randomUUID(), 1L))
28+
.emotionMarbleType(request.getEmotionMarbleType())
29+
.date(nowDate)
30+
.userId(user.getUserPk().getId())
31+
.historyStartDateTime(nowDateTime)
32+
.historyEndDateTime(endDateTime) // historyEndDateTime은 당일 11시 59분 59초로 설정(하루씩 설정되기 때문. 이러면 매일 감정 갱신이 불필요함)
33+
.resultCase( // 감정 구슬에 따른 추천 루틴을 찾기 위해 Case 객체를 생성
34+
Case.builder()
35+
.caseId(request.getEmotionMarbleType().getCaseId())
36+
.build()
37+
).build();
38+
}
39+
}

src/main/java/bitnagil/bitnagil_backend/emotionMarble/service/EmotionMarbleService.java

Lines changed: 16 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -5,37 +5,34 @@
55
import bitnagil.bitnagil_backend.emotionMarble.repository.EmotionMarbleRepository;
66
import bitnagil.bitnagil_backend.emotionMarble.request.RegisterEmotionMarbleRequest;
77
import bitnagil.bitnagil_backend.emotionMarble.response.EmotionMarbleTypeResponse;
8-
import bitnagil.bitnagil_backend.emotionMarble.response.RecommendedRoutineDto;
9-
import bitnagil.bitnagil_backend.emotionMarble.response.RecommendedSubRoutineDto;
8+
import bitnagil.bitnagil_backend.recommendedRoutine.response.RecommendedRoutineDto;
109
import bitnagil.bitnagil_backend.emotionMarble.response.RegisterEmotionMarbleResponse;
11-
import bitnagil.bitnagil_backend.global.entity.HistoryPk;
1210
import bitnagil.bitnagil_backend.global.errorcode.ErrorCode;
1311
import bitnagil.bitnagil_backend.global.exception.CustomException;
1412

15-
import bitnagil.bitnagil_backend.onboarding.domain.Case;
16-
import bitnagil.bitnagil_backend.recommendedRoutine.domain.RecommendedRoutine;
17-
import bitnagil.bitnagil_backend.recommendedRoutine.domain.RecommendedSubRoutine;
18-
import bitnagil.bitnagil_backend.recommendedRoutine.repository.RecommendedRoutineRepository;
19-
import bitnagil.bitnagil_backend.recommendedRoutine.repository.RecommendedSubRoutineRepository;
13+
import bitnagil.bitnagil_backend.recommendedRoutine.service.RecommendedRoutineManager;
2014
import bitnagil.bitnagil_backend.user.domain.User;
2115
import lombok.RequiredArgsConstructor;
16+
2217
import org.springframework.stereotype.Service;
2318
import org.springframework.transaction.annotation.Transactional;
2419

2520
import java.time.LocalDate;
2621
import java.time.LocalDateTime;
2722
import java.time.LocalTime;
28-
import java.util.ArrayList;
2923
import java.util.List;
30-
import java.util.UUID;
3124

25+
/**
26+
* 감정 구슬에 대한 로직을 관리하는 클래스입니다.
27+
*/
3228
@Service
3329
@RequiredArgsConstructor
3430
public class EmotionMarbleService {
3531

3632
private final EmotionMarbleRepository emotionMarbleRepository;
37-
private final RecommendedRoutineRepository recommendRoutineRepository;
38-
private final RecommendedSubRoutineRepository recommendedSubRoutineRepository;
33+
34+
private final RecommendedRoutineManager recommendedRoutineManager;
35+
private final EmotionMarbleFactory emotionMarbleFactory;
3936

4037
// 감정 구술 조회(enum의 value를 가져온다.)
4138
public EmotionMarbleTypeResponse getEmotionMarbles() {
@@ -55,56 +52,19 @@ public RegisterEmotionMarbleResponse registryEmotionMarble(User user, RegisterEm
5552
throw new CustomException(ErrorCode.ALREADY_REGISTERED_EMOTION_MARBLE);
5653
}
5754

58-
EmotionMarble emotionMarble = EmotionMarble.builder()
59-
.emotionMarblePk(new HistoryPk(UUID.randomUUID(), 1L))
60-
.emotionMarbleType(request.getEmotionMarbleType())
61-
.date(nowDate)
62-
.userId(user.getUserPk().getId())
63-
.historyStartDateTime(nowDateTime)
64-
.historyEndDateTime(endDateTime) // historyEndDateTime은 당일 11시 59분 59초로 설정(하루씩 설정되기 때문. 이러면 매일 감정 갱신이 불필요함)
65-
.resultCase( // 감정 구슬에 따른 추천 루틴을 찾기 위해 Case 객체를 생성
66-
Case.builder()
67-
.caseId(request.getEmotionMarbleType().getCaseId())
68-
.build()
69-
).build();
55+
EmotionMarble emotionMarble = emotionMarbleFactory.createTodayEmotionMarble(
56+
user, request, nowDate, nowDateTime, endDateTime);
7057

7158
emotionMarbleRepository.save(emotionMarble);
7259

7360
// 감정 구슬에 따른 추천 루틴 응답
74-
List<RecommendedRoutine> recommendedRoutines = recommendRoutineRepository.findByResultCase(emotionMarble.getResultCase());
75-
if (recommendedRoutines.isEmpty()) {
76-
throw new CustomException(ErrorCode.NOT_FOUND_RECOMMENDED_ROUTINE);
77-
}
61+
List<RecommendedRoutineDto> recommendedRoutineDtoList =
62+
recommendedRoutineManager.recommendRoutinesByEmotionMarble(emotionMarble.getResultCase());
7863

79-
// 응답 생성
80-
List<RecommendedRoutineDto> recommendedRoutineDtoList = new ArrayList<>();
81-
for (RecommendedRoutine recommendedRoutine : recommendedRoutines) {
82-
List<RecommendedSubRoutineDto> recommendedRoutineDetailDtoList = new ArrayList<>();
83-
84-
List<RecommendedSubRoutine> recommendedSubRoutines = recommendedSubRoutineRepository.findByRecommendedRoutine(recommendedRoutine);
85-
86-
// 추천 루틴의 세부 루틴을 dto로 변환한다.
87-
for (RecommendedSubRoutine recommendedSubRoutine : recommendedSubRoutines) {
88-
RecommendedSubRoutineDto recommendedRoutineDetailDto = RecommendedSubRoutineDto.builder()
89-
.recommendedSubRoutineId(recommendedSubRoutine.getRecommendedSubRoutineId())
90-
.recommendedSubRoutineName(recommendedSubRoutine.getSubRoutineName())
91-
.build();
92-
recommendedRoutineDetailDtoList.add(recommendedRoutineDetailDto);
93-
}
94-
95-
// 추천 루틴을 dto로 변환한다.
96-
RecommendedRoutineDto recommendedRoutineDto = RecommendedRoutineDto.builder()
97-
.recommendedRoutineId(recommendedRoutine.getRecommendedRoutineId())
98-
.recommendedRoutineName(recommendedRoutine.getRecommendedRoutineName())
99-
.routineDescription(recommendedRoutine.getRecommendedRoutineDescription())
100-
.recommendedSubRoutines(recommendedRoutineDetailDtoList)
101-
.build();
102-
recommendedRoutineDtoList.add(recommendedRoutineDto);
103-
}
104-
105-
RegisterEmotionMarbleResponse response = RegisterEmotionMarbleResponse.builder()
64+
return RegisterEmotionMarbleResponse.builder()
10665
.recommendedRoutines(recommendedRoutineDtoList)
10766
.build();
108-
return response;
10967
}
68+
69+
11070
}

src/main/java/bitnagil/bitnagil_backend/onboarding/response/OnboardingResponse.java

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

3+
import bitnagil.bitnagil_backend.recommendedRoutine.response.RecommendedRoutineDto;
34
import lombok.AllArgsConstructor;
45
import lombok.Builder;
56
import lombok.Getter;

src/main/java/bitnagil/bitnagil_backend/onboarding/response/RecommendedRoutineDto.java

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/main/java/bitnagil/bitnagil_backend/onboarding/response/RecommendedSubRoutineDto.java

Lines changed: 0 additions & 18 deletions
This file was deleted.

0 commit comments

Comments
 (0)