Add monitoring service and database schema

- Implement monitoring service with heartbeat, lease tasks, resume tasks, and task result handling.
- Create monitoring time utilities for business date calculations.
- Add unit tests for date window resolution and business day handling.
- Define database schema for monitoring-related tables including quotas, daily reports, and task management.
- Establish migration scripts for creating and dropping monitoring tables.
This commit is contained in:
2026-04-12 09:56:18 +08:00
parent 9b4dd09780
commit 6066f43a7d
67 changed files with 16312 additions and 125 deletions
@@ -20,6 +20,14 @@ func RegisterRoutes(app *bootstrap.App) {
callbacks.POST("/bind", pluginHandler.PluginBindCallback)
callbacks.POST("/publish", pluginHandler.PluginPublishCallback)
monitoringCallbackHandler := NewMonitoringCallbackHandler(app)
monitoringPlugin := app.Engine.Group("/api/plugin/monitoring")
monitoringPlugin.POST("/heartbeat", monitoringCallbackHandler.Heartbeat)
monitoringPlugin.POST("/tasks/lease", monitoringCallbackHandler.LeaseTasks)
monitoringPlugin.POST("/tasks/resume", monitoringCallbackHandler.ResumeTasks)
monitoringPlugin.POST("/tasks/:id/result", monitoringCallbackHandler.TaskResult)
monitoringPlugin.POST("/tasks/:id/skip", monitoringCallbackHandler.SkipTask)
protected := app.Engine.Group("/api")
protected.Use(auth.Middleware(app.JWT, app.Sessions))
protected.Use(middleware.TenantScope())
@@ -89,6 +97,12 @@ func RegisterRoutes(app *bootstrap.App) {
brands.PUT("/:id/competitors/:cid", brandHandler.UpdateCompetitor)
brands.DELETE("/:id/competitors/:cid", brandHandler.DeleteCompetitor)
monitoring := protected.Group("/tenant/monitoring")
monitoringHandler := NewMonitoringHandler(app)
monitoring.GET("/dashboard/composite", monitoringHandler.DashboardComposite)
monitoring.GET("/brands/:brand_id/questions/:question_id/detail", monitoringHandler.QuestionDetail)
monitoring.POST("/brands/:brand_id/collect-now", monitoringHandler.CollectNow)
knowledge := protected.Group("/tenant/knowledge")
knowledgeHandler := NewKnowledgeHandler(app)
knowledge.GET("/groups", knowledgeHandler.ListGroups)