Files
2026-07-09 14:16:56 +08:00

164 lines
5.1 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package controller
import (
"encoding/json"
"net/http"
"strconv"
"ezops/model"
"github.com/gin-gonic/gin"
)
// 告警联系人 + 联系组 CRUD(AlertHandler 方法接收者) // Logan.Li
// ==================== 联系人 ====================
// ListContacts GET /alerts/contacts
func (h *AlertHandler) ListContacts(c *gin.Context) {
var contacts []model.AlertContact
h.db.Order("created_at DESC").Find(&contacts)
c.JSON(http.StatusOK, model.Response{
Code: 200,
Message: "success",
Data: model.ListResponse{List: contacts, Total: int64(len(contacts))},
})
}
// CreateContact POST /alerts/contacts
func (h *AlertHandler) CreateContact(c *gin.Context) {
var req model.CreateContactRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "请求参数错误: " + err.Error()})
return
}
contact := model.AlertContact{
Name: req.Name,
Phone: req.Phone,
Email: req.Email,
ChannelType: req.ChannelType,
WebhookURL: req.WebhookURL,
}
if err := h.db.Create(&contact).Error; err != nil {
c.JSON(http.StatusInternalServerError, model.Response{Code: 500, Message: "创建失败"})
return
}
c.JSON(http.StatusOK, model.Response{Code: 200, Message: "创建成功", Data: contact})
}
// UpdateContact PUT /alerts/contacts/:id
func (h *AlertHandler) UpdateContact(c *gin.Context) {
id, _ := strconv.Atoi(c.Param("id"))
var req model.UpdateContactRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "请求参数错误"})
return
}
var contact model.AlertContact
if err := h.db.First(&contact, id).Error; err != nil {
c.JSON(http.StatusNotFound, model.Response{Code: 404, Message: "联系人不存在"})
return
}
updates := map[string]interface{}{}
if req.Name != "" {
updates["name"] = req.Name
}
if req.Phone != "" {
updates["phone"] = req.Phone
}
if req.Email != "" {
updates["email"] = req.Email
}
if req.ChannelType != "" {
updates["channel_type"] = req.ChannelType
}
if req.WebhookURL != "" {
updates["webhook_url"] = req.WebhookURL
}
h.db.Model(&contact).Updates(updates)
h.db.First(&contact, id)
c.JSON(http.StatusOK, model.Response{Code: 200, Message: "更新成功", Data: contact})
}
// DeleteContact DELETE /alerts/contacts/:id
func (h *AlertHandler) DeleteContact(c *gin.Context) {
id, _ := strconv.Atoi(c.Param("id"))
if err := h.db.Delete(&model.AlertContact{}, id).Error; err != nil {
c.JSON(http.StatusInternalServerError, model.Response{Code: 500, Message: "删除失败"})
return
}
c.JSON(http.StatusOK, model.Response{Code: 200, Message: "删除成功"})
}
// ==================== 联系组 ====================
// ListContactGroups GET /alerts/contact-groups
func (h *AlertHandler) ListContactGroups(c *gin.Context) {
var groups []model.AlertContactGroup
h.db.Order("created_at DESC").Find(&groups)
c.JSON(http.StatusOK, model.Response{
Code: 200,
Message: "success",
Data: model.ListResponse{List: groups, Total: int64(len(groups))},
})
}
// CreateContactGroup POST /alerts/contact-groups
func (h *AlertHandler) CreateContactGroup(c *gin.Context) {
var req model.CreateContactGroupRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "请求参数错误: " + err.Error()})
return
}
idsJSON, _ := json.Marshal(req.ContactIDs)
group := model.AlertContactGroup{
GroupName: req.GroupName,
Notes: req.Notes,
ContactIDs: string(idsJSON),
}
if err := h.db.Create(&group).Error; err != nil {
c.JSON(http.StatusInternalServerError, model.Response{Code: 500, Message: "创建失败"})
return
}
c.JSON(http.StatusOK, model.Response{Code: 200, Message: "创建成功", Data: group})
}
// UpdateContactGroup PUT /alerts/contact-groups/:id
func (h *AlertHandler) UpdateContactGroup(c *gin.Context) {
id, _ := strconv.Atoi(c.Param("id"))
var req model.UpdateContactGroupRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "请求参数错误"})
return
}
var group model.AlertContactGroup
if err := h.db.First(&group, id).Error; err != nil {
c.JSON(http.StatusNotFound, model.Response{Code: 404, Message: "联系组不存在"})
return
}
updates := map[string]interface{}{}
if req.GroupName != "" {
updates["group_name"] = req.GroupName
}
if req.Notes != "" {
updates["notes"] = req.Notes
}
if len(req.ContactIDs) > 0 {
idsJSON, _ := json.Marshal(req.ContactIDs)
updates["contact_ids"] = string(idsJSON)
}
h.db.Model(&group).Updates(updates)
h.db.First(&group, id)
c.JSON(http.StatusOK, model.Response{Code: 200, Message: "更新成功", Data: group})
}
// DeleteContactGroup DELETE /alerts/contact-groups/:id
func (h *AlertHandler) DeleteContactGroup(c *gin.Context) {
id, _ := strconv.Atoi(c.Param("id"))
if err := h.db.Delete(&model.AlertContactGroup{}, id).Error; err != nil {
c.JSON(http.StatusInternalServerError, model.Response{Code: 500, Message: "删除失败"})
return
}
c.JSON(http.StatusOK, model.Response{Code: 200, Message: "删除成功"})
}