diff --git a/src/main/java/kr/tennispark/web/activity/application/service/WebActivityApplicationQueryService.java b/src/main/java/kr/tennispark/web/activity/application/service/WebActivityApplicationQueryService.java index d940745..dd513dd 100644 --- a/src/main/java/kr/tennispark/web/activity/application/service/WebActivityApplicationQueryService.java +++ b/src/main/java/kr/tennispark/web/activity/application/service/WebActivityApplicationQueryService.java @@ -2,6 +2,7 @@ import java.time.LocalDate; import java.util.List; + import kr.tennispark.activity.common.domain.Activity; import kr.tennispark.activity.common.domain.ActivityApplication; import kr.tennispark.activity.common.domain.enums.ActivityType; @@ -11,7 +12,9 @@ import kr.tennispark.web.activity.infrastructure.repository.WebAdminActivityRepository; import kr.tennispark.web.activity.presentation.dto.ActivityApplicationRowDTO; import kr.tennispark.web.activity.presentation.dto.GetWeeklyActivityApplicationsResponse; +import kr.tennispark.web.activity.presentation.dto.GetActivityApplicationsResponse; import lombok.RequiredArgsConstructor; + import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -23,20 +26,47 @@ public class WebActivityApplicationQueryService { private final WebAdminActivityRepository activityRepository; private final WebAdminActivityApplicationRepository applicationRepository; + /** + * 기존 기능 — 이번 주 활동 조회 + */ public GetWeeklyActivityApplicationsResponse getThisWeeksApplication(ActivityType type) { + LocalDate fromDate = WeekPeriod.thisWeek().start(); List activities = activityRepository.findFromDate(fromDate, type); List rows = activities.stream() .map(a -> { - List approved = applicationRepository.findAllByActivityAndStatus( - a, ApplicationStatus.APPROVED - ); + List approved = + applicationRepository.findAllByActivityAndStatus(a, ApplicationStatus.APPROVED); return ActivityApplicationRowDTO.of(a, approved); }) .toList(); return new GetWeeklyActivityApplicationsResponse(rows); } + + /** + * 신규 기능 — 기간 조회 + */ + public GetActivityApplicationsResponse getApplications( + ActivityType type, + LocalDate fromDate, + LocalDate toDate + ) { + System.out.println("[DEBUG] type = " + type); + System.out.println("[DEBUG] fromDate = " + fromDate); + System.out.println("[DEBUG] toDate = " + toDate); + List activities = activityRepository.findActivities(type, fromDate, toDate); + + List rows = activities.stream() + .map(a -> { + List approved = + applicationRepository.findAllByActivityAndStatus(a, ApplicationStatus.APPROVED); + return ActivityApplicationRowDTO.of(a, approved); + }) + .toList(); + + return new GetActivityApplicationsResponse(rows); + } } diff --git a/src/main/java/kr/tennispark/web/activity/infrastructure/repository/WebAdminActivityRepository.java b/src/main/java/kr/tennispark/web/activity/infrastructure/repository/WebAdminActivityRepository.java index 56dacc0..ea49bee 100644 --- a/src/main/java/kr/tennispark/web/activity/infrastructure/repository/WebAdminActivityRepository.java +++ b/src/main/java/kr/tennispark/web/activity/infrastructure/repository/WebAdminActivityRepository.java @@ -2,8 +2,10 @@ import java.time.LocalDate; import java.util.List; + import kr.tennispark.activity.common.domain.Activity; import kr.tennispark.activity.common.domain.enums.ActivityType; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -12,14 +14,37 @@ @Repository public interface WebAdminActivityRepository extends JpaRepository { + /** + * 기존 API — 특정 날짜 이후 조회 (이번 주) + */ @Query(""" SELECT a FROM Activity a WHERE a.date >= :fromDate - AND a.type = :type + AND a.type = :type AND a.status = true ORDER BY a.date ASC, a.scheduledTime.beginAt ASC, a.id ASC """) - List findFromDate(@Param("fromDate") LocalDate fromDate, ActivityType type); + List findFromDate( + @Param("fromDate") LocalDate fromDate, + @Param("type") ActivityType type + ); + /** + * 신규 기능 — 날짜 범위 조회 + */ + @Query(""" + SELECT a + FROM Activity a + WHERE (:fromDate IS NULL OR a.date >= :fromDate) + AND (:toDate IS NULL OR a.date <= :toDate) + AND a.type = :type + AND a.status = true + ORDER BY a.date ASC, a.scheduledTime.beginAt ASC, a.id ASC + """) + List findActivities( + @Param("type") ActivityType type, + @Param("fromDate") LocalDate fromDate, + @Param("toDate") LocalDate toDate + ); } diff --git a/src/main/java/kr/tennispark/web/activity/presentation/controller/WebAdminActivityQueryController.java b/src/main/java/kr/tennispark/web/activity/presentation/controller/WebAdminActivityQueryController.java index 352ef78..4d4ad8d 100644 --- a/src/main/java/kr/tennispark/web/activity/presentation/controller/WebAdminActivityQueryController.java +++ b/src/main/java/kr/tennispark/web/activity/presentation/controller/WebAdminActivityQueryController.java @@ -5,12 +5,13 @@ import kr.tennispark.common.utils.ApiUtils.ApiResult; import kr.tennispark.web.activity.application.service.WebActivityApplicationQueryService; import kr.tennispark.web.activity.presentation.dto.GetWeeklyActivityApplicationsResponse; +import kr.tennispark.web.activity.presentation.dto.GetActivityApplicationsResponse; import lombok.RequiredArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDate; @RestController @RequiredArgsConstructor @@ -19,11 +20,32 @@ public class WebAdminActivityQueryController { private final WebActivityApplicationQueryService activityApplicationQueryService; + /** + * 기존 API — 이번 주 활동 조회 + */ @GetMapping("/applications/week") - public ResponseEntity> getWeeklyApplications(@RequestParam - ActivityType type) { - GetWeeklyActivityApplicationsResponse response = activityApplicationQueryService.getThisWeeksApplication(type); + public ResponseEntity> getWeeklyApplications( + @RequestParam ActivityType type + ) { + GetWeeklyActivityApplicationsResponse response = + activityApplicationQueryService.getThisWeeksApplication(type); return ResponseEntity.ok(ApiUtils.success(response)); } + /** + * 신규 API — 기간 조회 (/applications/search) + * LocalDate 파싱 명확화(@DateTimeFormat) + */ + @GetMapping("/applications/search") + public ResponseEntity> searchApplications( + @RequestParam ActivityType type, + @RequestParam(required = false) + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate fromDate, + @RequestParam(required = false) + @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate toDate + ) { + GetActivityApplicationsResponse response = + activityApplicationQueryService.getApplications(type, fromDate, toDate); + return ResponseEntity.ok(ApiUtils.success(response)); + } } diff --git a/src/main/java/kr/tennispark/web/activity/presentation/dto/GetActivityApplicationsResponse.java b/src/main/java/kr/tennispark/web/activity/presentation/dto/GetActivityApplicationsResponse.java new file mode 100644 index 0000000..82d8ac0 --- /dev/null +++ b/src/main/java/kr/tennispark/web/activity/presentation/dto/GetActivityApplicationsResponse.java @@ -0,0 +1,8 @@ +package kr.tennispark.web.activity.presentation.dto; + +import java.util.List; + +public record GetActivityApplicationsResponse( + List rows +) { +}