浏览代码

feat(gameShield): 添加替换源机 IP 功能

- 新增 ReplacementSourceMachineIpRequest 结构体用于替换源机 IP 请求
- 实现 ReplacementSourceMachineIp 方法处理替换源机 IP 操作
- 添加 GetGameShieldBackendByHostIdAndSourceMachineIp 方法支持查询指定源机 IP 的游戏盾配置
- 更新 GameShieldBackendService 接口,增加替换源机 IP 的方法
- 在 HTTP 服务器中添加替换源机 IP 的路由
fusu 2 月之前
父节点
当前提交
6098a1d739

+ 7 - 0
api/v1/gameShieldBackend.go

@@ -45,3 +45,10 @@ type DelGameShieldBackendRequest struct {
 	Uid    int   `json:"uid" form:"uid" binding:"required"`
 	HostId int   `json:"host_id" form:"host_id" binding:"required"`
 }
+
+type ReplacementSourceMachineIpRequest struct {
+	OldSourceMachineIp string `json:"old_source_machine_ip" form:"old_source_machine_ip"`
+	NewSourceMachineIp string `json:"new_source_machine_ip" form:"new_source_machine_ip"`
+	Uid                int    `json:"uid" form:"uid" binding:"required"`
+	HostId             int    `json:"host_id" form:"host_id" binding:"required"`
+}

+ 1 - 1
go.mod

@@ -16,6 +16,7 @@ require (
 	github.com/golang-jwt/jwt/v5 v5.2.2
 	github.com/golang/mock v1.6.0
 	github.com/google/wire v0.5.0
+	github.com/jinzhu/copier v0.4.0
 	github.com/mcuadros/go-defaults v1.2.0
 	github.com/redis/go-redis/v9 v9.0.5
 	github.com/sony/sonyflake v1.1.0
@@ -29,7 +30,6 @@ require (
 	go.uber.org/zap v1.26.0
 	golang.org/x/crypto v0.37.0
 	google.golang.org/grpc v1.55.1
-	gopkg.in/natefinch/lumberjack.v2 v2.2.1
 	gorm.io/driver/mysql v1.5.7
 	gorm.io/driver/postgres v1.5.11
 	gorm.io/gorm v1.25.12

+ 2 - 2
go.sum

@@ -286,6 +286,8 @@ github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw=
 github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A=
 github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
 github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
+github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8=
+github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg=
 github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
 github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
 github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
@@ -909,8 +911,6 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
 gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
-gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

+ 15 - 0
internal/handler/gameshieldbackend.go

@@ -71,3 +71,18 @@ func (h *GameShieldBackendHandler) DeleteGameShieldBackend(ctx *gin.Context) {
 	}
 	v1.HandleSuccess(ctx, res)
 }
+
+func (h *GameShieldBackendHandler) ReplacementSourceMachineIp(ctx *gin.Context) {
+	req := new(v1.ReplacementSourceMachineIpRequest)
+	if err := ctx.ShouldBind(req); err != nil {
+		v1.HandleError(ctx, http.StatusBadRequest, v1.ErrBadRequest, err.Error())
+		return
+	}
+	defaults.SetDefaults(req)
+	err := h.gameShieldBackendService.ReplacementSourceMachineIp(ctx, req)
+	if err != nil {
+		v1.HandleError(ctx, http.StatusInternalServerError, err, err.Error())
+		return
+	}
+	v1.HandleSuccess(ctx, nil)
+}

+ 9 - 0
internal/repository/gameshieldbackend.go

@@ -14,6 +14,7 @@ type GameShieldBackendRepository interface {
 	GetGameShieldBackendByHostId(ctx context.Context, hostId int) ([]model.GameShieldBackend, error)
 	GetGameShieldBackendConfigCountByHostId(ctx context.Context, hostId int) (*v1.GameShieldHostBackendConfigResponse, error)
 	GetGameShieldBackendSourceMachineIpByHostId(ctx context.Context, hostId int) ([]string, error)
+	GetGameShieldBackendByHostIdAndSourceMachineIp(ctx context.Context, hostId int, sourceMachineIp string) ([]model.GameShieldBackend, error)
 }
 
 func NewGameShieldBackendRepository(
@@ -86,3 +87,11 @@ func (r *gameShieldBackendRepository) GetGameShieldBackendSourceMachineIpByHostI
 	}
 	return res, nil
 }
