monorepo/cloud/maplepress-backend/internal/usecase/gateway/validate_registration_input.go

92 lines
2.7 KiB
Go

package gateway
import (
"go.uber.org/zap"
domaintenant "codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/internal/domain/tenant"
domainuser "codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/internal/domain/user"
"codeberg.org/mapleopentech/monorepo/cloud/maplepress-backend/pkg/logger"
)
// RegisterInput represents the input for user registration validation
type RegisterInput struct {
Email string
Password string
FirstName string
LastName string
TenantName string
TenantSlug string
Timezone string
// Consent fields
AgreeTermsOfService bool
AgreePromotions bool
AgreeToTrackingAcrossThirdPartyAppsAndServices bool
// Optional: IP address for audit trail
CreatedFromIPAddress string
}
// ValidateRegistrationInputUseCase validates registration input
type ValidateRegistrationInputUseCase struct {
logger *zap.Logger
}
// ProvideValidateRegistrationInputUseCase creates a new ValidateRegistrationInputUseCase
func ProvideValidateRegistrationInputUseCase(logger *zap.Logger) *ValidateRegistrationInputUseCase {
return &ValidateRegistrationInputUseCase{
logger: logger.Named("validate-registration-input-usecase"),
}
}
// Execute validates the registration input fields
func (uc *ValidateRegistrationInputUseCase) Execute(input *RegisterInput) error {
if input.Email == "" {
uc.logger.Warn("email is required")
return domainuser.ErrEmailRequired
}
if input.Password == "" {
uc.logger.Warn("password is required")
return domainuser.ErrPasswordRequired
}
if input.FirstName == "" {
uc.logger.Warn("first name is required")
return domainuser.ErrFirstNameRequired
}
if input.LastName == "" {
uc.logger.Warn("last name is required")
return domainuser.ErrLastNameRequired
}
if input.TenantName == "" {
uc.logger.Warn("tenant name is required")
return domaintenant.ErrNameRequired
}
if input.TenantSlug == "" {
uc.logger.Warn("tenant slug is required")
return domaintenant.ErrSlugRequired
}
// Validate Terms of Service agreement (REQUIRED)
if !input.AgreeTermsOfService {
uc.logger.Warn("terms of service agreement is required")
return domainuser.ErrTermsOfServiceRequired
}
// Note: AgreePromotions and AgreeToTrackingAcrossThirdPartyAppsAndServices
// are optional (defaults to false if not provided)
// CWE-532: Use hashed/redacted fields to prevent PII in logs
uc.logger.Debug("registration input validated successfully",
logger.EmailHash(input.Email),
logger.TenantSlugHash(input.TenantSlug),
zap.Bool("agree_terms", input.AgreeTermsOfService),
zap.Bool("agree_promotions", input.AgreePromotions),
zap.Bool("agree_tracking", input.AgreeToTrackingAcrossThirdPartyAppsAndServices))
return nil
}