@@ -144,12 +144,22 @@ public JogakResponseDto.CreateJogakDto updateJogak(Long jogakId, JogakRequestDto
144
144
.orElseThrow (() -> new JogakException (ErrorCode .NOT_EXIST_JOGAK ));
145
145
validatePeriod (Optional .ofNullable (updateJogakDto .getIsRoutine ()), Optional .ofNullable (updateJogakDto .getDays ()));
146
146
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
+
147
156
if (updateJogakDto .getDays () != null ) {
148
157
updateJogakPeriod (jogak , updateJogakDto .getDays ());
149
158
}
150
159
if (updateJogakDto .getIsRoutine () != null && !updateJogakDto .getIsRoutine ()) {
151
160
jogakPeriodRepository .deleteAllByJogakId (jogakId );
152
161
}
162
+
153
163
return JogakConverter .toCreateJogakResponseDto (jogak );
154
164
}
155
165
@@ -171,14 +181,22 @@ private void validatePeriod(Optional<Boolean> isRoutineOptional, Optional<List<S
171
181
* */
172
182
private void updateJogakPeriod (Jogak jogak , List <String > days ) {
173
183
List <Period > periods = new ArrayList <>();
184
+ int todayNum = dateToNum (LocalDate .now ());
185
+
174
186
for (String day : days ) {
175
187
Period period = periodRepository .findOneByDays (day )
176
- .orElseThrow (() -> new MogakException (ErrorCode .NOT_EXIST_DAY ));
188
+ .orElseThrow (() -> new BaseException (ErrorCode .NOT_EXIST_DAY ));
177
189
periods .add (period );
178
190
179
191
// 주기와 오늘이 일치하는 경우
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
+ }
182
200
}
183
201
}
184
202
@@ -220,6 +238,7 @@ public JogakResponseDto.GetDailyJogakListDto getDayJogaks(LocalDate day) {
220
238
List <Jogak > userRoutineJogaks = jogakRepository .findDailyRoutineJogaks (user , dateToNum (day ));
221
239
return JogakConverter .toGetDailyJogakListResponseDto (
222
240
userRoutineJogaks .stream ()
241
+ // 여기서 npe 발생
223
242
.filter (jogak -> jogak .getEndAt ().isAfter (day ))
224
243
.map (JogakConverter ::toDailyJogakResponseDto )
225
244
.collect (Collectors .toList ()));
@@ -263,13 +282,13 @@ public List<JogakResponseDto.GetRoutineJogakDto> getRoutineJogaks(LocalDate star
263
282
}))
264
283
.collect (Collectors .toList ());
265
284
dailyRoutineJogaks .put (i , matchingJogaks );
266
- log .info ("루틴 day: " + i + " " + dailyRoutineJogaks .get (i ));
285
+ log .debug ("루틴 day: " + i + " " + dailyRoutineJogaks .get (i ));
267
286
});
268
287
// 요일 값 대입
269
288
for (LocalDate date : futureDates ) {
270
289
dailyRoutineJogaks .get (dateToNum (date ))
271
290
.forEach (i -> {
272
- log .info (i .getEndAt () + " , " + date );
291
+ log .debug (i .getEndAt () + " , " + date );
273
292
// 기간에 해당하지 않는 조각은 가져오지 않는 로직
274
293
if (i .getEndAt ().isAfter (date )) {
275
294
routineJogaks .add (DailyJogak .getFutureRoutineJogakDto (date , i .getTitle ()));
@@ -307,7 +326,11 @@ private List<LocalDate> getFutureDates(LocalDate startDate, LocalDate endDate) {
307
326
public JogakResponseDto .JogakDailyJogakDto startJogak (Long jogakId ) {
308
327
Jogak jogak = jogakRepository .findById (jogakId )
309
328
.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 ()) {
311
334
throw new JogakException (ErrorCode .ALREADY_START_JOGAK );
312
335
}
313
336
DailyJogak dailyJogak = dailyJogakRepository .save (JogakConverter .toInitialDailyJogak (jogak ));
@@ -317,31 +340,46 @@ public JogakResponseDto.JogakDailyJogakDto startJogak(Long jogakId) {
317
340
@ Transactional
318
341
@ Override
319
342
public JogakResponseDto .JogakDailyJogakDto successJogak (Long dailyJogakId ) {
320
- DailyJogak dailyjogak = dailyJogakRepository .findById (dailyJogakId )
343
+ DailyJogak dailyJogak = dailyJogakRepository .findById (dailyJogakId )
321
344
.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 ()) {
323
348
throw new BaseException (ErrorCode .ALREADY_END_JOGAK );
324
349
}
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 );
330
354
}
331
355
332
356
@ Transactional
333
357
@ Override
334
358
public JogakResponseDto .JogakDailyJogakDto failJogak (Long dailyJogakId ) {
335
359
DailyJogak dailyJogak = dailyJogakRepository .findById (dailyJogakId )
336
360
.orElseThrow (() -> new JogakException (ErrorCode .NOT_EXIST_JOGAK ));
361
+ Jogak jogak = jogakRepository .findByDailyJogak (dailyJogak )
362
+ .orElseThrow (() -> new JogakException (ErrorCode .NOT_EXIST_JOGAK ));
337
363
if (!dailyJogak .getIsAchievement ()) {
338
364
throw new BaseException (ErrorCode .NOT_SUCCESS_DAILY_JOGAK );
339
365
}
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
+ // 조각 실패
343
382
jogak .decreaseAchievements ();
344
- return JogakConverter .toJogakDailyJogakDto (jogak , dailyJogak );
345
383
}
346
384
347
385
@ Override
@@ -366,7 +404,7 @@ public void deleteJogak(Long jogakId) {
366
404
Jogak jogak = jogakRepository .findById (jogakId )
367
405
.orElseThrow (() -> new JogakException (ErrorCode .NOT_EXIST_JOGAK ));
368
406
jogakPeriodRepository .deleteAllByJogakId (jogakId );
369
- dailyJogakRepository .deleteAllByJogakId ( jogakId );
407
+ dailyJogakRepository .deleteAllByJogak ( jogak );
370
408
jogakRepository .deleteById (jogakId );
371
409
}
372
410
0 commit comments