70 lines
2.0 KiB
Go
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,
|
|
})
|
|
}
|