Files
Datarush/internal/gw/handler/achievements_handler.go
T
2025-12-17 11:00:50 +03:00

70 lines
2.0 KiB
Go

package handler
import (
"net/http"
"datarush/internal/gw/domain"
"datarush/internal/gw/grpc_client"
"datarush/internal/gw/utils"
)
type AchievementsHandler struct {
achievementsClient *grpc_client.AchievementsClient
}
func NewAchievementsHandler(achievementsClient *grpc_client.AchievementsClient) *AchievementsHandler {
return &AchievementsHandler{achievementsClient: achievementsClient}
}
func (h *AchievementsHandler) ListAchievements(w http.ResponseWriter, r *http.Request) {
achievements, err := h.achievementsClient.ListAchievements(r.Context())
if err != nil {
utils.RespondError(w, domain.NewInternalServerError("failed to list achievements"))
return
}
response := make([]domain.AchievementResponse, len(achievements))
for i, ach := range achievements {
response[i] = *utils.AchievementProtoToHTTP(ach)
}
utils.RespondJSON(w, http.StatusOK, &domain.ListAchievementsResponse{
Achievements: response,
})
}
func (h *AchievementsHandler) GetAchievement(w http.ResponseWriter, r *http.Request) {
achievementID := getPathParam(r, "achievement_id")
achievement, err := h.achievementsClient.GetAchievement(r.Context(), achievementID)
if err != nil {
utils.RespondError(w, domain.NewNotFoundError("achievement not found"))
return
}
utils.RespondJSON(w, http.StatusOK, utils.AchievementProtoToHTTP(achievement))
}
func (h *AchievementsHandler) GetUserAchievements(w http.ResponseWriter, r *http.Request) {
userID := getPathParam(r, "user_id")
achievements, err := h.achievementsClient.GetUserAchievements(r.Context(), userID)
if err != nil {
utils.RespondError(w, domain.NewInternalServerError("failed to get user achievements"))
return
}
response := make([]domain.UserAchievementResponse, len(achievements))
for i, ach := range achievements {
response[i] = domain.UserAchievementResponse{
AchievementID: ach.Achievement.Id,
UserID: userID,
EarnedAt: ach.ReceivedAt.AsTime(),
}
}
utils.RespondJSON(w, http.StatusOK, &domain.ListUserAchievementsResponse{
Achievements: response,
})
}