feat: added API gateway
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
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,
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user