+
+func (r *gameShieldBackendRepository) GetGameShieldBackendByHostIdAndSourceMachineIp(ctx context.Context, hostId int, sourceMachineIp string) ([]model.GameShieldBackend, error) {
+	var res []model.GameShieldBackend
+	if err := r.DB(ctx).Where("host_id = ? AND source_machine_ip = ?", hostId, sourceMachineIp).First(&res).Error; err != nil {
+		return nil, err
+	}
+	return res, nil
+}

+ 1 - 0
internal/server/http.go

@@ -111,6 +111,7 @@ func NewHTTPServer(
 			noAuthRouter.POST("/gameShieldBackend/add", ipAllowlistMiddleware, gameShieldBackendHandler.AddGameShieldBackend)
 			noAuthRouter.POST("/gameShieldBackend/edit", ipAllowlistMiddleware, gameShieldBackendHandler.EditGameShieldBackend)
 			noAuthRouter.POST("/gameShieldBackend/delete", ipAllowlistMiddleware, gameShieldBackendHandler.DeleteGameShieldBackend)
+			noAuthRouter.POST("/gameShieldBackend/replacementSourceMachineIp", ipAllowlistMiddleware, gameShieldBackendHandler.ReplacementSourceMachineIp)
 		}
 		// Non-strict permission routing group
 		noStrictAuthRouter := v1.Group("/").Use(middleware.NoStrictAuth(jwt, logger))

+ 40 - 0
internal/service/gameshieldbackend.go

@@ -7,6 +7,7 @@ import (
 	v1 "github.com/go-nunu/nunu-layout-advanced/api/v1"
 	"github.com/go-nunu/nunu-layout-advanced/internal/model"
 	"github.com/go-nunu/nunu-layout-advanced/internal/repository"
+	"github.com/jinzhu/copier"
 	"github.com/spf13/cast"
 	"github.com/spf13/viper"
 	"strconv"
@@ -20,6 +21,7 @@ type GameShieldBackendService interface {
 	EditGameShieldBackend(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (string, error)
 	DeleteGameShieldBackend(ctx context.Context, req *v1.DelGameShieldBackendRequest) (string, error)
 	GetGameShieldRequired(ctx context.Context, req *v1.GameShieldBackendArrayRequest) (*v1.GetGameShieldRequiredResponse, int, error)
+	ReplacementSourceMachineIp(ctx context.Context, req *v1.ReplacementSourceMachineIpRequest) error
 }
 
 func NewGameShieldBackendService(
@@ -303,3 +305,41 @@ func (s *gameShieldBackendService) SaveGameShieldBackend(ctx context.Context, re
 
 	return nil
 }
+
+// ReplacementSourceMachineIp 替换源机ip
+func (s *gameShieldBackendService) ReplacementSourceMachineIp(ctx context.Context, req *v1.ReplacementSourceMachineIpRequest) error {
+	var data []v1.GameShieldBackendRequest
+	var baseData []model.GameShieldBackend
+	var err error
+	if len(req.OldSourceMachineIp) != 0 {
+		baseData, err = s.gameShieldBackendRepository.GetGameShieldBackendByHostIdAndSourceMachineIp(ctx, req.HostId, req.OldSourceMachineIp)
+		if err != nil {
+			return err
+		}
+		for i := range baseData {
+			baseData[i].SourceMachineIP = req.NewSourceMachineIp
+		}
+	}
+	if len(req.OldSourceMachineIp) == 0 {
+		baseData, err = s.gameShieldBackendRepository.GetGameShieldBackendByHostId(ctx, req.HostId)
+		if err != nil {
+			return err
+		}
+		for i := range baseData {
+			baseData[i].SourceMachineIP = req.NewSourceMachineIp
+		}
+	}
+	err = copier.Copy(&data, &baseData)
+	if err != nil {
+		return err
+	}
+	_, err = s.EditGameShieldBackend(ctx, &v1.GameShieldBackendArrayRequest{
+		Items:  data,
+		HostId: req.HostId,
+		Uid:    req.Uid,
+	})
+	if err != nil {
+		return err
+	}
+	return nil
+}