package handlers import ( "net/http" "github.com/celestia-trace/backend/models" "github.com/gin-gonic/gin" "gorm.io/gorm" ) type DeviceHandler struct { DB *gorm.DB } // GetDevices returns all bound devices for the authenticated user func (h *DeviceHandler) GetDevices(c *gin.Context) { userID := c.GetString("userID") var devices []models.BoundDevice if err := h.DB.Where("user_id = ?", userID).Order("bound_at desc").Find(&devices).Error; err != nil { respondError(c, http.StatusInternalServerError, 500, "failed to query devices") return } respondSuccess(c, devices) } // BindDevice binds a new Spark device to the authenticated user func (h *DeviceHandler) BindDevice(c *gin.Context) { userID := c.GetString("userID") var req models.BindDeviceRequest if err := c.ShouldBindJSON(&req); err != nil { respondError(c, http.StatusBadRequest, 400, "invalid device parameters") return } var device models.BoundDevice err := h.DB.Where("user_id = ? AND peripheral_uuid = ?", userID, req.PeripheralUUID).First(&device).Error if err != nil && err != gorm.ErrRecordNotFound { respondError(c, http.StatusInternalServerError, 500, "failed to query device") return } device.UserID = userID device.Name = req.Name device.PeripheralUUID = req.PeripheralUUID device.HardwareMAC = req.HardwareMAC device.FirmwareVersion = req.FirmwareVersion if req.BatteryLevel != nil { device.BatteryLevel = *req.BatteryLevel } if req.FreeStorageMB != nil { device.FreeStorageMB = *req.FreeStorageMB } if req.TotalStorageMB != nil { device.TotalStorageMB = *req.TotalStorageMB } device.IsConnected = true if err := h.DB.Save(&device).Error; err != nil { respondError(c, http.StatusInternalServerError, 500, "failed to bind device") return } respondSuccess(c, device) } // UpdateDevice updates device attributes (e.g. name or online status) func (h *DeviceHandler) UpdateDevice(c *gin.Context) { userID := c.GetString("userID") deviceID := c.Param("id") var req models.UpdateDeviceRequest if err := c.ShouldBindJSON(&req); err != nil { respondError(c, http.StatusBadRequest, 400, "invalid input data") return } var device models.BoundDevice if err := h.DB.Where("id = ? AND user_id = ?", deviceID, userID).First(&device).Error; err != nil { respondError(c, http.StatusNotFound, 404, "device not found") return } if req.Name != nil { device.Name = *req.Name } if req.BatteryLevel != nil { device.BatteryLevel = *req.BatteryLevel } if req.IsConnected != nil { device.IsConnected = *req.IsConnected } if req.FirmwareVersion != nil { device.FirmwareVersion = *req.FirmwareVersion } if req.FreeStorageMB != nil { device.FreeStorageMB = *req.FreeStorageMB } if req.TotalStorageMB != nil { device.TotalStorageMB = *req.TotalStorageMB } if err := h.DB.Save(&device).Error; err != nil { respondError(c, http.StatusInternalServerError, 500, "failed to update device") return } respondSuccess(c, device) } // UnbindDevice unbinds a Spark device func (h *DeviceHandler) UnbindDevice(c *gin.Context) { userID := c.GetString("userID") deviceID := c.Param("id") if err := h.DB.Where("id = ? AND user_id = ?", deviceID, userID).Delete(&models.BoundDevice{}).Error; err != nil { respondError(c, http.StatusInternalServerError, 500, "failed to unbind device") return } respondSuccess(c, gin.H{"deletedId": deviceID}) }