Files
silk/server-go/internal/handler/sensor.go
T
2026-08-17 21:43:26 +08:00

118 lines
3.3 KiB
Go

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