package handler import ( "net/http" "silk-server-go/internal/middleware" "silk-server-go/internal/model" "github.com/gin-gonic/gin" "gorm.io/gorm" ) // RegisterSensorRoutes 注册传感器路由 func RegisterSensorRoutes(rg *gin.RouterGroup, db *gorm.DB) { rg.GET("/sensors", middleware.RequirePermission(db, "device:read"), listSensors(db)) rg.GET("/sensors/:id", middleware.RequirePermission(db, "device:read"), getSensor(db)) rg.POST("/sensors", middleware.RequirePermission(db, "room:write"), createSensor(db)) rg.PATCH("/sensors/:id", middleware.RequirePermission(db, "room:write"), updateSensor(db)) rg.DELETE("/sensors/:id", middleware.RequirePermission(db, "room:write"), deleteSensor(db)) } // listSensors 传感器列表 func listSensors(db *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { var sensors []model.Sensor q := db.Model(&model.Sensor{}). Joins("JOIN devices d ON d.id = sensors.device_id") q = applyRoomScope(q, c, "d.room_id") q.Order("sensors.created_at DESC").Find(&sensors) c.JSON(http.StatusOK, sensors) } } // getSensor 传感器详情 func getSensor(db *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { id := c.Param("id") if !requireObjectAccess(c, db, "sensor", id) { return } var sensor model.Sensor if db.Where("id = ?", id).First(&sensor).Error != nil { c.JSON(http.StatusNotFound, gin.H{"error": "sensor not found"}) return } c.JSON(http.StatusOK, sensor) } } // createSensor 新建传感器 func createSensor(db *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { var sensor model.Sensor if err := c.ShouldBindJSON(&sensor); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } sensor.ID = "" // 让数据库自动生成 if !isUUID(sensor.DeviceID) { c.JSON(http.StatusBadRequest, gin.H{"error": "deviceId 不是合法的 UUID"}) return } if !requireObjectAccess(c, db, "device", sensor.DeviceID) { return } if err := db.Create(&sensor).Error; err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "创建失败"}) return } c.JSON(http.StatusCreated, sensor) } } // updateSensor 更新传感器 func updateSensor(db *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { id := c.Param("id") if !requireObjectAccess(c, db, "sensor", id) { return } var sensor model.Sensor if db.Where("id = ?", id).First(&sensor).Error != nil { c.JSON(http.StatusNotFound, gin.H{"error": "sensor not found"}) return } updates, err := bindUpdates(c) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } if deviceID, ok := updates["device_id"].(string); ok && !requireObjectAccess(c, db, "device", deviceID) { return } if len(updates) > 0 { db.Model(&model.Sensor{}).Where("id = ?", id).Updates(updates) } db.Where("id = ?", id).First(&sensor) c.JSON(http.StatusOK, sensor) } } // deleteSensor 删除传感器 func deleteSensor(db *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { id := c.Param("id") if !requireObjectAccess(c, db, "sensor", id) { return } var sensor model.Sensor if db.Where("id = ?", id).First(&sensor).Error != nil { c.JSON(http.StatusNotFound, gin.H{"error": "sensor not found"}) return } db.Where("id = ?", id).Delete(&model.Sensor{}) c.JSON(http.StatusOK, gin.H{"id": id}) } }