package handlers import ( "net/http" "strconv" "strings" "ezops/internal/models" "github.com/gin-gonic/gin" "gorm.io/gorm" ) // ==================== 区域管理(Region)==================== // RegionHandler 区域处理器 type RegionHandler struct { db *gorm.DB } func NewRegionHandler(db *gorm.DB) *RegionHandler { return &RegionHandler{db: db} } // regionRequest 区域创建/更新请求 type regionRequest struct { Name string `json:"name"` Code string `json:"code"` Provider string `json:"provider"` Location string `json:"location"` Status string `json:"status"` Endpoint string `json:"endpoint"` } // ListRegions 获取区域列表 func (h *RegionHandler) ListRegions(c *gin.Context) { var regions []models.Region h.db.Find(®ions) c.JSON(http.StatusOK, models.Response{ Code: 200, Message: "success", Data: models.ListResponse{ List: regions, Total: int64(len(regions)), }, }) } // CreateRegion 创建区域 func (h *RegionHandler) CreateRegion(c *gin.Context) { var req regionRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "请求参数错误: " + err.Error()}) return } if strings.TrimSpace(req.Name) == "" || strings.TrimSpace(req.Code) == "" { c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "区域名称和编码不能为空"}) return } status := strings.TrimSpace(req.Status) if status == "" { status = "active" } region := models.Region{ Name: strings.TrimSpace(req.Name), Code: strings.TrimSpace(req.Code), Provider: strings.TrimSpace(req.Provider), Location: req.Location, Status: status, Endpoint: req.Endpoint, } if err := h.db.Create(®ion).Error; err != nil { c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "创建失败,编码可能已存在"}) return } c.JSON(http.StatusOK, models.Response{Code: 200, Message: "创建成功", Data: region}) } // UpdateRegion 更新区域 func (h *RegionHandler) UpdateRegion(c *gin.Context) { id, _ := strconv.Atoi(c.Param("id")) var req regionRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "请求参数错误: " + err.Error()}) return } var region models.Region if err := h.db.First(®ion, id).Error; err != nil { c.JSON(http.StatusNotFound, models.Response{Code: 404, Message: "区域不存在"}) return } if strings.TrimSpace(req.Name) != "" { region.Name = strings.TrimSpace(req.Name) } if strings.TrimSpace(req.Code) != "" { region.Code = strings.TrimSpace(req.Code) } if strings.TrimSpace(req.Provider) != "" { region.Provider = strings.TrimSpace(req.Provider) } region.Location = req.Location if strings.TrimSpace(req.Status) != "" { region.Status = strings.TrimSpace(req.Status) } region.Endpoint = req.Endpoint if err := h.db.Save(®ion).Error; err != nil { c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "更新失败"}) return } c.JSON(http.StatusOK, models.Response{Code: 200, Message: "更新成功", Data: region}) } // DeleteRegion 删除区域 func (h *RegionHandler) DeleteRegion(c *gin.Context) { id, _ := strconv.Atoi(c.Param("id")) if err := h.db.Delete(&models.Region{}, id).Error; err != nil { c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "删除失败"}) return } c.JSON(http.StatusOK, models.Response{Code: 200, Message: "删除成功"}) } // BatchDeleteRegions 批量删除区域 // Logan.Li // @Summary 批量删除区域 // @Description 批量删除区域 // @Tags 云区域 // @Accept json // @Produce json // @Security Bearer // @Param request body models.IDsRequest true "删除请求" // @Success 200 {object} models.Response // @Router /regions/batch-delete [delete] func (h *RegionHandler) BatchDeleteRegions(c *gin.Context) { var req models.IDsRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, models.Response{Code: 400, Message: "请求参数错误"}) return } if err := h.db.Delete(&models.Region{}, req.IDs).Error; err != nil { c.JSON(http.StatusInternalServerError, models.Response{Code: 500, Message: "删除失败"}) return } c.JSON(http.StatusOK, models.Response{Code: 200, Message: "删除成功"}) }