device_handler.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package handlers
  2. import (
  3. "net/http"
  4. "github.com/celestia-trace/backend/models"
  5. "github.com/gin-gonic/gin"
  6. "gorm.io/gorm"
  7. )
  8. type DeviceHandler struct {
  9. DB *gorm.DB
  10. }
  11. // GetDevices returns all bound devices for the authenticated user
  12. func (h *DeviceHandler) GetDevices(c *gin.Context) {
  13. userID := c.GetString("userID")
  14. var devices []models.BoundDevice
  15. if err := h.DB.Where("user_id = ?", userID).Order("bound_at desc").Find(&devices).Error; err != nil {
  16. respondError(c, http.StatusInternalServerError, 500, "failed to query devices")
  17. return
  18. }
  19. respondSuccess(c, devices)
  20. }
  21. // BindDevice binds a new Spark device to the authenticated user
  22. func (h *DeviceHandler) BindDevice(c *gin.Context) {
  23. userID := c.GetString("userID")
  24. var req models.BindDeviceRequest
  25. if err := c.ShouldBindJSON(&req); err != nil {
  26. respondError(c, http.StatusBadRequest, 400, "invalid device parameters")
  27. return
  28. }
  29. var device models.BoundDevice
  30. err := h.DB.Where("user_id = ? AND peripheral_uuid = ?", userID, req.PeripheralUUID).First(&device).Error
  31. if err != nil && err != gorm.ErrRecordNotFound {
  32. respondError(c, http.StatusInternalServerError, 500, "failed to query device")
  33. return
  34. }
  35. device.UserID = userID
  36. device.Name = req.Name
  37. device.PeripheralUUID = req.PeripheralUUID
  38. device.HardwareMAC = req.HardwareMAC
  39. device.FirmwareVersion = req.FirmwareVersion
  40. if req.BatteryLevel != nil {
  41. device.BatteryLevel = *req.BatteryLevel
  42. }
  43. if req.FreeStorageMB != nil {
  44. device.FreeStorageMB = *req.FreeStorageMB
  45. }
  46. if req.TotalStorageMB != nil {
  47. device.TotalStorageMB = *req.TotalStorageMB
  48. }
  49. device.IsConnected = true
  50. if err := h.DB.Save(&device).Error; err != nil {
  51. respondError(c, http.StatusInternalServerError, 500, "failed to bind device")
  52. return
  53. }
  54. respondSuccess(c, device)
  55. }
  56. // UpdateDevice updates device attributes (e.g. name or online status)
  57. func (h *DeviceHandler) UpdateDevice(c *gin.Context) {
  58. userID := c.GetString("userID")
  59. deviceID := c.Param("id")
  60. var req models.UpdateDeviceRequest
  61. if err := c.ShouldBindJSON(&req); err != nil {
  62. respondError(c, http.StatusBadRequest, 400, "invalid input data")
  63. return
  64. }
  65. var device models.BoundDevice
  66. if err := h.DB.Where("id = ? AND user_id = ?", deviceID, userID).First(&device).Error; err != nil {
  67. respondError(c, http.StatusNotFound, 404, "device not found")
  68. return
  69. }
  70. if req.Name != nil {
  71. device.Name = *req.Name
  72. }
  73. if req.BatteryLevel != nil {
  74. device.BatteryLevel = *req.BatteryLevel
  75. }
  76. if req.IsConnected != nil {
  77. device.IsConnected = *req.IsConnected
  78. }
  79. if req.FirmwareVersion != nil {
  80. device.FirmwareVersion = *req.FirmwareVersion
  81. }
  82. if req.FreeStorageMB != nil {
  83. device.FreeStorageMB = *req.FreeStorageMB
  84. }
  85. if req.TotalStorageMB != nil {
  86. device.TotalStorageMB = *req.TotalStorageMB
  87. }
  88. if err := h.DB.Save(&device).Error; err != nil {
  89. respondError(c, http.StatusInternalServerError, 500, "failed to update device")
  90. return
  91. }
  92. respondSuccess(c, device)
  93. }
  94. // UnbindDevice unbinds a Spark device
  95. func (h *DeviceHandler) UnbindDevice(c *gin.Context) {
  96. userID := c.GetString("userID")
  97. deviceID := c.Param("id")
  98. if err := h.DB.Where("id = ? AND user_id = ?", deviceID, userID).Delete(&models.BoundDevice{}).Error; err != nil {
  99. respondError(c, http.StatusInternalServerError, 500, "failed to unbind device")
  100. return
  101. }
  102. respondSuccess(c, gin.H{"deletedId": deviceID})
  103. }