Skip to content

Commit f3cddbc

Browse files
authored
Merge pull request #124 from Team-MOGAK/fix/dailyjogak-domain-fix
Fix/dailyjogak domain fix
2 parents a3d09b8 + f756530 commit f3cddbc

File tree

8 files changed

+89
-37
lines changed

8 files changed

+89
-37
lines changed

src/main/java/com/mogak/spring/converter/JogakConverter.java

+7-6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import java.time.LocalDate;
99
import java.util.List;
10+
import java.util.Objects;
1011
import java.util.stream.Collectors;
1112

1213
public class JogakConverter {
@@ -36,7 +37,7 @@ public static DailyJogak toDailyJogakResponseDto(Jogak jogak) {
3637
return DailyJogak.builder()
3738
.id(-1L)
3839
.mogak(jogak.getMogak())
39-
.jogakId(jogak.getId())
40+
.jogak(jogak)
4041
.title(jogak.getTitle())
4142
.category(jogak.getCategory())
4243
.isRoutine(jogak.getIsRoutine())
@@ -50,7 +51,7 @@ public static DailyJogak toInitialDailyJogak(Jogak jogak) {
5051
.category(jogak.getCategory())
5152
.title(jogak.getTitle())
5253
.isAchievement(false)
53-
.jogakId(jogak.getId())
54+
.jogak(jogak)
5455
.isRoutine(jogak.getIsRoutine())
5556
.build();
5657
}
@@ -155,7 +156,7 @@ public static JogakResponseDto.GetJogakDto toGetJogakResponseDto(Jogak jogak, Bo
155156

156157
public static JogakResponseDto.GetDailyJogakDto toGetDailyJogakResponseDto(DailyJogak dailyJogak) {
157158
return JogakResponseDto.GetDailyJogakDto.builder()
158-
.jogakId(dailyJogak.getJogakId())
159+
.jogakId(dailyJogak.getJogak().getId())
159160
.dailyJogakId(dailyJogak.getId())
160161
.mogakTitle(dailyJogak.getMogak().getTitle())
161162
.category(dailyJogak.getCategory().getName())
@@ -187,7 +188,7 @@ public static JogakResponseDto.GetOneTimeJogakListDto toGetOneTimeJogakListRespo
187188

188189
private static Boolean findCorrespondingDailyJogak(Jogak jogak, List<DailyJogak> dailyJogaks) {
189190
return dailyJogaks.stream()
190-
.anyMatch(dailyJogak -> dailyJogak.getJogakId() == jogak.getId());
191+
.anyMatch(dailyJogak -> Objects.equals(dailyJogak.getJogak(), jogak));
191192
}
192193

193194
public static JogakResponseDto.GetDailyJogakListDto toGetDailyJogakListResponseDto(List<DailyJogak> dailyJogaks) {
@@ -212,8 +213,8 @@ public static JogakResponseDto.JogakDailyJogakDto toJogakDailyJogakDto(Jogak jog
212213
.jogakId(jogak.getId())
213214
.dailyJogakId(dailyJogak.getId())
214215
.title(dailyJogak.getTitle())
215-
.mogakTitle(jogak.getTitle())
216-
.category(jogak.getTitle())
216+
.mogakTitle(jogak.getMogak().getTitle())
217+
.category(jogak.getCategory().getName())
217218
.isRoutine(jogak.getIsRoutine())
218219
.isAchievement(dailyJogak.getIsAchievement())
219220
.achievements(jogak.getAchievements())

src/main/java/com/mogak/spring/domain/jogak/DailyJogak.java

+9-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ public class DailyJogak extends BaseEntity {
2323
@ManyToOne(fetch = FetchType.LAZY)
2424
@JoinColumn(name = "mogak_id")
2525
private Mogak mogak;
26-
@Column(nullable = false, name = "jogak_id")
27-
private Long jogakId;
26+
@ManyToOne(fetch = FetchType.LAZY)
27+
@JoinColumn(name = "jogak_id")
28+
private Jogak jogak;
2829
@ManyToOne(fetch = FetchType.LAZY)
2930
@JoinColumn(name = "mogak_category")
3031
private MogakCategory category;
@@ -39,6 +40,12 @@ public void updateAchievement(boolean state) {
3940
this.isAchievement = state;
4041
}
4142

43+
public void updateJogak(Jogak jogak) {
44+
this.jogak = jogak;
45+
this.title = jogak.getTitle();
46+
this.isRoutine = jogak.getIsRoutine();
47+
}
48+
4249
public static JogakResponseDto.GetRoutineJogakDto getRoutineJogakDto(DailyJogak dailyJogak) {
4350
return JogakResponseDto.GetRoutineJogakDto.builder()
4451
.dailyJogakId(dailyJogak.getId())

src/main/java/com/mogak/spring/domain/jogak/Jogak.java

+3-6
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ public class Jogak extends BaseEntity {
3636
private String title;
3737
@OneToMany(mappedBy = "jogak")
3838
private List<JogakPeriod> jogakPeriods = new ArrayList<>();
39+
@OneToMany(mappedBy = "jogak")
40+
private List<DailyJogak> dailyJogaks = new ArrayList<>();
3941
@Column(nullable = false)
4042
private Boolean isRoutine;
4143
@Column(name = "achievement")
@@ -57,12 +59,7 @@ public List<String> getPeriods() {
5759
public void update(String title, Boolean isRoutine, LocalDate endAt) {
5860
Optional.ofNullable(title).ifPresent(updateTitle -> this.title = updateTitle);
5961
Optional.ofNullable(isRoutine).ifPresent(routine -> this.isRoutine = routine);
60-
Optional.ofNullable(endAt).ifPresent(endDate -> {
61-
this.endAt = endDate;
62-
if (endAt.getYear() == 9999) {
63-
this.endAt = null;
64-
}
65-
});
62+
Optional.ofNullable(endAt).ifPresent(endDate -> this.endAt = endDate);
6663
}
6764

6865
public void updateCategory(MogakCategory category) {

src/main/java/com/mogak/spring/repository/DailyJogakRepository.java

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.mogak.spring.repository;
22

33
import com.mogak.spring.domain.jogak.DailyJogak;
4+
import com.mogak.spring.domain.jogak.Jogak;
45
import com.mogak.spring.domain.user.User;
56
import org.springframework.data.jpa.repository.JpaRepository;
67
import org.springframework.data.jpa.repository.Query;
@@ -14,10 +15,10 @@ public interface DailyJogakRepository extends JpaRepository<DailyJogak, Long> {
1415
@Query("SELECT j FROM DailyJogak j WHERE j.createdAt BETWEEN :startDate AND :endDate")
1516
List<DailyJogak> findByDateRange(@Param("startDate") LocalDateTime startDate, @Param("endDate") LocalDateTime endDate);
1617

17-
@Query("SELECT j FROM DailyJogak j WHERE j.createdAt BETWEEN :startDateTime AND :endDateTime AND j.jogakId = :id")
18+
@Query("SELECT j FROM DailyJogak j WHERE j.createdAt BETWEEN :startDateTime AND :endDateTime AND j.jogak = :jogak")
1819
Optional<DailyJogak> findByCreatedAtBetweenAndId(@Param("startDateTime") LocalDateTime startDateTime,
1920
@Param("endDateTime") LocalDateTime endDateTime,
20-
@Param("id") Long jogakId
21+
@Param("jogak") Jogak jogak
2122
);
2223

2324
@Query("SELECT j from DailyJogak j " +
@@ -27,5 +28,7 @@ List<DailyJogak> findDailyJogaks(@Param(value = "user") User user,
2728
@Param(value = "today") LocalDateTime today,
2829
@Param(value = "tomorrow") LocalDateTime tomorrow);
2930

30-
void deleteAllByJogakId(Long jogakId);
31+
void deleteAllByJogak(Jogak jogak);
32+
33+
List<DailyJogak> findAllByJogak(Jogak jogak);
3134
}

src/main/java/com/mogak/spring/repository/JogakRepository.java

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.mogak.spring.repository;
22

3+
import com.mogak.spring.domain.jogak.DailyJogak;
34
import com.mogak.spring.domain.jogak.Jogak;
45
import com.mogak.spring.domain.mogak.Mogak;
56
import com.mogak.spring.domain.user.User;
@@ -33,4 +34,9 @@ public interface JogakRepository extends JpaRepository<Jogak, Long> {
3334
Optional<List<Jogak>> findAllByUserId(Long userId);
3435

3536
void deleteByUserId(Long userId);
37+
38+
@Query("SELECT j FROM Jogak j " +
39+
"JOIN FETCH j.dailyJogaks dj " +
40+
"WHERE dj = :dailyJogak")
41+
Optional<Jogak> findByDailyJogak(@Param("dailyJogak") DailyJogak dailyJogak);
3642
}

src/main/java/com/mogak/spring/service/AuthService.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public void deleteUserInfo(User deleteUser) {
165165
Optional<List<Jogak>> optJogaks = jogakRepository.findAllByUserId(deleteUser.getId());
166166
if (optJogaks.isPresent()) {
167167
for (Jogak jogak : optJogaks.get()) {
168-
dailyJogakRepository.deleteAllByJogakId(jogak.getId());
168+
dailyJogakRepository.deleteAllByJogak(jogak);
169169
jogakPeriodRepository.deleteAllByJogakId(jogak.getId());
170170
}
171171
}

src/main/java/com/mogak/spring/service/JogakServiceImpl.java

+56-18
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,22 @@ public JogakResponseDto.CreateJogakDto updateJogak(Long jogakId, JogakRequestDto
144144
.orElseThrow(() -> new JogakException(ErrorCode.NOT_EXIST_JOGAK));
145145
validatePeriod(Optional.ofNullable(updateJogakDto.getIsRoutine()), Optional.ofNullable(updateJogakDto.getDays()));
146146
jogak.update(updateJogakDto.getTitle(), updateJogakDto.getIsRoutine(), updateJogakDto.getEndDate());
147+
148+
List<DailyJogak> dailyJogaks = dailyJogakRepository.findAllByJogak(jogak);
149+
150+
if (!dailyJogaks.isEmpty()) {
151+
for (DailyJogak dailyJogak : dailyJogaks) {
152+
dailyJogak.updateJogak(jogak);
153+
}
154+
}
155+
147156
if (updateJogakDto.getDays() != null) {
148157
updateJogakPeriod(jogak, updateJogakDto.getDays());
149158
}
150159
if (updateJogakDto.getIsRoutine() != null && !updateJogakDto.getIsRoutine()) {
151160
jogakPeriodRepository.deleteAllByJogakId(jogakId);
152161
}
162+
153163
return JogakConverter.toCreateJogakResponseDto(jogak);
154164
}
155165

@@ -171,14 +181,22 @@ private void validatePeriod(Optional<Boolean> isRoutineOptional, Optional<List<S
171181
* */
172182
private void updateJogakPeriod(Jogak jogak, List<String> days) {
173183
List<Period> periods = new ArrayList<>();
184+
int todayNum = dateToNum(LocalDate.now());
185+
174186
for (String day : days) {
175187
Period period = periodRepository.findOneByDays(day)
176-
.orElseThrow(() -> new MogakException(ErrorCode.NOT_EXIST_DAY));
188+
.orElseThrow(() -> new BaseException(ErrorCode.NOT_EXIST_DAY));
177189
periods.add(period);
178190

179191
// 주기와 오늘이 일치하는 경우
180-
if (dateToNum(LocalDate.now()) == period.getId()) {
181-
dailyJogakRepository.save(JogakConverter.toInitialDailyJogak(jogak));
192+
if (todayNum == period.getId()) {
193+
boolean isPeriodAlreadyAssigned = jogak.getJogakPeriods().stream()
194+
.anyMatch(jogakPeriod -> jogakPeriod.getPeriod().equals(period));
195+
196+
// 오늘 날짜에 해당하는 Period가 JogakPeriods에 존재하지 않는 경우에만 새로운 DailyJogak 저장
197+
if (!isPeriodAlreadyAssigned) {
198+
dailyJogakRepository.save(JogakConverter.toInitialDailyJogak(jogak));
199+
}
182200
}
183201
}
184202

@@ -220,6 +238,7 @@ public JogakResponseDto.GetDailyJogakListDto getDayJogaks(LocalDate day) {
220238
List<Jogak> userRoutineJogaks = jogakRepository.findDailyRoutineJogaks(user, dateToNum(day));
221239
return JogakConverter.toGetDailyJogakListResponseDto(
222240
userRoutineJogaks.stream()
241+
// 여기서 npe 발생
223242
.filter(jogak -> jogak.getEndAt().isAfter(day))
224243
.map(JogakConverter::toDailyJogakResponseDto)
225244
.collect(Collectors.toList()));
@@ -263,13 +282,13 @@ public List<JogakResponseDto.GetRoutineJogakDto> getRoutineJogaks(LocalDate star
263282
}))
264283
.collect(Collectors.toList());
265284
dailyRoutineJogaks.put(i, matchingJogaks);
266-
log.info("루틴 day: " + i + " " + dailyRoutineJogaks.get(i));
285+
log.debug("루틴 day: " + i + " " + dailyRoutineJogaks.get(i));
267286
});
268287
// 요일 값 대입
269288
for (LocalDate date: futureDates) {
270289
dailyRoutineJogaks.get(dateToNum(date))
271290
.forEach(i -> {
272-
log.info(i.getEndAt() + " , " + date);
291+
log.debug(i.getEndAt() + " , " + date);
273292
// 기간에 해당하지 않는 조각은 가져오지 않는 로직
274293
if (i.getEndAt().isAfter(date)) {
275294
routineJogaks.add(DailyJogak.getFutureRoutineJogakDto(date, i.getTitle()));
@@ -307,7 +326,11 @@ private List<LocalDate> getFutureDates(LocalDate startDate, LocalDate endDate) {
307326
public JogakResponseDto.JogakDailyJogakDto startJogak(Long jogakId) {
308327
Jogak jogak = jogakRepository.findById(jogakId)
309328
.orElseThrow(() -> new JogakException(ErrorCode.NOT_EXIST_JOGAK));
310-
if (jogak.getIsRoutine() || dailyJogakRepository.findByCreatedAtBetweenAndId(LocalDate.now().atStartOfDay(), LocalDate.now().atStartOfDay().plusDays(1), jogakId).isPresent()) {
329+
if (jogak.getIsRoutine() ||
330+
dailyJogakRepository.findByCreatedAtBetweenAndId(
331+
LocalDate.now().atStartOfDay(),
332+
LocalDate.now().atStartOfDay().plusDays(1),
333+
jogak).isPresent()) {
311334
throw new JogakException(ErrorCode.ALREADY_START_JOGAK);
312335
}
313336
DailyJogak dailyJogak = dailyJogakRepository.save(JogakConverter.toInitialDailyJogak(jogak));
@@ -317,31 +340,46 @@ public JogakResponseDto.JogakDailyJogakDto startJogak(Long jogakId) {
317340
@Transactional
318341
@Override
319342
public JogakResponseDto.JogakDailyJogakDto successJogak(Long dailyJogakId) {
320-
DailyJogak dailyjogak = dailyJogakRepository.findById(dailyJogakId)
343+
DailyJogak dailyJogak = dailyJogakRepository.findById(dailyJogakId)
321344
.orElseThrow(() -> new JogakException(ErrorCode.NOT_EXIST_JOGAK));
322-
if (dailyjogak.getIsAchievement()) {
345+
Jogak jogak = jogakRepository.findByDailyJogak(dailyJogak)
346+
.orElseThrow(() -> new JogakException(ErrorCode.NOT_EXIST_JOGAK));
347+
if (dailyJogak.getIsAchievement()) {
323348
throw new BaseException(ErrorCode.ALREADY_END_JOGAK);
324349
}
325-
dailyjogak.updateAchievement(true);
326-
Jogak jogak = jogakRepository.findById(dailyjogak.getJogakId())
327-
.orElseThrow(() -> new BaseException(ErrorCode.NOT_EXIST_JOGAK));
328-
jogak.increaseAchievements();
329-
return JogakConverter.toJogakDailyJogakDto(jogak, dailyjogak);
350+
351+
updateAchievement(true, jogak, dailyJogak);
352+
353+
return JogakConverter.toJogakDailyJogakDto(dailyJogak.getJogak(), dailyJogak);
330354
}
331355

332356
@Transactional
333357
@Override
334358
public JogakResponseDto.JogakDailyJogakDto failJogak(Long dailyJogakId) {
335359
DailyJogak dailyJogak = dailyJogakRepository.findById(dailyJogakId)
336360
.orElseThrow(() -> new JogakException(ErrorCode.NOT_EXIST_JOGAK));
361+
Jogak jogak = jogakRepository.findByDailyJogak(dailyJogak)
362+
.orElseThrow(() -> new JogakException(ErrorCode.NOT_EXIST_JOGAK));
337363
if (!dailyJogak.getIsAchievement()) {
338364
throw new BaseException(ErrorCode.NOT_SUCCESS_DAILY_JOGAK);
339365
}
340-
dailyJogak.updateAchievement(false);
341-
Jogak jogak = jogakRepository.findById(dailyJogak.getJogakId())
342-
.orElseThrow(() -> new BaseException(ErrorCode.NOT_EXIST_JOGAK));
366+
367+
updateAchievement(false, jogak, dailyJogak);
368+
369+
return JogakConverter.toJogakDailyJogakDto(dailyJogak.getJogak(), dailyJogak);
370+
}
371+
372+
private void updateAchievement(boolean achievement, Jogak jogak, DailyJogak dailyJogak) {
373+
dailyJogak.updateAchievement(achievement);
374+
375+
// 조각 성공
376+
if (achievement) {
377+
jogak.increaseAchievements();
378+
return;
379+
}
380+
381+
// 조각 실패
343382
jogak.decreaseAchievements();
344-
return JogakConverter.toJogakDailyJogakDto(jogak, dailyJogak);
345383
}
346384

347385
@Override
@@ -366,7 +404,7 @@ public void deleteJogak(Long jogakId) {
366404
Jogak jogak = jogakRepository.findById(jogakId)
367405
.orElseThrow(() -> new JogakException(ErrorCode.NOT_EXIST_JOGAK));
368406
jogakPeriodRepository.deleteAllByJogakId(jogakId);
369-
dailyJogakRepository.deleteAllByJogakId(jogakId);
407+
dailyJogakRepository.deleteAllByJogak(jogak);
370408
jogakRepository.deleteById(jogakId);
371409
}
372410

src/main/java/com/mogak/spring/service/MogakServiceImpl.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,6 @@ public List<JogakResponseDto.GetJogakDto> getJogaks(Long mogakId, LocalDate day)
244244

245245
private static Boolean findCorrespondingDailyJogak(Jogak jogak, List<DailyJogak> dailyJogaks) {
246246
return dailyJogaks.stream()
247-
.anyMatch(dailyJogak -> dailyJogak.getJogakId().equals(jogak.getId()));
247+
.anyMatch(dailyJogak -> dailyJogak.getJogak().equals(jogak));
248248
}
249249
}

0 commit comments

Comments
 (0)