Browse Source

feat(admin): 新增网关 IP 管理功能

- 添加网关 IP 管理相关的 API、模型、仓库和服务
- 实现网关 IP 列表查询、添加、编辑和删除功能
- 优化代码结构,提高可维护性和可扩展性
fusu 3 tuần trước cách đây
mục cha
commit
04f502c6e0

+ 25 - 0
api/v1/admin/gatewayIp.go

@@ -0,0 +1,25 @@
+package admin
+type SearchGatewayIpParams struct {
+	Ip     string `form:"ip" json:"ip"`
+	HostId   int	`form:"hostId" json:"hostId"`
+	Name     string `form:"name" json:"name"`
+	NodeArea string `form:"nodeArea" json:"nodeArea"`
+	Operator int	`form:"operator" json:"operator"`
+	BanUdp       int `gorm:"null" json:"banUdp" form:"banUdp" default:"0"`
+	BanOverseas int `gorm:"null" json:"banOverseas" form:"banOverseas" default:"0"`
+	Comment  string `form:"comment" json:"comment"`
+	Current  int	`form:"current" json:"current" default:"1"`
+	PageSize int	`form:"pageSize" json:"pageSize" default:"10"`
+	Column   string `form:"column" json:"column" default:"id"`
+	Order    string `form:"order" json:"order" default:"desc"`
+}
+
+type GatewayIp struct {
+	Id int `json:"id" form:"id" validate:"required"`
+	Uid int `json:"uid" form:"uid"`
+}
+
+type DeleteGatewayIpRequest struct {
+	Ids []int64 `json:"ids" form:"ids" validate:"required,min=1,dive,required"`
+	Uid int `json:"uid" form:"uid" `
+}

+ 26 - 24
cmd/server/wire/wire.go

