template-monorepo/internal/svc/service_context.go

143 lines
4.0 KiB
Go

// Code scaffolded by goctl. Safe to edit.
// goctl 1.10.1
package svc
import (
"context"
"gateway/internal/config"
libmongo "gateway/internal/library/mongo"
redislib "gateway/internal/library/redis"
"gateway/internal/library/validate"
"gateway/internal/library/zitadel"
authdomrepo "gateway/internal/model/auth/domain/repository"
domauth "gateway/internal/model/auth/domain/usecase"
authrepo "gateway/internal/model/auth/repository"
authusecase "gateway/internal/model/auth/usecase"
domrepo "gateway/internal/model/member/domain/repository"
dommember "gateway/internal/model/member/domain/usecase"
memberusecase "gateway/internal/model/member/usecase"
domnotif "gateway/internal/model/notification/domain/usecase"
notifusecase "gateway/internal/model/notification/usecase"
"gateway/internal/worker/notification_retry"
)
type ServiceContext struct {
Config config.Config
Validator validate.Validate
Redis *redislib.Client
AuthToken domauth.TokenUseCase
AuthInvite domauth.InviteUseCase
AuthRegistrationMeta domauth.RegistrationMetaUseCase
AuthRegistrationSession domauth.RegistrationSessionUseCase
AuthLoginSession domauth.LoginSessionUseCase
Zitadel *zitadel.Client
Notifier domnotif.NotifierUseCase
NotificationAdmin domnotif.AdminNotifierUseCase
NotificationRetry *notification_retry.Runner
MemberOTP dommember.OTPUseCase
MemberTOTP dommember.TOTPUseCase
MemberProfile dommember.ProfileUseCase
MemberLifecycle dommember.LifecycleUseCase
MemberProvisioning dommember.ProvisioningUseCase
MemberTenant dommember.TenantUseCase
MemberVerifyRate dommember.VerifyRateUseCase
MemberRepo domrepo.MemberRepository
}
func NewServiceContext(c config.Config) *ServiceContext {
v, err := validate.NewWithDefaultEN()
if err != nil {
panic(err)
}
rds, err := redislib.NewClient(c.Redis)
if err != nil {
panic(err)
}
sc := &ServiceContext{
Config: c,
Validator: v,
Redis: rds,
}
authCfg := c.Auth.Defaults()
if authCfg.Enabled() {
var revoke authdomrepo.TokenRevokeStore
if rds != nil && rds.Zero() != nil {
revoke = authrepo.NewRedisTokenRevokeStore(rds)
}
sc.AuthToken = authusecase.MustTokenUseCase(authusecase.TokenUseCaseParam{
Config: authCfg,
Revoke: revoke,
})
}
zClient, err := zitadel.NewClient(c.Zitadel)
if err != nil {
panic(err)
}
sc.Zitadel = zClient
if c.Mongo.Host != "" {
mod, err := notifusecase.NewModuleFromParam(notifusecase.FactoryParam{
MongoConf: &c.Mongo,
Redis: rds,
Config: c.Notification,
})
if err != nil {
panic(err)
}
sc.Notifier = mod.Notifier
sc.NotificationAdmin = mod.Admin
sc.NotificationRetry = notification_retry.NewRunner(mod.RetryWorker)
authMod, err := authusecase.NewModuleFromParam(authusecase.ModuleParam{
MongoConf: &c.Mongo,
Redis: rds,
})
if err != nil {
panic(err)
}
sc.AuthInvite = authMod.Invite
sc.AuthRegistrationMeta = authMod.RegistrationMeta
sc.AuthRegistrationSession = authMod.RegistrationSession
sc.AuthLoginSession = authMod.LoginSession
}
if rds != nil && rds.Zero() != nil {
var mongoConf *libmongo.Conf
if c.Mongo.Host != "" {
mongoConf = &c.Mongo
}
memberMod, err := memberusecase.NewModuleFromParam(memberusecase.ModuleParam{
Redis: rds,
MongoConf: mongoConf,
Config: c.Member,
})
if err != nil {
panic(err)
}
sc.MemberOTP = memberMod.OTP
sc.MemberTOTP = memberMod.TOTP
sc.MemberProfile = memberMod.Profile
sc.MemberLifecycle = memberMod.Lifecycle
sc.MemberProvisioning = memberMod.Provisioning
sc.MemberTenant = memberMod.Tenant
sc.MemberVerifyRate = memberMod.VerifyRate
sc.MemberRepo = memberMod.Members
}
return sc
}
func (sc *ServiceContext) StartWorkers(ctx context.Context) {
if sc.NotificationRetry != nil {
sc.NotificationRetry.Start(ctx)
}
}
func (sc *ServiceContext) StopWorkers() {
if sc.NotificationRetry != nil {
sc.NotificationRetry.Stop()
}
}