1
0
mirror of https://github.com/muety/wakapi.git synced 2023-08-10 21:12:56 +03:00

chore: caching for leaderboard

This commit is contained in:
Ferdinand Mütsch 2022-10-02 10:31:01 +02:00
parent 4a22a19cb0
commit dba4da8641

View File

@ -9,6 +9,8 @@ import (
"github.com/muety/wakapi/repositories" "github.com/muety/wakapi/repositories"
"github.com/muety/wakapi/utils" "github.com/muety/wakapi/utils"
"github.com/patrickmn/go-cache" "github.com/patrickmn/go-cache"
"reflect"
"strings"
"time" "time"
) )
@ -24,7 +26,7 @@ type LeaderboardService struct {
func NewLeaderboardService(leaderboardRepo repositories.ILeaderboardRepository, summaryService ISummaryService, userService IUserService) *LeaderboardService { func NewLeaderboardService(leaderboardRepo repositories.ILeaderboardRepository, summaryService ISummaryService, userService IUserService) *LeaderboardService {
srv := &LeaderboardService{ srv := &LeaderboardService{
config: config.Get(), config: config.Get(),
cache: cache.New(24*time.Hour, 24*time.Hour), cache: cache.New(6*time.Hour, 6*time.Hour),
eventBus: config.EventBus(), eventBus: config.EventBus(),
repository: leaderboardRepo, repository: leaderboardRepo,
summaryService: summaryService, summaryService: summaryService,
@ -108,8 +110,8 @@ func (srv *LeaderboardService) Run(users []*models.User, interval *models.Interv
} }
} }
srv.cache.Flush()
logbuch.Info("finished leaderboard generation") logbuch.Info("finished leaderboard generation")
return nil return nil
} }
@ -123,7 +125,19 @@ func (srv *LeaderboardService) GetByInterval(interval *models.IntervalKey) ([]*m
} }
func (srv *LeaderboardService) GetAggregatedByInterval(interval *models.IntervalKey, by *uint8) ([]*models.LeaderboardItem, error) { func (srv *LeaderboardService) GetAggregatedByInterval(interval *models.IntervalKey, by *uint8) ([]*models.LeaderboardItem, error) {
return srv.repository.GetAllAggregatedByInterval(interval, by) // check cache
cacheKey := srv.getHash(interval, by)
if cacheResult, ok := srv.cache.Get(cacheKey); ok {
return cacheResult.([]*models.LeaderboardItem), nil
}
items, err := srv.repository.GetAllAggregatedByInterval(interval, by)
if err != nil {
return nil, err
}
srv.cache.SetDefault(cacheKey, items)
return items, nil
} }
func (srv *LeaderboardService) GenerateByUser(user *models.User, interval *models.IntervalKey) (*models.LeaderboardItem, error) { func (srv *LeaderboardService) GenerateByUser(user *models.User, interval *models.IntervalKey) (*models.LeaderboardItem, error) {
@ -173,3 +187,11 @@ func (srv *LeaderboardService) GenerateAggregatedByUser(user *models.User, inter
return items, nil return items, nil
} }
func (srv *LeaderboardService) getHash(interval *models.IntervalKey, by *uint8) string {
k := strings.Join(*interval, "__")
if by != nil && !reflect.ValueOf(by).IsNil() {
k += "__" + models.GetEntityColumn(*by)
}
return k
}