wakapi/routes/leaderboard.go

75 lines
2.2 KiB
Go

package routes
import (
"github.com/gorilla/mux"
conf "github.com/muety/wakapi/config"
"github.com/muety/wakapi/middlewares"
"github.com/muety/wakapi/models"
"github.com/muety/wakapi/models/view"
"github.com/muety/wakapi/services"
"net/http"
)
type LeaderboardHandler struct {
config *conf.Config
userService services.IUserService
leaderboardService services.ILeaderboardService
}
func NewLeaderboardHandler(userService services.IUserService, leaderboardService services.ILeaderboardService) *LeaderboardHandler {
return &LeaderboardHandler{
config: conf.Get(),
userService: userService,
leaderboardService: leaderboardService,
}
}
func (h *LeaderboardHandler) RegisterRoutes(router *mux.Router) {
r := router.PathPrefix("/leaderboard").Subrouter()
r.Use(
middlewares.NewAuthenticateMiddleware(h.userService).
WithRedirectTarget(defaultErrorRedirectTarget()).
WithOptionalFor([]string{"/"}).
Handler,
)
r.Methods(http.MethodGet).HandlerFunc(h.GetIndex)
}
func (h *LeaderboardHandler) GetIndex(w http.ResponseWriter, r *http.Request) {
if h.config.IsDev() {
loadTemplates()
}
templates[conf.LeaderboardTemplate].Execute(w, h.buildViewModel(r))
}
func (h *LeaderboardHandler) buildViewModel(r *http.Request) *view.LeaderboardViewModel {
user := middlewares.GetPrincipal(r)
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}
}
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}
}
var apiKey string
if user != nil {
apiKey = user.ApiKey
}
return &view.LeaderboardViewModel{
User: user,
Items: itemsGeneral,
ItemsByLanguage: itemsByLanguage,
ApiKey: apiKey,
Success: r.URL.Query().Get("success"),
Error: r.URL.Query().Get("error"),
}
}