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, }) }