package handlers import ( "net/http" "github.com/calendarapi/internal/middleware" "github.com/calendarapi/internal/models" "github.com/calendarapi/internal/service" "github.com/calendarapi/internal/utils" ) type AuthHandler struct { authSvc *service.AuthService userSvc *service.UserService } func NewAuthHandler(authSvc *service.AuthService, userSvc *service.UserService) *AuthHandler { return &AuthHandler{authSvc: authSvc, userSvc: userSvc} } func (h *AuthHandler) Register(w http.ResponseWriter, r *http.Request) { var req struct { Email string `json:"email"` Password string `json:"password"` Timezone string `json:"timezone"` } if err := utils.DecodeJSON(r, &req); err != nil { utils.WriteError(w, err) return } result, err := h.authSvc.Register(r.Context(), req.Email, req.Password, req.Timezone) if err != nil { utils.WriteError(w, err) return } utils.WriteJSON(w, http.StatusOK, result) } func (h *AuthHandler) Login(w http.ResponseWriter, r *http.Request) { var req struct { Email string `json:"email"` Password string `json:"password"` } if err := utils.DecodeJSON(r, &req); err != nil { utils.WriteError(w, err) return } result, err := h.authSvc.Login(r.Context(), req.Email, req.Password) if err != nil { utils.WriteError(w, err) return } utils.WriteJSON(w, http.StatusOK, result) } func (h *AuthHandler) Refresh(w http.ResponseWriter, r *http.Request) { var req struct { RefreshToken string `json:"refresh_token"` } if err := utils.DecodeJSON(r, &req); err != nil { utils.WriteError(w, err) return } result, err := h.authSvc.Refresh(r.Context(), req.RefreshToken) if err != nil { utils.WriteError(w, err) return } utils.WriteJSON(w, http.StatusOK, result) } func (h *AuthHandler) Logout(w http.ResponseWriter, r *http.Request) { var req struct { RefreshToken string `json:"refresh_token"` } if err := utils.DecodeJSON(r, &req); err != nil { utils.WriteError(w, err) return } if err := h.authSvc.Logout(r.Context(), req.RefreshToken); err != nil { utils.WriteError(w, err) return } utils.WriteOK(w) } func (h *AuthHandler) Me(w http.ResponseWriter, r *http.Request) { userID, ok := middleware.GetUserID(r.Context()) if !ok { utils.WriteError(w, models.ErrAuthRequired) return } user, err := h.userSvc.GetMe(r.Context(), userID) if err != nil { utils.WriteError(w, err) return } utils.WriteJSON(w, http.StatusOK, map[string]interface{}{"user": user}) }