-
Notifications
You must be signed in to change notification settings - Fork 36
Expand file tree
/
Copy pathRankingServiceImpl.java
More file actions
65 lines (53 loc) · 2.1 KB
/
RankingServiceImpl.java
File metadata and controls
65 lines (53 loc) · 2.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.loopers.infrastructure.rank;
import com.loopers.application.rank.RankingInfo;
import com.loopers.domain.rank.monthly.MonthlyRankingMVRepository;
import com.loopers.domain.rank.weekly.WeeklyRankingMVRepository;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Set;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
@RequiredArgsConstructor
@Component
public class RankingServiceImpl implements RankingService {
private final RedisTemplate<String, String> redisTemplate;
private final WeeklyRankingMVRepository weeklyRepository;
private final MonthlyRankingMVRepository monthlyRepository;
@Override
public List<Long> getTopRankingIds(String date, int page, int size) {
String key = "ranking:all:" + date;
int start = (page - 1) * size;
int end = start + size - 1;
Set<String> rankedIds = redisTemplate.opsForZSet().reverseRange(key, start, end);
if (rankedIds == null || rankedIds.isEmpty()) {
return List.of();
}
return rankedIds.stream()
.map(Long::valueOf)
.toList();
}
@Override
public List<RankingInfo> getWeeklyRankings(String date, int page, int size) {
return weeklyRepository.findByBaseDateOrderByCurrentRankAsc(date, PageRequest.of(page - 1, size))
.stream()
.map(RankingInfo::from)
.toList();
}
@Override
public List<RankingInfo> getMonthlyRankings(String date, int page, int size) {
return monthlyRepository.findByBaseDateOrderByCurrentRankAsc(date, PageRequest.of(page - 1, size))
.stream()
.map(RankingInfo::from)
.toList();
}
@Override
public Integer getProductRank(Long productId) {
String today = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
String key = "ranking:all:" + today;
Long rank = redisTemplate.opsForZSet().reverseRank(key, String.valueOf(productId));
return (rank != null) ? rank.intValue() + 1 : null;
}
}