feat(ops): add job center for cross-source job operations

Provide a unified ops console for inspecting, retrying and cancelling
jobs across generation, template/kol assist, knowledge parse, desktop
publish/task, compliance review and monitoring collect sources. Wires
RabbitMQ for retry republish and consolidates the desktop_publish_jobs
columns into the base migration.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-06 12:56:39 +08:00
parent ab62d666b4
commit 7b4d7ccf68
13 changed files with 3043 additions and 12 deletions
+15
View File
@@ -19,6 +19,7 @@ import (
sharedauth "github.com/geo-platform/tenant-api/internal/shared/auth"
sharedbootstrap "github.com/geo-platform/tenant-api/internal/shared/bootstrap"
"github.com/geo-platform/tenant-api/internal/shared/cache"
"github.com/geo-platform/tenant-api/internal/shared/messaging/rabbitmq"
"github.com/geo-platform/tenant-api/internal/shared/observability"
"github.com/geo-platform/tenant-api/internal/shared/repository/postgres"
"github.com/geo-platform/tenant-api/internal/shared/repository/redis"
@@ -64,8 +65,20 @@ func main() {
defer func() { _ = rdb.Close() }()
appCache := cache.New(cfg.Cache.Driver, rdb)
var rabbitMQ *rabbitmq.Client
if cfg.RabbitMQ.URL != "" {
mq, mqErr := rabbitmq.New(ctx, cfg.RabbitMQ)
if mqErr != nil {
logger.Warn("rabbitmq unavailable during startup; job retry actions requiring queues are disabled", zap.Error(mqErr))
} else {
rabbitMQ = mq
defer func() { _ = rabbitMQ.Close() }()
}
}
accountsRepo := repository.NewAccountRepository(pool)
adminUsersRepo := repository.NewAdminUserRepository(pool)
jobsRepo := repository.NewJobRepository(pool, monitoringPool)
kolSubscriptionsRepo := repository.NewKolSubscriptionRepository(pool)
auditsRepo := repository.NewAuditRepository(pool)
siteDomainMappingsRepo := repository.NewSiteDomainMappingRepository(monitoringPool)
@@ -83,6 +96,7 @@ func main() {
accountSvc := app.NewAccountService(accountsRepo, auditSvc)
tenantLoginGuard := sharedauth.NewLoginGuard(rdb, sharedauth.DefaultLoginGuardConfig("tenant"))
adminUserSvc := app.NewAdminUserService(adminUsersRepo, auditSvc, cfg.AdminUsers.DefaultPlanCode).WithLoginGuard(tenantLoginGuard)
jobSvc := app.NewJobService(jobsRepo, auditSvc, rabbitMQ)
kolSubscriptionSvc := app.NewKolSubscriptionService(kolSubscriptionsRepo, auditSvc).WithCache(appCache)
siteDomainMappingSvc := app.NewSiteDomainMappingService(siteDomainMappingsRepo, auditSvc)
complianceSvc := app.NewComplianceService(pool, auditSvc, logger)
@@ -127,6 +141,7 @@ func main() {
Auth: authSvc,
Accounts: accountSvc,
AdminUsers: adminUserSvc,
Jobs: jobSvc,
KolSubs: kolSubscriptionSvc,
Audits: auditSvc,
SiteDomains: siteDomainMappingSvc,