Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
Expand Up @@ -2,6 +2,7 @@

import com.moplus.moplus_server.admin.problemset.dto.response.ProblemSetGetResponse;
import com.moplus.moplus_server.admin.problemset.dto.response.ProblemSummaryResponse;
import com.moplus.moplus_server.client.submit.domain.ProgressStatus;
import java.time.LocalDate;
import java.util.List;

Expand All @@ -18,10 +19,10 @@ public static HomeFeedResponse of(

public record DailyProgressResponse(
LocalDate date,
double progressRate
ProgressStatus progressStatus
) {
public static DailyProgressResponse of(LocalDate date, double progressRate) {
return new DailyProgressResponse(date, progressRate);
public static DailyProgressResponse of(LocalDate date, ProgressStatus progressStatus) {
return new DailyProgressResponse(date, progressStatus);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import com.moplus.moplus_server.client.homefeed.dto.response.HomeFeedResponse;
import com.moplus.moplus_server.client.homefeed.dto.response.HomeFeedResponse.DailyProgressResponse;
import com.moplus.moplus_server.client.homefeed.dto.response.HomeFeedResponse.ProblemSetHomeFeedResponse;
import com.moplus.moplus_server.client.submit.domain.ProgressStatus;
import com.moplus.moplus_server.client.submit.service.ProblemSubmitGetService;
import com.moplus.moplus_server.domain.problemset.service.ProblemSetGetService;
import com.moplus.moplus_server.member.domain.Member;
import com.moplus.moplus_server.statistic.Problem.domain.ProblemSetStatistic;
Expand All @@ -24,27 +26,41 @@
@RequiredArgsConstructor
public class HomeFeedFacadeService {

private static final LocalDate today = LocalDate.now();
private static final LocalDate monday = today.with(DayOfWeek.MONDAY);
private static final LocalDate friday = today.with(DayOfWeek.FRIDAY);
private final ProblemSetStatisticRepository problemSetStatisticRepository;
private final PublishGetService publishGetService;
private final ProblemSetGetService problemSetGetService;
private final ProblemSubmitGetService problemSubmitGetService;

@Transactional(readOnly = true)
public HomeFeedResponse getHomeFeed(Member member) {
Long memberId = member.getId();

List<DailyProgressResponse> dailyProgresses = new ArrayList<>(); // 다음 PR에서 구현
List<ProblemSetHomeFeedResponse> problemSets = getWeekdayProblemSets();
List<Publish> publishes = publishGetService.getPublishesBetweenDates(monday, friday);

List<DailyProgressResponse> dailyProgresses = getDailyProgresses(memberId, publishes);
List<ProblemSetHomeFeedResponse> problemSets = getWeekdayProblemSets(publishes);

return HomeFeedResponse.of(dailyProgresses, problemSets);
}

private List<ProblemSetHomeFeedResponse> getWeekdayProblemSets() {
LocalDate today = LocalDate.now();
LocalDate monday = today.with(DayOfWeek.MONDAY);
LocalDate friday = today.with(DayOfWeek.FRIDAY);
private List<DailyProgressResponse> getDailyProgresses(Long memberId, List<Publish> publishes) {
Map<LocalDate, ProgressStatus> progressStatuses = problemSubmitGetService.getProgressStatuses(memberId,
publishes);

List<DailyProgressResponse> responses = new ArrayList<>();
for (LocalDate date = monday; !date.isAfter(friday); date = date.plusDays(1)) {
ProgressStatus status = progressStatuses.getOrDefault(date, ProgressStatus.NOT_STARTED);
responses.add(DailyProgressResponse.of(date, status));
}

return responses;
}

private List<ProblemSetHomeFeedResponse> getWeekdayProblemSets(List<Publish> publishes) {

// 월요일부터 금요일까지의 발행된 문제 세트 조회
List<Publish> publishes = publishGetService.getPublishesBetweenDates(monday, friday);
Map<LocalDate, Publish> publishByDate = publishes.stream()
.collect(Collectors.toMap(Publish::getPublishedDate, publish -> publish));

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.moplus.moplus_server.client.submit.domain;

public enum ProgressStatus {
COMPLETED,
IN_PROGRESS,
NOT_STARTED
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.moplus.moplus_server.client.submit.service;

import com.moplus.moplus_server.admin.publish.domain.Publish;
import com.moplus.moplus_server.client.submit.domain.ProblemSubmit;
import com.moplus.moplus_server.client.submit.domain.ProgressStatus;
import com.moplus.moplus_server.client.submit.repository.ProblemSubmitRepository;
import com.moplus.moplus_server.domain.problemset.domain.ProblemSet;
import com.moplus.moplus_server.domain.problemset.repository.ProblemSetRepository;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class ProblemSubmitGetService {

private final ProblemSubmitRepository problemSubmitRepository;
private final ProblemSetRepository problemSetRepository;

@Transactional(readOnly = true)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

외부에서 사용되는 곳이 없다면, 해당 어노테이션이 없어도 같은 트랜잭션에 묶일 것 같습니다.

public ProgressStatus getProgressStatus(Long memberId, Long publishId) {
List<ProblemSubmit> submits = problemSubmitRepository.findByMemberIdAndPublishId(memberId, publishId);

if (submits.isEmpty()) {
return ProgressStatus.NOT_STARTED;
}

ProblemSet problemSet = problemSetRepository.findByIdElseThrow(submits.get(0).getProblemId());

int totalProblems = problemSet.getProblemIds().size();

if (submits.size() == totalProblems) {
return ProgressStatus.COMPLETED;
}
return ProgressStatus.IN_PROGRESS;
}

@Transactional(readOnly = true)
public Map<LocalDate, ProgressStatus> getProgressStatuses(Long memberId, List<Publish> publishes) {
return publishes.stream()
.collect(Collectors.toMap(
Publish::getPublishedDate,
publish -> getProgressStatus(memberId, publish.getId())
));
}
}