82 lines
2.5 KiB
Go
82 lines
2.5 KiB
Go
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(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(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)
|
|
}
|