diff --git a/smeem-application/src/main/java/com/smeem/application/domain/diary/DiaryService.java b/smeem-application/src/main/java/com/smeem/application/domain/diary/DiaryService.java index 76a69629..746199c9 100644 --- a/smeem-application/src/main/java/com/smeem/application/domain/diary/DiaryService.java +++ b/smeem-application/src/main/java/com/smeem/application/domain/diary/DiaryService.java @@ -10,6 +10,7 @@ import com.smeem.application.port.input.dto.response.diary.RetrieveDiariesResponse; import com.smeem.application.port.input.dto.response.diary.RetrieveDiaryResponse; import com.smeem.application.port.input.dto.response.diary.WriteDiaryResponse; +import com.smeem.application.port.output.cache.CachePort; import com.smeem.application.port.output.persistence.*; import lombok.RequiredArgsConstructor; import lombok.val; @@ -17,6 +18,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; @@ -31,6 +33,7 @@ public class DiaryService implements DiaryUseCase { private final MemberBadgePort memberBadgePort; private final TopicPort topicPort; private final SmeemProperties smeemProperties; + private final CachePort cachePort; @Transactional public WriteDiaryResponse writeDiary(long memberId, WriteDiaryRequest request) { @@ -68,7 +71,20 @@ public RetrieveDiaryResponse retrieveDiary(long diaryId) { Topic topic = diary.getTopicId() != null ? topicPort.findById(diary.getTopicId()) : null; Member member = memberPort.findById(diary.getMemberId()); List corrections = correctionPort.findByDiary(diaryId); - return RetrieveDiaryResponse.of(diary, topic, member, corrections); + int correctionCount = getCorrectionCount(member.getId()); + return RetrieveDiaryResponse.of(diary, topic, member, corrections, correctionCount); + } + + private int getCorrectionCount(long memberId) { + LocalDate now = LocalDate.now(); + String today = now.format(DateTimeFormatter.ofPattern("yyyyMMdd")); + String key = "correction:" + today + ":" + memberId; + return cachePort.getInt(key) + .orElseGet(() -> { + int count = correctionPort.countDistinctByMemberAndDate(memberId, now); + cachePort.setInt(key, count); + return count; + }); } @Transactional diff --git a/smeem-application/src/main/java/com/smeem/application/port/input/dto/response/diary/RetrieveDiaryResponse.java b/smeem-application/src/main/java/com/smeem/application/port/input/dto/response/diary/RetrieveDiaryResponse.java index 6f982411..94587ca3 100644 --- a/smeem-application/src/main/java/com/smeem/application/port/input/dto/response/diary/RetrieveDiaryResponse.java +++ b/smeem-application/src/main/java/com/smeem/application/port/input/dto/response/diary/RetrieveDiaryResponse.java @@ -26,13 +26,18 @@ public record RetrieveDiaryResponse( @Schema(description = "일기 작성자 닉네임") String username, @Schema(description = "코칭 결과 정보") - List corrections + List corrections, + @Schema(description = "코칭 횟수") + int correctionCount, + @Schema(description = "코칭 최대 횟수") + int correctionMaxCount ) { public static RetrieveDiaryResponse of( @NotNull Diary diary, Topic topic, @NotNull Member member, - @NotNull List corrections + @NotNull List corrections, + int correctionCount ) { return RetrieveDiaryResponse.builder() .diaryId(diary.getId()) @@ -41,6 +46,8 @@ public static RetrieveDiaryResponse of( .createdAt(SmeemConverter.toString(diary.getCreatedAt())) .username(member.getUsername()) .corrections(corrections) + .correctionCount(correctionCount) + .correctionMaxCount(1) .build(); } }