package user import ( "fmt" "net/http" "github.com/golang-jwt/jwt/v5" "github.com/gorilla/mux" "sismedika.com/sas/westone/services/auth" "sismedika.com/sas/westone/types" "sismedika.com/sas/westone/utils" ) type Handler struct { store types.UserStore errorStore types.ErrorLogStore } func NewHandler(store types.UserStore, errorStore types.ErrorLogStore) *Handler { return &Handler{ store: store, errorStore: errorStore, } } func (h *Handler) RegisterRoutes(router *mux.Router) { router.HandleFunc("/login", h.handleLogin).Methods("POST") router.HandleFunc("/register", h.handleRegister).Methods("POST") // admin routes // router.HandleFunc("/users/{userID}", auth.WithJWTAuth(h.handleGetUser)).Methods(http.MethodGet) } func (h *Handler) handleLogin(w http.ResponseWriter, r *http.Request) { // var payload types.SignInPayload // if err := utils.ParseJSON(r, &payload); err != nil { // utils.WriteError(w, http.StatusBadRequest, err) // return // } // if err := utils.Validate.Struct(payload); err != nil { // errors := err.(validator.ValidationErrors) // utils.WriteError(w, http.StatusBadRequest, fmt.Errorf("invalid payload: %v", errors)) // return // } // hashedPassword := auth.HashWithMD5(payload.Password) // response, err := h.store.SignIn(payload.Email, hashedPassword) // if err != nil { // var logError *utils.LogError // if errors.As(err, &logError) { // h.errorStore.CreateErrorLog(*logError) // utils.WriteErrorLog(w, http.StatusBadRequest, *logError) // } // return // } // // remoteAddr := r.RemoteAddr // // userAgent := r.UserAgent() // // response.IP = remoteAddr // // response.Agent = userAgent // secret := []byte(configs.Envs.JWTSecret) // token, err := auth.CreateJWT(secret, *response) // if err != nil { // utils.WriteError(w, http.StatusInternalServerError, err) // return // } // utils.WriteJSONLogin(w, http.StatusOK, response, token, "westone") } func (h *Handler) handleRegister(w http.ResponseWriter, r *http.Request) { // var user types.RegisterUserPayload // if err := utils.ParseJSON(r, &user); err != nil { // utils.WriteError(w, http.StatusBadRequest, err) // return // } // if err := utils.Validate.Struct(user); err != nil { // errors := err.(validator.ValidationErrors) // utils.WriteError(w, http.StatusBadRequest, fmt.Errorf("invalid payload: %v", errors)) // return // } // // check if user exists // _, err := h.store.GetUserByEmail(user.Email) // if err == nil { // utils.WriteError(w, http.StatusBadRequest, fmt.Errorf("user with email %s already exists", user.Email)) // return // } // // hash password // hashedPassword, err := auth.HashPassword(user.Password) // if err != nil { // utils.WriteError(w, http.StatusInternalServerError, err) // return // } // err = h.store.CreateUser(types.User{ // FirstName: user.FirstName, // LastName: user.LastName, // Email: user.Email, // Password: hashedPassword, // }) // if err != nil { // utils.WriteError(w, http.StatusInternalServerError, err) // return // } // utils.WriteJSON(w, http.StatusCreated, nil) } func (h *Handler) handleGetUser(w http.ResponseWriter, r *http.Request) { claims, ok := r.Context().Value(auth.UserContextKey).(jwt.MapClaims) if !ok { utils.WriteError(w, http.StatusInternalServerError, fmt.Errorf("token not found in context")) return } email := claims["M_UserEmail"] utils.WriteJSON(w, http.StatusOK, email) }