Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DDING-80] 활동보고서 현재 회차 조회 API 로직 수정 및 페이지네이션 로직 수정 #220

Merged
merged 5 commits into from
Jan 19, 2025
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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<ActivityReportTermInfo, Long> {

Optional<ActivityReportTermInfo> findFirstByOrderByStartDateAsc();

}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand All @@ -32,23 +32,25 @@ public List<ActivityReportTermInfo> 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);
Expand All @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,35 +76,24 @@ public MyFeedPageQuery getMyFeedPage(User user, int size, Long currentCursorId)
if (feedPage == null) {
return MyFeedPageQuery.createEmpty();
}
List<Feed> completeFeeds = feedPage.getContent().stream().filter(this::isComplete).toList();

List<FeedListQuery> feedListQueries = completeFeeds.stream().map(feedFileService::extractFeedThumbnailInfo).toList();
List<Feed> completeFeeds = feedPage.getContent();
List<FeedListQuery> 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<SseVodProcessingNotificationDto> 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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<Feed> 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<Feed> feedPage = feedService.getFeedPageByClubId(clubId, size, currentCursorId);
if (feedPage == null) {
return ClubFeedPageQuery.createEmpty();
}
List<Feed> completeFeeds = feedPage.getContent();
List<FeedListQuery> feedListQueries = completeFeeds.stream()
.map(feedFileService::extractFeedThumbnailInfo)
.toList();
PagingQuery pagingQuery = PagingQuery.of(currentCursorId, completeFeeds, feedPage.hasNext());

return ClubFeedPageQuery.of(feedListQueries, pagingQuery);
}
List<Feed> completeFeeds = feedPage.getContent().stream().filter(this::isComplete).toList();

List<FeedListQuery> feedListQueries = completeFeeds.stream().map(feedFileService::extractFeedThumbnailInfo).toList();
PagingQuery pagingQuery = PagingQuery.of(currentCursorId, completeFeeds, feedPage.hasNext());
public NewestFeedPerClubPageQuery getNewestFeedPerClubPage(int size, Long currentCursorId) {
Slice<Feed> feedPage = feedService.getNewestFeedPerClubPage(size, currentCursorId);
if (feedPage == null) {
return NewestFeedPerClubPageQuery.createEmpty();
}
List<Feed> completeFeeds = feedPage.getContent();

return ClubFeedPageQuery.of(feedListQueries, pagingQuery);
}
List<FeedListQuery> feedListQueries = completeFeeds.stream().map(feedFileService::extractFeedThumbnailInfo)
.toList();
PagingQuery pagingQuery = PagingQuery.of(currentCursorId, completeFeeds, feedPage.hasNext());

public NewestFeedPerClubPageQuery getNewestFeedPerClubPage(int size, Long currentCursorId) {
Slice<Feed> feedPage = feedService.getNewestFeedPerClubPage(size, currentCursorId);
if (feedPage == null) {
return NewestFeedPerClubPageQuery.createEmpty();
return NewestFeedPerClubPageQuery.of(feedListQueries, pagingQuery);
}
List<Feed> completeFeeds = feedPage.getContent();

List<FeedListQuery> 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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -19,12 +22,14 @@
public class GeneralFeedService implements FeedService {

private final FeedRepository feedRepository;
private final VodProcessingJobService vodProcessingJobService;

@Override
public Slice<Feed> getFeedPageByClubId(Long clubId, int size, Long currentCursorId) {
Slice<Feed> feedPages = feedRepository.findPageByClubIdOrderById(clubId, size + 1, currentCursorId);
return buildSlice(feedPages, size);
}

@Override
public Slice<Feed> getNewestFeedPerClubPage(int size, Long currentCursorId) {
Slice<Feed> feedPages = feedRepository.findNewestPerClubPage(size + 1, currentCursorId);
Expand All @@ -34,7 +39,7 @@ public Slice<Feed> 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
Expand All @@ -56,7 +61,9 @@ public void delete(Feed feed) {
}

private Slice<Feed> buildSlice(Slice<Feed> originalSlice, int size) {
List<Feed> content = new ArrayList<>(originalSlice.getContent());
List<Feed> content = new ArrayList<>(originalSlice.getContent()).stream()
.filter(this::isComplete)
.collect(Collectors.toList());
if (content.isEmpty()) {
return null;
}
Expand All @@ -69,4 +76,16 @@ private Slice<Feed> buildSlice(Slice<Feed> 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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Loading