package handler import ( "net/http" "sql-platform/internal/middleware" "sql-platform/internal/model" "github.com/gin-gonic/gin" ) // GET /api/v1/dashboard/stats func DashboardStats(c *gin.Context) { var ticketCount, queryCount, instanceCount int64 model.DB.Model(&model.Ticket{}).Count(&ticketCount) model.DB.Model(&model.QueryHistory{}).Count(&queryCount) model.DB.Model(&model.Instance{}).Count(&instanceCount) c.JSON(http.StatusOK, gin.H{ "ticket_count": ticketCount, "query_count": queryCount, "instance_count": instanceCount, }) } // GET /api/v1/dashboard/my-tickets func MyTickets(c *gin.Context) { userID, _, role := middleware.GetCurrentUser(c) var tickets []model.Ticket query := model.DB.Order("id DESC").Limit(10) switch role { case "admin": // Admin sees all pending/executing tickets query = query.Where("status IN ?", []string{"pending", "reviewing", "executing"}) case "dba", "auditor": // DBA sees their own + pending approval query = query.Where( "(applicant_id = ? AND status IN ?) OR (id IN (SELECT ticket_id FROM ticket_approvals WHERE approver_id = ?) AND status IN ?)", userID, []string{"pending", "executing"}, userID, []string{"pending", "reviewing", "executing"}, ) default: // developer query = query.Where("applicant_id = ?", userID) } query.Find(&tickets) type ticketWithRelation struct { model.Ticket Relation string `json:"relation"` // "submitted" or "pending_approval" } var result []ticketWithRelation for _, t := range tickets { rel := "submitted" if t.ApplicantID != userID { rel = "pending_approval" } result = append(result, ticketWithRelation{Ticket: t, Relation: rel}) } if result == nil { result = []ticketWithRelation{} } c.JSON(http.StatusOK, result) }