| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- 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})
- }
|