diff --git a/src/main/java/com/cmc/mercury/domain/memo/repository/MemoRepository.java b/src/main/java/com/cmc/mercury/domain/memo/repository/MemoRepository.java index 8eeab27..808e020 100644 --- a/src/main/java/com/cmc/mercury/domain/memo/repository/MemoRepository.java +++ b/src/main/java/com/cmc/mercury/domain/memo/repository/MemoRepository.java @@ -13,8 +13,8 @@ @Repository public interface MemoRepository extends JpaRepository { - // RecordDetail의 모든 Memo들을 찾아서 업데이트 순으로 정렬 후 최상단 반환 - Optional findTopByRecordDetailOrderByUpdatedAtDesc(RecordDetail recordDetail); + // RecordDetail의 모든 Memo들을 찾아서 생성 순으로 정렬 후 최상단 반환 + Optional findTopByRecordDetailOrderByCreatedAtDesc(RecordDetail recordDetail); // RecordDetail의 모든 Memo들을 찾아서 생성 순으로 정렬 후 반환 List findAllByRecordDetailOrderByCreatedAtDesc(RecordDetail recordDetail); diff --git a/src/main/java/com/cmc/mercury/domain/memo/service/MemoService.java b/src/main/java/com/cmc/mercury/domain/memo/service/MemoService.java index 0430b66..922fea8 100644 --- a/src/main/java/com/cmc/mercury/domain/memo/service/MemoService.java +++ b/src/main/java/com/cmc/mercury/domain/memo/service/MemoService.java @@ -22,6 +22,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.Optional; @Service @RequiredArgsConstructor @@ -112,8 +113,9 @@ public MemoResponse updateMemo(User user, Long recordId, Long memoId, MemoUpdate // db에 updatedAt이 바로 반영되어 응답하도록 memoRepository.flush(); - Record record = memo.getRecordDetail().getRecord(); - record.updateLastModifiedDateWithDetail(memo.getUpdatedAt()); +// 수정은 날짜 바뀌지 않음 +// Record record = memo.getRecordDetail().getRecord(); +// record.updateLastModifiedDateWithDetail(memo.getUpdatedAt()); return MemoResponse.from(memo, recordId); } @@ -122,13 +124,20 @@ public MemoResponse updateMemo(User user, Long recordId, Long memoId, MemoUpdate public void deleteMemo(User user, Long recordId, Long memoId) { Memo memo = validateAndGetMemo(user.getId(), recordId, memoId); + Record record = memo.getRecordDetail().getRecord(); + RecordDetail recordDetail = memo.getRecordDetail(); // 사용자 경험치 차감 // user.updateExp(user.getExp() - memo.getAcquiredExp()); - memo.getRecordDetail().getMemos().remove(memo); + // 메모 삭제 + // memo.getRecordDetail().getMemos().remove(memo); + memoRepository.delete(memo); // Memo 삭제하면 JPA가 자동으로 RecordDetail에서도 삭제 - memoRepository.delete(memo); + // 남은 메모 중 최신 메모 찾기 + Optional latestMemo = memoRepository.findTopByRecordDetailOrderByCreatedAtDesc(recordDetail); + // RecordDetail의 updatedGauge 갱신 (없으면 0) + recordDetail.updateGauge(latestMemo.map(Memo::getGauge).orElse(0)); } private Memo validateAndGetMemo(Long userId, Long recordId, Long memoId) { diff --git a/src/main/java/com/cmc/mercury/domain/record/dto/RecordDetailResponse.java b/src/main/java/com/cmc/mercury/domain/record/dto/RecordDetailResponse.java index c623831..53d6986 100644 --- a/src/main/java/com/cmc/mercury/domain/record/dto/RecordDetailResponse.java +++ b/src/main/java/com/cmc/mercury/domain/record/dto/RecordDetailResponse.java @@ -2,6 +2,7 @@ import com.cmc.mercury.domain.book.dto.BookResponse; import com.cmc.mercury.domain.memo.dto.MemoResponse; +import com.cmc.mercury.domain.memo.entity.Memo; import com.cmc.mercury.domain.record.entity.Record; import com.cmc.mercury.domain.record.entity.RecordDetail; import io.swagger.v3.oas.annotations.media.Schema; @@ -25,13 +26,13 @@ public record RecordDetailResponse( @Schema(description = "메모 객체 목록") List memos ) { - public static RecordDetailResponse of(Record record, RecordDetail detail, List memos) { + public static RecordDetailResponse of(Record record, RecordDetail recordDetail, Memo latestMemo, List memos) { return new RecordDetailResponse( record.getId(), - detail.getUpdatedGauge(), + recordDetail.getUpdatedGauge(), BookResponse.from(record.getBook()), record.getCreatedAt(), - record.getUpdatedAt(), + latestMemo != null ? latestMemo.getCreatedAt() : record.getUpdatedAt(), memos ); } diff --git a/src/main/java/com/cmc/mercury/domain/record/dto/RecordResponse.java b/src/main/java/com/cmc/mercury/domain/record/dto/RecordResponse.java index 1810138..343cf00 100644 --- a/src/main/java/com/cmc/mercury/domain/record/dto/RecordResponse.java +++ b/src/main/java/com/cmc/mercury/domain/record/dto/RecordResponse.java @@ -1,11 +1,13 @@ package com.cmc.mercury.domain.record.dto; import com.cmc.mercury.domain.book.dto.BookResponse; +import com.cmc.mercury.domain.memo.entity.Memo; import com.cmc.mercury.domain.record.entity.Record; import com.cmc.mercury.domain.record.entity.RecordDetail; import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDateTime; +import java.util.Optional; @Schema(title = "기록 객체 응답 형식") public record RecordResponse ( @@ -25,14 +27,14 @@ public record RecordResponse ( @Schema(description = "얻은 경험치") int acquiredExp ) { - public static RecordResponse of(Record record, RecordDetail detail, String content) { + public static RecordResponse of(Record record, RecordDetail recordDetail, Memo memo, String content) { return new RecordResponse( record.getId(), - detail.getUpdatedGauge(), + recordDetail.getUpdatedGauge(), content, record.getCreatedAt(), - record.getUpdatedAt(), + memo != null ? memo.getCreatedAt() : record.getUpdatedAt(), BookResponse.from(record.getBook()), record.getAcquiredExp() ); diff --git a/src/main/java/com/cmc/mercury/domain/record/service/RecordService.java b/src/main/java/com/cmc/mercury/domain/record/service/RecordService.java index 85ba55c..8ec70da 100644 --- a/src/main/java/com/cmc/mercury/domain/record/service/RecordService.java +++ b/src/main/java/com/cmc/mercury/domain/record/service/RecordService.java @@ -25,6 +25,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; @Service @RequiredArgsConstructor @@ -99,7 +100,7 @@ public RecordResponse createRecord(User user, RecordRequest request) { habitHistoryRepository.save(history); //* return RecordResponse.of(record, recordDetail, savedMemo.getContent()); - return RecordResponse.of(savedRecord, savedRecord.getRecordDetail(), memo.getContent()); + return RecordResponse.of(savedRecord, savedRecord.getRecordDetail(), memo, memo.getContent()); } private int calculateRecordExp(Long userId, LocalDateTime deviceTime) { @@ -160,6 +161,7 @@ public void deleteRecord(User user, Long recordId) { user.updateExp(user.getExp() - reduceExp);*/ + // CascadeType.ALL로 인해 recordDetail도 같이 삭제 recordRepository.delete(record); } @@ -181,7 +183,9 @@ public RecordDetailResponse getRecordDetail(User user, Long recordId) { .map(memo -> MemoResponse.from(memo, record.getId())) .toList(); - return RecordDetailResponse.of(record, recordDetail, memoResponses); + Memo latestMemo = memoRepository.findTopByRecordDetailOrderByCreatedAtDesc(recordDetail).orElse(null); + + return RecordDetailResponse.of(record, recordDetail, latestMemo, memoResponses); } public List toRecordResponses(List records) { @@ -189,14 +193,12 @@ public List toRecordResponses(List records) { // RecordResponse 리스트로 변환 return records.stream() .map(record -> { - RecordDetail detail = record.getRecordDetail(); + RecordDetail recordDetail = record.getRecordDetail(); + Memo latestMemo = memoRepository.findTopByRecordDetailOrderByCreatedAtDesc(recordDetail).orElse(null); - String latestMemoContent = memoRepository - .findTopByRecordDetailOrderByUpdatedAtDesc(detail) - .map(Memo::getContent) - .orElse(""); + String latestMemoContent = (latestMemo != null) ? latestMemo.getContent() : ""; - return RecordResponse.of(record, detail, latestMemoContent); + return RecordResponse.of(record, recordDetail, latestMemo, latestMemoContent); }) .toList(); }