package bootstrap import ( "github.com/redis/go-redis/v9" "go.uber.org/zap" "gorm.io/gorm" approvalApp "github.com/break/junhong_cmp_fiber/internal/application/approval" "github.com/break/junhong_cmp_fiber/internal/application/merchantpayment" packagesilenceApp "github.com/break/junhong_cmp_fiber/internal/application/packagesilence" refundchannelApp "github.com/break/junhong_cmp_fiber/internal/application/refundchannel" auditInfra "github.com/break/junhong_cmp_fiber/internal/infrastructure/audit" packageSvc "github.com/break/junhong_cmp_fiber/internal/service/package" ) // packageSilenceBundle 是沉默期相关用例的装配结果(API 与 Worker 共用)。 type packageSilenceBundle struct { Switch *packagesilenceApp.Switch Resolver *packagesilenceApp.Resolver Setter *packagesilenceApp.Setter FirstPurchase *packagesilenceApp.FirstPurchaseRecorder // 以下仅 API 与 Worker 中延期相关入口装配 Extensions *packagesilenceApp.ExtensionService Policies *packagesilenceApp.PolicyService Switches *packagesilenceApp.SwitchService } // newPackageSilenceBundle 装配沉默期总开关、判定、设置与首次购买套餐时间用例,并把激活闸门注入激活服务。 func newPackageSilenceBundle(db *gorm.DB, redisClient *redis.Client, logger *zap.Logger, auditWriter *auditInfra.Writer, activation *packageSvc.ActivationService) *packageSilenceBundle { sw := packagesilenceApp.NewDefaultSwitch(db, redisClient, logger) resolver := packagesilenceApp.NewResolver(db, sw, auditWriter, logger) if activation != nil { resolver.SetActivator(activation) activation.SetSilenceGate(resolver, sw) } return &packageSilenceBundle{ Switch: sw, Resolver: resolver, Setter: packagesilenceApp.NewSetter(db, auditWriter), FirstPurchase: packagesilenceApp.NewFirstPurchaseRecorder(auditWriter), Extensions: packagesilenceApp.NewExtensionService(db, resolver, auditWriter, logger), Policies: packagesilenceApp.NewPolicyService(db, auditWriter), Switches: packagesilenceApp.NewSwitchService(db, redisClient, sw, auditWriter), } } // wireExtensions 注入延期用例的审批、权限、资产归属、商户池与支付渠道。 func (b *packageSilenceBundle) wireExtensions(approval approvalApp.Port, perms packagesilenceApp.PermissionChecker, ownership packagesilenceApp.OwnershipChecker, runtime *merchantpayment.RuntimeLoader, ports packagesilenceApp.PaymentPorts, refunder refundchannelApp.Refunder) { b.Setter.SetApprovalPort(approval) b.Setter.SetPermissionChecker(perms) b.Extensions.SetApprovalPort(approval) b.Extensions.SetPermissionChecker(perms) b.Extensions.SetOwnershipChecker(ownership) b.Extensions.SetPayment(runtime, ports, refunder) b.Policies.SetPermissionChecker(perms) }