package api import ( "net/http" "github.com/gin-gonic/gin" "oci-portal/internal/oci" ) // swag 解析 @Success 里的 oci.ReservedIP 需要本文件持有该包导入 var _ = oci.ReservedIP{} // ---- 保留公网 IP ---- // @Summary 保留 IP 列表 // @Tags 网络 // @Param id path int true "配置 ID" // @Param region query string false "区域,空为主区域" // @Param compartmentId query string false "区间 OCID,空为生效区间" // @Success 200 {array} oci.ReservedIP // @Security BearerAuth // @Router /api/v1/oci-configs/{id}/reserved-ips [get] func (h *ociConfigHandler) listReservedIPs(c *gin.Context) { id, ok := pathID(c) if !ok { return } ips, err := h.svc.ReservedIPs(c.Request.Context(), id, c.Query("region"), c.Query("compartmentId")) if err != nil { respondError(c, err) return } c.JSON(http.StatusOK, ips) } // @Summary 创建保留 IP // @Tags 网络 // @Param id path int true "配置 ID" // @Param body body object true "请求体:region、compartmentId、displayName" // @Success 201 {object} oci.ReservedIP // @Security BearerAuth // @Router /api/v1/oci-configs/{id}/reserved-ips [post] func (h *ociConfigHandler) createReservedIP(c *gin.Context) { id, ok := pathID(c) if !ok { return } var req struct { Region string `json:"region"` CompartmentID string `json:"compartmentId"` DisplayName string `json:"displayName"` } _ = c.ShouldBindJSON(&req) ip, err := h.svc.CreateReservedIP(c.Request.Context(), id, req.Region, req.CompartmentID, req.DisplayName) if err != nil { respondError(c, err) return } c.JSON(http.StatusCreated, ip) } // @Summary 绑定/解绑保留 IP // @Description vnicId 非空时绑到该网卡,否则绑 instanceId 主网卡(两者都空为解绑);目标已有公网 IP 时自动释放/解绑 // @Tags 网络 // @Param id path int true "配置 ID" // @Param publicIpId path string true "保留 IP OCID" // @Param body body object true "请求体:region、instanceId、vnicId" // @Success 204 "绑定成功" // @Security BearerAuth // @Router /api/v1/oci-configs/{id}/reserved-ips/{publicIpId} [put] func (h *ociConfigHandler) assignReservedIP(c *gin.Context) { id, ok := pathID(c) if !ok { return } var req struct { Region string `json:"region"` InstanceID string `json:"instanceId"` VnicID string `json:"vnicId"` } _ = c.ShouldBindJSON(&req) err := h.svc.AssignReservedIP(c.Request.Context(), id, req.Region, c.Param("publicIpId"), req.InstanceID, req.VnicID) if err != nil { respondError(c, err) return } c.Status(http.StatusNoContent) } // @Summary 删除保留 IP // @Tags 网络 // @Param id path int true "配置 ID" // @Param publicIpId path string true "保留 IP OCID" // @Param region query string false "区域" // @Success 204 "删除成功" // @Security BearerAuth // @Router /api/v1/oci-configs/{id}/reserved-ips/{publicIpId} [delete] func (h *ociConfigHandler) deleteReservedIP(c *gin.Context) { id, ok := pathID(c) if !ok { return } err := h.svc.DeleteReservedIP(c.Request.Context(), id, c.Query("region"), c.Param("publicIpId")) if err != nil { respondError(c, err) return } c.Status(http.StatusNoContent) }