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

refactor: use query param for leaderboard controls

This commit is contained in:
Ferdinand Mütsch
2022-10-03 20:38:19 +02:00
parent b3fa032bde
commit 1d7ff4bc2a
4 changed files with 43 additions and 51 deletions

View File

@@ -1,6 +1,7 @@
package routes
import (
"fmt"
"github.com/gorilla/mux"
conf "github.com/muety/wakapi/config"
"github.com/muety/wakapi/middlewares"
@@ -8,6 +9,7 @@ import (
"github.com/muety/wakapi/models/view"
"github.com/muety/wakapi/services"
"net/http"
"strings"
)
type LeaderboardHandler struct {
@@ -16,6 +18,10 @@ type LeaderboardHandler struct {
leaderboardService services.ILeaderboardService
}
var allowedAggregations = map[string]uint8{
"language": models.SummaryLanguage,
}
func NewLeaderboardHandler(userService services.IUserService, leaderboardService services.ILeaderboardService) *LeaderboardHandler {
return &LeaderboardHandler{
config: conf.Get(),
@@ -44,18 +50,27 @@ func (h *LeaderboardHandler) GetIndex(w http.ResponseWriter, r *http.Request) {
func (h *LeaderboardHandler) buildViewModel(r *http.Request) *view.LeaderboardViewModel {
user := middlewares.GetPrincipal(r)
byParam := strings.ToLower(r.URL.Query().Get("by"))
itemsGeneral, err := h.leaderboardService.GetByInterval(models.IntervalPast7Days)
if err != nil {
conf.Log().Request(r).Error("error while fetching general leaderboard items - %v", err)
return &view.LeaderboardViewModel{Error: criticalError}
}
var err error
var items []*models.LeaderboardItem
by := models.SummaryLanguage
itemsByLanguage, err := h.leaderboardService.GetAggregatedByInterval(models.IntervalPast7Days, &by)
if err != nil {
conf.Log().Request(r).Error("error while fetching general leaderboard items - %v", err)
return &view.LeaderboardViewModel{Error: criticalError}
if byParam == "" {
items, err = h.leaderboardService.GetByInterval(models.IntervalPast7Days)
if err != nil {
conf.Log().Request(r).Error("error while fetching general leaderboard items - %v", err)
return &view.LeaderboardViewModel{Error: criticalError}
}
} else {
if by, ok := allowedAggregations[byParam]; ok {
items, err = h.leaderboardService.GetAggregatedByInterval(models.IntervalPast7Days, &by)
if err != nil {
conf.Log().Request(r).Error("error while fetching general leaderboard items - %v", err)
return &view.LeaderboardViewModel{Error: criticalError}
}
} else {
return &view.LeaderboardViewModel{Error: fmt.Sprintf("unsupported aggregation '%s'", byParam)}
}
}
var apiKey string
@@ -64,11 +79,11 @@ func (h *LeaderboardHandler) buildViewModel(r *http.Request) *view.LeaderboardVi
}
return &view.LeaderboardViewModel{
User: user,
Items: itemsGeneral,
ItemsByLanguage: itemsByLanguage,
ApiKey: apiKey,
Success: r.URL.Query().Get("success"),
Error: r.URL.Query().Get("error"),
User: user,
By: byParam,
Items: items,
ApiKey: apiKey,
Success: r.URL.Query().Get("success"),
Error: r.URL.Query().Get("error"),
}
}