Skip to content

Commit d2c7ce7

Browse files
committed
feat: 랭킹 조회 API에 기간별 지원 추가
1 parent 4849e9e commit d2c7ce7

3 files changed

Lines changed: 41 additions & 9 deletions

File tree

apps/commerce-api/src/main/java/com/loopers/interfaces/api/ranking/RankingV1ApiSpec.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
@Tag(name = "Ranking API", description = "상품 랭킹 API")
1414
public interface RankingV1ApiSpec {
1515

16-
@Operation(summary = "랭킹 페이지 조회", description = "일간 상품 랭킹을 페이지로 조회합니다.")
16+
@Operation(summary = "랭킹 페이지 조회", description = "일간/주간/월간 상품 랭킹을 페이지로 조회합니다.")
1717
@ApiResponses(value = {
1818
@io.swagger.v3.oas.annotations.responses.ApiResponse(
1919
responseCode = "200",
@@ -26,14 +26,17 @@ ApiResponse<RankingV1Dto.RankingPageResponse> getRankings(
2626
@Parameter(description = "날짜 (yyyyMMdd 형식, 기본값: 오늘)")
2727
@RequestParam(required = false) String date,
2828

29+
@Parameter(description = "기간 (daily, weekly, monthly)")
30+
@RequestParam(defaultValue = "daily") String period,
31+
2932
@Parameter(description = "페이지 번호 (0부터 시작)")
3033
@RequestParam(defaultValue = "0") int page,
3134

3235
@Parameter(description = "페이지 크기")
3336
@RequestParam(defaultValue = "20") int size
3437
);
3538

36-
@Operation(summary = "Top-N 랭킹 조회", description = "오늘의 Top-N 상품을 조회합니다.")
39+
@Operation(summary = "Top-N 랭킹 조회", description = "일간/주간/월간 Top-N 상품을 조회합니다.")
3740
@ApiResponses(value = {
3841
@io.swagger.v3.oas.annotations.responses.ApiResponse(
3942
responseCode = "200",
@@ -46,6 +49,9 @@ ApiResponse<RankingV1Dto.TopNResponse> getTopN(
4649
@Parameter(description = "날짜 (yyyyMMdd 형식, 기본값: 오늘)")
4750
@RequestParam(required = false) String date,
4851

52+
@Parameter(description = "기간 (daily, weekly, monthly)")
53+
@RequestParam(defaultValue = "daily") String period,
54+
4955
@Parameter(description = "조회할 상위 N개")
5056
@RequestParam(defaultValue = "10") int n
5157
);

apps/commerce-api/src/main/java/com/loopers/interfaces/api/ranking/RankingV1Controller.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.loopers.application.ranking.RankingFacade;
55
import com.loopers.application.ranking.RankingPageInfo;
66
import com.loopers.domain.ranking.RankingInfo;
7+
import com.loopers.domain.ranking.RankingPeriod;
78
import com.loopers.interfaces.api.ApiResponse;
89
import lombok.RequiredArgsConstructor;
910
import org.springframework.web.bind.annotation.RequestMapping;
@@ -23,17 +24,18 @@ public class RankingV1Controller implements RankingV1ApiSpec {
2324
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
2425

2526
@Override
26-
public ApiResponse<RankingV1Dto.RankingPageResponse> getRankings(String date, int page, int size) {
27-
RankingCommand command = RankingCommand.of(date, page, size);
27+
public ApiResponse<RankingV1Dto.RankingPageResponse> getRankings(String date, String period, int page, int size) {
28+
RankingCommand command = RankingCommand.of(date, period, page, size);
2829
RankingPageInfo pageInfo = rankingFacade.getRankingPage(command);
2930
return ApiResponse.success(RankingV1Dto.RankingPageResponse.from(pageInfo));
3031
}
3132

3233
@Override
33-
public ApiResponse<RankingV1Dto.TopNResponse> getTopN(String date, int n) {
34+
public ApiResponse<RankingV1Dto.TopNResponse> getTopN(String date, String period, int n) {
3435
LocalDate targetDate = parseDate(date);
35-
List<RankingInfo> rankings = rankingFacade.getTopN(targetDate, n);
36-
return ApiResponse.success(RankingV1Dto.TopNResponse.of(rankings, targetDate));
36+
RankingPeriod rankingPeriod = parsePeriod(period);
37+
List<RankingInfo> rankings = rankingFacade.getTopN(targetDate, rankingPeriod, n);
38+
return ApiResponse.success(RankingV1Dto.TopNResponse.of(rankings, targetDate, rankingPeriod));
3739
}
3840

3941
private LocalDate parseDate(String date) {
@@ -42,4 +44,15 @@ private LocalDate parseDate(String date) {
4244
}
4345
return LocalDate.parse(date, DATE_FORMATTER);
4446
}
47+
48+
private RankingPeriod parsePeriod(String period) {
49+
if (period == null || period.isBlank()) {
50+
return RankingPeriod.DAILY;
51+
}
52+
try {
53+
return RankingPeriod.valueOf(period.toUpperCase());
54+
} catch (IllegalArgumentException e) {
55+
return RankingPeriod.DAILY;
56+
}
57+
}
4558
}

apps/commerce-api/src/main/java/com/loopers/interfaces/api/ranking/RankingV1Dto.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.loopers.application.ranking.RankingPageInfo;
44
import com.loopers.domain.ranking.RankingInfo;
5+
import com.loopers.domain.ranking.RankingPeriod;
56

67
import java.time.LocalDate;
78
import java.time.format.DateTimeFormatter;
@@ -14,6 +15,7 @@ public class RankingV1Dto {
1415
public record RankingPageResponse(
1516
List<RankingItemResponse> rankings,
1617
String date,
18+
String period,
1719
int page,
1820
int size,
1921
Long totalCount,
@@ -27,6 +29,7 @@ public static RankingPageResponse from(RankingPageInfo info) {
2729
return new RankingPageResponse(
2830
items,
2931
info.date().format(DATE_FORMATTER),
32+
info.period().name().toLowerCase(),
3033
info.page(),
3134
info.size(),
3235
info.totalCount(),
@@ -58,14 +61,24 @@ public static RankingItemResponse from(RankingInfo info) {
5861
public record TopNResponse(
5962
List<RankingItemResponse> rankings,
6063
String date,
64+
String period,
6165
int size
6266
) {
63-
public static TopNResponse of(List<RankingInfo> rankings, LocalDate date) {
67+
public static TopNResponse of(List<RankingInfo> rankings, LocalDate date, RankingPeriod period) {
6468
List<RankingItemResponse> items = rankings.stream()
6569
.map(RankingItemResponse::from)
6670
.toList();
6771

68-
return new TopNResponse(items, date.format(DATE_FORMATTER), items.size());
72+
return new TopNResponse(
73+
items,
74+
date.format(DATE_FORMATTER),
75+
period.name().toLowerCase(),
76+
items.size()
77+
);
78+
}
79+
80+
public static TopNResponse of(List<RankingInfo> rankings, LocalDate date) {
81+
return of(rankings, date, RankingPeriod.DAILY);
6982
}
7083
}
7184
}

0 commit comments

Comments
 (0)