package router import ( "net/http" "chatapp3-golang/internal/config" "chatapp3-golang/internal/service/taskcenter" "github.com/gin-gonic/gin" ) const taskCenterArchiveGCManagePermission = "resident-activity:task-center-archive-gc:manage" const taskCenterArchiveGCMenuAlias = "ResidentTaskCenterArchiveGC" // registerTaskCenterArchiveGCRoutes 只做管理命令/cron tick 的 HTTP 绑定;所有状态机、 // 租约、COS 校验和删除边界均由 taskcenter service 实现。 func registerTaskCenterArchiveGCRoutes(engine *gin.Engine, cfg config.Config, javaClient authGateway, service *taskcenter.Service) { if service == nil { return } admin := engine.Group("/resident-activity/task-center/archive-gc") admin.Use(consoleAuthMiddleware(javaClient)) admin.GET("/status", consoleMenuMiddleware(javaClient, taskCenterArchiveGCMenuAlias), func(c *gin.Context) { response, err := service.ArchiveGCStatus(c.Request.Context()) if err != nil { writeError(c, err) return } writeOK(c, response) }) admin.POST("/dry-run", consolePermissionMiddleware(javaClient, taskCenterArchiveGCManagePermission), func(c *gin.Context) { var request taskcenter.ArchiveGCDryRunRequest if err := c.ShouldBindJSON(&request); err != nil { writeError(c, taskcenter.NewAppError(http.StatusBadRequest, "bad_request", err.Error())) return } response, err := service.ArchiveGCDryRun(c.Request.Context(), request) if err != nil { writeError(c, err) return } writeOK(c, response) }) admin.POST("/start", consolePermissionMiddleware(javaClient, taskCenterArchiveGCManagePermission), func(c *gin.Context) { response, err := service.StartArchiveGC(c.Request.Context()) if err != nil { writeError(c, err) return } writeOK(c, response) }) admin.POST("/pause", consolePermissionMiddleware(javaClient, taskCenterArchiveGCManagePermission), func(c *gin.Context) { response, err := service.PauseArchiveGC(c.Request.Context()) if err != nil { writeError(c, err) return } writeOK(c, response) }) admin.POST("/resume", consolePermissionMiddleware(javaClient, taskCenterArchiveGCManagePermission), func(c *gin.Context) { response, err := service.ResumeArchiveGC(c.Request.Context()) if err != nil { writeError(c, err) return } writeOK(c, response) }) internal := engine.Group("/internal/task-center/archive-gc") // tick 会最终删除生产数据,密钥缺失也必须 fail-closed,不能沿用历史空密钥兼容。 internal.Use(requiredInternalSecretMiddleware(cfg.HTTP.InternalCallbackSecret)) internal.POST("/tick", func(c *gin.Context) { response, err := service.ArchiveGCTick(c.Request.Context()) if err != nil { writeError(c, err) return } writeOK(c, response) }) }