package handler import ( "net/http" "pc-monitor-server/model" "pc-monitor-server/service" "time" "github.com/gin-gonic/gin" ) type MetricsHandler struct { service *service.MetricsService } func NewMetricsHandler(service *service.MetricsService) *MetricsHandler { return &MetricsHandler{service: service} } type ReportRequest struct { DeviceID string `json:"device_id" binding:"required"` model.Metrics } func (h *MetricsHandler) Report(c *gin.Context) { var req ReportRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } metrics := req.Metrics metrics.DeviceID = req.DeviceID metrics.Timestamp = time.Now() if err := h.service.Save(&metrics); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"message": "Metrics saved"}) } func (h *MetricsHandler) GetLatest(c *gin.Context) { deviceID := c.Param("id") metrics, err := h.service.GetLatest(deviceID) if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "No metrics found"}) return } c.JSON(http.StatusOK, gin.H{"metrics": metrics}) } func (h *MetricsHandler) GetHistory(c *gin.Context) { deviceID := c.Param("id") startStr := c.Query("start") endStr := c.Query("end") start := time.Now().Add(-1 * time.Hour) end := time.Now() if startStr != "" { if t, err := time.Parse(time.RFC3339, startStr); err == nil { start = t } } if endStr != "" { if t, err := time.Parse(time.RFC3339, endStr); err == nil { end = t } } metrics, err := h.service.GetHistory(deviceID, start, end, 1000) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } c.JSON(http.StatusOK, gin.H{"metrics": metrics}) }