diff --git a/src/main/java/org/example/plzdrawing/domain/content/controller/ContentController.java b/src/main/java/org/example/plzdrawing/domain/content/controller/ContentController.java index fdd3a0b..64ae9a3 100644 --- a/src/main/java/org/example/plzdrawing/domain/content/controller/ContentController.java +++ b/src/main/java/org/example/plzdrawing/domain/content/controller/ContentController.java @@ -10,7 +10,7 @@ import org.example.plzdrawing.common.page.PageResponse; import org.example.plzdrawing.domain.content.dto.request.UpdateContentRequest; import org.example.plzdrawing.domain.content.dto.request.UploadContentRequest; -import org.example.plzdrawing.domain.content.dto.response.LatestContentsResponse; +import org.example.plzdrawing.domain.content.dto.response.GetContentsResponse; import org.example.plzdrawing.domain.content.dto.response.UploadContentResponse; import org.example.plzdrawing.domain.content.facade.ContentFacade; import org.springframework.http.MediaType; @@ -66,12 +66,14 @@ public ResponseEntity> getContentsThumbnail( } @GetMapping - @Operation(summary = "최신순 콘텐츠 조회", description = "최신순으로 콘텐츠를 조회한다.") - public ResponseEntity> getLatestContents( + @Operation(summary = "옵션별 콘텐츠 조회", description = "옵션별로 콘텐츠를 조회한다. (0이면 최신순 1이면 좋아요 누른 게시글)") + public ResponseEntity> getLatestContents( + @AuthenticationPrincipal CustomUser customUser, @RequestParam(name = "page", defaultValue = "1") int page, - @RequestParam(name = "size", defaultValue = "10") int size + @RequestParam(name = "size", defaultValue = "10") int size, + @RequestParam(name = "option", defaultValue = "0") int option ) { int safePage = (page < 1) ? 0 : page - 1; - return ResponseEntity.ok(contentFacade.getLatestContents(safePage, size)); + return ResponseEntity.ok(contentFacade.getLatestContents(safePage, size, customUser, option)); } } diff --git a/src/main/java/org/example/plzdrawing/domain/content/dto/response/ContentsDto.java b/src/main/java/org/example/plzdrawing/domain/content/dto/response/ContentsDto.java index 7ae0147..fb4d7d8 100644 --- a/src/main/java/org/example/plzdrawing/domain/content/dto/response/ContentsDto.java +++ b/src/main/java/org/example/plzdrawing/domain/content/dto/response/ContentsDto.java @@ -1,7 +1,7 @@ package org.example.plzdrawing.domain.content.dto.response; import io.swagger.v3.oas.annotations.media.Schema; -import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; import org.example.plzdrawing.domain.content.enums.TimeTaken; @@ -9,7 +9,7 @@ public record ContentsDto( @Schema(description = "콘텐츠 id", example = "1") Long contentId, @Schema(description = "콘텐츠 생성일자", example = "2025-12-22") - LocalDate createAt, + LocalDateTime createAt, @Schema(description = "콘텐츠 url", example = "[https://s3~, https://s3~]") List contentUrl, @Schema(description = "콘텐츠 해시태그", example = "[사과, 바나나]") diff --git a/src/main/java/org/example/plzdrawing/domain/content/dto/response/LatestContentsResponse.java b/src/main/java/org/example/plzdrawing/domain/content/dto/response/GetContentsResponse.java similarity index 90% rename from src/main/java/org/example/plzdrawing/domain/content/dto/response/LatestContentsResponse.java rename to src/main/java/org/example/plzdrawing/domain/content/dto/response/GetContentsResponse.java index 9713056..84ba73c 100644 --- a/src/main/java/org/example/plzdrawing/domain/content/dto/response/LatestContentsResponse.java +++ b/src/main/java/org/example/plzdrawing/domain/content/dto/response/GetContentsResponse.java @@ -3,7 +3,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import org.example.plzdrawing.api.member.dto.response.UploaderDto; -public record LatestContentsResponse( +public record GetContentsResponse( @Schema(description = "업로더 정보") UploaderDto uploaderDto, @Schema(description = "콘텐츠 정보") diff --git a/src/main/java/org/example/plzdrawing/domain/content/facade/ContentFacade.java b/src/main/java/org/example/plzdrawing/domain/content/facade/ContentFacade.java index 6897a26..4e924cd 100644 --- a/src/main/java/org/example/plzdrawing/domain/content/facade/ContentFacade.java +++ b/src/main/java/org/example/plzdrawing/domain/content/facade/ContentFacade.java @@ -1,6 +1,7 @@ package org.example.plzdrawing.domain.content.facade; import static org.example.plzdrawing.common.error.CommonErrorCode.CONTENT_NOT_FOUND; +import static org.example.plzdrawing.common.error.CommonErrorCode.INVALID_FIELD; import java.util.List; import java.util.Map; @@ -14,7 +15,7 @@ import org.example.plzdrawing.domain.content.Content; import org.example.plzdrawing.domain.content.dto.request.UpdateContentRequest; import org.example.plzdrawing.domain.content.dto.request.UploadContentRequest; -import org.example.plzdrawing.domain.content.dto.response.LatestContentsResponse; +import org.example.plzdrawing.domain.content.dto.response.GetContentsResponse; import org.example.plzdrawing.domain.content.dto.response.UploadContentResponse; import org.example.plzdrawing.domain.content.service.ContentImageService; import org.example.plzdrawing.domain.content.service.ContentService; @@ -86,7 +87,7 @@ public PageResponse getMemberContents(Long memberId, int page, int Long contentId = content.getId(); return new ContentsDto( contentId, - content.getCreatedAt().toLocalDate(), + content.getCreatedAt(), imageMap.getOrDefault(contentId, List.of()), tagMap.getOrDefault(contentId, List.of()), content.getExplanation(), @@ -103,10 +104,18 @@ public PageResponse getMemberContents(Long memberId, int page, int return PageResponse.from(dtoPage); } - public PageResponse getLatestContents(int page, int size) { + public PageResponse getLatestContents(int page, int size, CustomUser customUser, int option) { PageRequest pageRequest = PageRequest.of(page, size); - - Page contentPage = contentService.findLatest(pageRequest); + Page contentPage; + if(option == 0) { + contentPage = contentService.findLatest(pageRequest); + } + else if(option == 1) { + contentPage = contentService.findByMyLikeLatest(customUser.getMember(), pageRequest); + } + else { + throw new RestApiException(INVALID_FIELD.getErrorCode()); + } if (contentPage.isEmpty()) { return PageResponse.from(Page.empty(pageRequest)); } @@ -123,7 +132,7 @@ public PageResponse getLatestContents(int page, int size Map drawingCountMap = contentService.countDrawingsByMemberIds(memberIds); Map reviewStatsMap = reviewService.findSellingMemberStats(memberIds); - List dtoList = contents.stream() + List dtoList = contents.stream() .map(content -> { Long contentId = content.getId(); Long uploaderId = content.getMember().getId(); @@ -140,7 +149,7 @@ public PageResponse getLatestContents(int page, int size ContentsDto contentsDto = new ContentsDto( contentId, - content.getCreatedAt().toLocalDate(), + content.getCreatedAt(), imageMap.getOrDefault(contentId, List.of()), tagMap.getOrDefault(contentId, List.of()), content.getExplanation(), @@ -149,7 +158,7 @@ public PageResponse getLatestContents(int page, int size likeMap.getOrDefault(contentId, 0L) ); - return new LatestContentsResponse(uploaderDto, contentsDto); + return new GetContentsResponse(uploaderDto, contentsDto); }) .toList(); diff --git a/src/main/java/org/example/plzdrawing/domain/content/repository/ContentRepository.java b/src/main/java/org/example/plzdrawing/domain/content/repository/ContentRepository.java index a08474c..0d24dc5 100644 --- a/src/main/java/org/example/plzdrawing/domain/content/repository/ContentRepository.java +++ b/src/main/java/org/example/plzdrawing/domain/content/repository/ContentRepository.java @@ -29,4 +29,12 @@ select c.member.id as memberId, count(c) as cnt group by c.member.id """) List countByMemberIds(@Param("memberIds") List memberIds); + + @Query(""" + select distinct c + from LikeEntity l join l.content c + where l.member = :member + order by c.createdAt desc + """) + Page findByMemberLikeAndCreatedAtDesc(@Param("member")Member member, Pageable pageable); } diff --git a/src/main/java/org/example/plzdrawing/domain/content/service/ContentService.java b/src/main/java/org/example/plzdrawing/domain/content/service/ContentService.java index b1ce382..24fd6db 100644 --- a/src/main/java/org/example/plzdrawing/domain/content/service/ContentService.java +++ b/src/main/java/org/example/plzdrawing/domain/content/service/ContentService.java @@ -11,6 +11,7 @@ import org.example.plzdrawing.domain.content.repository.ContentRepository; import org.example.plzdrawing.domain.member.Member; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -65,4 +66,8 @@ public Map countDrawingsByMemberIds(List memberIds) { ContentRepository.DrawingCountProjection::getCnt )); } + + public Page findByMyLikeLatest(Member member, PageRequest pageRequest) { + return contentRepository.findByMemberLikeAndCreatedAtDesc(member, pageRequest); + } }