92 lines
2.7 KiB
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
|
|
}
|