package usecase import ( "fmt" redislib "gateway/internal/library/redis" memberconfig "gateway/internal/model/member/config" domrepo "gateway/internal/model/member/domain/repository" domusecase "gateway/internal/model/member/domain/usecase" "gateway/internal/model/member/repository" domnotif "gateway/internal/model/notification/domain/usecase" ) // Module bundles member use cases. type Module struct { OTP domusecase.OTPUseCase Verification domusecase.VerificationUseCase } // ModuleParam wires member module dependencies. type ModuleParam struct { Redis *redislib.Client Notifier domnotif.NotifierUseCase Config memberconfig.Config Profile domrepo.ProfileRepository // optional; defaults to memory } // NewModuleFromParam builds member use cases. func NewModuleFromParam(param ModuleParam) (*Module, error) { if param.Redis == nil || param.Redis.Zero() == nil { return nil, fmt.Errorf("member: redis is required") } if param.Notifier == nil { return nil, fmt.Errorf("member: notifier is required") } otpStore := repository.NewRedisOTPChallengeStore(param.Redis) rateStore := repository.NewRedisVerifyRateStore(param.Redis) profile := param.Profile if profile == nil { profile = repository.NewMemoryProfileRepository() } cfg := param.Config.Defaults() otpUC := MustOTPUseCase(OTPUseCaseParam{Store: otpStore, Config: cfg}) verificationUC := MustVerificationUseCase(VerificationUseCaseParam{ OTP: otpUC, Notifier: param.Notifier, Profile: profile, Rates: rateStore, Config: cfg, }) return &Module{OTP: otpUC, Verification: verificationUC}, nil }