Skip to content

Commit cbb6097

Browse files
authored
[Fix] 독서기록에서 기대하지 않은 응답들 수정
[Fix] 독서기록에서 기대하지 않은 응답들 수정
2 parents 39aa0ec + d2dd5e2 commit cbb6097

File tree

5 files changed

+34
-20
lines changed

5 files changed

+34
-20
lines changed

src/main/java/com/cmc/mercury/domain/memo/repository/MemoRepository.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
@Repository
1414
public interface MemoRepository extends JpaRepository<Memo, Long> {
1515

16-
// RecordDetail의 모든 Memo들을 찾아서 업데이트 순으로 정렬 후 최상단 반환
17-
Optional<Memo> findTopByRecordDetailOrderByUpdatedAtDesc(RecordDetail recordDetail);
16+
// RecordDetail의 모든 Memo들을 찾아서 생성 순으로 정렬 후 최상단 반환
17+
Optional<Memo> findTopByRecordDetailOrderByCreatedAtDesc(RecordDetail recordDetail);
1818

1919
// RecordDetail의 모든 Memo들을 찾아서 생성 순으로 정렬 후 반환
2020
List<Memo> findAllByRecordDetailOrderByCreatedAtDesc(RecordDetail recordDetail);

src/main/java/com/cmc/mercury/domain/memo/service/MemoService.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import java.time.LocalDate;
2424
import java.time.LocalDateTime;
25+
import java.util.Optional;
2526

2627
@Service
2728
@RequiredArgsConstructor
@@ -112,8 +113,9 @@ public MemoResponse updateMemo(User user, Long recordId, Long memoId, MemoUpdate
112113
// db에 updatedAt이 바로 반영되어 응답하도록
113114
memoRepository.flush();
114115

115-
Record record = memo.getRecordDetail().getRecord();
116-
record.updateLastModifiedDateWithDetail(memo.getUpdatedAt());
116+
// 수정은 날짜 바뀌지 않음
117+
// Record record = memo.getRecordDetail().getRecord();
118+
// record.updateLastModifiedDateWithDetail(memo.getUpdatedAt());
117119

118120
return MemoResponse.from(memo, recordId);
119121
}
@@ -122,13 +124,20 @@ public MemoResponse updateMemo(User user, Long recordId, Long memoId, MemoUpdate
122124
public void deleteMemo(User user, Long recordId, Long memoId) {
123125

124126
Memo memo = validateAndGetMemo(user.getId(), recordId, memoId);
127+
Record record = memo.getRecordDetail().getRecord();
128+
RecordDetail recordDetail = memo.getRecordDetail();
125129

126130
// 사용자 경험치 차감
127131
// user.updateExp(user.getExp() - memo.getAcquiredExp());
128132

129-
memo.getRecordDetail().getMemos().remove(memo);
133+
// 메모 삭제
134+
// memo.getRecordDetail().getMemos().remove(memo);
135+
memoRepository.delete(memo); // Memo 삭제하면 JPA가 자동으로 RecordDetail에서도 삭제
130136

131-
memoRepository.delete(memo);
137+
// 남은 메모 중 최신 메모 찾기
138+
Optional<Memo> latestMemo = memoRepository.findTopByRecordDetailOrderByCreatedAtDesc(recordDetail);
139+
// RecordDetail의 updatedGauge 갱신 (없으면 0)
140+
recordDetail.updateGauge(latestMemo.map(Memo::getGauge).orElse(0));
132141
}
133142

134143
private Memo validateAndGetMemo(Long userId, Long recordId, Long memoId) {

src/main/java/com/cmc/mercury/domain/record/dto/RecordDetailResponse.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.cmc.mercury.domain.book.dto.BookResponse;
44
import com.cmc.mercury.domain.memo.dto.MemoResponse;
5+
import com.cmc.mercury.domain.memo.entity.Memo;
56
import com.cmc.mercury.domain.record.entity.Record;
67
import com.cmc.mercury.domain.record.entity.RecordDetail;
78
import io.swagger.v3.oas.annotations.media.Schema;
@@ -25,13 +26,13 @@ public record RecordDetailResponse(
2526
@Schema(description = "메모 객체 목록")
2627
List<MemoResponse> memos
2728
) {
28-
public static RecordDetailResponse of(Record record, RecordDetail detail, List<MemoResponse> memos) {
29+
public static RecordDetailResponse of(Record record, RecordDetail recordDetail, Memo latestMemo, List<MemoResponse> memos) {
2930
return new RecordDetailResponse(
3031
record.getId(),
31-
detail.getUpdatedGauge(),
32+
recordDetail.getUpdatedGauge(),
3233
BookResponse.from(record.getBook()),
3334
record.getCreatedAt(),
34-
record.getUpdatedAt(),
35+
latestMemo != null ? latestMemo.getCreatedAt() : record.getUpdatedAt(),
3536
memos
3637
);
3738
}

src/main/java/com/cmc/mercury/domain/record/dto/RecordResponse.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package com.cmc.mercury.domain.record.dto;
22

33
import com.cmc.mercury.domain.book.dto.BookResponse;
4+
import com.cmc.mercury.domain.memo.entity.Memo;
45
import com.cmc.mercury.domain.record.entity.Record;
56
import com.cmc.mercury.domain.record.entity.RecordDetail;
67
import io.swagger.v3.oas.annotations.media.Schema;
78

89
import java.time.LocalDateTime;
10+
import java.util.Optional;
911

1012
@Schema(title = "기록 객체 응답 형식")
1113
public record RecordResponse (
@@ -25,14 +27,14 @@ public record RecordResponse (
2527
@Schema(description = "얻은 경험치")
2628
int acquiredExp
2729
) {
28-
public static RecordResponse of(Record record, RecordDetail detail, String content) {
30+
public static RecordResponse of(Record record, RecordDetail recordDetail, Memo memo, String content) {
2931

3032
return new RecordResponse(
3133
record.getId(),
32-
detail.getUpdatedGauge(),
34+
recordDetail.getUpdatedGauge(),
3335
content,
3436
record.getCreatedAt(),
35-
record.getUpdatedAt(),
37+
memo != null ? memo.getCreatedAt() : record.getUpdatedAt(),
3638
BookResponse.from(record.getBook()),
3739
record.getAcquiredExp()
3840
);

src/main/java/com/cmc/mercury/domain/record/service/RecordService.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.time.LocalDate;
2626
import java.time.LocalDateTime;
2727
import java.util.List;
28+
import java.util.Optional;
2829

2930
@Service
3031
@RequiredArgsConstructor
@@ -99,7 +100,7 @@ public RecordResponse createRecord(User user, RecordRequest request) {
99100
habitHistoryRepository.save(history);
100101

101102
//* return RecordResponse.of(record, recordDetail, savedMemo.getContent());
102-
return RecordResponse.of(savedRecord, savedRecord.getRecordDetail(), memo.getContent());
103+
return RecordResponse.of(savedRecord, savedRecord.getRecordDetail(), memo, memo.getContent());
103104
}
104105

105106
private int calculateRecordExp(Long userId, LocalDateTime deviceTime) {
@@ -160,6 +161,7 @@ public void deleteRecord(User user, Long recordId) {
160161
161162
user.updateExp(user.getExp() - reduceExp);*/
162163

164+
// CascadeType.ALL로 인해 recordDetail도 같이 삭제
163165
recordRepository.delete(record);
164166
}
165167

@@ -181,22 +183,22 @@ public RecordDetailResponse getRecordDetail(User user, Long recordId) {
181183
.map(memo -> MemoResponse.from(memo, record.getId()))
182184
.toList();
183185

184-
return RecordDetailResponse.of(record, recordDetail, memoResponses);
186+
Memo latestMemo = memoRepository.findTopByRecordDetailOrderByCreatedAtDesc(recordDetail).orElse(null);
187+
188+
return RecordDetailResponse.of(record, recordDetail, latestMemo, memoResponses);
185189
}
186190

187191
public List<RecordResponse> toRecordResponses(List<Record> records) {
188192

189193
// RecordResponse 리스트로 변환
190194
return records.stream()
191195
.map(record -> {
192-
RecordDetail detail = record.getRecordDetail();
196+
RecordDetail recordDetail = record.getRecordDetail();
197+
Memo latestMemo = memoRepository.findTopByRecordDetailOrderByCreatedAtDesc(recordDetail).orElse(null);
193198

194-
String latestMemoContent = memoRepository
195-
.findTopByRecordDetailOrderByUpdatedAtDesc(detail)
196-
.map(Memo::getContent)
197-
.orElse("");
199+
String latestMemoContent = (latestMemo != null) ? latestMemo.getContent() : "";
198200

199-
return RecordResponse.of(record, detail, latestMemoContent);
201+
return RecordResponse.of(record, recordDetail, latestMemo, latestMemoContent);
200202
})
201203
.toList();
202204
}

0 commit comments

Comments
 (0)