template-monorepo/internal/model/member/usecase/module.go

56 lines
1.6 KiB
Go
Raw Normal View History

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
}