diff --git a/src/main/java/ddingdong/ddingdongBE/domain/activityreport/repository/ActivityReportTermInfoRepository.java b/src/main/java/ddingdong/ddingdongBE/domain/activityreport/repository/ActivityReportTermInfoRepository.java index f7078490..54e7a8b0 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/activityreport/repository/ActivityReportTermInfoRepository.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/activityreport/repository/ActivityReportTermInfoRepository.java @@ -1,8 +1,11 @@ package ddingdong.ddingdongBE.domain.activityreport.repository; import ddingdong.ddingdongBE.domain.activityreport.domain.ActivityReportTermInfo; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; public interface ActivityReportTermInfoRepository extends JpaRepository { + Optional findFirstByOrderByStartDateAsc(); + } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/activityreport/service/ActivityReportTermInfoServiceImpl.java b/src/main/java/ddingdong/ddingdongBE/domain/activityreport/service/ActivityReportTermInfoServiceImpl.java index 8ddbf1a2..aa70a0f2 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/activityreport/service/ActivityReportTermInfoServiceImpl.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/activityreport/service/ActivityReportTermInfoServiceImpl.java @@ -1,5 +1,6 @@ package ddingdong.ddingdongBE.domain.activityreport.service; +import ddingdong.ddingdongBE.common.exception.PersistenceException.ResourceNotFound; import ddingdong.ddingdongBE.domain.activityreport.domain.ActivityReportTermInfo; import ddingdong.ddingdongBE.domain.activityreport.repository.ActivityReportTermInfoRepository; import java.time.Duration; @@ -14,9 +15,8 @@ @Service @RequiredArgsConstructor @Transactional(readOnly = true) -public class ActivityReportTermInfoServiceImpl implements ActivityReportTermInfoService{ +public class ActivityReportTermInfoServiceImpl implements ActivityReportTermInfoService { - private static final String START_DATE = "2024-09-02"; private static final int DEFAULT_TERM = 8; private static final int CORRECTION_VALUE = 8; private static final int TERM_LENGTH_OF_DAYS = 14; @@ -32,23 +32,25 @@ public List getActivityReportTermInfos() { @Override public void create(LocalDate startDate, int totalTermCount) { activityReportTermInfoRepository.saveAll( - IntStream.range(0, totalTermCount) - .mapToObj(i -> { - LocalDate termStartDate = startDate.plusDays(i * 14L); - LocalDate termEndDate = termStartDate.plusDays(13L); - return ActivityReportTermInfo.builder() - .term(i + 1) - .startDate(termStartDate) - .endDate(termEndDate) - .build(); - }) - .collect(Collectors.toList()) + IntStream.range(0, totalTermCount) + .mapToObj(i -> { + LocalDate termStartDate = startDate.plusDays(i * 14L); + LocalDate termEndDate = termStartDate.plusDays(13L); + return ActivityReportTermInfo.builder() + .term(i + 1) + .startDate(termStartDate) + .endDate(termEndDate) + .build(); + }) + .collect(Collectors.toList()) ); } @Override public String getCurrentTerm() { - LocalDate startDate = LocalDate.parse(START_DATE); + ActivityReportTermInfo activityReportTermInfo = activityReportTermInfoRepository.findFirstByOrderByStartDateAsc() + .orElseThrow(() -> new ResourceNotFound("활동보고서 기간이 존재하지 않습니다.")); + LocalDate startDate = activityReportTermInfo.getStartDate(); LocalDate currentDate = LocalDate.now(); int gapOfDays = calculateGapOfDays(startDate, currentDate); @@ -57,7 +59,7 @@ public String getCurrentTerm() { private int calculateGapOfDays(final LocalDate startDate, final LocalDate currentDate) { return (int) Duration.between(startDate.atStartOfDay(), currentDate.atStartOfDay()) - .toDays(); + .toDays(); } private String calculateCurrentTerm(final int days) { diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/service/FacadeClubFeedServiceImpl.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/FacadeClubFeedServiceImpl.java index 01ef80bf..112d9474 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/feed/service/FacadeClubFeedServiceImpl.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/FacadeClubFeedServiceImpl.java @@ -76,35 +76,24 @@ public MyFeedPageQuery getMyFeedPage(User user, int size, Long currentCursorId) if (feedPage == null) { return MyFeedPageQuery.createEmpty(); } - List completeFeeds = feedPage.getContent().stream().filter(this::isComplete).toList(); - - List feedListQueries = completeFeeds.stream().map(feedFileService::extractFeedThumbnailInfo).toList(); + List completeFeeds = feedPage.getContent(); + List feedListQueries = completeFeeds.stream() + .map(feedFileService::extractFeedThumbnailInfo) + .toList(); PagingQuery pagingQuery = PagingQuery.of(currentCursorId, completeFeeds, feedPage.hasNext()); return MyFeedPageQuery.of(feedListQueries, pagingQuery); } - private boolean isComplete(Feed feed) { - if (feed.isImage()) { - return true; - } - - VodProcessingJob vodProcessingJob = vodProcessingJobService.findByVideoFeedId(feed.getId()); - if (vodProcessingJob == null) { - return false; - } - return vodProcessingJob.isCompleteNotification(); - } - private void checkVodProcessingJobAndNotify(Feed feed) { VodProcessingJob vodProcessingJob = vodProcessingJobService.findByVideoFeedId(feed.getId()); if (vodProcessingJob != null && vodProcessingJob.isPossibleNotify()) { SseEvent sseEvent = SseEvent.of( - "vod-processing", - new SseVodProcessingNotificationDto( - vodProcessingJob.getVodProcessingNotification().getId(), - vodProcessingJob.getConvertJobStatus()), - LocalDateTime.now() + "vod-processing", + new SseVodProcessingNotificationDto( + vodProcessingJob.getVodProcessingNotification().getId(), + vodProcessingJob.getConvertJobStatus()), + LocalDateTime.now() ); sseConnectionService.sendVodProcessingNotification(vodProcessingJob, sseEvent); } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/feed/service/FacadeFeedService.java b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/FacadeFeedService.java index eb58a13b..c7cfcb71 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/feed/service/FacadeFeedService.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/FacadeFeedService.java @@ -8,8 +8,6 @@ import ddingdong.ddingdongBE.domain.feed.service.dto.query.FeedQuery; import ddingdong.ddingdongBE.domain.feed.service.dto.query.NewestFeedPerClubPageQuery; import ddingdong.ddingdongBE.domain.feed.service.dto.query.PagingQuery; -import ddingdong.ddingdongBE.domain.vodprocessing.entity.VodProcessingJob; -import ddingdong.ddingdongBE.domain.vodprocessing.service.VodProcessingJobService; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Slice; @@ -21,52 +19,42 @@ @Transactional(readOnly = true) public class FacadeFeedService { - private final FeedService feedService; - private final FeedFileService feedFileService; - private final VodProcessingJobService vodProcessingJobService; - - public ClubFeedPageQuery getFeedPageByClub(Long clubId, int size, Long currentCursorId) { - Slice feedPage = feedService.getFeedPageByClubId(clubId, size, currentCursorId); - if (feedPage == null) { - return ClubFeedPageQuery.createEmpty(); + private final FeedService feedService; + private final FeedFileService feedFileService; + + public ClubFeedPageQuery getFeedPageByClub(Long clubId, int size, Long currentCursorId) { + Slice feedPage = feedService.getFeedPageByClubId(clubId, size, currentCursorId); + if (feedPage == null) { + return ClubFeedPageQuery.createEmpty(); + } + List completeFeeds = feedPage.getContent(); + List feedListQueries = completeFeeds.stream() + .map(feedFileService::extractFeedThumbnailInfo) + .toList(); + PagingQuery pagingQuery = PagingQuery.of(currentCursorId, completeFeeds, feedPage.hasNext()); + + return ClubFeedPageQuery.of(feedListQueries, pagingQuery); } - List completeFeeds = feedPage.getContent().stream().filter(this::isComplete).toList(); - List feedListQueries = completeFeeds.stream().map(feedFileService::extractFeedThumbnailInfo).toList(); - PagingQuery pagingQuery = PagingQuery.of(currentCursorId, completeFeeds, feedPage.hasNext()); + public NewestFeedPerClubPageQuery getNewestFeedPerClubPage(int size, Long currentCursorId) { + Slice feedPage = feedService.getNewestFeedPerClubPage(size, currentCursorId); + if (feedPage == null) { + return NewestFeedPerClubPageQuery.createEmpty(); + } + List completeFeeds = feedPage.getContent(); - return ClubFeedPageQuery.of(feedListQueries, pagingQuery); - } + List feedListQueries = completeFeeds.stream().map(feedFileService::extractFeedThumbnailInfo) + .toList(); + PagingQuery pagingQuery = PagingQuery.of(currentCursorId, completeFeeds, feedPage.hasNext()); - public NewestFeedPerClubPageQuery getNewestFeedPerClubPage(int size, Long currentCursorId) { - Slice feedPage = feedService.getNewestFeedPerClubPage(size, currentCursorId); - if (feedPage == null) { - return NewestFeedPerClubPageQuery.createEmpty(); + return NewestFeedPerClubPageQuery.of(feedListQueries, pagingQuery); } - List completeFeeds = feedPage.getContent(); - - List feedListQueries = completeFeeds.stream().map(feedFileService::extractFeedThumbnailInfo).toList(); - PagingQuery pagingQuery = PagingQuery.of(currentCursorId, completeFeeds, feedPage.hasNext()); - - return NewestFeedPerClubPageQuery.of(feedListQueries, pagingQuery); - } - public FeedQuery getById(Long feedId) { - Feed feed = feedService.getById(feedId); - ClubProfileQuery clubProfileQuery = feedFileService.extractClubInfo(feed.getClub()); - FeedFileUrlQuery feedFileUrlQuery = feedFileService.extractFeedFileInfo(feed); - return FeedQuery.of(feed, clubProfileQuery, feedFileUrlQuery); - } - - private boolean isComplete(Feed feed) { - if (feed.isImage()) { - return true; + public FeedQuery getById(Long feedId) { + Feed feed = feedService.getById(feedId); + ClubProfileQuery clubProfileQuery = feedFileService.extractClubInfo(feed.getClub()); + FeedFileUrlQuery feedFileUrlQuery = feedFileService.extractFeedFileInfo(feed); + return FeedQuery.of(feed, clubProfileQuery, feedFileUrlQuery); } - VodProcessingJob vodProcessingJob = vodProcessingJobService.findByVideoFeedId(feed.getId()); - if (vodProcessingJob == null) { - return false; - } - return vodProcessingJob.isCompleteNotification(); - } } 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 0fca497c..99f81e22 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/feed/service/GeneralFeedService.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/feed/service/GeneralFeedService.java @@ -3,9 +3,12 @@ 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; @@ -19,12 +22,14 @@ public class GeneralFeedService implements FeedService { private final FeedRepository feedRepository; + private final VodProcessingJobService vodProcessingJobService; @Override public Slice getFeedPageByClubId(Long clubId, int size, Long currentCursorId) { Slice feedPages = feedRepository.findPageByClubIdOrderById(clubId, size + 1, currentCursorId); return buildSlice(feedPages, size); } + @Override public Slice getNewestFeedPerClubPage(int size, Long currentCursorId) { Slice feedPages = feedRepository.findNewestPerClubPage(size + 1, currentCursorId); @@ -34,7 +39,7 @@ public Slice getNewestFeedPerClubPage(int size, Long currentCursorId) { @Override public Feed getById(Long feedId) { return feedRepository.findById(feedId) - .orElseThrow(() -> new ResourceNotFound("Feed(id: " + feedId + ")를 찾을 수 없습니다.")); + .orElseThrow(() -> new ResourceNotFound("Feed(id: " + feedId + ")를 찾을 수 없습니다.")); } @Override @@ -56,7 +61,9 @@ public void delete(Feed feed) { } private Slice buildSlice(Slice originalSlice, int size) { - List content = new ArrayList<>(originalSlice.getContent()); + List content = new ArrayList<>(originalSlice.getContent()).stream() + .filter(this::isComplete) + .collect(Collectors.toList()); if (content.isEmpty()) { return null; } @@ -69,4 +76,16 @@ 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/vodprocessing/entity/VodProcessingJob.java b/src/main/java/ddingdong/ddingdongBE/domain/vodprocessing/entity/VodProcessingJob.java index c1aaa985..1a2ac061 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/vodprocessing/entity/VodProcessingJob.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/vodprocessing/entity/VodProcessingJob.java @@ -62,7 +62,7 @@ public boolean isPossibleNotify() { return this.convertJobStatus == ConvertJobStatus.COMPLETE || this.convertJobStatus == ConvertJobStatus.ERROR; } - public boolean isCompleteNotification() { - return this.vodProcessingNotification.getVodNotificationStatus() == VodNotificationStatus.COMPLETED; + public boolean isCompleted() { + return this.convertJobStatus == ConvertJobStatus.COMPLETE; } } diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 1a1772ed..0d5c7252 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -16,6 +16,7 @@ spring: properties: hibernate: defer-datasource-initialization: false + open-in-view: false sql: init: diff --git a/src/test/java/ddingdong/ddingdongBE/domain/feed/service/GeneralFeedServiceTest.java b/src/test/java/ddingdong/ddingdongBE/domain/feed/service/GeneralFeedServiceTest.java index 94698b41..6c22cd78 100644 --- a/src/test/java/ddingdong/ddingdongBE/domain/feed/service/GeneralFeedServiceTest.java +++ b/src/test/java/ddingdong/ddingdongBE/domain/feed/service/GeneralFeedServiceTest.java @@ -38,11 +38,11 @@ class GeneralFeedServiceTest extends TestContainerSupport { void create() { // given Feed feed = fixtureMonkey.giveMeBuilder(Feed.class) - .set("activityContent", "활동내용") - .set("feedType", FeedType.IMAGE) - .set("deletedAt", null) - .set("club", null) - .sample(); + .set("activityContent", "활동내용") + .set("feedType", FeedType.IMAGE) + .set("deletedAt", null) + .set("club", null) + .sample(); // when Long feedId = feedService.create(feed); // then @@ -57,33 +57,37 @@ void create() { void getFeedPageByClubId() { // given Club club = fixtureMonkey.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 = fixtureMonkey.giveMeBuilder(Feed.class) - .set("club", savedClub) - .set("activityContent", "내용1") - .set("feedType", FeedType.IMAGE) - .sample(); + .set("club", savedClub) + .set("activityContent", "내용1") + .set("feedType", FeedType.IMAGE) + .set("deletedAt", null) + .sample(); Feed feed2 = fixtureMonkey.giveMeBuilder(Feed.class) - .set("club", savedClub) - .set("activityContent", "내용2") - .set("feedType", FeedType.VIDEO) - .sample(); + .set("club", savedClub) + .set("activityContent", "내용2") + .set("feedType", FeedType.VIDEO) + .set("deletedAt", null) + .sample(); Feed feed3 = fixtureMonkey.giveMeBuilder(Feed.class) - .set("club", savedClub) - .set("activityContent", "내용3") - .set("feedType", FeedType.IMAGE) - .sample(); + .set("club", savedClub) + .set("activityContent", "내용3") + .set("feedType", FeedType.IMAGE) + .set("deletedAt", null) + .sample(); Feed feed4 = fixtureMonkey.giveMeBuilder(Feed.class) - .set("club", savedClub) - .set("activityContent", "내용4") - .set("feedType", FeedType.IMAGE) - .sample(); + .set("club", savedClub) + .set("activityContent", "내용4") + .set("feedType", FeedType.IMAGE) + .set("deletedAt", null) + .sample(); feedRepository.saveAll(List.of(feed1, feed2, feed3, feed4)); Long clubId = savedClub.getId(); @@ -96,6 +100,5 @@ void getFeedPageByClubId() { assertThat(page.getContent().size()).isEqualTo(2); assertThat(page.getNumber()).isEqualTo(0); assertThat(page.getContent().get(page.getContent().size() - 1).getId()).isEqualTo(3); - assertThat(page.hasNext()).isTrue(); } } diff --git a/src/test/java/ddingdong/ddingdongBE/domain/question/service/FacadeUserQuestionServiceImplTest.java b/src/test/java/ddingdong/ddingdongBE/domain/question/service/FacadeUserQuestionServiceImplTest.java index e1df64d2..eaab5dc7 100644 --- a/src/test/java/ddingdong/ddingdongBE/domain/question/service/FacadeUserQuestionServiceImplTest.java +++ b/src/test/java/ddingdong/ddingdongBE/domain/question/service/FacadeUserQuestionServiceImplTest.java @@ -33,6 +33,7 @@ void getAllQuestions() { .setNotNull("question") .setNotNull("reply") .setNotNull("createdAt") + .setNotNull("deletedAt") .sampleList(5); questionRepository.saveAll(questions);