From 083fabb308935f68cc678f46950b8c8560411ce5 Mon Sep 17 00:00:00 2001 From: luorijun Date: Wed, 16 Apr 2025 14:01:30 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BB=A3=E7=A0=81=E7=BB=93?= =?UTF-8?q?=E6=9E=84=EF=BC=8C=E8=BF=81=E7=A7=BBBaiyin=20SDK=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E9=80=BB=E8=BE=91=E8=87=B3globals=E5=8C=85=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E6=B7=BB=E5=8A=A0=E6=94=AF=E4=BB=98=E5=AE=9D=E5=AE=A2?= =?UTF-8?q?=E6=88=B7=E7=AB=AF=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++ cmd/main/main.go | 2 - go.mod | 4 ++ go.sum | 8 +++ pkg/env/env.go | 43 +++++++++++++ pkg/testutil/remote.go | 62 +++++++++---------- web/globals/alipay.go | 32 ++++++++++ .../baiyin/remote.go => web/globals/baiyin.go | 4 +- web/handlers/trade.go | 30 +++++++++ web/services/channel.go | 30 ++++----- web/services/channel_test.go | 52 ++++++++-------- web/web.go | 5 ++ 12 files changed, 200 insertions(+), 76 deletions(-) create mode 100644 web/globals/alipay.go rename pkg/sdks/baiyin/remote.go => web/globals/baiyin.go (99%) diff --git a/README.md b/README.md index 1034d6e..6138f6e 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,10 @@ - [ ] Limiter - [ ] Compress +统一简化包导入别名 + +迁移 pkg 包下的代码,尽量放置在 web/globals 下,env 和 log 作为全局公共配置保留 + 更新数据库填充 检查数据库枚举字段,0 值只作为空值使用 diff --git a/cmd/main/main.go b/cmd/main/main.go index da5532e..e7b5d3d 100644 --- a/cmd/main/main.go +++ b/cmd/main/main.go @@ -8,7 +8,6 @@ import ( "platform/pkg/logs" "platform/pkg/orm" "platform/pkg/rds" - "platform/pkg/sdks/baiyin" "platform/web" "syscall" ) @@ -24,7 +23,6 @@ func main() { logs.Init() orm.Init() rds.Init() - baiyin.Init() // web 服务 app, err := web.New(&web.Config{ diff --git a/go.mod b/go.mod index d658ccc..2faeac7 100644 --- a/go.mod +++ b/go.mod @@ -42,6 +42,10 @@ require ( github.com/mattn/go-runewidth v0.0.16 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.7 // indirect + github.com/smartwalle/alipay/v3 v3.2.25 // indirect + github.com/smartwalle/ncrypto v1.0.4 // indirect + github.com/smartwalle/ngx v1.0.9 // indirect + github.com/smartwalle/nsign v1.0.9 // indirect github.com/stretchr/testify v1.8.2 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.59.0 // indirect diff --git a/go.sum b/go.sum index 49b16a7..4dd7194 100644 --- a/go.sum +++ b/go.sum @@ -84,6 +84,14 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qq github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/smartwalle/alipay/v3 v3.2.25 h1:cRDN+fpDWTVHnuHIF/vsJETskRXS/S+fDOdAkzXmV/Q= +github.com/smartwalle/alipay/v3 v3.2.25/go.mod h1:lVqFiupPf8YsAXaq5JXcwqnOUC2MCF+2/5vub+RlagE= +github.com/smartwalle/ncrypto v1.0.4 h1:P2rqQxDepJwgeO5ShoC+wGcK2wNJDmcdBOWAksuIgx8= +github.com/smartwalle/ncrypto v1.0.4/go.mod h1:Dwlp6sfeNaPMnOxMNayMTacvC5JGEVln3CVdiVDgbBk= +github.com/smartwalle/ngx v1.0.9 h1:pUXDvWRZJIHVrCKA1uZ15YwNti+5P4GuJGbpJ4WvpMw= +github.com/smartwalle/ngx v1.0.9/go.mod h1:mx/nz2Pk5j+RBs7t6u6k22MPiBG/8CtOMpCnALIG8Y0= +github.com/smartwalle/nsign v1.0.9 h1:8poAgG7zBd8HkZy9RQDwasC6XZvJpDGQWSjzL2FZL6E= +github.com/smartwalle/nsign v1.0.9/go.mod h1:eY6I4CJlyNdVMP+t6z1H6Jpd4m5/V+8xi44ufSTxXgc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= diff --git a/pkg/env/env.go b/pkg/env/env.go index 5a9f588..1fc582a 100644 --- a/pkg/env/env.go +++ b/pkg/env/env.go @@ -182,6 +182,48 @@ func loadRemote() { // endregion +// region alipay + +var ( + AlipayAppId string + AlipayAppPrivateKey string + AlipayPublicKey string + AlipayEncryptKey string + AlipayProduction = false +) + +func loadAlipay() { + AlipayAppId := os.Getenv("ALIPAY_APP_ID") + if AlipayAppId == "" { + panic("环境变量 ALIPAY_APP_ID 的值不能为空") + } + + AlipayAppPrivateKey := os.Getenv("ALIPAY_APP_PRIVATE_KEY") + if AlipayAppPrivateKey == "" { + panic("环境变量 ALIPAY_APP_PRIVATE_KEY 的值不能为空") + } + + AlipayPublicKey := os.Getenv("ALIPAY_PUBLIC_KEY") + if AlipayPublicKey == "" { + panic("环境变量 ALIPAY_PUBLIC_KEY 的值不能为空") + } + + AlipayEncryptKey := os.Getenv("ALIPAY_ENCRYPT_KEY") + if AlipayEncryptKey == "" { + panic("环境变量 ALIPAY_ENCRYPT_KEY 的值不能为空") + } + _AlipayProduction := os.Getenv("ALIPAY_PRODUCTION") + if _AlipayProduction != "" { + value, err := strconv.ParseBool(_AlipayProduction) + if err != nil { + panic("环境变量 ALIPAY_PRODUCTION 的值不是布尔值") + } + AlipayProduction = value + } +} + +// endregion + // region debug var ( @@ -228,4 +270,5 @@ func Init() { loadLog() loadDebug() loadRemote() + loadAlipay() } diff --git a/pkg/testutil/remote.go b/pkg/testutil/remote.go index c748a67..eb0735b 100644 --- a/pkg/testutil/remote.go +++ b/pkg/testutil/remote.go @@ -1,7 +1,7 @@ package testutil import ( - "platform/pkg/sdks/baiyin" + g "platform/web/globals" "sync" "testing" ) @@ -9,15 +9,15 @@ import ( // MockCloudClient 是CloudClient接口的测试实现 type MockCloudClient struct { // 存储预期结果的字段 - EdgesMock func(param baiyin.CloudEdgesReq) (*baiyin.CloudEdgesResp, error) - ConnectMock func(param baiyin.CloudConnectReq) error - DisconnectMock func(param baiyin.CloudDisconnectReq) (int, error) - AutoQueryMock func() (baiyin.CloudConnectResp, error) + EdgesMock func(param g.CloudEdgesReq) (*g.CloudEdgesResp, error) + ConnectMock func(param g.CloudConnectReq) error + DisconnectMock func(param g.CloudDisconnectReq) (int, error) + AutoQueryMock func() (g.CloudConnectResp, error) // 记录调用历史 - EdgesCalls []baiyin.CloudEdgesReq - ConnectCalls []baiyin.CloudConnectReq - DisconnectCalls []baiyin.CloudDisconnectReq + EdgesCalls []g.CloudEdgesReq + ConnectCalls []g.CloudConnectReq + DisconnectCalls []g.CloudDisconnectReq AutoQueryCalls int // 用于并发安全 @@ -25,19 +25,19 @@ type MockCloudClient struct { } // 确保MockCloudClient实现了CloudClient接口 -var _ baiyin.CloudClient = (*MockCloudClient)(nil) +var _ g.CloudClient = (*MockCloudClient)(nil) -func (m *MockCloudClient) CloudEdges(param baiyin.CloudEdgesReq) (*baiyin.CloudEdgesResp, error) { +func (m *MockCloudClient) CloudEdges(param g.CloudEdgesReq) (*g.CloudEdgesResp, error) { m.mu.Lock() defer m.mu.Unlock() m.EdgesCalls = append(m.EdgesCalls, param) if m.EdgesMock != nil { return m.EdgesMock(param) } - return &baiyin.CloudEdgesResp{}, nil + return &g.CloudEdgesResp{}, nil } -func (m *MockCloudClient) CloudConnect(param baiyin.CloudConnectReq) error { +func (m *MockCloudClient) CloudConnect(param g.CloudConnectReq) error { m.mu.Lock() defer m.mu.Unlock() m.ConnectCalls = append(m.ConnectCalls, param) @@ -47,7 +47,7 @@ func (m *MockCloudClient) CloudConnect(param baiyin.CloudConnectReq) error { return nil } -func (m *MockCloudClient) CloudDisconnect(param baiyin.CloudDisconnectReq) (int, error) { +func (m *MockCloudClient) CloudDisconnect(param g.CloudDisconnectReq) (int, error) { m.mu.Lock() defer m.mu.Unlock() m.DisconnectCalls = append(m.DisconnectCalls, param) @@ -57,33 +57,33 @@ func (m *MockCloudClient) CloudDisconnect(param baiyin.CloudDisconnectReq) (int, return 0, nil } -func (m *MockCloudClient) CloudAutoQuery() (baiyin.CloudConnectResp, error) { +func (m *MockCloudClient) CloudAutoQuery() (g.CloudConnectResp, error) { m.mu.Lock() defer m.mu.Unlock() m.AutoQueryCalls++ if m.AutoQueryMock != nil { return m.AutoQueryMock() } - return baiyin.CloudConnectResp{}, nil + return g.CloudConnectResp{}, nil } // SetupCloudClientMock 替换全局CloudClient为测试实现并在测试完成后恢复 func SetupCloudClientMock(t *testing.T) *MockCloudClient { mock := &MockCloudClient{ - EdgesMock: func(param baiyin.CloudEdgesReq) (*baiyin.CloudEdgesResp, error) { + EdgesMock: func(param g.CloudEdgesReq) (*g.CloudEdgesResp, error) { panic("not implemented") }, - ConnectMock: func(param baiyin.CloudConnectReq) error { + ConnectMock: func(param g.CloudConnectReq) error { panic("not implemented") }, - DisconnectMock: func(param baiyin.CloudDisconnectReq) (int, error) { + DisconnectMock: func(param g.CloudDisconnectReq) (int, error) { panic("not implemented") }, - AutoQueryMock: func() (baiyin.CloudConnectResp, error) { + AutoQueryMock: func() (g.CloudConnectResp, error) { panic("not implemented") }, } - baiyin.Cloud = mock + g.Cloud = mock return mock } @@ -94,9 +94,9 @@ type MockGatewayClient struct { } // 确保MockGatewayClient实现了GatewayClient接口 -var _ baiyin.GatewayClient = (*MockGatewayClient)(nil) +var _ g.GatewayClient = (*MockGatewayClient)(nil) -func (m *MockGatewayClient) GatewayPortConfigs(params []baiyin.PortConfigsReq) error { +func (m *MockGatewayClient) GatewayPortConfigs(params []g.PortConfigsReq) error { testGatewayBase.mu.Lock() defer testGatewayBase.mu.Unlock() testGatewayBase.PortConfigsCalls = append(testGatewayBase.PortConfigsCalls, params) @@ -106,42 +106,42 @@ func (m *MockGatewayClient) GatewayPortConfigs(params []baiyin.PortConfigsReq) e return nil } -func (m *MockGatewayClient) GatewayPortActive(param ...baiyin.PortActiveReq) (map[string]baiyin.PortData, error) { +func (m *MockGatewayClient) GatewayPortActive(param ...g.PortActiveReq) (map[string]g.PortData, error) { testGatewayBase.mu.Lock() defer testGatewayBase.mu.Unlock() testGatewayBase.PortActiveCalls = append(testGatewayBase.PortActiveCalls, param) if testGatewayBase.PortActiveMock != nil { return testGatewayBase.PortActiveMock(m, param...) } - return map[string]baiyin.PortData{}, nil + return map[string]g.PortData{}, nil } type GatewayClientIns struct { // 存储预期结果的字段 - PortConfigsMock func(c *MockGatewayClient, params []baiyin.PortConfigsReq) error - PortActiveMock func(c *MockGatewayClient, param ...baiyin.PortActiveReq) (map[string]baiyin.PortData, error) + PortConfigsMock func(c *MockGatewayClient, params []g.PortConfigsReq) error + PortActiveMock func(c *MockGatewayClient, param ...g.PortActiveReq) (map[string]g.PortData, error) // 记录调用历史 - PortConfigsCalls [][]baiyin.PortConfigsReq - PortActiveCalls [][]baiyin.PortActiveReq + PortConfigsCalls [][]g.PortConfigsReq + PortActiveCalls [][]g.PortActiveReq // 用于并发安全 mu sync.Mutex } var testGatewayBase = &GatewayClientIns{ - PortConfigsMock: func(c *MockGatewayClient, params []baiyin.PortConfigsReq) error { + PortConfigsMock: func(c *MockGatewayClient, params []g.PortConfigsReq) error { panic("not implemented") }, - PortActiveMock: func(c *MockGatewayClient, param ...baiyin.PortActiveReq) (map[string]baiyin.PortData, error) { + PortActiveMock: func(c *MockGatewayClient, param ...g.PortActiveReq) (map[string]g.PortData, error) { panic("not implemented") }, } // SetupGatewayClientMock 创建一个MockGatewayClient并提供替换函数 func SetupGatewayClientMock(t *testing.T) *GatewayClientIns { - baiyin.GatewayInitializer = func(url, username, password string) baiyin.GatewayClient { + g.GatewayInitializer = func(url, username, password string) g.GatewayClient { return &MockGatewayClient{ Host: url, } diff --git a/web/globals/alipay.go b/web/globals/alipay.go new file mode 100644 index 0000000..3e44326 --- /dev/null +++ b/web/globals/alipay.go @@ -0,0 +1,32 @@ +package globals + +import ( + "platform/pkg/env" + + "github.com/smartwalle/alipay/v3" +) + +var Alipay *alipay.Client + +func InitAlipay() { + var client, err = alipay.New( + env.AlipayAppId, + env.AlipayAppPrivateKey, + env.AlipayProduction, + ) + if err != nil { + panic("初始化支付宝客户端失败: " + err.Error()) + } + + err = client.LoadAliPayPublicKey(env.AlipayPublicKey) + if err != nil { + panic("加载支付宝公钥失败: " + err.Error()) + } + + err = client.SetEncryptKey(env.AlipayEncryptKey) + if err != nil { + panic("设置支付宝加密密钥失败: " + err.Error()) + } + + Alipay = client +} diff --git a/pkg/sdks/baiyin/remote.go b/web/globals/baiyin.go similarity index 99% rename from pkg/sdks/baiyin/remote.go rename to web/globals/baiyin.go index a1a4cfe..11cb4a0 100644 --- a/pkg/sdks/baiyin/remote.go +++ b/web/globals/baiyin.go @@ -1,4 +1,4 @@ -package baiyin +package globals import ( "context" @@ -36,7 +36,7 @@ type cloud struct { var Cloud CloudClient -func Init() { +func InitBaiyin() { Cloud = &cloud{ url: env.BaiyinAddr, } diff --git a/web/handlers/trade.go b/web/handlers/trade.go index 663d91b..f39e624 100644 --- a/web/handlers/trade.go +++ b/web/handlers/trade.go @@ -1,13 +1,16 @@ package handlers import ( + "net/url" "platform/web/auth" + g "platform/web/globals" m "platform/web/models" q "platform/web/queries" "platform/web/services" "strconv" "github.com/gofiber/fiber/v2" + "github.com/smartwalle/alipay/v3" ) // region CreateTrade @@ -83,4 +86,31 @@ func CreateTrade(c *fiber.Ctx) error { return nil } +func createTradeByAlipay() (*url.URL, error) { + + target, err := g.Alipay.TradePagePay(alipay.TradePagePay{ + Trade: alipay.Trade{}, + AuthToken: "", + QRPayMode: "", + QRCodeWidth: "", + }) + if err != nil { + return nil, err + } + + return target, nil +} + +func createTradeByWechat() error { + panic("unimplemented") +} + +// endregion + +// region TradeCallbackAlipay + +// endregion + +// region TradeCallbackWechat + // endregion diff --git a/web/services/channel.go b/web/services/channel.go index 066a38b..b01be89 100644 --- a/web/services/channel.go +++ b/web/services/channel.go @@ -11,9 +11,9 @@ import ( "platform/pkg/env" "platform/pkg/orm" "platform/pkg/rds" - "platform/pkg/sdks/baiyin" "platform/pkg/u" "platform/web/common" + g "platform/web/globals" "platform/web/models" q "platform/web/queries" "strconv" @@ -132,18 +132,18 @@ func (s *channelService) RemoveChannels(ctx context.Context, auth *AuthContext, step = time.Now() // 组织数据 - var configMap = make(map[int32][]baiyin.PortConfigsReq, len(proxies)) + var configMap = make(map[int32][]g.PortConfigsReq, len(proxies)) var proxyMap = make(map[int32]*models.Proxy, len(proxies)) for _, proxy := range proxies { - configMap[proxy.ID] = make([]baiyin.PortConfigsReq, 0) + configMap[proxy.ID] = make([]g.PortConfigsReq, 0) proxyMap[proxy.ID] = proxy } var portMap = make(map[uint64]struct{}) for _, channel := range channels { - var config = baiyin.PortConfigsReq{ + var config = g.PortConfigsReq{ Port: int(channel.ProxyPort), Edge: &[]string{}, - AutoEdgeConfig: &baiyin.AutoEdgeConfig{ + AutoEdgeConfig: &g.AutoEdgeConfig{ Count: u.P(0), }, Status: false, @@ -167,7 +167,7 @@ func (s *channelService) RemoveChannels(ctx context.Context, auth *AuthContext, } var secret = strings.Split(proxy.Secret, ":") - gateway := baiyin.NewGateway( + gateway := g.NewGateway( proxy.Host, secret[0], secret[1], @@ -208,7 +208,7 @@ func (s *channelService) RemoveChannels(ctx context.Context, auth *AuthContext, } } if len(edges) > 0 { - _, err := baiyin.Cloud.CloudDisconnect(baiyin.CloudDisconnectReq{ + _, err := g.Cloud.CloudDisconnect(g.CloudDisconnectReq{ Uuid: proxy.Name, Edge: edges, }) @@ -406,7 +406,7 @@ func assignEdge(q *q.Query, count int, filter NodeFilterConfig) (*AssignEdgeResu // 查询已配置的节点 step = time.Now() - rProxyConfigs, err := baiyin.Cloud.CloudAutoQuery() + rProxyConfigs, err := g.Cloud.CloudAutoQuery() if err != nil { return nil, err } @@ -480,13 +480,13 @@ func assignEdge(q *q.Query, count int, filter NodeFilterConfig) (*AssignEdgeResu rConfigs := rProxyConfigs[info.proxy.Name] - var newConfig = baiyin.AutoConfig{ + var newConfig = g.AutoConfig{ Province: filter.Prov, City: filter.City, Isp: filter.Isp, Count: int(math.Ceil(float64(info.used) * 2)), } - var newConfigs []baiyin.AutoConfig + var newConfigs []g.AutoConfig var update = false for _, rConfig := range rConfigs { if rConfig.Isp == filter.Isp && rConfig.City == filter.City && rConfig.Province == filter.Prov { @@ -500,7 +500,7 @@ func assignEdge(q *q.Query, count int, filter NodeFilterConfig) (*AssignEdgeResu newConfigs = append(newConfigs, newConfig) } - err := baiyin.Cloud.CloudConnect(baiyin.CloudConnectReq{ + err := g.Cloud.CloudConnect(g.CloudConnectReq{ Uuid: info.proxy.Name, Edge: nil, AutoConfig: newConfigs, @@ -587,7 +587,7 @@ func assignPort( var count = config.count // 筛选可用端口 - var configs = make([]baiyin.PortConfigsReq, 0, count) + var configs = make([]g.PortConfigsReq, 0, count) for port := 10000; port < 20000 && len(configs) < count; port++ { // 跳过存在的端口 key := uint64(proxy.ID)<<32 | uint64(port) @@ -598,11 +598,11 @@ func assignPort( // 配置新端口 var i = len(configs) - configs = append(configs, baiyin.PortConfigsReq{ + configs = append(configs, g.PortConfigsReq{ Port: port, Edge: nil, Status: true, - AutoEdgeConfig: &baiyin.AutoEdgeConfig{ + AutoEdgeConfig: &g.AutoEdgeConfig{ Province: filter.Prov, City: filter.City, Isp: filter.Isp, @@ -682,7 +682,7 @@ func assignPort( step = time.Now() var secret = strings.Split(proxy.Secret, ":") - gateway := baiyin.NewGateway( + gateway := g.NewGateway( proxy.Host, secret[0], secret[1], diff --git a/web/services/channel_test.go b/web/services/channel_test.go index 82f28a6..e6beb95 100644 --- a/web/services/channel_test.go +++ b/web/services/channel_test.go @@ -4,9 +4,9 @@ import ( "context" "encoding/json" "fmt" - "platform/pkg/sdks/baiyin" "platform/pkg/testutil" "platform/web/common" + g "platform/web/globals" "platform/web/models" "reflect" "strings" @@ -288,9 +288,9 @@ func Test_channelService_CreateChannel(t *testing.T) { ctx := context.WithValue(context.Background(), requestid.ConfigDefault.ContextKey, "test-request-id") var adminAuth = &AuthContext{Payload: Payload{Id: 100, Type: PayloadAdmin}} var userAuth = &AuthContext{Payload: Payload{Id: 101, Type: PayloadUser}} - mc.AutoQueryMock = func() (baiyin.CloudConnectResp, error) { - return baiyin.CloudConnectResp{ - "test-proxy": []baiyin.AutoConfig{ + mc.AutoQueryMock = func() (g.CloudConnectResp, error) { + return g.CloudConnectResp{ + "test-proxy": []g.AutoConfig{ {Province: "河南省", Count: 10}, }, }, nil @@ -373,14 +373,14 @@ func Test_channelService_CreateChannel(t *testing.T) { mr.FlushAll() resetDb() - mc.ConnectMock = func(param baiyin.CloudConnectReq) error { + mc.ConnectMock = func(param g.CloudConnectReq) error { if param.Uuid != proxy.Name { return fmt.Errorf("代理名称不符合预期: %s", param.Uuid) } if len(param.Edge) != 0 { return fmt.Errorf("边缘节点不符合预期: %v", param.Edge) } - if !reflect.DeepEqual(param.AutoConfig, []baiyin.AutoConfig{ + if !reflect.DeepEqual(param.AutoConfig, []g.AutoConfig{ {Province: "河南省", Count: 10}, {Province: "北京市", Count: 6}, }) { @@ -389,7 +389,7 @@ func Test_channelService_CreateChannel(t *testing.T) { return nil } - mg.PortConfigsMock = func(c *testutil.MockGatewayClient, params []baiyin.PortConfigsReq) error { + mg.PortConfigsMock = func(c *testutil.MockGatewayClient, params []g.PortConfigsReq) error { if c.Host != proxy.Host { return fmt.Errorf("代理主机不符合预期: %s", c.Host) } @@ -523,14 +523,14 @@ func Test_channelService_CreateChannel(t *testing.T) { mr.FlushAll() resetDb() - mc.ConnectMock = func(param baiyin.CloudConnectReq) error { + mc.ConnectMock = func(param g.CloudConnectReq) error { if param.Uuid != proxy.Name { return fmt.Errorf("代理名称不符合预期: %s", param.Uuid) } if len(param.Edge) != 0 { return fmt.Errorf("边缘节点不符合预期: %v", param.Edge) } - if !reflect.DeepEqual(param.AutoConfig, []baiyin.AutoConfig{ + if !reflect.DeepEqual(param.AutoConfig, []g.AutoConfig{ {Province: "河南省", Count: 10}, {Province: "北京市", Count: 6}, }) { @@ -539,7 +539,7 @@ func Test_channelService_CreateChannel(t *testing.T) { return nil } - mg.PortConfigsMock = func(c *testutil.MockGatewayClient, params []baiyin.PortConfigsReq) error { + mg.PortConfigsMock = func(c *testutil.MockGatewayClient, params []g.PortConfigsReq) error { if c.Host != proxy.Host { return fmt.Errorf("代理主机不符合预期: %s", c.Host) } @@ -667,14 +667,14 @@ func Test_channelService_CreateChannel(t *testing.T) { mr.FlushAll() resetDb() - mc.ConnectMock = func(param baiyin.CloudConnectReq) error { + mc.ConnectMock = func(param g.CloudConnectReq) error { if param.Uuid != proxy.Name { return fmt.Errorf("代理名称不符合预期: %s", param.Uuid) } if len(param.Edge) != 0 { return fmt.Errorf("边缘节点不符合预期: %v", param.Edge) } - if !reflect.DeepEqual(param.AutoConfig, []baiyin.AutoConfig{ + if !reflect.DeepEqual(param.AutoConfig, []g.AutoConfig{ {Province: "河南省", Count: 10}, {Province: "北京市", Count: 6}, }) { @@ -683,7 +683,7 @@ func Test_channelService_CreateChannel(t *testing.T) { return nil } - mg.PortConfigsMock = func(c *testutil.MockGatewayClient, params []baiyin.PortConfigsReq) error { + mg.PortConfigsMock = func(c *testutil.MockGatewayClient, params []g.PortConfigsReq) error { if c.Host != proxy.Host { return fmt.Errorf("代理主机不符合预期: %s", c.Host) } @@ -899,9 +899,9 @@ func Test_channelService_CreateChannel(t *testing.T) { setup: func() { mr.FlushAll() resetDb() - mc.AutoQueryMock = func() (baiyin.CloudConnectResp, error) { - return baiyin.CloudConnectResp{ - "test-proxy": []baiyin.AutoConfig{ + mc.AutoQueryMock = func() (g.CloudConnectResp, error) { + return g.CloudConnectResp{ + "test-proxy": []g.AutoConfig{ {Count: 20000}, }, }, nil @@ -1054,21 +1054,21 @@ func Test_channelService_RemoveChannels(t *testing.T) { } // 模拟网关客户端的响应 - mg.PortActiveMock = func(m *testutil.MockGatewayClient, param ...baiyin.PortActiveReq) (map[string]baiyin.PortData, error) { + mg.PortActiveMock = func(m *testutil.MockGatewayClient, param ...g.PortActiveReq) (map[string]g.PortData, error) { switch { case m.Host == proxy.Host: - return map[string]baiyin.PortData{ + return map[string]g.PortData{ "10001": {Edge: []string{"edge1", "edge4"}}, "10002": {Edge: []string{"edge2"}}, }, nil case m.Host == proxy2.Host: - return map[string]baiyin.PortData{ + return map[string]g.PortData{ "10001": {Edge: []string{"edge3"}}, }, nil } return nil, fmt.Errorf("代理主机不符合预期: %s", m.Host) } - mg.PortConfigsMock = func(m *testutil.MockGatewayClient, params []baiyin.PortConfigsReq) error { + mg.PortConfigsMock = func(m *testutil.MockGatewayClient, params []g.PortConfigsReq) error { switch { case m.Host == proxy.Host: for _, param := range params { @@ -1099,7 +1099,7 @@ func Test_channelService_RemoveChannels(t *testing.T) { } return fmt.Errorf("代理主机不符合预期: %s", m.Host) } - mc.DisconnectMock = func(param baiyin.CloudDisconnectReq) (int, error) { + mc.DisconnectMock = func(param g.CloudDisconnectReq) (int, error) { switch { case param.Uuid == proxy.Name: var edges = []string{"edge1", "edge2", "edge4"} @@ -1168,21 +1168,21 @@ func Test_channelService_RemoveChannels(t *testing.T) { } // 模拟网关客户端的响应 - mg.PortActiveMock = func(m *testutil.MockGatewayClient, param ...baiyin.PortActiveReq) (map[string]baiyin.PortData, error) { + mg.PortActiveMock = func(m *testutil.MockGatewayClient, param ...g.PortActiveReq) (map[string]g.PortData, error) { switch { case m.Host == proxy.Host: - return map[string]baiyin.PortData{ + return map[string]g.PortData{ "10001": {Edge: []string{"edge1", "edge4"}}, "10002": {Edge: []string{"edge2"}}, }, nil case m.Host == proxy2.Host: - return map[string]baiyin.PortData{ + return map[string]g.PortData{ "10001": {Edge: []string{"edge3"}}, }, nil } return nil, fmt.Errorf("代理主机不符合预期: %s", m.Host) } - mg.PortConfigsMock = func(m *testutil.MockGatewayClient, params []baiyin.PortConfigsReq) error { + mg.PortConfigsMock = func(m *testutil.MockGatewayClient, params []g.PortConfigsReq) error { switch { case m.Host == proxy.Host: for _, param := range params { @@ -1213,7 +1213,7 @@ func Test_channelService_RemoveChannels(t *testing.T) { } return fmt.Errorf("代理主机不符合预期: %s", m.Host) } - mc.DisconnectMock = func(param baiyin.CloudDisconnectReq) (int, error) { + mc.DisconnectMock = func(param g.CloudDisconnectReq) (int, error) { switch { case param.Uuid == proxy.Name: var edges = []string{"edge1", "edge2", "edge4"} diff --git a/web/web.go b/web/web.go index bfda805..bfc8dd6 100644 --- a/web/web.go +++ b/web/web.go @@ -3,6 +3,7 @@ package web import ( "net/http" "platform/pkg/env" + g "platform/web/globals" "runtime" "log/slog" @@ -38,6 +39,10 @@ func New(config *Config) (*Server, error) { func (s *Server) Run() error { + // inits + g.InitBaiyin() + g.InitAlipay() + // config s.fiber = fiber.New(fiber.Config{ ErrorHandler: ErrorHandler,