@@ -5,15 +5,15 @@ package wire
 
 import (
 	"github.com/go-nunu/nunu-layout-advanced/internal/handler"
-	admin3 "github.com/go-nunu/nunu-layout-advanced/internal/handler/admin"
-	waf3 "github.com/go-nunu/nunu-layout-advanced/internal/handler/api/waf"
+	adminHandler "github.com/go-nunu/nunu-layout-advanced/internal/handler/admin"
+	wafHandler "github.com/go-nunu/nunu-layout-advanced/internal/handler/api/waf"
 	"github.com/go-nunu/nunu-layout-advanced/internal/middleware"
 	"github.com/go-nunu/nunu-layout-advanced/internal/repository"
-	"github.com/go-nunu/nunu-layout-advanced/internal/repository/admin"
-	waf2 "github.com/go-nunu/nunu-layout-advanced/internal/repository/api/waf"
+	adminRep "github.com/go-nunu/nunu-layout-advanced/internal/repository/admin"
+	wafRep "github.com/go-nunu/nunu-layout-advanced/internal/repository/api/waf"
 	"github.com/go-nunu/nunu-layout-advanced/internal/server"
 	"github.com/go-nunu/nunu-layout-advanced/internal/service"
-	admin2 "github.com/go-nunu/nunu-layout-advanced/internal/service/admin"
+	"github.com/go-nunu/nunu-layout-advanced/internal/service/admin"
 	"github.com/go-nunu/nunu-layout-advanced/internal/service/api/gameShield"
 	"github.com/go-nunu/nunu-layout-advanced/internal/service/api/waf"
 	"github.com/go-nunu/nunu-layout-advanced/pkg/app"
@@ -35,35 +35,36 @@ var repositorySet = wire.NewSet(
 	repository.NewRabbitMQ,
 	repository.NewRepository,
 	repository.NewTransaction,
-	admin.NewAdminRepository,
-	admin.NewUserRepository,
+	adminRep.NewAdminRepository,
+	adminRep.NewUserRepository,
 	repository.NewGameShieldRepository,
 	repository.NewGameShieldPublicIpRepository,
-	waf2.NewWebForwardingRepository,
-	waf2.NewTcpforwardingRepository,
-	waf2.NewUdpForWardingRepository,
+	wafRep.NewWebForwardingRepository,
+	wafRep.NewTcpforwardingRepository,
+	wafRep.NewUdpForWardingRepository,
 	repository.NewGameShieldUserIpRepository,
 	repository.NewGameShieldBackendRepository,
 	repository.NewGameShieldSdkIpRepository,
 	repository.NewHostRepository,
-	waf2.NewGlobalLimitRepository,
+	wafRep.NewGlobalLimitRepository,
 	repository.NewGatewayGroupRepository,
 	repository.NewGateWayGroupIpRepository,
 	repository.NewCdnRepository,
-	waf2.NewAllowAndDenyIpRepository,
+	wafRep.NewAllowAndDenyIpRepository,
 	repository.NewProxyRepository,
 	repository.NewCcRepository,
 	repository.NewExpiredRepository,
 	repository.NewLogRepository,
-	waf2.NewGatewayipRepository,
+	wafRep.NewGatewayipRepository,
+	adminRep.NewGatewayIpAdminRepository,
 
 )
 
 var serviceSet = wire.NewSet(
 	service.NewService,
-	admin2.NewUserService,
-
-	admin2.NewAdminService,
+	admin.NewUserService,
+	admin.NewGatewayIpAdminService,
+	admin.NewAdminService,
 	gameShield.NewGameShieldService,
 	service.NewAoDunService,
 	service.NewGameShieldPublicIpService,
@@ -96,23 +97,24 @@ var serviceSet = wire.NewSet(
 
 var handlerSet = wire.NewSet(
 	handler.NewHandler,
-	admin3.NewUserHandler,
-	admin3.NewAdminHandler,
+	adminHandler.NewUserHandler,
+	adminHandler.NewAdminHandler,
+	adminHandler.NewGatewayIpAdminHandler,
 	handler.NewGameShieldHandler,
 	handler.NewGameShieldPublicIpHandler,
-	waf3.NewWebForwardingHandler,
-	waf3.NewTcpforwardingHandler,
-	waf3.NewUdpForWardingHandler,
+	wafHandler.NewWebForwardingHandler,
+	wafHandler.NewTcpforwardingHandler,
+	wafHandler.NewUdpForWardingHandler,
 	handler.NewGameShieldUserIpHandler,
 	handler.NewGameShieldBackendHandler,
 	handler.NewGameShieldSdkIpHandler,
 	handler.NewHostHandler,
-	waf3.NewGlobalLimitHandler,
+	wafHandler.NewGlobalLimitHandler,
 	handler.NewGatewayGroupHandler,
 	handler.NewGateWayGroupIpHandler,
-	waf3.NewAllowAndDenyIpHandler,
+	wafHandler.NewAllowAndDenyIpHandler,
 	handler.NewCcHandler,
-	waf3.NewGatewayipHandler,
+	wafHandler.NewGatewayipHandler,
 )
 
 

+ 3 - 3
cmd/server/wire/wire_gen.go

@@ -116,11 +116,11 @@ func NewWire(viperViper *viper.Viper, logger *log.Logger) (*app.App, func(), err
 
 // wire.go:
 
-var repositorySet = wire.NewSet(repository.NewDB, repository.NewRedis, repository.NewCasbinEnforcer, repository.NewMongoClient, repository.NewMongoDB, repository.NewRabbitMQ, repository.NewRepository, repository.NewTransaction, admin.NewAdminRepository, admin.NewUserRepository, repository.NewGameShieldRepository, repository.NewGameShieldPublicIpRepository, waf.NewWebForwardingRepository, waf.NewTcpforwardingRepository, waf.NewUdpForWardingRepository, repository.NewGameShieldUserIpRepository, repository.NewGameShieldBackendRepository, repository.NewGameShieldSdkIpRepository, repository.NewHostRepository, waf.NewGlobalLimitRepository, repository.NewGatewayGroupRepository, repository.NewGateWayGroupIpRepository, repository.NewCdnRepository, waf.NewAllowAndDenyIpRepository, repository.NewProxyRepository, repository.NewCcRepository, repository.NewExpiredRepository, repository.NewLogRepository, waf.NewGatewayipRepository)
+var repositorySet = wire.NewSet(repository.NewDB, repository.NewRedis, repository.NewCasbinEnforcer, repository.NewMongoClient, repository.NewMongoDB, repository.NewRabbitMQ, repository.NewRepository, repository.NewTransaction, admin.NewAdminRepository, admin.NewUserRepository, repository.NewGameShieldRepository, repository.NewGameShieldPublicIpRepository, waf.NewWebForwardingRepository, waf.NewTcpforwardingRepository, waf.NewUdpForWardingRepository, repository.NewGameShieldUserIpRepository, repository.NewGameShieldBackendRepository, repository.NewGameShieldSdkIpRepository, repository.NewHostRepository, waf.NewGlobalLimitRepository, repository.NewGatewayGroupRepository, repository.NewGateWayGroupIpRepository, repository.NewCdnRepository, waf.NewAllowAndDenyIpRepository, repository.NewProxyRepository, repository.NewCcRepository, repository.NewExpiredRepository, repository.NewLogRepository, waf.NewGatewayipRepository, admin.NewGatewayIpAdminRepository)
 
-var serviceSet = wire.NewSet(service.NewService, admin2.NewUserService, admin2.NewAdminService, gameShield.NewGameShieldService, service.NewAoDunService, service.NewGameShieldPublicIpService, service.NewDuedateService, service.NewFormatterService, service.NewParserService, service.NewRequiredService, service.NewCrawlerService, waf2.NewWebForwardingService, waf2.NewTcpforwardingService, waf2.NewUdpForWardingService, service.NewGameShieldUserIpService, gameShield.NewGameShieldBackendService, service.NewGameShieldSdkIpService, service.NewHostService, waf2.NewGlobalLimitService, service.NewGatewayGroupService, waf2.NewWafFormatterService, service.NewGateWayGroupIpService, service.NewRequestService, service.NewCdnService, waf2.NewAllowAndDenyIpService, service.NewProxyService, service.NewSslCertService, service.NewWebsocketService, service.NewCcService, service.NewLogService, waf2.NewGatewayipService)
+var serviceSet = wire.NewSet(service.NewService, admin2.NewUserService, admin2.NewGatewayIpAdminService, admin2.NewAdminService, gameShield.NewGameShieldService, service.NewAoDunService, service.NewGameShieldPublicIpService, service.NewDuedateService, service.NewFormatterService, service.NewParserService, service.NewRequiredService, service.NewCrawlerService, waf2.NewWebForwardingService, waf2.NewTcpforwardingService, waf2.NewUdpForWardingService, service.NewGameShieldUserIpService, gameShield.NewGameShieldBackendService, service.NewGameShieldSdkIpService, service.NewHostService, waf2.NewGlobalLimitService, service.NewGatewayGroupService, waf2.NewWafFormatterService, service.NewGateWayGroupIpService, service.NewRequestService, service.NewCdnService, waf2.NewAllowAndDenyIpService, service.NewProxyService, service.NewSslCertService, service.NewWebsocketService, service.NewCcService, service.NewLogService, waf2.NewGatewayipService)
 
-var handlerSet = wire.NewSet(handler.NewHandler, admin3.NewUserHandler, admin3.NewAdminHandler, handler.NewGameShieldHandler, handler.NewGameShieldPublicIpHandler, waf3.NewWebForwardingHandler, waf3.NewTcpforwardingHandler, waf3.NewUdpForWardingHandler, handler.NewGameShieldUserIpHandler, handler.NewGameShieldBackendHandler, handler.NewGameShieldSdkIpHandler, handler.NewHostHandler, waf3.NewGlobalLimitHandler, handler.NewGatewayGroupHandler, handler.NewGateWayGroupIpHandler, waf3.NewAllowAndDenyIpHandler, handler.NewCcHandler, waf3.NewGatewayipHandler)
+var handlerSet = wire.NewSet(handler.NewHandler, admin3.NewUserHandler, admin3.NewAdminHandler, admin3.NewGatewayIpAdminHandler, handler.NewGameShieldHandler, handler.NewGameShieldPublicIpHandler, waf3.NewWebForwardingHandler, waf3.NewTcpforwardingHandler, waf3.NewUdpForWardingHandler, handler.NewGameShieldUserIpHandler, handler.NewGameShieldBackendHandler, handler.NewGameShieldSdkIpHandler, handler.NewHostHandler, waf3.NewGlobalLimitHandler, handler.NewGatewayGroupHandler, handler.NewGateWayGroupIpHandler, waf3.NewAllowAndDenyIpHandler, handler.NewCcHandler, waf3.NewGatewayipHandler)
 
 // 限流器依赖集
 var limiterSet = wire.NewSet(limiter.NewLimiter, middleware.NewRateLimitMiddleware)

+ 111 - 0
internal/handler/admin/gatewayipadmin.go

@@ -0,0 +1,111 @@
+package admin
+
+import (
+	"github.com/gin-gonic/gin"
+	v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
+	v1admin "github.com/go-nunu/nunu-layout-advanced/api/v1/admin"
+	"github.com/go-nunu/nunu-layout-advanced/internal/handler"
+	"github.com/go-nunu/nunu-layout-advanced/internal/model"
+	"github.com/go-nunu/nunu-layout-advanced/internal/service/admin"
+	"net/http"
+)
+
+type GatewayIpAdminHandler struct {
+	*handler.Handler
+	gatewayIpAdminService admin.GatewayIpAdminService
+}
+
+func NewGatewayIpAdminHandler(
+    handler *handler.Handler,
+    gatewayIpAdminService admin.GatewayIpAdminService,
+) *GatewayIpAdminHandler {
+	return &GatewayIpAdminHandler{
+		Handler:      handler,
+		gatewayIpAdminService: gatewayIpAdminService,
+	}
+}
+
+func (h *GatewayIpAdminHandler) GetGatewayIpAdmin(ctx *gin.Context) {
+	var req v1admin.GatewayIp
+	if err := ctx.ShouldBindJSON(&req); err != nil {
+		v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
+		return
+	}
+
+	res, err := h.gatewayIpAdminService.GetGatewayIpAdmin(ctx, int64(req.Id))
+	if err != nil {
+		v1.HandleError(ctx, http.StatusUnauthorized, v1.ErrUnauthorized, nil)
+		return
+	}
+	v1.HandleSuccess(ctx, res)
+}
+
+func (h *GatewayIpAdminHandler) GetGatewayIpAdminList(ctx *gin.Context) {
+	var req v1admin.SearchGatewayIpParams
+	if err := ctx.ShouldBindJSON(&req); err != nil {
+		v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
+		return
+	}
+	res, err := h.gatewayIpAdminService.GetGatewayGroupIpList(ctx, req)
+	if err != nil {
+		v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
+		return
+	}
+	v1.HandleSuccess(ctx, res)
+}
+
+func (h *GatewayIpAdminHandler) AddGatewayIpAdmin(ctx *gin.Context) {
+	var req model.Gatewayip
+	if err := ctx.ShouldBindJSON(&req); err != nil {
+		v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
+		return
+	}
+	 err := h.gatewayIpAdminService.AddGatewayIp(ctx, req)
+	if err != nil {
+		v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
+		return
+	}
+	v1.HandleSuccess(ctx, nil)
+}
+
+func (h *GatewayIpAdminHandler) EditGatewayIpAdmin(ctx *gin.Context) {
+	var req model.Gatewayip
+	if err := ctx.ShouldBindJSON(&req); err != nil {
+		v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
+		return
+	}
+	err := h.gatewayIpAdminService.EditGatewayIp(ctx, req)
+	if err != nil {
+		v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
+		return
+	}
+	v1.HandleSuccess(ctx, nil)
+}
+
+func (h *GatewayIpAdminHandler) DeleteGatewayIpAdmin(ctx *gin.Context) {
+	var req v1admin.GatewayIp
+	if err := ctx.ShouldBindJSON(&req); err != nil {
+		v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
+		return
+	}
+	err := h.gatewayIpAdminService.DeleteGatewayIp(ctx, int64(req.Id))
+	if err != nil {
+		v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
+		return
+	}
+	v1.HandleSuccess(ctx, nil)
+}
+
+func (h *GatewayIpAdminHandler) DeleteGatewayIpsAdmin(ctx *gin.Context) {
+	var req v1admin.DeleteGatewayIpRequest
+	if err := ctx.ShouldBindJSON(&req); err != nil {
+		v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, nil)
+		return
+	}
+	err := h.gatewayIpAdminService.DeleteGatewayIps(ctx, req.Ids)
+	if err != nil {
+		v1.HandleError(ctx, http.StatusInternalServerError, v1.ErrInternalServerError, nil)
+		return
+	}
+	v1.HandleSuccess(ctx, nil)
+}

+ 11 - 0
internal/model/gatewayipadmin.go

@@ -0,0 +1,11 @@
+package model
+
+import "gorm.io/gorm"
+
+type GatewayIpAdmin struct {
+	gorm.Model
+}
+
+func (m *GatewayIpAdmin) TableName() string {
+    return "gateway_ip_admin"
+}

+ 148 - 0
internal/repository/admin/gatewayipadmin.go

@@ -0,0 +1,148 @@
+package admin
+
+import (
+    "context"
+	v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
+	"github.com/go-nunu/nunu-layout-advanced/api/v1/admin"
+	"github.com/go-nunu/nunu-layout-advanced/internal/model"
+	"github.com/go-nunu/nunu-layout-advanced/internal/repository"
+	"math"
+	"strings"
+)
+
+type GatewayIpAdminRepository interface {
+	GetGatewayIpAdmin(ctx context.Context, id int64) (*model.Gatewayip, error)
+	GetGatewayGroupIpList(ctx context.Context,req admin.SearchGatewayIpParams) (*v1.PaginatedResponse[model.Gatewayip], error)
+	AddGatewayIp(ctx context.Context,req model.Gatewayip) error
+	EditGatewayIp(ctx context.Context,req model.Gatewayip) error
+	DeleteGatewayIp(ctx context.Context,id int64) error
+	DeleteGatewayIps(ctx context.Context, ids []int64) error
+}
+
+func NewGatewayIpAdminRepository(
+	repository *repository.Repository,
+) GatewayIpAdminRepository {
+	return &gatewayIpAdminRepository{
+		Repository: repository,
+	}
+}
+
+type gatewayIpAdminRepository struct {
+	*repository.Repository
+}
+
+func (r *gatewayIpAdminRepository) GetGatewayIpAdmin(ctx context.Context, id int64) (*model.Gatewayip, error) {
+	var req model.Gatewayip
+
+	return &req, r.DB(ctx).Model(&model.Gatewayip{}).Where("id = ?", id).First(&req).Error
+}
+
+
+func (r *gatewayIpAdminRepository) GetGatewayGroupIpList(ctx context.Context,req admin.SearchGatewayIpParams) (*v1.PaginatedResponse[model.Gatewayip], error) {
+	var res []model.Gatewayip
+	var total int64
+
+	query := r.Db.WithContext(ctx).Model(&model.GateWayGroupIp{})
+	if  req.Ip != "" {
+		trimmedName := strings.TrimSpace(req.Ip)
+		// 使用 LIKE 进行模糊匹配
+		query = query.Where("ip LIKE CONCAT('%', ?, '%')", trimmedName)
+	}
+
+
+	if req.HostId != 0 {
+		query = query.Where("host_id = ?", req.HostId)
+	}
+
+	if req.Name != "" {
+		trimmedName := strings.TrimSpace(req.Name)
+		// 使用 LIKE 进行模糊匹配
+		query = query.Where("name LIKE CONCAT('%', ?, '%')", trimmedName)
+	}
+
+	if req.NodeArea != "" {
+		trimmedName := strings.TrimSpace(req.NodeArea)
+		// 使用 LIKE 进行模糊匹配
+		query = query.Where("node_area LIKE CONCAT('%', ?, '%')", trimmedName)
+	}
+
+	// 如果 Operator 被提供了
+	if req.Operator != 0 {
+		query = query.Where("operator = ?", req.Operator)
+	}
+
+	if req.BanUdp != 0 {
+		query = query.Where("ban_udp = ?", req.BanUdp)
+	}
+
+	if req.BanOverseas != 0 {
+		query = query.Where("ban_overseas = ?", req.BanOverseas)
+	}
+
+	if req.Comment != "" {
+		trimmedName := strings.TrimSpace(req.Comment)
+		// 使用 LIKE 进行模糊匹配
+		query = query.Where("comment LIKE CONCAT('%', ?, '%')", trimmedName)
+	}
+
+	if req.Column != "" {
+		if req.Column == "createTime" {
+			query = query.Order("created_at" + " " + req.Order)
+		}
+	}
+
+	if err := query.Count(&total).Error; err != nil {
+		// 如果连计数都失败了,直接返回错误
+		return nil, err
+	}
+
+
+	page := req.Current
+	pageSize := req.PageSize
+
+	if page <= 0 {
+		page = 1
+	}
+
+	if pageSize <= 0 {
+		pageSize = 10 // 默认每页 10 条
+	} else if pageSize > 100 {
+		pageSize = 100 // 每页最多 100 条
+	}
+
+	// 计算 offset (偏移量)
+	// 例如,第 1 页,offset = (1-1)*10 = 0 (从第0条开始)
+	// 第 2 页,offset = (2-1)*10 = 10 (从第10条开始)
+	offset := (page - 1) * pageSize
+	// 3. 执行最终的查询
+	// 在所有条件都添加完毕后,再执行 .Find()
+	result := query.Offset(offset).Limit(pageSize).Find(&res)
+	if result.Error != nil {
+		// 这里的错误可能是数据库连接问题等,而不是“未找到记录”
+		return nil, result.Error
+	}
+	return &v1.PaginatedResponse[model.Gatewayip]{
+		Records: res,
+		Page: page,
+		PageSize: pageSize,
+		Total: total,
+		TotalPages: int(math.Ceil(float64(total) / float64(pageSize))),
+
+	}, nil
+}
+
+func (r *gatewayIpAdminRepository) AddGatewayIp(ctx context.Context,req model.Gatewayip) error {
+	return r.DB(ctx).Create(&req).Error
+}
+
+func (r *gatewayIpAdminRepository) EditGatewayIp(ctx context.Context,req model.Gatewayip) error {
+	return r.DB(ctx).Updates(&req).Error
+}
+
+func (r *gatewayIpAdminRepository) DeleteGatewayIp(ctx context.Context,id int64) error {
+	return r.DB(ctx).Model(&model.Gatewayip{}).Where("id = ?", id).Delete(id).Error
+}
+
+func (r *gatewayIpAdminRepository) DeleteGatewayIps(ctx context.Context, ids []int64) error {
+	return r.DB(ctx).Model(&model.Gatewayip{}).Where("id in ?", ids).Delete(ids).Error
+}

+ 57 - 0
internal/service/admin/gatewayipadmin.go

@@ -0,0 +1,57 @@
+package admin
+
+import (
+	"context"
+	v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
+	v1admin "github.com/go-nunu/nunu-layout-advanced/api/v1/admin"
+	"github.com/go-nunu/nunu-layout-advanced/internal/model"
+	"github.com/go-nunu/nunu-layout-advanced/internal/repository/admin"
+	"github.com/go-nunu/nunu-layout-advanced/internal/service"
+)
+
+type GatewayIpAdminService interface {
+	GetGatewayIpAdmin(ctx context.Context, id int64) (*model.Gatewayip, error)
+	GetGatewayGroupIpList(ctx context.Context,req v1admin.SearchGatewayIpParams) (*v1.PaginatedResponse[model.Gatewayip], error)
+	AddGatewayIp(ctx context.Context,req model.Gatewayip) error
+	EditGatewayIp(ctx context.Context,req model.Gatewayip) error
+	DeleteGatewayIp(ctx context.Context,id int64) error
+	DeleteGatewayIps(ctx context.Context, ids []int64) error
+}
+func NewGatewayIpAdminService(
+    service *service.Service,
+    gatewayIpAdminRepository admin.GatewayIpAdminRepository,
+) GatewayIpAdminService {
+	return &gatewayIpAdminService{
+		Service:        service,
+		gatewayIpAdminRepository: gatewayIpAdminRepository,
+	}
+}
+
+type gatewayIpAdminService struct {
+	*service.Service
+	gatewayIpAdminRepository admin.GatewayIpAdminRepository
+}
+
+func (s *gatewayIpAdminService) GetGatewayIpAdmin(ctx context.Context, id int64) (*model.Gatewayip, error) {
+	return s.gatewayIpAdminRepository.GetGatewayIpAdmin(ctx, id)
+}
+
+func (s *gatewayIpAdminService) GetGatewayGroupIpList(ctx context.Context,req v1admin.SearchGatewayIpParams) (*v1.PaginatedResponse[model.Gatewayip], error) {
+	return s.gatewayIpAdminRepository.GetGatewayGroupIpList(ctx,req)
+}
+
+func (s *gatewayIpAdminService) AddGatewayIp(ctx context.Context,req model.Gatewayip) error {
+	return s.gatewayIpAdminRepository.AddGatewayIp(ctx,req)
+}
+
+func (s *gatewayIpAdminService) EditGatewayIp(ctx context.Context,req model.Gatewayip) error {
+	return s.gatewayIpAdminRepository.EditGatewayIp(ctx,req)
+}
+
+func (s *gatewayIpAdminService) DeleteGatewayIp(ctx context.Context,id int64) error {
+	return s.gatewayIpAdminRepository.DeleteGatewayIp(ctx,id)
+}
+
+func (s *gatewayIpAdminService) DeleteGatewayIps(ctx context.Context, ids []int64) error {
+	return s.gatewayIpAdminRepository.DeleteGatewayIps(ctx,ids)
+}