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