package handler import ( "net/http" "datarush/internal/gw/domain" "datarush/internal/gw/grpc_client" "datarush/internal/gw/utils" ) type AuthHandler struct { authClient *grpc_client.AuthClient userClient *grpc_client.UserClient } func NewAuthHandler(authClient *grpc_client.AuthClient, userClient *grpc_client.UserClient) *AuthHandler { return &AuthHandler{ authClient: authClient, userClient: userClient, } } func (h *AuthHandler) SignUp(w http.ResponseWriter, r *http.Request) { var req domain.SignUpRequest if err := utils.DecodeJSON(r, &req); err != nil { utils.RespondError(w, err) return } token, err := h.authClient.SignUp(r.Context(), req.Email, req.Username, req.Password) if err != nil { utils.RespondError(w, domain.NewInternalServerError("sign up failed")) return } utils.RespondJSON(w, http.StatusCreated, &domain.TokenResponse{Token: token}) } func (h *AuthHandler) SignIn(w http.ResponseWriter, r *http.Request) { var req domain.SignInRequest if err := utils.DecodeJSON(r, &req); err != nil { utils.RespondError(w, err) return } token, err := h.authClient.SignIn(r.Context(), req.Email, req.Password) if err != nil { utils.RespondError(w, domain.NewUnauthorizedError("invalid credentials")) return } utils.RespondJSON(w, http.StatusOK, &domain.TokenResponse{Token: token}) } func (h *AuthHandler) GetMe(w http.ResponseWriter, r *http.Request) { userID, err := getUserIDFromContext(r.Context()) if err != nil { utils.RespondError(w, domain.NewUnauthorizedError("unauthorized")) return } user, err := h.userClient.GetProfile(r.Context(), userID) if err != nil { utils.RespondError(w, domain.NewInternalServerError("failed to get user profile")) return } utils.RespondJSON(w, http.StatusOK, utils.UserProtoToHTTP(user)) }