From 41d9c8e4adf01689dc91f690a157f978c8a4f0ca Mon Sep 17 00:00:00 2001 From: MODUGGAGI Date: Sun, 16 Feb 2025 23:38:47 +0900 Subject: [PATCH] =?UTF-8?q?feat=20:=20=ED=99=88=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../converter/ResourceConverter.java | 20 ++++++++- .../service/collection/CollectionService.java | 45 ++++++++++++++++--- .../web/dto/resource/ResourceResponseDTO.java | 1 + 3 files changed, 60 insertions(+), 6 deletions(-) diff --git a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java index b58d0b1..179b42c 100644 --- a/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java +++ b/src/main/java/learningFlow/learningFlow_BE/converter/ResourceConverter.java @@ -74,7 +74,9 @@ public static ResourceResponseDTO.changeEpisodeIsCompleteDTO toChangeEpisodeIsCo .build(); } - public static ResourceResponseDTO.SearchResultResourceDTO convertToResourceDTO(CollectionEpisode episode) { + public static ResourceResponseDTO.SearchResultResourceDTO convertToResourceDTO( + CollectionEpisode episode + ) { return ResourceResponseDTO.SearchResultResourceDTO.builder() .episodeId(episode.getId()) .episodeName(episode.getEpisodeName()) @@ -101,6 +103,22 @@ public static ResourceResponseDTO.RecentlyWatchedEpisodeDTO convertToRecentlyWat .build(); } + public static List convertToResourceDTOWithToday( + List episodes, + int nextEpisodeNumber + ) { + return episodes.stream() + .map(episode -> ResourceResponseDTO.SearchResultResourceDTO.builder() + .episodeId(episode.getId()) + .episodeName(episode.getEpisodeName()) + .url(episode.getResource().getUrl()) + .resourceSource(extractResourceSource(episode.getResource().getUrl())) + .episodeNumber(episode.getEpisodeNumber()) + .today(episode.getEpisodeNumber().equals(nextEpisodeNumber)) + .build()) + .toList(); + } + private static String extractResourceSource(String url) { String lowerCaseUrl = url.toLowerCase(); diff --git a/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java b/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java index 3f5fe33..42b82c1 100644 --- a/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java +++ b/src/main/java/learningFlow/learningFlow_BE/service/collection/CollectionService.java @@ -277,13 +277,48 @@ public HomeResponseDTO.UserHomeInfoDTO getUserHomeCollections(User user) { } private CollectionResponseDTO.CollectionPreviewDTO getRecentLearning(User user) { + return userCollectionRepository .findFirstByUserAndStatusOrderByUpdatedAtDesc(user, UserCollectionStatus.IN_PROGRESS) - .map(userCollection -> CollectionConverter.toCollectionPreviewDTO( - userCollection.getCollection(), - getLearningInfo(userCollection.getCollection(), user, false), - user - )) + .map(userCollection -> { + Collection collection = userCollection.getCollection(); + + List episodes = collection.getEpisodes(); + int totalEpisodes = episodes.size(); + int currentEpisode = userCollection.getUserCollectionStatus(); + int nextEpisode = currentEpisode + 1; + + List selectedEpisodes = new ArrayList<>(); + if (totalEpisodes <= 4) { + // 4회차 이하의 컬렉션은 전체 표시 + selectedEpisodes.addAll(episodes); + } else { + // 5회차 이상의 컬렉션 + // today 에피소드(다음 에피소드)가 가능한 2번째에 오도록 계산 + int idealStart = nextEpisode - 2; // today가 2번째에 오기 위한 이상적인 시작 인덱스 + + // 실제 시작 인덱스 계산 (0 이상, totalEpisodes-4 이하) + int startIdx = Math.max(0, Math.min(idealStart, totalEpisodes - 4)); + + // 4개의 에피소드 선택 + for (int i = 0; i < 4; i++) { + selectedEpisodes.add(episodes.get(startIdx + i)); + } + } + + CollectionResponseDTO.CollectionLearningInfo learningInfo = CollectionResponseDTO.CollectionLearningInfo.builder() + .learningStatus("IN_PROGRESS") + .progressRate(calculateProgressRate(userCollection)) + .startDate(userCollection.getCreatedAt().toLocalDate()) + .currentEpisode(currentEpisode) + .resourceDTOList(ResourceConverter.convertToResourceDTOWithToday( + selectedEpisodes, + nextEpisode + )) + .build(); + + return CollectionConverter.toCollectionPreviewDTO(collection, learningInfo, user); + }) .orElse(null); } diff --git a/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java b/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java index 6b191ca..b4a98da 100644 --- a/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java +++ b/src/main/java/learningFlow/learningFlow_BE/web/dto/resource/ResourceResponseDTO.java @@ -64,6 +64,7 @@ public static class SearchResultResourceDTO { String url; String resourceSource; Integer episodeNumber; + Boolean today; } @Getter