package handlers import ( "log" "net/http" "time" "github.com/Fimeg/RedFlag/aggregator-server/internal/database/queries" "github.com/Fimeg/RedFlag/aggregator-server/internal/models" "github.com/gin-gonic/gin" "github.com/google/uuid" ) // StorageMetricsHandler handles storage metrics endpoints type StorageMetricsHandler struct { queries *queries.StorageMetricsQueries } // NewStorageMetricsHandler creates a new storage metrics handler func NewStorageMetricsHandler(queries *queries.StorageMetricsQueries) *StorageMetricsHandler { return &StorageMetricsHandler{ queries: queries, } } // ReportStorageMetrics handles POST /api/v1/agents/:id/storage-metrics func (h *StorageMetricsHandler) ReportStorageMetrics(c *gin.Context) { // Get agent ID from context (set by middleware) agentID := c.MustGet("agent_id").(uuid.UUID) // Parse request body var req models.StorageMetricRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request body"}) return } // Validate agent ID matches if req.AgentID != agentID { c.JSON(http.StatusBadRequest, gin.H{"error": "Agent ID mismatch"}) return } // Insert storage metrics with error isolation for _, metric := range req.Metrics { dbMetric := models.StorageMetric{ ID: uuid.New(), AgentID: req.AgentID, Mountpoint: metric.Mountpoint, Device: metric.Device, DiskType: metric.DiskType, Filesystem: metric.Filesystem, TotalBytes: metric.TotalBytes, UsedBytes: metric.UsedBytes, AvailableBytes: metric.AvailableBytes, UsedPercent: metric.UsedPercent, Severity: metric.Severity, Metadata: metric.Metadata, CreatedAt: time.Now(), } if err := h.queries.InsertStorageMetric(c.Request.Context(), dbMetric); err != nil { log.Printf("[ERROR] Failed to insert storage metric for agent %s: %v\n", agentID, err) c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to insert storage metric"}) return } } c.JSON(http.StatusOK, gin.H{ "status": "success", "message": "Storage metrics reported successfully", }) } // GetStorageMetrics handles GET /api/v1/agents/:id/storage-metrics func (h *StorageMetricsHandler) GetStorageMetrics(c *gin.Context) { // Get agent ID from context (set by middleware) agentID := c.MustGet("agent_id").(uuid.UUID) // Get storage metrics metrics, err := h.queries.GetStorageMetricsByAgentID(c.Request.Context(), agentID, 100, 0) if err != nil { log.Printf("[ERROR] Failed to retrieve storage metrics for agent %s: %v\n", agentID, err) c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to retrieve storage metrics"}) return } c.JSON(http.StatusOK, gin.H{ "metrics": metrics, "total": len(metrics), }) }