package handler import ( "spider/internal/model" "github.com/gin-gonic/gin" "gorm.io/gorm" ) // DashboardHandler handles the dashboard summary endpoint. type DashboardHandler struct { db *gorm.DB } // Get returns aggregated dashboard statistics. // GET /dashboard func (h *DashboardHandler) Get(c *gin.Context) { var channelsTotal int64 h.db.Model(&model.Channel{}).Count(&channelsTotal) var merchantsRawTotal int64 h.db.Model(&model.MerchantRaw{}).Count(&merchantsRawTotal) var merchantsCleanTotal int64 h.db.Model(&model.MerchantClean{}).Count(&merchantsCleanTotal) var merchantsValid int64 h.db.Model(&model.MerchantClean{}).Where("status = ?", "valid").Count(&merchantsValid) var navSitesTotal int64 h.db.Model(&model.NavSite{}).Count(&navSitesTotal) var seedsTotal int64 h.db.Model(&model.ManagedSeed{}).Count(&seedsTotal) var keywordsTotal int64 h.db.Model(&model.ManagedKeyword{}).Count(&keywordsTotal) // Recent 5 tasks. var recentTasks []model.Task h.db.Order("created_at DESC").Limit(5).Find(&recentTasks) // Currently running task (first one). var runningTask *model.Task var rt model.Task if err := h.db.Where("status = ?", "running").First(&rt).Error; err == nil { runningTask = &rt } OK(c, gin.H{ "channels_total": channelsTotal, "merchants_raw_total": merchantsRawTotal, "merchants_clean_total": merchantsCleanTotal, "merchants_valid": merchantsValid, "nav_sites_total": navSitesTotal, "seeds_total": seedsTotal, "keywords_total": keywordsTotal, "recent_tasks": recentTasks, "running_task": runningTask, }) }