package auth import ( "RenewCMS/api/pkg/apperr" validator "RenewCMS/api/pkg/validator" "RenewCMS/internal/domain/user" "RenewCMS/internal/infrastructure/useCases" "encoding/json" "errors" "net/http" ) type PasswordResetHandler struct { RequestPasswordResetUseCase *useCases.RequestPasswordResetUseCase ResetPasswordUseCase *useCases.ResetPasswordUseCase } type RequestPasswordResetCredentials struct { Email string `json:"email" validate:"required,email"` } type ResetPasswordCredentials struct { Email string `json:"email" validate:"required,email"` Code string `json:"code" validate:"required"` Password string `json:"password" validate:"required,min=8"` } func NewPasswordResetHandler(requestPasswordReset *useCases.RequestPasswordResetUseCase, resetPassword *useCases.ResetPasswordUseCase) *PasswordResetHandler { return &PasswordResetHandler{ RequestPasswordResetUseCase: requestPasswordReset, ResetPasswordUseCase: resetPassword, } } func (h *PasswordResetHandler) RequestPasswordReset(w http.ResponseWriter, r *http.Request) { var credentials RequestPasswordResetCredentials err := json.NewDecoder(r.Body).Decode(&credentials) if err != nil { http.Error(w, apperr.BodyErrorMessage, http.StatusBadRequest) return } err = validator.Validate.Struct(credentials) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } _ = h.RequestPasswordResetUseCase.RequestPasswordReset(r.Context(), credentials.Email) message, _ := json.Marshal(map[string]any{"message": apperr.PasswordResetRequestedMessage}) _, _ = w.Write(message) } func (h *PasswordResetHandler) ResetPassword(w http.ResponseWriter, r *http.Request) { var credentials ResetPasswordCredentials err := json.NewDecoder(r.Body).Decode(&credentials) if err != nil { http.Error(w, apperr.BodyErrorMessage, http.StatusBadRequest) return } err = validator.Validate.Struct(credentials) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } err = h.ResetPasswordUseCase.ResetPassword(r.Context(), credentials.Email, credentials.Code, credentials.Password) if err != nil { if errors.Is(err, user.ErrInvalidPasswordResetCode) || errors.Is(err, user.ErrPasswordResetCodeExpired) { http.Error(w, apperr.PasswordResetFailedErrorMessage, http.StatusForbidden) return } http.Error(w, "Internal server error", http.StatusInternalServerError) return } message, _ := json.Marshal(map[string]any{"message": "Your password has been reset. You can now log in."}) _, _ = w.Write(message) }