package handlers import ( "ezops/internal/models" "net/http" "strconv" "github.com/gin-gonic/gin" "gorm.io/gorm" ) // SNMPHandler SNMP 设备管理 handler // Logan.Li type SNMPHandler struct { db *gorm.DB } // NewSNMPHandler 创建 SNMP handler func NewSNMPHandler(db *gorm.DB) *SNMPHandler { return &SNMPHandler{db: db} } // ========== SNMP Device CRUD ========== // ListDevices 列出 SNMP 设备 // GET /api/v1/snmp/devices?page=1&page_size=20&keyword= func (h *SNMPHandler) ListDevices(c *gin.Context) { var devices []models.SNMPDevice q := h.db.Model(&models.SNMPDevice{}) if kw := c.Query("keyword"); kw != "" { q = q.Where("name LIKE ? OR ip LIKE ?", "%"+kw+"%", "%"+kw+"%") } page, _ := strconv.Atoi(c.DefaultQuery("page", "1")) pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20")) var total int64 q.Count(&total) q.Offset((page - 1) * pageSize).Limit(pageSize).Order("name ASC").Find(&devices) if devices == nil { devices = []models.SNMPDevice{} } c.JSON(http.StatusOK, models.Response{Code: 200, Data: gin.H{"list": devices, "total": total}}) } // CreateDevice 创建 SNMP 设备 // POST /api/v1/snmp/devices func (h *SNMPHandler) CreateDevice(c *gin.Context) { var device models.SNMPDevice if err := c.ShouldBindJSON(&device); err != nil { c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: err.Error()}) return } if err := h.db.Create(&device).Error; err != nil { c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: err.Error()}) return } c.JSON(http.StatusOK, models.Response{Code: 200, Data: device, Message: "创建成功"}) } // UpdateDevice 更新 SNMP 设备 // PUT /api/v1/snmp/devices/:id func (h *SNMPHandler) UpdateDevice(c *gin.Context) { id := c.Param("id") var device models.SNMPDevice if err := h.db.First(&device, id).Error; err != nil { c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "设备不存在"}) return } if err := c.ShouldBindJSON(&device); err != nil { c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: err.Error()}) return } h.db.Save(&device) c.JSON(http.StatusOK, models.Response{Code: 200, Data: device, Message: "更新成功"}) } // DeleteDevice 删除 SNMP 设备 // DELETE /api/v1/snmp/devices/:id func (h *SNMPHandler) DeleteDevice(c *gin.Context) { id := c.Param("id") if err := h.db.Delete(&models.SNMPDevice{}, id).Error; err != nil { c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: err.Error()}) return } c.JSON(http.StatusOK, models.Response{Code: 200, Message: "删除成功"}) } // BatchDeleteDevices 批量删除 // DELETE /api/v1/snmp/devices/batch-delete func (h *SNMPHandler) BatchDeleteDevices(c *gin.Context) { var req models.IDsRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: err.Error()}) return } h.db.Where("id IN ?", req.IDs).Delete(&models.SNMPDevice{}) c.JSON(http.StatusOK, models.Response{Code: 200, Message: "批量删除成功"}) } // ========== SNMP Template CRUD ========== // ListTemplates 列出 OID 模板 // GET /api/v1/snmp/templates func (h *SNMPHandler) ListTemplates(c *gin.Context) { var templates []models.SNMPTemplate h.db.Order("name ASC").Find(&templates) if templates == nil { templates = []models.SNMPTemplate{} } c.JSON(http.StatusOK, models.Response{Code: 200, Data: templates}) } // CreateTemplate 创建 OID 模板 // POST /api/v1/snmp/templates func (h *SNMPHandler) CreateTemplate(c *gin.Context) { var template models.SNMPTemplate if err := c.ShouldBindJSON(&template); err != nil { c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: err.Error()}) return } if err := h.db.Create(&template).Error; err != nil { c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: err.Error()}) return } c.JSON(http.StatusOK, models.Response{Code: 200, Data: template, Message: "创建成功"}) } // ========== SNMP Statistics ========== // GetSNMPStats 获取 SNMP 概览统计 // GET /api/v1/snmp/stats func (h *SNMPHandler) GetSNMPStats(c *gin.Context) { var total, online int64 h.db.Model(&models.SNMPDevice{}).Count(&total) h.db.Model(&models.SNMPDevice{}).Where("status = ?", "online").Count(&online) c.JSON(http.StatusOK, models.Response{Code: 200, Data: gin.H{ "total": total, "online": online, "abnormal": total - online, }}) }