7768037724
- Add comprehensive validation package with email (RFC 5322), password strength, and IANA timezone validation - Implement strict password requirements: min 8 chars, uppercase, lowercase, digit, special character - Integrate validation into RegisterUserHandler with complete test coverage (59 validation tests + 25 handler tests) - Fix pre-existing test failures: - Remove tests for non-existent HabitEntry.DeletedAt and Delete() methods - Replace deprecated HabitTypeQuantity with HabitTypeValue - Add missing FindByHabitIDAndDateRange mock implementation - Remove hardcoded localhost:8080 from Swagger config for self-hosted flexibility
54 lines
1.3 KiB
Go
54 lines
1.3 KiB
Go
package commands
|
|
|
|
import (
|
|
"context"
|
|
|
|
"apocapoc-api/internal/domain/entities"
|
|
"apocapoc-api/internal/domain/repositories"
|
|
"apocapoc-api/internal/domain/services"
|
|
"apocapoc-api/internal/shared/errors"
|
|
"apocapoc-api/internal/shared/validation"
|
|
)
|
|
|
|
type RegisterUserCommand struct {
|
|
Email string
|
|
Password string
|
|
Timezone string
|
|
}
|
|
|
|
type RegisterUserHandler struct {
|
|
userRepo repositories.UserRepository
|
|
passwordHasher services.PasswordHasher
|
|
}
|
|
|
|
func NewRegisterUserHandler(userRepo repositories.UserRepository, passwordHasher services.PasswordHasher) *RegisterUserHandler {
|
|
return &RegisterUserHandler{
|
|
userRepo: userRepo,
|
|
passwordHasher: passwordHasher,
|
|
}
|
|
}
|
|
|
|
func (h *RegisterUserHandler) Handle(ctx context.Context, cmd RegisterUserCommand) (string, error) {
|
|
if err := validation.ValidateRegistration(cmd.Email, cmd.Password, cmd.Timezone); err != nil {
|
|
return "", errors.ErrInvalidInput
|
|
}
|
|
|
|
existing, _ := h.userRepo.FindByEmail(ctx, cmd.Email)
|
|
if existing != nil {
|
|
return "", errors.ErrAlreadyExists
|
|
}
|
|
|
|
hashedPassword, err := h.passwordHasher.Hash(cmd.Password)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
user := entities.NewUser(cmd.Email, hashedPassword, cmd.Timezone)
|
|
|
|
if err := h.userRepo.Create(ctx, user); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return user.ID, nil
|
|
}
|