hi-server/internal/logic/admin/server/updateServerLogic.go
shanshanzhong 15f4e69dc3
All checks were successful
Build docker and publish / build (20.15.1) (push) Successful in 7m3s
feat(server): 添加服务器地理位置信息字段
为服务器模型添加经度、纬度及中心点坐标字段,并在相关逻辑中处理这些字段
同时修复服务器用户列表缓存功能
2025-11-03 23:50:23 -08:00

124 lines
3.7 KiB
Go

package server
import (
"context"
"strings"
"github.com/perfect-panel/server/internal/model/node"
"github.com/perfect-panel/server/internal/svc"
"github.com/perfect-panel/server/internal/types"
"github.com/perfect-panel/server/pkg/ip"
"github.com/perfect-panel/server/pkg/logger"
"github.com/perfect-panel/server/pkg/tool"
"github.com/perfect-panel/server/pkg/xerr"
"github.com/pkg/errors"
)
type UpdateServerLogic struct {
logger.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
// NewUpdateServerLogic Update Server
func NewUpdateServerLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdateServerLogic {
return &UpdateServerLogic{
Logger: logger.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *UpdateServerLogic) UpdateServer(req *types.UpdateServerRequest) error {
data, err := l.svcCtx.NodeModel.FindOneServer(l.ctx, req.Id)
if err != nil {
l.Errorf("[UpdateServer] FindOneServer Error: %v", err.Error())
return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "find server error: %v", err.Error())
}
data.Name = req.Name
data.Country = req.Country
data.City = req.City
// only update address when it's different
if req.Address != data.Address {
// query server ip location
result, err := ip.GetRegionByIp(req.Address)
if err != nil {
l.Errorf("[UpdateServer] GetRegionByIp Error: %v", err.Error())
} else {
data.City = result.City
data.Country = result.Country
data.Latitude = result.Latitude
data.Longitude = result.Longitude
data.LatitudeCenter = result.LatitudeCenter
data.LongitudeCenter = result.LongitudeCenter
}
// update address
data.Address = req.Address
}
protocols := make([]node.Protocol, 0)
for _, item := range req.Protocols {
if item.Type == "" {
return errors.Wrapf(xerr.NewErrCodeMsg(xerr.InvalidParams, "protocols type is empty"), "protocols type is empty")
}
var protocol node.Protocol
tool.DeepCopy(&protocol, item)
// VLESS Reality Key Generation
if protocol.Type == "vless" {
if protocol.Security == "reality" {
if protocol.RealityPublicKey == "" {
public, private, err := tool.Curve25519Genkey(false, "")
if err != nil {
l.Errorf("[CreateServer] Generate Reality Key Error: %v", err.Error())
return errors.Wrapf(xerr.NewErrCode(xerr.ERROR), "generate reality key error: %v", err)
}
protocol.RealityPublicKey = public
protocol.RealityPrivateKey = private
protocol.RealityShortId = tool.GenerateShortID(private)
}
if protocol.RealityServerAddr == "" {
protocol.RealityServerAddr = protocol.SNI
}
if protocol.RealityServerPort == 0 {
protocol.RealityServerPort = 443
}
}
}
// ShadowSocks 2022 Key Generation
if protocol.Type == "shadowsocks" {
if strings.Contains(protocol.Cipher, "2022") {
var length int
switch protocol.Cipher {
case "2022-blake3-aes-128-gcm":
length = 16
default:
length = 32
}
if len(protocol.ServerKey) != length {
protocol.ServerKey = tool.GenerateCipher(protocol.ServerKey, length)
}
}
}
protocols = append(protocols, protocol)
}
err = data.MarshalProtocols(protocols)
if err != nil {
l.Errorf("[UpdateServer] Marshal Protocols Error: %v", err.Error())
return errors.Wrapf(xerr.NewErrCodeMsg(xerr.InvalidParams, "protocols marshal error"), "protocols marshal error: %v", err)
}
err = l.svcCtx.NodeModel.UpdateServer(l.ctx, data)
if err != nil {
l.Errorf("[UpdateServer] UpdateServer Error: %v", err.Error())
return errors.Wrapf(xerr.NewErrCode(xerr.DatabaseUpdateError), "update server error: %v", err.Error())
}
return l.svcCtx.NodeModel.ClearNodeCache(l.ctx, &node.FilterNodeParams{
Page: 1,
Size: 1000,
ServerId: []int64{req.Id},
Search: "",
})
}