wire_gen.go 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793
  1. // Code generated by Wire. DO NOT EDIT.
  2. //go:generate go run -mod=mod github.com/google/wire/cmd/wire
  3. //go:build !wireinject
  4. // +build !wireinject
  5. package main
  6. import (
  7. "context"
  8. "github.com/Wei-Shaw/sub2api/ent"
  9. "github.com/Wei-Shaw/sub2api/internal/config"
  10. "github.com/Wei-Shaw/sub2api/internal/handler"
  11. "github.com/Wei-Shaw/sub2api/internal/handler/admin"
  12. "github.com/Wei-Shaw/sub2api/internal/payment"
  13. "github.com/Wei-Shaw/sub2api/internal/repository"
  14. "github.com/Wei-Shaw/sub2api/internal/securityaudit"
  15. "github.com/Wei-Shaw/sub2api/internal/server"
  16. "github.com/Wei-Shaw/sub2api/internal/server/middleware"
  17. "github.com/Wei-Shaw/sub2api/internal/service"
  18. "github.com/redis/go-redis/v9"
  19. "log"
  20. "net/http"
  21. "sync"
  22. "time"
  23. )
  24. import (
  25. _ "embed"
  26. _ "github.com/Wei-Shaw/sub2api/ent/runtime"
  27. )
  28. // Injectors from wire.go:
  29. func initializeApplication(buildInfo handler.BuildInfo) (*Application, error) {
  30. configConfig, err := config.ProvideConfig()
  31. if err != nil {
  32. return nil, err
  33. }
  34. client, err := repository.ProvideEnt(configConfig)
  35. if err != nil {
  36. return nil, err
  37. }
  38. db, err := repository.ProvideSQLDB(client)
  39. if err != nil {
  40. return nil, err
  41. }
  42. userRepository := repository.NewUserRepository(client, db)
  43. redeemCodeRepository := repository.NewRedeemCodeRepository(client)
  44. redisClient := repository.ProvideRedis(configConfig)
  45. refreshTokenCache := repository.NewRefreshTokenCache(redisClient)
  46. settingRepository := repository.NewSettingRepository(client)
  47. groupRepository := repository.NewGroupRepository(client, db)
  48. proxyRepository := repository.NewProxyRepository(client, db)
  49. settingService := service.ProvideSettingService(settingRepository, groupRepository, proxyRepository, configConfig)
  50. emailCache := repository.NewEmailCache(redisClient)
  51. emailService := service.NewEmailService(settingRepository, emailCache)
  52. turnstileVerifier := repository.NewTurnstileVerifier()
  53. turnstileService := service.NewTurnstileService(settingService, turnstileVerifier)
  54. tencentCaptchaVerifier := repository.NewTencentCaptchaVerifier()
  55. tencentCaptchaService := service.NewTencentCaptchaService(settingService, tencentCaptchaVerifier)
  56. aliyunCaptchaVerifier := repository.NewAliyunCaptchaVerifier()
  57. aliyunCaptchaService := service.NewAliyunCaptchaService(settingService, aliyunCaptchaVerifier)
  58. emailQueueService := service.ProvideEmailQueueService(emailService)
  59. promoCodeRepository := repository.NewPromoCodeRepository(client)
  60. billingCache := repository.NewBillingCache(redisClient)
  61. userSubscriptionRepository := repository.NewUserSubscriptionRepository(client)
  62. apiKeyRepository := repository.NewAPIKeyRepository(client, db)
  63. userRPMCache := repository.NewUserRPMCache(redisClient)
  64. userGroupRateRepository := repository.NewUserGroupRateRepository(db)
  65. userPlatformQuotaRepository := repository.NewUserPlatformQuotaRepository(client)
  66. serviceUserPlatformQuotaRepository := repository.NewUserPlatformQuotaServiceAdapter(userPlatformQuotaRepository)
  67. billingCacheService := service.ProvideBillingCacheService(billingCache, userRepository, userSubscriptionRepository, apiKeyRepository, userRPMCache, userGroupRateRepository, configConfig, serviceUserPlatformQuotaRepository)
  68. apiKeyCache := repository.NewAPIKeyCache(redisClient)
  69. concurrencyCache := repository.ProvideConcurrencyCache(redisClient, configConfig)
  70. schedulerCache := repository.ProvideSchedulerCache(redisClient, configConfig)
  71. accountRepository := repository.NewAccountRepository(client, db, schedulerCache)
  72. concurrencyService := service.ProvideConcurrencyService(concurrencyCache, accountRepository, configConfig)
  73. apiKeyService := service.ProvideAPIKeyService(apiKeyRepository, userRepository, groupRepository, userSubscriptionRepository, userGroupRateRepository, apiKeyCache, configConfig, billingCacheService, concurrencyService)
  74. apiKeyAuthCacheInvalidator := service.ProvideAPIKeyAuthCacheInvalidator(apiKeyService)
  75. promoService := service.NewPromoService(promoCodeRepository, userRepository, billingCacheService, client, apiKeyAuthCacheInvalidator)
  76. subscriptionService := service.NewSubscriptionService(groupRepository, userSubscriptionRepository, billingCacheService, client, configConfig)
  77. affiliateRepository := repository.NewAffiliateRepository(client, db)
  78. affiliateService := service.NewAffiliateService(affiliateRepository, settingService, apiKeyAuthCacheInvalidator, billingCacheService)
  79. authService := service.ProvideAuthService(client, userRepository, redeemCodeRepository, refreshTokenCache, configConfig, settingService, emailService, turnstileService, tencentCaptchaService, aliyunCaptchaService, emailQueueService, promoService, subscriptionService, affiliateService, serviceUserPlatformQuotaRepository)
  80. userService := service.NewUserService(userRepository, settingRepository, apiKeyAuthCacheInvalidator, billingCache)
  81. redeemCache := repository.NewRedeemCache(redisClient)
  82. redeemService := service.NewRedeemService(redeemCodeRepository, userRepository, subscriptionService, redeemCache, billingCacheService, client, apiKeyAuthCacheInvalidator, affiliateService)
  83. secretEncryptor, err := repository.NewAESEncryptor(configConfig)
  84. if err != nil {
  85. return nil, err
  86. }
  87. totpCache := repository.NewTotpCache(redisClient)
  88. totpService := service.NewTotpService(userRepository, secretEncryptor, totpCache, settingService, emailService, emailQueueService)
  89. userAttributeDefinitionRepository := repository.NewUserAttributeDefinitionRepository(client)
  90. userAttributeValueRepository := repository.NewUserAttributeValueRepository(client)
  91. userAttributeService := service.NewUserAttributeService(userAttributeDefinitionRepository, userAttributeValueRepository)
  92. authHandler := handler.NewAuthHandler(configConfig, authService, userService, settingService, promoService, redeemService, totpService, userAttributeService)
  93. userHandler := handler.NewUserHandler(userService, authService, emailService, emailCache, affiliateService, serviceUserPlatformQuotaRepository)
  94. apiKeyHandler := handler.NewAPIKeyHandler(apiKeyService)
  95. usageLogRepository := repository.NewUsageLogRepository(client, db)
  96. usageService := service.NewUsageService(usageLogRepository, userRepository, client, apiKeyAuthCacheInvalidator)
  97. opsRepository := repository.NewOpsRepository(db)
  98. usageBillingRepository := repository.NewUsageBillingRepository(client, db)
  99. gatewayCache := repository.NewGatewayCache(redisClient)
  100. schedulerOutboxRepository := repository.NewSchedulerOutboxRepository(db)
  101. schedulerSnapshotService := service.ProvideSchedulerSnapshotService(schedulerCache, schedulerOutboxRepository, accountRepository, groupRepository, configConfig)
  102. pricingRemoteClient := repository.ProvidePricingRemoteClient(configConfig)
  103. pricingService, err := service.ProvidePricingService(configConfig, pricingRemoteClient)
  104. if err != nil {
  105. return nil, err
  106. }
  107. billingService := service.NewBillingService(configConfig, pricingService)
  108. geminiQuotaService := service.NewGeminiQuotaService(configConfig, settingRepository)
  109. tempUnschedCache := repository.NewTempUnschedCache(redisClient)
  110. timeoutCounterCache := repository.NewTimeoutCounterCache(redisClient)
  111. openAI403CounterCache := repository.NewOpenAI403CounterCache(redisClient)
  112. geminiTokenCache := repository.NewGeminiTokenCache(redisClient)
  113. compositeTokenCacheInvalidator := service.NewCompositeTokenCacheInvalidator(geminiTokenCache)
  114. rateLimitService := service.ProvideRateLimitService(accountRepository, usageLogRepository, configConfig, geminiQuotaService, tempUnschedCache, timeoutCounterCache, openAI403CounterCache, settingService, compositeTokenCacheInvalidator)
  115. identityCache := repository.NewIdentityCache(redisClient)
  116. identityService := service.NewIdentityService(identityCache)
  117. accountTrafficCache := repository.NewAccountTrafficCache(redisClient)
  118. accountTrafficService := service.NewAccountTrafficService(accountTrafficCache)
  119. httpUpstream := repository.NewControlledHTTPUpstream(configConfig, accountTrafficService)
  120. timingWheelService, err := service.ProvideTimingWheelService()
  121. if err != nil {
  122. return nil, err
  123. }
  124. deferredService := service.ProvideDeferredService(accountRepository, timingWheelService)
  125. claudeOAuthClient := repository.NewClaudeOAuthClient()
  126. oAuthService := service.NewOAuthService(proxyRepository, claudeOAuthClient)
  127. oAuthRefreshAPI := service.ProvideOAuthRefreshAPI(accountRepository, geminiTokenCache)
  128. claudeTokenProvider := service.ProvideClaudeTokenProvider(accountRepository, geminiTokenCache, oAuthService, oAuthRefreshAPI)
  129. sessionLimitCache := repository.ProvideSessionLimitCache(redisClient, configConfig)
  130. rpmCache := repository.NewRPMCache(redisClient)
  131. digestSessionStore := service.NewDigestSessionStore()
  132. tlsFingerprintProfileRepository := repository.NewTLSFingerprintProfileRepository(client)
  133. tlsFingerprintProfileCache := repository.NewTLSFingerprintProfileCache(redisClient)
  134. tlsFingerprintProfileService := service.ProvideTLSFingerprintProfileService(tlsFingerprintProfileRepository, tlsFingerprintProfileCache, configConfig)
  135. channelRepository := repository.NewChannelRepository(db)
  136. channelCachePubSub := repository.NewChannelCache(redisClient)
  137. channelService := service.NewChannelService(channelRepository, groupRepository, apiKeyAuthCacheInvalidator, pricingService, channelCachePubSub)
  138. globalModelPricingRepository := repository.NewGlobalModelPricingRepository(db)
  139. globalModelPricingService := service.NewGlobalModelPricingService(globalModelPricingRepository)
  140. modelPricingResolver := service.NewModelPricingResolverWithGlobal(channelService, billingService, globalModelPricingService)
  141. compositeModelRouteRepository := repository.NewCompositeModelRouteRepository(client)
  142. compositeRouteResolver := service.NewCompositeRouteResolver(compositeModelRouteRepository)
  143. notificationEmailService := service.NewNotificationEmailService(settingRepository, emailService)
  144. balanceNotifyService := service.ProvideBalanceNotifyService(emailService, settingRepository, accountRepository, notificationEmailService)
  145. gatewayService := service.NewGatewayService(accountRepository, groupRepository, usageLogRepository, usageBillingRepository, userRepository, userSubscriptionRepository, userGroupRateRepository, gatewayCache, configConfig, schedulerSnapshotService, concurrencyService, billingService, rateLimitService, billingCacheService, identityService, httpUpstream, deferredService, claudeTokenProvider, sessionLimitCache, rpmCache, digestSessionStore, settingService, tlsFingerprintProfileService, channelService, modelPricingResolver, compositeRouteResolver, balanceNotifyService, serviceUserPlatformQuotaRepository)
  146. openAIOAuthClient := repository.NewOpenAIOAuthClient()
  147. privacyClientFactory := providePrivacyClientFactory()
  148. openAIOAuthService := service.ProvideOpenAIOAuthService(proxyRepository, openAIOAuthClient, privacyClientFactory)
  149. openAITokenProvider := service.ProvideOpenAITokenProvider(accountRepository, geminiTokenCache, openAIOAuthService, oAuthRefreshAPI)
  150. grokOAuthClient := repository.NewGrokOAuthClient()
  151. grokOAuthService := service.ProvideGrokOAuthService(proxyRepository, grokOAuthClient, configConfig, redisClient)
  152. grokTokenProvider := service.ProvideGrokTokenProvider(accountRepository, geminiTokenCache, grokOAuthService, oAuthRefreshAPI, tempUnschedCache)
  153. openAIGatewayService := service.NewOpenAIGatewayService(accountRepository, usageLogRepository, usageBillingRepository, userRepository, userSubscriptionRepository, userGroupRateRepository, gatewayCache, configConfig, schedulerSnapshotService, concurrencyService, billingService, rateLimitService, billingCacheService, httpUpstream, deferredService, openAITokenProvider, grokTokenProvider, modelPricingResolver, channelService, balanceNotifyService, settingService, serviceUserPlatformQuotaRepository)
  154. geminiOAuthClient := repository.NewGeminiOAuthClient(configConfig)
  155. geminiCliCodeAssistClient := repository.NewGeminiCliCodeAssistClient()
  156. driveClient := repository.NewGeminiDriveClient()
  157. geminiOAuthService := service.NewGeminiOAuthService(proxyRepository, geminiOAuthClient, geminiCliCodeAssistClient, driveClient, configConfig)
  158. geminiTokenProvider := service.ProvideGeminiTokenProvider(accountRepository, geminiTokenCache, geminiOAuthService, oAuthRefreshAPI)
  159. antigravityOAuthService := service.NewAntigravityOAuthService(proxyRepository)
  160. antigravityTokenProvider := service.ProvideAntigravityTokenProvider(accountRepository, geminiTokenCache, antigravityOAuthService, oAuthRefreshAPI, tempUnschedCache)
  161. internal500CounterCache := repository.NewInternal500CounterCache(redisClient)
  162. antigravityGatewayService := service.NewAntigravityGatewayService(accountRepository, gatewayCache, schedulerSnapshotService, antigravityTokenProvider, rateLimitService, httpUpstream, settingService, internal500CounterCache)
  163. geminiMessagesCompatService := service.NewGeminiMessagesCompatService(accountRepository, groupRepository, gatewayCache, schedulerSnapshotService, geminiTokenProvider, rateLimitService, httpUpstream, antigravityGatewayService, configConfig)
  164. opsSystemLogSink := service.ProvideOpsSystemLogSink(opsRepository)
  165. authCacheInvalidationOutboxRepository := repository.NewAuthCacheInvalidationOutboxRepository(db)
  166. authCacheInvalidationWorker := service.ProvideAuthCacheInvalidationWorker(authCacheInvalidationOutboxRepository, apiKeyCache, apiKeyService)
  167. opsService := service.ProvideOpsService(opsRepository, settingRepository, configConfig, accountRepository, userRepository, concurrencyService, gatewayService, openAIGatewayService, geminiMessagesCompatService, antigravityGatewayService, opsSystemLogSink, settingService, authCacheInvalidationWorker, apiKeyService)
  168. usageHandler := handler.NewUsageHandler(usageService, apiKeyService, opsService, settingService)
  169. redeemHandler := handler.NewRedeemHandler(redeemService)
  170. subscriptionHandler := handler.NewSubscriptionHandler(subscriptionService)
  171. announcementRepository := repository.NewAnnouncementRepository(client)
  172. announcementReadRepository := repository.NewAnnouncementReadRepository(client)
  173. announcementService := service.NewAnnouncementService(announcementRepository, announcementReadRepository, userRepository, userSubscriptionRepository)
  174. announcementHandler := handler.NewAnnouncementHandler(announcementService)
  175. channelMonitorRepository := repository.NewChannelMonitorRepository(client, db)
  176. channelMonitorService := service.ProvideChannelMonitorService(channelMonitorRepository, secretEncryptor, settingService)
  177. channelMonitorUserHandler := handler.NewChannelMonitorUserHandler(channelMonitorService, settingService)
  178. channelMonitorV2Repository := repository.NewChannelMonitorV2Repository(db)
  179. channelMonitorV2Service := service.ProvideChannelMonitorV2Service(channelMonitorV2Repository, settingService)
  180. channelMonitorV2Handler := handler.NewChannelMonitorV2Handler(channelMonitorV2Service, apiKeyService)
  181. dashboardAggregationRepository := repository.NewDashboardAggregationRepository(db)
  182. dashboardStatsCache := repository.NewDashboardCache(redisClient, configConfig)
  183. dashboardService := service.NewDashboardService(usageLogRepository, dashboardAggregationRepository, dashboardStatsCache, configConfig)
  184. leaderLockCache := repository.NewLeaderLockCache(redisClient)
  185. dashboardAggregationService := service.ProvideDashboardAggregationService(dashboardAggregationRepository, timingWheelService, leaderLockCache, db, configConfig)
  186. dashboardHandler := admin.NewDashboardHandler(dashboardService, dashboardAggregationService)
  187. adminGroupRepository := repository.NewAdminGroupRepository(client, db)
  188. adminAccountRepository := repository.NewAdminAccountRepository(client, db, schedulerCache)
  189. proxyExitInfoProber := repository.NewProxyExitInfoProber(configConfig)
  190. proxyLatencyCache := repository.NewProxyLatencyCache(redisClient)
  191. adminService := service.NewAdminService(configConfig, userRepository, adminGroupRepository, adminAccountRepository, proxyRepository, apiKeyRepository, redeemCodeRepository, userGroupRateRepository, userRPMCache, billingCacheService, proxyExitInfoProber, proxyLatencyCache, apiKeyAuthCacheInvalidator, client, settingService, subscriptionService, userSubscriptionRepository, privacyClientFactory, openAIGatewayService, affiliateService, compositeModelRouteRepository, compositeRouteResolver, channelService)
  192. adminUserHandler := admin.NewUserHandler(adminService, concurrencyService, serviceUserPlatformQuotaRepository, billingCache, totpService, userService, settingService)
  193. userCleanupService := service.NewUserCleanupService(db, apiKeyAuthCacheInvalidator)
  194. userCleanupHandler := admin.NewUserCleanupHandler(userCleanupService)
  195. intelligentTestRepository := repository.NewIntelligentTestRepository(db)
  196. pluginRepository := repository.NewPluginRepository(db)
  197. pluginHostInfo := providePluginHostInfo(buildInfo)
  198. pluginManager := service.NewPluginManager(pluginRepository, secretEncryptor, configConfig, pluginHostInfo)
  199. accountTestService := service.ProvideAccountTestService(concurrencyService, accountRepository, geminiTokenProvider, claudeTokenProvider, grokTokenProvider, antigravityGatewayService, httpUpstream, configConfig, tlsFingerprintProfileService, openAIGatewayService, settingService, pluginManager)
  200. intelligentTestService := service.ProvideIntelligentTestService(intelligentTestRepository, accountTestService)
  201. intelligentTestHandler := admin.NewIntelligentTestHandler(intelligentTestService)
  202. groupCapacityService := service.NewGroupCapacityService(accountRepository, groupRepository, concurrencyService, sessionLimitCache, rpmCache)
  203. groupHandler := admin.NewGroupHandlerWithConfig(adminService, dashboardService, groupCapacityService, configConfig)
  204. claudeUsageFetcher := repository.NewClaudeUsageFetcher(httpUpstream)
  205. antigravityQuotaFetcher := service.NewAntigravityQuotaFetcher(proxyRepository, configConfig)
  206. grokQuotaFetcher := service.NewGrokQuotaFetcher()
  207. grokQuotaService := service.ProvideGrokQuotaService(accountRepository, proxyRepository, grokTokenProvider, httpUpstream, configConfig, usageLogRepository, settingService)
  208. openAIQuotaService := service.ProvideOpenAIQuotaService(accountRepository, proxyRepository, openAITokenProvider, privacyClientFactory, openAIGatewayService)
  209. usageCache := service.NewUsageCache()
  210. accountUsageService := service.ProvideAccountUsageService(accountRepository, usageLogRepository, claudeUsageFetcher, geminiQuotaService, antigravityQuotaFetcher, grokQuotaFetcher, grokQuotaService, openAIQuotaService, usageCache, identityCache, tlsFingerprintProfileService, openAIGatewayService)
  211. crsSyncService := service.NewCRSSyncService(accountRepository, proxyRepository, oAuthService, openAIOAuthService, geminiOAuthService, configConfig)
  212. accountHandler := admin.ProvideAccountHandler(configConfig, adminService, oAuthService, openAIOAuthService, geminiOAuthService, antigravityOAuthService, grokOAuthService, rateLimitService, accountUsageService, accountTestService, concurrencyService, crsSyncService, sessionLimitCache, rpmCache, compositeTokenCacheInvalidator, grokQuotaService)
  213. accountTrafficHandler := admin.NewAccountTrafficHandler(adminService, accountTrafficService)
  214. adminAnnouncementHandler := admin.NewAnnouncementHandler(announcementService)
  215. dataManagementService := service.NewDataManagementService()
  216. dataManagementHandler := admin.NewDataManagementHandler(dataManagementService)
  217. backupObjectStoreFactory := repository.NewS3BackupStoreFactory()
  218. dbDumper := repository.NewPgDumper(configConfig, db)
  219. backupService := service.ProvideBackupService(settingRepository, configConfig, secretEncryptor, backupObjectStoreFactory, dbDumper, leaderLockCache, db)
  220. imageStorageFactory := repository.ProvideImageStorageFactory()
  221. imageStorageSettingService := service.ProvideImageStorageSettingService(settingRepository, secretEncryptor, backupService, imageStorageFactory, configConfig)
  222. backupHandler := admin.NewBackupHandler(backupService, userService, imageStorageSettingService)
  223. oAuthHandler := admin.NewOAuthHandler(oAuthService)
  224. openAIOAuthHandler := admin.NewOpenAIOAuthHandler(openAIOAuthService, adminService, openAIQuotaService, rateLimitService)
  225. geminiOAuthHandler := admin.NewGeminiOAuthHandler(geminiOAuthService)
  226. antigravityOAuthHandler := admin.NewAntigravityOAuthHandler(antigravityOAuthService)
  227. tokenRefreshService := service.ProvideTokenRefreshService(accountRepository, oAuthService, openAIOAuthService, geminiOAuthService, antigravityOAuthService, grokOAuthService, compositeTokenCacheInvalidator, schedulerCache, configConfig, tempUnschedCache, privacyClientFactory, proxyRepository, oAuthRefreshAPI, openAIGatewayService)
  228. grokOAuthHandler := admin.NewGrokOAuthHandler(grokOAuthService, adminService, grokQuotaService, tokenRefreshService)
  229. cnProviderQuotaService := service.ProvideCNProviderQuotaService(accountRepository, proxyRepository, httpUpstream, configConfig)
  230. cnProviderBalanceService := service.ProvideCNProviderBalanceService(accountRepository, proxyRepository, httpUpstream, configConfig)
  231. cnProviderHandler := admin.NewCNProviderHandler(cnProviderQuotaService, cnProviderBalanceService)
  232. proxyHandler := admin.NewProxyHandler(adminService)
  233. adminRedeemHandler := admin.NewRedeemHandler(adminService, redeemService)
  234. promoHandler := admin.NewPromoHandler(promoService)
  235. encryptionKey, err := payment.ProvideEncryptionKey(configConfig)
  236. if err != nil {
  237. return nil, err
  238. }
  239. paymentConfigService := service.ProvidePaymentConfigService(client, settingRepository, encryptionKey)
  240. registry := payment.ProvideRegistry()
  241. defaultLoadBalancer := payment.ProvideDefaultLoadBalancer(client, encryptionKey)
  242. paymentService := service.ProvidePaymentService(client, registry, defaultLoadBalancer, redeemService, subscriptionService, paymentConfigService, userRepository, groupRepository, affiliateService, notificationEmailService)
  243. settingHandler := handler.ProvideAdminSettingHandler(settingService, emailService, turnstileService, aliyunCaptchaService, opsService, paymentConfigService, paymentService, userAttributeService, notificationEmailService, totpService, userService)
  244. opsHandler := admin.NewOpsHandler(opsService)
  245. updateCache := repository.NewUpdateCache(redisClient)
  246. gitHubReleaseClient := repository.ProvideGitHubReleaseClient(configConfig)
  247. serviceBuildInfo := provideServiceBuildInfo(buildInfo)
  248. updateService := service.ProvideUpdateService(updateCache, gitHubReleaseClient, serviceBuildInfo)
  249. idempotencyRepository := repository.NewIdempotencyRepository(client, db)
  250. systemOperationLockService := service.ProvideSystemOperationLockService(idempotencyRepository, configConfig)
  251. systemHandler := handler.ProvideSystemHandler(updateService, systemOperationLockService)
  252. adminSubscriptionHandler := admin.NewSubscriptionHandler(subscriptionService)
  253. usageCleanupRepository := repository.NewUsageCleanupRepository(client, db)
  254. usageCleanupService := service.ProvideUsageCleanupService(usageCleanupRepository, timingWheelService, dashboardAggregationService, configConfig)
  255. adminUsageHandler := admin.NewUsageHandler(usageService, apiKeyService, adminService, usageCleanupService)
  256. userAttributeHandler := admin.NewUserAttributeHandler(userAttributeService)
  257. errorPassthroughRepository := repository.NewErrorPassthroughRepository(client)
  258. errorPassthroughCache := repository.NewErrorPassthroughCache(redisClient)
  259. errorPassthroughService := service.NewErrorPassthroughService(errorPassthroughRepository, errorPassthroughCache)
  260. errorPassthroughHandler := admin.NewErrorPassthroughHandler(errorPassthroughService)
  261. tlsFingerprintProfileHandler := admin.NewTLSFingerprintProfileHandler(tlsFingerprintProfileService)
  262. pluginHandler := admin.NewPluginHandler(pluginManager)
  263. adminAPIKeyHandler := admin.NewAdminAPIKeyHandler(adminService)
  264. scheduledTestPlanRepository := repository.NewScheduledTestPlanRepository(db)
  265. scheduledTestResultRepository := repository.NewScheduledTestResultRepository(db)
  266. scheduledTestService := service.ProvideScheduledTestService(scheduledTestPlanRepository, scheduledTestResultRepository)
  267. scheduledTestHandler := admin.NewScheduledTestHandler(scheduledTestService)
  268. channelHandler := admin.NewChannelHandler(channelService, billingService, pricingService)
  269. channelMonitorHandler := admin.NewChannelMonitorHandler(channelMonitorService)
  270. channelMonitorRequestTemplateRepository := repository.NewChannelMonitorRequestTemplateRepository(client, db)
  271. channelMonitorRequestTemplateService := service.NewChannelMonitorRequestTemplateService(channelMonitorRequestTemplateRepository)
  272. channelMonitorRequestTemplateHandler := admin.NewChannelMonitorRequestTemplateHandler(channelMonitorRequestTemplateService)
  273. contentModerationRepository := repository.NewContentModerationRepository(db)
  274. contentModerationHashCache := repository.NewContentModerationHashCache(redisClient)
  275. contentModerationService := service.NewContentModerationService(settingRepository, contentModerationRepository, contentModerationHashCache, groupRepository, userRepository, proxyRepository, apiKeyAuthCacheInvalidator, emailService)
  276. contentModerationHandler := admin.NewContentModerationHandler(contentModerationService)
  277. securityPolicyRepository := repository.NewSecurityPolicyRepository(client, db)
  278. securityPolicySessionStore := repository.NewSecurityPolicySessionStore(redisClient)
  279. securityPolicyService := service.NewSecurityPolicyService(contentModerationService, securityPolicyRepository, securityPolicySessionStore, contentModerationRepository, settingRepository, groupRepository, emailService)
  280. securityPolicyHandler := admin.NewSecurityPolicyHandler(securityPolicyService)
  281. globalPricingHandler := admin.NewGlobalPricingHandler(globalModelPricingService)
  282. accountHealthService := service.ProvideAccountHealthService(db, accountRepository, settingRepository)
  283. accountHealthHandler := admin.NewAccountHealthHandler(accountHealthService)
  284. marginService := service.ProvideMarginService(db, channelService, billingService, settingRepository)
  285. marginHandler := admin.NewMarginHandler(marginService)
  286. tieredRoutingService := service.NewTieredRoutingService(settingRepository)
  287. tieredRoutingHandler := admin.NewTieredRoutingHandler(tieredRoutingService)
  288. spendGuardService := service.ProvideSpendGuardService(db, apiKeyService, settingRepository)
  289. spendGuardHandler := admin.NewSpendGuardHandler(spendGuardService)
  290. ticketService := service.NewTicketService(db)
  291. ticketHandler := admin.NewTicketHandler(ticketService)
  292. billingExportService := service.NewBillingExportService(db)
  293. billingExportHandler := admin.NewBillingExportHandler(billingExportService)
  294. antiDegradeService := service.ProvideAntiDegradeService(adminService, configConfig, pluginManager)
  295. antiDegradeHandler := admin.NewAntiDegradeHandler(antiDegradeService)
  296. configManager := securityaudit.NewConfigManager(db, settingRepository, redisClient, secretEncryptor, configConfig)
  297. postgreSQLRepository := securityaudit.NewPostgreSQLRepository(db)
  298. redisPayloadStore := securityaudit.NewRedisPayloadStore(redisClient)
  299. openAICompatibleScanner := securityaudit.NewOpenAICompatibleScanner()
  300. atomicMetrics := securityaudit.NewAtomicMetrics()
  301. promptService := securityaudit.NewPromptService(configManager, postgreSQLRepository, redisPayloadStore, openAICompatibleScanner, atomicMetrics)
  302. promptAdminHandler := securityaudit.NewPromptAdminHandler(promptService)
  303. paymentHandler := admin.NewPaymentHandler(paymentService, paymentConfigService)
  304. affiliateHandler := admin.NewAffiliateHandler(affiliateService, adminService)
  305. complianceHandler := admin.NewComplianceHandler(settingService)
  306. auditLogRepository := repository.NewAuditLogRepository(db)
  307. auditLogService := service.ProvideAuditLogService(auditLogRepository, settingService)
  308. auditLogHandler := admin.NewAuditLogHandler(auditLogService, totpService)
  309. upstreamBillingProbeService := service.ProvideUpstreamBillingProbeService(accountRepository, accountTestService, settingService, leaderLockCache, db)
  310. ollamaCloudUsageService := service.ProvideOllamaCloudUsageService(accountRepository, httpUpstream, settingService, secretEncryptor, configConfig, leaderLockCache, db)
  311. adminHandlers := handler.ProvideAdminHandlers(dashboardHandler, adminUserHandler, userCleanupHandler, intelligentTestHandler, groupHandler, accountHandler, accountTrafficHandler, adminAnnouncementHandler, dataManagementHandler, backupHandler, oAuthHandler, openAIOAuthHandler, geminiOAuthHandler, antigravityOAuthHandler, grokOAuthHandler, cnProviderHandler, proxyHandler, adminRedeemHandler, promoHandler, settingHandler, opsHandler, systemHandler, adminSubscriptionHandler, adminUsageHandler, userAttributeHandler, errorPassthroughHandler, tlsFingerprintProfileHandler, pluginHandler, adminAPIKeyHandler, scheduledTestHandler, channelHandler, channelMonitorHandler, channelMonitorRequestTemplateHandler, contentModerationHandler, securityPolicyHandler, globalPricingHandler, accountHealthHandler, marginHandler, tieredRoutingHandler, spendGuardHandler, ticketHandler, billingExportHandler, antiDegradeHandler, promptAdminHandler, paymentHandler, affiliateHandler, complianceHandler, auditLogHandler, upstreamBillingProbeService, ollamaCloudUsageService)
  312. usageRecordWorkerPool := service.NewUsageRecordWorkerPool(configConfig)
  313. userMsgQueueCache := repository.NewUserMsgQueueCache(redisClient)
  314. userMessageQueueService := service.ProvideUserMessageQueueService(userMsgQueueCache, rpmCache, configConfig)
  315. legacyEngine := securityaudit.NewLegacyModerationAdapter(contentModerationService)
  316. coordinator := securityaudit.NewCoordinator(legacyEngine, promptService)
  317. gatewayHandler := handler.ProvideGatewayHandler(gatewayService, openAIGatewayService, geminiMessagesCompatService, antigravityGatewayService, userService, concurrencyService, billingCacheService, usageService, apiKeyService, usageRecordWorkerPool, errorPassthroughService, contentModerationService, userMessageQueueService, configConfig, settingService, coordinator, securityPolicyService)
  318. openAIGatewayHandler := handler.ProvideOpenAIGatewayHandler(openAIGatewayService, pluginManager, concurrencyService, billingCacheService, apiKeyService, usageRecordWorkerPool, errorPassthroughService, contentModerationService, opsService, grokQuotaService, configConfig, coordinator, securityPolicyService)
  319. handlerSettingHandler := handler.ProvideSettingHandler(settingService, buildInfo, notificationEmailService)
  320. totpHandler := handler.NewTotpHandler(totpService)
  321. passkeyRepository := repository.NewPasskeyRepository(db)
  322. passkeySessionStore := repository.NewPasskeySessionStore(redisClient)
  323. passkeyService, err := service.NewPasskeyService(configConfig, passkeyRepository, passkeySessionStore, userRepository)
  324. if err != nil {
  325. return nil, err
  326. }
  327. passkeyHandler := handler.NewPasskeyHandler(passkeyService, authService, settingService)
  328. handlerPaymentHandler := handler.NewPaymentHandler(paymentService, paymentConfigService)
  329. paymentWebhookHandler := handler.NewPaymentWebhookHandler(paymentService, registry)
  330. availableChannelHandler := handler.NewAvailableChannelHandler(channelService, apiKeyService, settingService)
  331. modelPlazaService := service.NewModelPlazaService(channelRepository, groupRepository, pricingService, billingService, modelPricingResolver)
  332. modelPlazaHandler := handler.NewModelPlazaHandler(modelPlazaService, apiKeyService, settingService)
  333. imageTaskStore := repository.NewImageTaskStore(redisClient)
  334. imageTaskService := service.ProvideImageTaskService(imageTaskStore, imageStorageSettingService)
  335. asyncImageHandler := handler.NewAsyncImageHandler(imageTaskService, openAIGatewayHandler)
  336. batchImageRepository := repository.NewBatchImageRepository(db)
  337. batchImageQueue := repository.NewBatchImageQueue(redisClient, configConfig)
  338. batchImageModelPricingResolver := service.ProvideBatchImageModelPricingResolver(modelPricingResolver)
  339. batchImagePublicService := service.NewBatchImagePublicService(batchImageRepository, accountRepository, groupRepository, userGroupRateRepository, batchImageQueue, batchImageModelPricingResolver, usageBillingRepository, apiKeyAuthCacheInvalidator, configConfig)
  340. batchImageDownloadLimiter := repository.NewBatchImageDownloadLimiter(redisClient, configConfig)
  341. batchImageDownloadService := service.NewBatchImageDownloadService(batchImageRepository, accountRepository, batchImageDownloadLimiter, configConfig)
  342. batchImageCleanupService := service.ProvideBatchImageCleanupService(batchImageRepository, accountRepository, configConfig)
  343. batchImageHandler := handler.ProvideBatchImageHandler(batchImagePublicService, batchImageDownloadService, batchImageCleanupService, openAIGatewayHandler)
  344. accountCapabilityHandler := handler.NewAccountCapabilityHandler(intelligentTestService)
  345. idempotencyCoordinator := service.ProvideIdempotencyCoordinator(idempotencyRepository, configConfig)
  346. idempotencyCleanupService := service.ProvideIdempotencyCleanupService(idempotencyRepository, configConfig)
  347. openAIQuotaAutoResetService := service.ProvideOpenAIQuotaAutoResetService(accountRepository, openAIQuotaService, rateLimitService, idempotencyCoordinator, auditLogService, settingService, leaderLockCache)
  348. handlers := handler.ProvideHandlers(authHandler, userHandler, apiKeyHandler, usageHandler, redeemHandler, subscriptionHandler, announcementHandler, channelMonitorUserHandler, channelMonitorV2Handler, adminHandlers, gatewayHandler, openAIGatewayHandler, handlerSettingHandler, totpHandler, passkeyHandler, handlerPaymentHandler, paymentWebhookHandler, availableChannelHandler, modelPlazaHandler, asyncImageHandler, batchImageHandler, accountCapabilityHandler, idempotencyCoordinator, idempotencyCleanupService, openAIQuotaAutoResetService)
  349. jwtAuthMiddleware := middleware.NewJWTAuthMiddleware(authService, userService, settingService, auditLogService)
  350. optionalJWTAuthMiddleware := middleware.NewOptionalJWTAuthMiddleware(authService, userService, settingService, auditLogService)
  351. adminAuthMiddleware := middleware.NewAdminAuthMiddleware(authService, userService, settingService, auditLogService)
  352. apiKeyAuthMiddleware := middleware.ProvideAPIKeyAuthMiddleware(apiKeyService, subscriptionService, configConfig, tieredRoutingService)
  353. auditLogMiddleware := middleware.NewAuditLogMiddleware(auditLogService)
  354. stepUpAuthMiddleware := middleware.NewStepUpAuthMiddleware(totpService, userService, settingService)
  355. engine := server.ProvideRouter(configConfig, handlers, jwtAuthMiddleware, optionalJWTAuthMiddleware, adminAuthMiddleware, apiKeyAuthMiddleware, auditLogMiddleware, stepUpAuthMiddleware, apiKeyService, subscriptionService, opsService, settingService, userService, compositeRouteResolver, redisClient)
  356. httpServer := server.ProvideHTTPServer(configConfig, engine)
  357. opsMetricsCollector := service.ProvideOpsMetricsCollector(opsRepository, settingRepository, accountRepository, concurrencyService, db, redisClient, configConfig)
  358. opsAggregationService := service.ProvideOpsAggregationService(opsRepository, settingRepository, db, redisClient, configConfig)
  359. opsAlertEvaluatorService := service.ProvideOpsAlertEvaluatorService(opsService, opsRepository, emailService, redisClient, configConfig, proxyRepository)
  360. opsCleanupService := service.ProvideOpsCleanupService(opsRepository, db, redisClient, configConfig, channelMonitorService, settingRepository, opsService)
  361. opsScheduledReportService := service.ProvideOpsScheduledReportService(opsService, userService, emailService, redisClient, configConfig)
  362. opsIngressRejectAggregator := service.ProvideOpsIngressRejectAggregator(opsRepository, opsService)
  363. accountExpiryService := service.ProvideAccountExpiryService(accountRepository)
  364. cnProviderBalanceCheckService := service.ProvideCNProviderBalanceCheckService(accountRepository, cnProviderBalanceService, cnProviderQuotaService, configConfig)
  365. openAICodexVersionSyncService := service.ProvideOpenAICodexVersionSyncService(settingRepository, settingService, gitHubReleaseClient)
  366. proxyExpiryService := service.ProvideProxyExpiryService(proxyRepository)
  367. subscriptionExpiryService := service.ProvideSubscriptionExpiryService(userSubscriptionRepository, settingRepository, notificationEmailService, leaderLockCache, db)
  368. batchImageWorkerRuntime := service.ProvideBatchImageWorkerRuntime(batchImageRepository, accountRepository, batchImageQueue, usageBillingRepository, usageLogRepository, batchImageModelPricingResolver, apiKeyAuthCacheInvalidator, configConfig)
  369. scheduledTestRunnerService := service.ProvideScheduledTestRunnerService(scheduledTestPlanRepository, scheduledTestService, accountTestService, rateLimitService, configConfig)
  370. paymentOrderExpiryService := service.ProvidePaymentOrderExpiryService(paymentService, leaderLockCache, db)
  371. channelMonitorQuotaFetcher := service.NewChannelMonitorQuotaFetcher(accountUsageService, cnProviderQuotaService, cnProviderBalanceService, accountRepository, configConfig)
  372. channelMonitorRunner := service.ProvideChannelMonitorRunner(channelMonitorService, settingService, channelMonitorQuotaFetcher)
  373. channelMonitorV2Aggregator := service.ProvideChannelMonitorV2Aggregator(channelMonitorV2Repository, db, settingService)
  374. userPlatformQuotaUsageFlusher := service.ProvideUserPlatformQuotaUsageFlusher(configConfig, billingCache, serviceUserPlatformQuotaRepository, timingWheelService)
  375. v := provideCleanup(client, redisClient, opsMetricsCollector, opsAggregationService, opsAlertEvaluatorService, opsCleanupService, opsScheduledReportService, opsSystemLogSink, opsService, opsIngressRejectAggregator, apiKeyService, authCacheInvalidationWorker, schedulerSnapshotService, tokenRefreshService, accountExpiryService, cnProviderBalanceCheckService, openAICodexVersionSyncService, proxyExpiryService, accountHealthService, marginService, spendGuardService, subscriptionExpiryService, usageCleanupService, idempotencyCleanupService, batchImageCleanupService, batchImageWorkerRuntime, pricingService, emailQueueService, billingCacheService, usageRecordWorkerPool, subscriptionService, oAuthService, openAIOAuthService, geminiOAuthService, antigravityOAuthService, grokOAuthService, openAIGatewayService, scheduledTestRunnerService, intelligentTestService, backupService, paymentOrderExpiryService, channelMonitorRunner, channelMonitorV2Aggregator, userPlatformQuotaUsageFlusher, upstreamBillingProbeService, ollamaCloudUsageService, auditLogService, openAIQuotaAutoResetService, promptService, pluginManager)
  376. application := &Application{
  377. Server: httpServer,
  378. PromptAudit: promptService,
  379. PluginManager: pluginManager,
  380. Cleanup: v,
  381. }
  382. return application, nil
  383. }
  384. // wire.go:
  385. type Application struct {
  386. Server *http.Server
  387. PromptAudit *securityaudit.PromptService
  388. PluginManager *service.PluginManager
  389. Cleanup func()
  390. }
  391. func providePrivacyClientFactory() service.PrivacyClientFactory {
  392. return repository.CreatePrivacyReqClient
  393. }
  394. func provideServiceBuildInfo(buildInfo handler.BuildInfo) service.BuildInfo {
  395. return service.BuildInfo{
  396. Version: buildInfo.Version,
  397. BuildType: buildInfo.BuildType,
  398. }
  399. }
  400. func providePluginHostInfo(buildInfo handler.BuildInfo) service.PluginHostInfo {
  401. return service.PluginHostInfo{
  402. Version: buildInfo.Version,
  403. BuildType: buildInfo.BuildType,
  404. }
  405. }
  406. func provideCleanup(
  407. entClient *ent.Client,
  408. rdb *redis.Client,
  409. opsMetricsCollector *service.OpsMetricsCollector,
  410. opsAggregation *service.OpsAggregationService,
  411. opsAlertEvaluator *service.OpsAlertEvaluatorService,
  412. opsCleanup *service.OpsCleanupService,
  413. opsScheduledReport *service.OpsScheduledReportService,
  414. opsSystemLogSink *service.OpsSystemLogSink,
  415. opsService *service.OpsService,
  416. opsIngressReject *service.OpsIngressRejectAggregator,
  417. apiKeyService *service.APIKeyService,
  418. authCacheInvalidationWorker *service.AuthCacheInvalidationWorker,
  419. schedulerSnapshot *service.SchedulerSnapshotService,
  420. tokenRefresh *service.TokenRefreshService,
  421. accountExpiry *service.AccountExpiryService,
  422. cnProviderBalanceCheck *service.CNProviderBalanceCheckService,
  423. codexVersionSync *service.OpenAICodexVersionSyncService,
  424. proxyExpiry *service.ProxyExpiryService,
  425. accountHealth *service.AccountHealthService,
  426. margin *service.MarginService,
  427. spendGuard *service.SpendGuardService,
  428. subscriptionExpiry *service.SubscriptionExpiryService,
  429. usageCleanup *service.UsageCleanupService,
  430. idempotencyCleanup *service.IdempotencyCleanupService,
  431. batchImageCleanup *service.BatchImageCleanupService,
  432. batchImageWorker *service.BatchImageWorkerRuntime,
  433. pricing *service.PricingService,
  434. emailQueue *service.EmailQueueService,
  435. billingCache *service.BillingCacheService,
  436. usageRecordWorkerPool *service.UsageRecordWorkerPool,
  437. subscriptionService *service.SubscriptionService,
  438. oauth *service.OAuthService,
  439. openaiOAuth *service.OpenAIOAuthService,
  440. geminiOAuth *service.GeminiOAuthService,
  441. antigravityOAuth *service.AntigravityOAuthService,
  442. grokOAuth *service.GrokOAuthService,
  443. openAIGateway *service.OpenAIGatewayService,
  444. scheduledTestRunner *service.ScheduledTestRunnerService,
  445. intelligentTests *service.IntelligentTestService,
  446. backupSvc *service.BackupService,
  447. paymentOrderExpiry *service.PaymentOrderExpiryService,
  448. channelMonitorRunner *service.ChannelMonitorRunner,
  449. channelMonitorV2Aggregator *service.ChannelMonitorV2Aggregator,
  450. quotaFlusher *service.UserPlatformQuotaUsageFlusher,
  451. upstreamBillingProbe *service.UpstreamBillingProbeService,
  452. ollamaCloudUsage *service.OllamaCloudUsageService,
  453. auditLog *service.AuditLogService,
  454. openAIAutoReset *service.OpenAIQuotaAutoResetService,
  455. promptAudit *securityaudit.PromptService,
  456. pluginManager *service.PluginManager,
  457. ) func() {
  458. return func() {
  459. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  460. defer cancel()
  461. type cleanupStep struct {
  462. name string
  463. fn func() error
  464. }
  465. parallelSteps := []cleanupStep{
  466. {"IntelligentTests", func() error {
  467. if intelligentTests != nil {
  468. intelligentTests.Stop()
  469. }
  470. return nil
  471. }},
  472. {"PluginManager", func() error {
  473. if pluginManager != nil {
  474. pluginManager.Stop()
  475. }
  476. return nil
  477. }},
  478. {"OpenAIQuotaAutoResetService", func() error {
  479. if openAIAutoReset != nil {
  480. openAIAutoReset.Stop()
  481. }
  482. return nil
  483. }},
  484. {"OpsIngressRejectAggregator", func() error {
  485. if opsIngressReject != nil {
  486. opsIngressReject.Stop()
  487. }
  488. return nil
  489. }},
  490. {"AuthCacheInvalidationWorker", func() error {
  491. if authCacheInvalidationWorker != nil {
  492. authCacheInvalidationWorker.Stop()
  493. }
  494. return nil
  495. }},
  496. {"AuthCacheInvalidationSubscriber", func() error {
  497. if apiKeyService != nil {
  498. apiKeyService.StopAuthCacheInvalidationSubscriber()
  499. }
  500. return nil
  501. }},
  502. {"OpsRuntimeSettingsRefresh", func() error {
  503. if opsService != nil {
  504. opsService.StopRuntimeSettingsRefresh()
  505. }
  506. return nil
  507. }},
  508. {"PromptAuditService", func() error {
  509. if promptAudit != nil {
  510. return promptAudit.Shutdown(ctx)
  511. }
  512. return nil
  513. }},
  514. {"OpsScheduledReportService", func() error {
  515. if opsScheduledReport != nil {
  516. opsScheduledReport.Stop()
  517. }
  518. return nil
  519. }},
  520. {"OpsCleanupService", func() error {
  521. if opsCleanup != nil {
  522. opsCleanup.Stop()
  523. }
  524. return nil
  525. }},
  526. {"OpsSystemLogSink", func() error {
  527. if opsSystemLogSink != nil {
  528. opsSystemLogSink.Stop()
  529. }
  530. return nil
  531. }},
  532. {"AuditLogService", func() error {
  533. if auditLog != nil {
  534. auditLog.Stop()
  535. }
  536. return nil
  537. }},
  538. {"OpsAlertEvaluatorService", func() error {
  539. if opsAlertEvaluator != nil {
  540. opsAlertEvaluator.Stop()
  541. }
  542. return nil
  543. }},
  544. {"OpsAggregationService", func() error {
  545. if opsAggregation != nil {
  546. opsAggregation.Stop()
  547. }
  548. return nil
  549. }},
  550. {"OpsMetricsCollector", func() error {
  551. if opsMetricsCollector != nil {
  552. opsMetricsCollector.Stop()
  553. }
  554. return nil
  555. }},
  556. {"SchedulerSnapshotService", func() error {
  557. if schedulerSnapshot != nil {
  558. schedulerSnapshot.Stop()
  559. }
  560. return nil
  561. }},
  562. {"UsageCleanupService", func() error {
  563. if usageCleanup != nil {
  564. usageCleanup.Stop()
  565. }
  566. return nil
  567. }},
  568. {"IdempotencyCleanupService", func() error {
  569. if idempotencyCleanup != nil {
  570. idempotencyCleanup.Stop()
  571. }
  572. return nil
  573. }},
  574. {"BatchImageCleanupService", func() error {
  575. if batchImageCleanup != nil {
  576. batchImageCleanup.Stop()
  577. }
  578. return nil
  579. }},
  580. {"BatchImageWorkerRuntime", func() error {
  581. if batchImageWorker != nil {
  582. batchImageWorker.Stop()
  583. }
  584. return nil
  585. }},
  586. {"TokenRefreshService", func() error {
  587. tokenRefresh.Stop()
  588. return nil
  589. }},
  590. {"AccountExpiryService", func() error {
  591. accountExpiry.Stop()
  592. return nil
  593. }},
  594. {"CNProviderBalanceCheckService", func() error {
  595. if cnProviderBalanceCheck != nil {
  596. cnProviderBalanceCheck.Stop()
  597. }
  598. return nil
  599. }},
  600. {"OpenAICodexVersionSyncService", func() error {
  601. codexVersionSync.Stop()
  602. return nil
  603. }},
  604. {"ProxyExpiryService", func() error {
  605. proxyExpiry.Stop()
  606. return nil
  607. }},
  608. {"AccountHealthService", func() error {
  609. accountHealth.Stop()
  610. return nil
  611. }},
  612. {"MarginService", func() error {
  613. margin.Stop()
  614. return nil
  615. }},
  616. {"SpendGuardService", func() error {
  617. spendGuard.Stop()
  618. return nil
  619. }},
  620. {"SubscriptionExpiryService", func() error {
  621. subscriptionExpiry.Stop()
  622. return nil
  623. }},
  624. {"SubscriptionService", func() error {
  625. if subscriptionService != nil {
  626. subscriptionService.Stop()
  627. }
  628. return nil
  629. }},
  630. {"PricingService", func() error {
  631. pricing.Stop()
  632. return nil
  633. }},
  634. {"EmailQueueService", func() error {
  635. emailQueue.Stop()
  636. return nil
  637. }},
  638. {"BillingCacheService", func() error {
  639. billingCache.Stop()
  640. return nil
  641. }},
  642. {"UsageRecordWorkerPool", func() error {
  643. if usageRecordWorkerPool != nil {
  644. usageRecordWorkerPool.Stop()
  645. }
  646. return nil
  647. }},
  648. {"OAuthService", func() error {
  649. oauth.Stop()
  650. return nil
  651. }},
  652. {"OpenAIOAuthService", func() error {
  653. openaiOAuth.Stop()
  654. return nil
  655. }},
  656. {"GeminiOAuthService", func() error {
  657. geminiOAuth.Stop()
  658. return nil
  659. }},
  660. {"AntigravityOAuthService", func() error {
  661. antigravityOAuth.Stop()
  662. return nil
  663. }},
  664. {"GrokOAuthService", func() error {
  665. if grokOAuth != nil {
  666. grokOAuth.Stop()
  667. }
  668. return nil
  669. }},
  670. {"OpenAIWSPool", func() error {
  671. if openAIGateway != nil {
  672. openAIGateway.CloseOpenAIWSPool()
  673. }
  674. return nil
  675. }},
  676. {"ScheduledTestRunnerService", func() error {
  677. if scheduledTestRunner != nil {
  678. scheduledTestRunner.Stop()
  679. }
  680. return nil
  681. }},
  682. {"BackupService", func() error {
  683. if backupSvc != nil {
  684. backupSvc.Stop()
  685. }
  686. return nil
  687. }},
  688. {"PaymentOrderExpiryService", func() error {
  689. if paymentOrderExpiry != nil {
  690. paymentOrderExpiry.Stop()
  691. }
  692. return nil
  693. }},
  694. {"ChannelMonitorV2Aggregator", func() error {
  695. if channelMonitorV2Aggregator != nil {
  696. channelMonitorV2Aggregator.Stop()
  697. }
  698. return nil
  699. }},
  700. {"ChannelMonitorRunner", func() error {
  701. if channelMonitorRunner != nil {
  702. channelMonitorRunner.Stop()
  703. }
  704. return nil
  705. }},
  706. {"UserPlatformQuotaUsageFlusher", func() error {
  707. if quotaFlusher != nil {
  708. quotaFlusher.Stop()
  709. }
  710. return nil
  711. }},
  712. {"UpstreamBillingProbeService", func() error {
  713. if upstreamBillingProbe != nil {
  714. upstreamBillingProbe.Stop()
  715. }
  716. return nil
  717. }},
  718. {"OllamaCloudUsageService", func() error {
  719. if ollamaCloudUsage != nil {
  720. ollamaCloudUsage.Stop()
  721. }
  722. return nil
  723. }},
  724. }
  725. infraSteps := []cleanupStep{
  726. {"Redis", func() error {
  727. if rdb == nil {
  728. return nil
  729. }
  730. return rdb.Close()
  731. }},
  732. {"Ent", func() error {
  733. if entClient == nil {
  734. return nil
  735. }
  736. return entClient.Close()
  737. }},
  738. }
  739. runParallel := func(steps []cleanupStep) {
  740. var wg sync.WaitGroup
  741. for i := range steps {
  742. step := steps[i]
  743. wg.Add(1)
  744. go func() {
  745. defer wg.Done()
  746. if err := step.fn(); err != nil {
  747. log.Printf("[Cleanup] %s failed: %v", step.name, err)
  748. return
  749. }
  750. log.Printf("[Cleanup] %s succeeded", step.name)
  751. }()
  752. }
  753. wg.Wait()
  754. }
  755. runSequential := func(steps []cleanupStep) {
  756. for i := range steps {
  757. step := steps[i]
  758. if err := step.fn(); err != nil {
  759. log.Printf("[Cleanup] %s failed: %v", step.name, err)
  760. continue
  761. }
  762. log.Printf("[Cleanup] %s succeeded", step.name)
  763. }
  764. }
  765. runParallel(parallelSteps)
  766. runSequential(infraSteps)
  767. select {
  768. case <-ctx.Done():
  769. log.Printf("[Cleanup] Warning: cleanup timed out after 10 seconds")
  770. default:
  771. log.Printf("[Cleanup] All cleanup steps completed")
  772. }
  773. }
  774. }