From fbb6da743a9ff7fdfa3c039d77f6888fd0bec5ea Mon Sep 17 00:00:00 2001 From: koseonje Date: Tue, 28 Jan 2025 17:28:54 +0900 Subject: [PATCH] [release] v.1.2.1 (#228) Co-authored-by: 5uhwann <106325839+5uhwann@users.noreply.github.com> --- .github/codeowners | 2 +- .../club/repository/ClubRepository.java | 3 + .../domain/club/service/ClubService.java | 3 +- .../club/service/GeneralClubService.java | 8 +- .../FacadeCentralClubMemberServiceImpl.java | 4 +- .../feed/repository/FeedRepository.java | 46 ++- .../feed/service/GeneralFeedService.java | 20 +- .../AdminScoreHistoryListResponse.java | 2 +- .../ClubScoreHistoryListResponse.java | 2 +- .../FacadeAdminScoreHistoryServiceImpl.java | 2 +- .../FacadeClubScoreHistoryServiceImpl.java | 3 +- .../query/AdminClubScoreHistoryListQuery.java | 8 +- .../dto/query/ClubScoreHistoryListQuery.java | 8 +- .../file/controller/S3FileController.java | 5 +- .../feed/repository/FeedRepositoryTest.java | 342 +++++++++++++----- 15 files changed, 323 insertions(+), 135 deletions(-) diff --git a/.github/codeowners b/.github/codeowners index 3ee3817b..155a3992 100644 --- a/.github/codeowners +++ b/.github/codeowners @@ -1 +1 @@ -* @wonjunYou @5uhwann @KoSeonJe +* @wonjunYou @5uhwann @KoSeonJe @Seooooo24 diff --git a/src/main/java/ddingdong/ddingdongBE/domain/club/repository/ClubRepository.java b/src/main/java/ddingdong/ddingdongBE/domain/club/repository/ClubRepository.java index 342816ad..209bdd5d 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/club/repository/ClubRepository.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/club/repository/ClubRepository.java @@ -2,6 +2,7 @@ import ddingdong.ddingdongBE.domain.club.entity.Club; import java.util.Optional; +import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -10,4 +11,6 @@ public interface ClubRepository extends JpaRepository { Optional findByUserId(Long userId); + @EntityGraph(attributePaths = {"clubMembers"}) + Optional findEntityGraphByUserId(Long userId); } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/club/service/ClubService.java b/src/main/java/ddingdong/ddingdongBE/domain/club/service/ClubService.java index 4f434db8..3896c5e4 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/club/service/ClubService.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/club/service/ClubService.java @@ -17,6 +17,5 @@ public interface ClubService { void delete(Long clubId); - - + Club getByUserIdWithFetch(Long userId); } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/club/service/GeneralClubService.java b/src/main/java/ddingdong/ddingdongBE/domain/club/service/GeneralClubService.java index b5ae0c61..086651e7 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/club/service/GeneralClubService.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/club/service/GeneralClubService.java @@ -5,12 +5,14 @@ import ddingdong.ddingdongBE.domain.club.repository.ClubRepository; import java.util.List; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional(readOnly = true) @RequiredArgsConstructor +@Slf4j public class GeneralClubService implements ClubService { private final ClubRepository clubRepository; @@ -34,6 +36,11 @@ public Club getByUserId(Long userId) { .orElseThrow(() -> new ResourceNotFound("Club(userId=" + userId + ")를 찾을 수 없습니다.")); } + @Override + public Club getByUserIdWithFetch(Long userId) { + return clubRepository.findEntityGraphByUserId(userId) + .orElseThrow(() -> new ResourceNotFound("Club(userId=" + userId + ")를 찾을 수 없습니다.")); } + @Override public List findAll() { return clubRepository.findAll(); @@ -51,5 +58,4 @@ public void delete(Long clubId) { Club club = getById(clubId); clubRepository.delete(club); } - } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/clubmember/service/FacadeCentralClubMemberServiceImpl.java b/src/main/java/ddingdong/ddingdongBE/domain/clubmember/service/FacadeCentralClubMemberServiceImpl.java index c1f528cd..4367714f 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/clubmember/service/FacadeCentralClubMemberServiceImpl.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/clubmember/service/FacadeCentralClubMemberServiceImpl.java @@ -12,12 +12,14 @@ import java.util.Set; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service @Transactional(readOnly = true) @RequiredArgsConstructor +@Slf4j public class FacadeCentralClubMemberServiceImpl implements FacadeCentralClubMemberService { private final ClubService clubService; @@ -32,7 +34,7 @@ public byte[] getClubMemberListFile(Long userId) { @Override public AllClubMemberInfoQuery getAllMyClubMember(Long userId) { - Club club = clubService.getByUserId(userId); + Club club = clubService.getByUserIdWithFetch(userId); return AllClubMemberInfoQuery.of(club.getName(), club.getClubMembers()); } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/repository/FeedRepository.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/repository/FeedRepository.java index a923c471..01e2475f 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/feed/repository/FeedRepository.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/repository/FeedRepository.java @@ -9,14 +9,29 @@ public interface FeedRepository extends JpaRepository { @Query(value = """ - select * - from feed f - where (:currentCursorId = -1 or id < :currentCursorId) - and f.club_id = :clubId - and deleted_at is null - order by f.id DESC - limit :size - """, nativeQuery = true) + select * + from feed f + where (:currentCursorId = -1 or id < :currentCursorId) + and f.club_id = :clubId + and deleted_at is null + and ( + f.feed_type != 'VIDEO' + or exists ( + select 1 + from ( + select id + from file_meta_data + where entity_id = f.id + and domain_type = 'FEED_VIDEO' + ) filtered_fm + join vod_processing_job vpj + on filtered_fm.id = vpj.file_meta_data_id + where vpj.convert_job_status = 'COMPLETE' + ) + ) + order by f.id DESC + limit :size + """, nativeQuery = true) Slice findPageByClubIdOrderById( @Param("clubId") Long clubId, @Param("size") int size, @@ -29,6 +44,21 @@ Slice findPageByClubIdOrderById( (select max(id) from feed where deleted_at is null + and ( + f.feed_type != 'VIDEO' + or exists ( + select 1 + from ( + select id + from file_meta_data + where entity_id = f.id + and domain_type = 'FEED_VIDEO' + ) filtered_fm + join vod_processing_job vpj + on filtered_fm.id = vpj.file_meta_data_id + where vpj.convert_job_status = 'COMPLETE' + ) + ) GROUP BY club_id) and (:currentCursorId = -1 or id < :currentCursorId) ORDER BY id DESC diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/service/GeneralFeedService.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/GeneralFeedService.java index 99f81e22..44e83989 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/feed/service/GeneralFeedService.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/GeneralFeedService.java @@ -3,12 +3,9 @@ import ddingdong.ddingdongBE.common.exception.PersistenceException.ResourceNotFound; import ddingdong.ddingdongBE.domain.feed.entity.Feed; import ddingdong.ddingdongBE.domain.feed.repository.FeedRepository; -import ddingdong.ddingdongBE.domain.vodprocessing.entity.VodProcessingJob; -import ddingdong.ddingdongBE.domain.vodprocessing.service.VodProcessingJobService; import java.util.ArrayList; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Slice; @@ -22,7 +19,6 @@ public class GeneralFeedService implements FeedService { private final FeedRepository feedRepository; - private final VodProcessingJobService vodProcessingJobService; @Override public Slice getFeedPageByClubId(Long clubId, int size, Long currentCursorId) { @@ -61,9 +57,7 @@ public void delete(Feed feed) { } private Slice buildSlice(Slice originalSlice, int size) { - List content = new ArrayList<>(originalSlice.getContent()).stream() - .filter(this::isComplete) - .collect(Collectors.toList()); + List content = new ArrayList<>(originalSlice.getContent()); if (content.isEmpty()) { return null; } @@ -76,16 +70,4 @@ private Slice buildSlice(Slice originalSlice, int size) { return new SliceImpl<>(content, PageRequest.of(originalSlice.getNumber(), size), hasNext); } - - private boolean isComplete(Feed feed) { - if (feed.isImage()) { - return true; - } - - VodProcessingJob vodProcessingJob = vodProcessingJobService.findByVideoFeedId(feed.getId()); - if (vodProcessingJob == null) { - return false; - } - return vodProcessingJob.isCompleted(); - } } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/response/AdminScoreHistoryListResponse.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/response/AdminScoreHistoryListResponse.java index 2ca15a13..d0083baa 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/response/AdminScoreHistoryListResponse.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/response/AdminScoreHistoryListResponse.java @@ -24,7 +24,7 @@ public record AdminScoreHistoryListResponse( public static AdminScoreHistoryListResponse from(AdminClubScoreHistoryListQuery query) { return new AdminScoreHistoryListResponse( - query.club().getScore().getValue(), + query.clubTotalScore(), query.scoreHistories().stream() .map(ScoreHistoryResponse::from) .toList() diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/response/ClubScoreHistoryListResponse.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/response/ClubScoreHistoryListResponse.java index 0b2c0837..63306061 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/response/ClubScoreHistoryListResponse.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/controller/dto/response/ClubScoreHistoryListResponse.java @@ -23,7 +23,7 @@ public record ClubScoreHistoryListResponse( public static ClubScoreHistoryListResponse from(ClubScoreHistoryListQuery query) { return new ClubScoreHistoryListResponse( - query.club().getScore().getValue(), + query.clubTotalScore(), query.scoreHistories().stream() .map(ScoreHistoryResponse::from) .toList() diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/FacadeAdminScoreHistoryServiceImpl.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/FacadeAdminScoreHistoryServiceImpl.java index ae431f91..184f12db 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/FacadeAdminScoreHistoryServiceImpl.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/FacadeAdminScoreHistoryServiceImpl.java @@ -34,7 +34,7 @@ public Long create(CreateScoreHistoryCommand command) { public AdminClubScoreHistoryListQuery findAllByClubId(Long clubId) { Club club = clubService.getById(clubId); List scoreHistories = scoreHistoryService.findAllByClubId(clubId); - return AdminClubScoreHistoryListQuery.of(club, scoreHistories); + return AdminClubScoreHistoryListQuery.of(club.getScore().getValue(), scoreHistories); } private BigDecimal roundToThirdPoint(BigDecimal value) { diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/FacadeClubScoreHistoryServiceImpl.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/FacadeClubScoreHistoryServiceImpl.java index d7267455..07270e2c 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/FacadeClubScoreHistoryServiceImpl.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/FacadeClubScoreHistoryServiceImpl.java @@ -3,7 +3,6 @@ import ddingdong.ddingdongBE.domain.club.entity.Club; import ddingdong.ddingdongBE.domain.club.service.ClubService; import ddingdong.ddingdongBE.domain.scorehistory.entity.ScoreHistory; -import ddingdong.ddingdongBE.domain.scorehistory.service.dto.query.AdminClubScoreHistoryListQuery; import ddingdong.ddingdongBE.domain.scorehistory.service.dto.query.ClubScoreHistoryListQuery; import java.util.List; import lombok.RequiredArgsConstructor; @@ -22,6 +21,6 @@ public class FacadeClubScoreHistoryServiceImpl implements FacadeClubScoreHistory public ClubScoreHistoryListQuery findMyScoreHistories(Long userId) { Club club = clubService.getByUserId(userId); List scoreHistories = scoreHistoryService.findAllByClubId(club.getId()); - return ClubScoreHistoryListQuery.of(club, scoreHistories); + return ClubScoreHistoryListQuery.of(club.getScore().getValue(), scoreHistories); } } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/dto/query/AdminClubScoreHistoryListQuery.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/dto/query/AdminClubScoreHistoryListQuery.java index a9544eda..947878ef 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/dto/query/AdminClubScoreHistoryListQuery.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/dto/query/AdminClubScoreHistoryListQuery.java @@ -1,15 +1,15 @@ package ddingdong.ddingdongBE.domain.scorehistory.service.dto.query; -import ddingdong.ddingdongBE.domain.club.entity.Club; import ddingdong.ddingdongBE.domain.scorehistory.entity.ScoreHistory; +import java.math.BigDecimal; import java.util.List; public record AdminClubScoreHistoryListQuery( - Club club, + BigDecimal clubTotalScore, List scoreHistories ) { - public static AdminClubScoreHistoryListQuery of(Club club, List scoreHistories) { - return new AdminClubScoreHistoryListQuery(club, scoreHistories); + public static AdminClubScoreHistoryListQuery of(BigDecimal clubTotalScore, List scoreHistories) { + return new AdminClubScoreHistoryListQuery(clubTotalScore, scoreHistories); } } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/dto/query/ClubScoreHistoryListQuery.java b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/dto/query/ClubScoreHistoryListQuery.java index cd4ed745..661add98 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/dto/query/ClubScoreHistoryListQuery.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/scorehistory/service/dto/query/ClubScoreHistoryListQuery.java @@ -1,15 +1,15 @@ package ddingdong.ddingdongBE.domain.scorehistory.service.dto.query; -import ddingdong.ddingdongBE.domain.club.entity.Club; import ddingdong.ddingdongBE.domain.scorehistory.entity.ScoreHistory; +import java.math.BigDecimal; import java.util.List; public record ClubScoreHistoryListQuery( - Club club, + BigDecimal clubTotalScore, List scoreHistories ) { - public static ClubScoreHistoryListQuery of(Club club, List scoreHistories) { - return new ClubScoreHistoryListQuery(club, scoreHistories); + public static ClubScoreHistoryListQuery of(BigDecimal clubTotalScore, List scoreHistories) { + return new ClubScoreHistoryListQuery(clubTotalScore, scoreHistories); } } diff --git a/src/main/java/ddingdong/ddingdongBE/file/controller/S3FileController.java b/src/main/java/ddingdong/ddingdongBE/file/controller/S3FileController.java index 9b4f3d5e..22d69f94 100644 --- a/src/main/java/ddingdong/ddingdongBE/file/controller/S3FileController.java +++ b/src/main/java/ddingdong/ddingdongBE/file/controller/S3FileController.java @@ -8,6 +8,8 @@ import ddingdong.ddingdongBE.file.service.dto.command.GeneratePreSignedUrlRequestCommand; import ddingdong.ddingdongBE.file.service.dto.query.GeneratePreSignedUrlRequestQuery; import java.net.URL; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.RestController; @@ -22,9 +24,10 @@ public class S3FileController implements S3FileAPi { public UploadUrlResponse getPreSignedUrl(PrincipalDetails principalDetails, String fileName) { User user = principalDetails.getUser(); LocalDateTime now = LocalDateTime.now(); + String decodedFileName = URLDecoder.decode(fileName, StandardCharsets.UTF_8); GeneratePreSignedUrlRequestQuery query = s3FileService.generatePresignedUrlRequest( - new GeneratePreSignedUrlRequestCommand(now, user.getId(), fileName)); + new GeneratePreSignedUrlRequestCommand(now, user.getId(), decodedFileName)); URL presingedUrl = s3FileService.getPresignedUrl(query.generatePresignedUrlRequest()); return UploadUrlResponse.of(query, presingedUrl); } diff --git a/src/test/java/ddingdong/ddingdongBE/domain/feed/repository/FeedRepositoryTest.java b/src/test/java/ddingdong/ddingdongBE/domain/feed/repository/FeedRepositoryTest.java index f2e9b7e4..b652b2d4 100644 --- a/src/test/java/ddingdong/ddingdongBE/domain/feed/repository/FeedRepositoryTest.java +++ b/src/test/java/ddingdong/ddingdongBE/domain/feed/repository/FeedRepositoryTest.java @@ -9,9 +9,17 @@ import ddingdong.ddingdongBE.domain.club.repository.ClubRepository; import ddingdong.ddingdongBE.domain.feed.entity.Feed; import ddingdong.ddingdongBE.domain.feed.entity.FeedType; +import ddingdong.ddingdongBE.domain.filemetadata.entity.DomainType; +import ddingdong.ddingdongBE.domain.filemetadata.entity.FileMetaData; +import ddingdong.ddingdongBE.domain.filemetadata.entity.FileStatus; +import ddingdong.ddingdongBE.domain.filemetadata.repository.FileMetaDataRepository; import ddingdong.ddingdongBE.domain.scorehistory.entity.Score; +import ddingdong.ddingdongBE.domain.vodprocessing.entity.ConvertJobStatus; +import ddingdong.ddingdongBE.domain.vodprocessing.entity.VodProcessingJob; +import ddingdong.ddingdongBE.domain.vodprocessing.repository.VodProcessingJobRepository; import java.math.BigDecimal; import java.util.List; +import java.util.UUID; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -26,6 +34,12 @@ class FeedRepositoryTest extends DataJpaTestSupport { @Autowired private FeedRepository feedRepository; + @Autowired + private FileMetaDataRepository fileMetaDataRepository; + + @Autowired + private VodProcessingJobRepository vodProcessingJobRepository; + private final FixtureMonkey fixture = FixtureMonkeyFactory.getNotNullBuilderIntrospectorMonkey(); @BeforeEach @@ -41,57 +55,63 @@ void setUp() { void findNewestPerClubPage() { // given Club club1 = fixture.giveMeBuilder(Club.class) - .set("name", "카우1") - .set("user", null) - .set("score", Score.from(BigDecimal.ZERO)) - .set("clubMembers", null) - .sample(); + .set("name", "카우1") + .set("user", null) + .set("score", Score.from(BigDecimal.ZERO)) + .set("clubMembers", null) + .sample(); Club club2 = fixture.giveMeBuilder(Club.class) - .set("name", "카우2") - .set("user", null) - .set("score", Score.from(BigDecimal.ZERO)) - .set("clubMembers", null) - .sample(); + .set("name", "카우2") + .set("user", null) + .set("score", Score.from(BigDecimal.ZERO)) + .set("clubMembers", null) + .sample(); Club club3 = fixture.giveMeBuilder(Club.class) - .set("name", "카우3") - .set("user", null) - .set("score", Score.from(BigDecimal.ZERO)) - .set("clubMembers", null) - .sample(); + .set("name", "카우3") + .set("user", null) + .set("score", Score.from(BigDecimal.ZERO)) + .set("clubMembers", null) + .sample(); Club savedClub1 = clubRepository.save(club1); Club savedClub2 = clubRepository.save(club2); Club savedClub3 = clubRepository.save(club3); Feed feed1 = fixture.giveMeBuilder(Feed.class) - .set("id", 1L) - .set("club", savedClub1) - .set("activityContent", "내용 1 올드") - .sample(); + .set("id", 1L) + .set("club", savedClub1) + .set("activityContent", "내용 1 올드") + .set("feedType", FeedType.IMAGE) + .sample(); Feed feed2 = fixture.giveMeBuilder(Feed.class) - .set("id", 2L) - .set("club", savedClub1) - .set("activityContent", "내용 1 최신") - .sample(); + .set("id", 2L) + .set("club", savedClub1) + .set("activityContent", "내용 1 최신") + .set("feedType", FeedType.IMAGE) + .sample(); Feed feed3 = fixture.giveMeBuilder(Feed.class) - .set("id", 3L) - .set("club", savedClub2) - .set("activityContent", "내용 2 올드") - .sample(); + .set("id", 3L) + .set("club", savedClub2) + .set("activityContent", "내용 2 올드") + .set("feedType", FeedType.IMAGE) + .sample(); Feed feed4 = fixture.giveMeBuilder(Feed.class) - .set("id", 4L) - .set("club", savedClub2) - .set("activityContent", "내용 2 최신") - .sample(); + .set("id", 4L) + .set("club", savedClub2) + .set("activityContent", "내용 2 최신") + .set("feedType", FeedType.IMAGE) + .sample(); Feed feed5 = fixture.giveMeBuilder(Feed.class) - .set("id", 5L) - .set("club", savedClub3) - .set("activityContent", "내용 3 올드") - .sample(); + .set("id", 5L) + .set("club", savedClub3) + .set("activityContent", "내용 3 올드") + .set("feedType", FeedType.IMAGE) + .sample(); Feed feed6 = fixture.giveMeBuilder(Feed.class) - .set("id", 6L) - .set("club", savedClub3) - .set("activityContent", "내용 3 최신") - .sample(); + .set("id", 6L) + .set("club", savedClub3) + .set("activityContent", "내용 3 최신") + .set("feedType", FeedType.IMAGE) + .sample(); feedRepository.saveAll(List.of(feed1, feed2, feed3, feed4, feed5, feed6)); int size = 2; @@ -111,37 +131,37 @@ void findNewestPerClubPage() { void 페이지네이션_남은_개수가_사이즈보다_적은경우() { // given Club club = fixture.giveMeBuilder(Club.class) - .set("name", "카우") - .set("user", null) - .set("score", Score.from(BigDecimal.ZERO)) - .set("clubMembers", null) - .sample(); + .set("name", "카우") + .set("user", null) + .set("score", Score.from(BigDecimal.ZERO)) + .set("clubMembers", null) + .sample(); Club savedClub = clubRepository.save(club); Feed feed1 = fixture.giveMeBuilder(Feed.class) - .set("id", 1L) - .set("club", savedClub) - .set("activityContent", "내용1") - .set("feedType", FeedType.IMAGE) - .sample(); + .set("id", 1L) + .set("club", savedClub) + .set("activityContent", "내용1") + .set("feedType", FeedType.IMAGE) + .sample(); Feed feed2 = fixture.giveMeBuilder(Feed.class) - .set("id", 2L) - .set("club", savedClub) - .set("activityContent", "내용2") - .set("feedType", FeedType.VIDEO) - .sample(); + .set("id", 2L) + .set("club", savedClub) + .set("activityContent", "내용2") + .set("feedType", FeedType.IMAGE) + .sample(); Feed feed3 = fixture.giveMeBuilder(Feed.class) - .set("id", 3L) - .set("club", savedClub) - .set("activityContent", "내용3") - .set("feedType", FeedType.IMAGE) - .sample(); + .set("id", 3L) + .set("club", savedClub) + .set("activityContent", "내용3") + .set("feedType", FeedType.IMAGE) + .sample(); Feed feed4 = fixture.giveMeBuilder(Feed.class) - .set("id", 4L) - .set("club", savedClub) - .set("activityContent", "내용4") - .set("feedType", FeedType.IMAGE) - .sample(); + .set("id", 4L) + .set("club", savedClub) + .set("activityContent", "내용4") + .set("feedType", FeedType.IMAGE) + .sample(); feedRepository.saveAll(List.of(feed1, feed2, feed3, feed4)); Long clubId = savedClub.getId(); @@ -161,37 +181,37 @@ void findNewestPerClubPage() { void findPageByClubIdOrderById() { // given Club club = fixture.giveMeBuilder(Club.class) - .set("name", "카우") - .set("user", null) - .set("score", Score.from(BigDecimal.ZERO)) - .set("clubMembers", null) - .sample(); + .set("name", "카우") + .set("user", null) + .set("score", Score.from(BigDecimal.ZERO)) + .set("clubMembers", null) + .sample(); Club savedClub = clubRepository.save(club); Feed feed1 = fixture.giveMeBuilder(Feed.class) - .set("id", 1L) - .set("club", savedClub) - .set("activityContent", "내용1") - .set("feedType", FeedType.IMAGE) - .sample(); + .set("id", 1L) + .set("club", savedClub) + .set("activityContent", "내용1") + .set("feedType", FeedType.IMAGE) + .sample(); Feed feed2 = fixture.giveMeBuilder(Feed.class) - .set("id", 2L) - .set("club", savedClub) - .set("activityContent", "내용2") - .set("feedType", FeedType.VIDEO) - .sample(); + .set("id", 2L) + .set("club", savedClub) + .set("activityContent", "내용2") + .set("feedType", FeedType.IMAGE) + .sample(); Feed feed3 = fixture.giveMeBuilder(Feed.class) - .set("id", 3L) - .set("club", savedClub) - .set("activityContent", "내용3") - .set("feedType", FeedType.IMAGE) - .sample(); + .set("id", 3L) + .set("club", savedClub) + .set("activityContent", "내용3") + .set("feedType", FeedType.IMAGE) + .sample(); Feed feed4 = fixture.giveMeBuilder(Feed.class) - .set("id", 4L) - .set("club", savedClub) - .set("activityContent", "내용4") - .set("feedType", FeedType.IMAGE) - .sample(); + .set("id", 4L) + .set("club", savedClub) + .set("activityContent", "내용4") + .set("feedType", FeedType.IMAGE) + .sample(); feedRepository.saveAll(List.of(feed1, feed2, feed3, feed4)); Long clubId = savedClub.getId(); @@ -207,4 +227,148 @@ void findPageByClubIdOrderById() { assertThat(feeds.get(1).getId()).isEqualTo(feed2.getId()); assertThat(feeds.get(1).getActivityContent()).isEqualTo(feed2.getActivityContent()); } + + @DisplayName("동아리 피드 목록 조회 - VIDEO 피드일 경우 vodJopProcessingJob 상태가 COMPLETE인것만 조회 ") + @Test + void 동아리_피드_목록_조회() { + // given + Club club = fixture.giveMeBuilder(Club.class) + .set("name", "카우") + .set("user", null) + .set("score", Score.from(BigDecimal.ZERO)) + .set("clubMembers", null) + .sample(); + Club savedClub = clubRepository.save(club); + + Feed feed1 = fixture.giveMeBuilder(Feed.class) + .set("id", 1L) + .set("club", savedClub) + .set("activityContent", "내용1") + .set("feedType", FeedType.VIDEO) + .sample(); + Feed feed2 = fixture.giveMeBuilder(Feed.class) + .set("id", 2L) + .set("club", savedClub) + .set("activityContent", "내용2") + .set("feedType", FeedType.VIDEO) + .sample(); + feedRepository.saveAll(List.of(feed1, feed2)); + + UUID id = UUID.randomUUID(); + UUID id2 = UUID.randomUUID(); + DomainType domainType = DomainType.FEED_VIDEO; + FileMetaData fileMetaData = FileMetaData.builder() + .id(id) + .fileKey("123") + .fileName("1234.png") + .domainType(domainType) + .entityId(feed1.getId()) + .fileStatus(FileStatus.COUPLED) + .build(); + FileMetaData fileMetaData2 = FileMetaData.builder() + .id(id2) + .fileKey("123") + .fileName("1234.png") + .domainType(domainType) + .entityId(feed2.getId()) + .fileStatus(FileStatus.COUPLED) + .build(); + fileMetaDataRepository.saveAll(List.of(fileMetaData, fileMetaData2)); + + VodProcessingJob vodProcessingJob1 = fixture.giveMeBuilder(VodProcessingJob.class) + .set("id", 1L) + .set("vodProcessingNotification", null) + .set("fileMetaData", fileMetaData) + .set("convertJobStatus", ConvertJobStatus.COMPLETE) + .sample(); + VodProcessingJob vodProcessingJob2 = fixture.giveMeBuilder(VodProcessingJob.class) + .set("id", 2L) + .set("vodProcessingNotification", null) + .set("fileMetaData", fileMetaData2) + .set("convertJobStatus", ConvertJobStatus.PENDING) + .sample(); + vodProcessingJobRepository.saveAll(List.of(vodProcessingJob1, vodProcessingJob2)); + Long clubId = savedClub.getId(); + int size = 2; + Long currentCursorId = -1L; + // when + Slice findFeedsByClub = feedRepository.findPageByClubIdOrderById(clubId, size, currentCursorId); + + // then + List feeds = findFeedsByClub.getContent(); + assertThat(feeds.size()).isEqualTo(1); + assertThat(feeds.get(0).getId()).isEqualTo(1); + } + + @DisplayName("모든 동아리 최신 피드 조회 - VIDEO 피드일 경우 vodJopProcessingJob 상태가 COMPLETE인것만 조회 ") + @Test + void 모든_동아리_최신_피드_조회() { + // given + Club club = fixture.giveMeBuilder(Club.class) + .set("name", "카우") + .set("user", null) + .set("score", Score.from(BigDecimal.ZERO)) + .set("clubMembers", null) + .sample(); + Club savedClub = clubRepository.save(club); + + Feed feed1 = fixture.giveMeBuilder(Feed.class) + .set("id", 1L) + .set("club", savedClub) + .set("activityContent", "내용1") + .set("feedType", FeedType.VIDEO) + .sample(); + Feed feed2 = fixture.giveMeBuilder(Feed.class) + .set("id", 2L) + .set("club", savedClub) + .set("activityContent", "내용2") + .set("feedType", FeedType.VIDEO) + .sample(); + feedRepository.saveAll(List.of(feed1, feed2)); + + UUID id = UUID.randomUUID(); + UUID id2 = UUID.randomUUID(); + DomainType domainType = DomainType.FEED_VIDEO; + FileMetaData fileMetaData = FileMetaData.builder() + .id(id) + .fileKey("123") + .fileName("1234.png") + .domainType(domainType) + .entityId(feed1.getId()) + .fileStatus(FileStatus.COUPLED) + .build(); + FileMetaData fileMetaData2 = FileMetaData.builder() + .id(id2) + .fileKey("123") + .fileName("1234.png") + .domainType(domainType) + .entityId(feed2.getId()) + .fileStatus(FileStatus.COUPLED) + .build(); + fileMetaDataRepository.saveAll(List.of(fileMetaData, fileMetaData2)); + + VodProcessingJob vodProcessingJob1 = fixture.giveMeBuilder(VodProcessingJob.class) + .set("id", 1L) + .set("vodProcessingNotification", null) + .set("fileMetaData", fileMetaData) + .set("convertJobStatus", ConvertJobStatus.COMPLETE) + .sample(); + VodProcessingJob vodProcessingJob2 = fixture.giveMeBuilder(VodProcessingJob.class) + .set("id", 2L) + .set("vodProcessingNotification", null) + .set("fileMetaData", fileMetaData2) + .set("convertJobStatus", ConvertJobStatus.COMPLETE) + .sample(); + vodProcessingJobRepository.saveAll(List.of(vodProcessingJob1, vodProcessingJob2)); + + int size = 2; + Long currentCursorId = -1L; + // when + Slice findFeedsByClub = feedRepository.findNewestPerClubPage(size, currentCursorId); + + // then + List feeds = findFeedsByClub.getContent(); + assertThat(feeds.size()).isEqualTo(1); + assertThat(feeds.get(0).getId()).isEqualTo(2); + } }