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