2024-07-23 01:36:25 +07:00

79 lines
2.0 KiB
Go

package request
import (
"errors"
"fmt"
"github.com/go-playground/validator/v10"
)
type LoginRequest struct {
Email string `json:"email"`
Password string `json:"password"`
}
type ResetPasswordRequest struct {
Email string `json:"email" validate:"required,email"`
}
type ResetPasswordChangeRequest struct {
OldPassword string `json:"old_password" validate:"required"`
NewPassword string `json:"new_password" validate:"required,strongpwd"`
}
func (e *ResetPasswordChangeRequest) Validate() error {
validate := validator.New()
validate.RegisterValidation("strongpwd", validateStrongPassword)
if err := validate.Struct(e); err != nil {
// Handle the validation errors
for _, err := range err.(validator.ValidationErrors) {
switch err.Field() {
case "NewPassword":
return fmt.Errorf("%w", validatePasswordError(err.Tag()))
default:
return fmt.Errorf("validation failed: %w", err)
}
}
}
return nil
}
func validateStrongPassword(fl validator.FieldLevel) bool {
password := fl.Field().String()
var (
hasMinLen = len(password) >= 8
)
return hasMinLen
}
// Error messages for password validation
var (
ErrPasswordTooShort = errors.New("password must be at least 8 characters long")
ErrPasswordNoUpper = errors.New("password must contain at least one uppercase letter")
ErrPasswordNoLower = errors.New("password must contain at least one lowercase letter")
ErrPasswordNoNumber = errors.New("password must contain at least one digit")
ErrPasswordNoSpecial = errors.New("password must contain at least one special character (!@#$%^&*)")
ErrPasswordValidation = errors.New("password does not meet the strength requirements")
)
func validatePasswordError(tag string) error {
switch tag {
case "min":
return ErrPasswordTooShort
case "uppercase":
return ErrPasswordNoUpper
case "lowercase":
return ErrPasswordNoLower
case "number":
return ErrPasswordNoNumber
case "special":
return ErrPasswordNoSpecial
default:
return ErrPasswordValidation
}
}