完善错误处理逻辑,统一使用 BizErr 包装业务错误,提供打印源码跳转并返回合适的 http 状态码
This commit is contained in:
@@ -4,13 +4,12 @@ import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"github.com/hibiken/asynq"
|
||||
"gorm.io/gen/field"
|
||||
"log/slog"
|
||||
"math"
|
||||
"math/rand/v2"
|
||||
"platform/pkg/env"
|
||||
"platform/pkg/u"
|
||||
"platform/web/core"
|
||||
channel2 "platform/web/domains/channel"
|
||||
edge2 "platform/web/domains/edge"
|
||||
proxy2 "platform/web/domains/proxy"
|
||||
@@ -24,13 +23,15 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/hibiken/asynq"
|
||||
"gorm.io/gen/field"
|
||||
|
||||
"github.com/redis/go-redis/v9"
|
||||
)
|
||||
|
||||
var Channel = &channelService{}
|
||||
|
||||
type channelService struct {
|
||||
}
|
||||
type channelService struct{}
|
||||
|
||||
// region 删除通道
|
||||
|
||||
@@ -46,7 +47,7 @@ func (s *channelService) RemoveChannels(id []int32, userId ...int32) error {
|
||||
}
|
||||
channels, err := tx.Channel.Where(do).Find()
|
||||
if err != nil {
|
||||
return err
|
||||
return core.NewBizErr("查找通道失败", err)
|
||||
}
|
||||
|
||||
proxyMap := make(map[int32]*m.Proxy)
|
||||
@@ -67,7 +68,7 @@ func (s *channelService) RemoveChannels(id []int32, userId ...int32) error {
|
||||
// 查找资源
|
||||
resources, err := tx.Resource.Where(tx.Resource.ID.In(resourceIds...)).Find()
|
||||
if err != nil {
|
||||
return err
|
||||
return core.NewBizErr("查找资源失败", err)
|
||||
}
|
||||
for _, res := range resources {
|
||||
resourceMap[res.ID] = res
|
||||
@@ -76,7 +77,7 @@ func (s *channelService) RemoveChannels(id []int32, userId ...int32) error {
|
||||
// 查找代理
|
||||
proxies, err := tx.Proxy.Where(q.Proxy.ID.In(proxyIds...)).Find()
|
||||
if err != nil {
|
||||
return err
|
||||
return core.NewBizErr("查找代理失败", err)
|
||||
}
|
||||
for _, proxy := range proxies {
|
||||
proxyMap[proxy.ID] = proxy
|
||||
@@ -100,10 +101,10 @@ func (s *channelService) RemoveChannels(id []int32, userId ...int32) error {
|
||||
Where(q.Channel.ID.In(id...)).
|
||||
Update(q.Channel.DeletedAt, now)
|
||||
if err != nil {
|
||||
return err
|
||||
return core.NewBizErr("删除通道失败", err)
|
||||
}
|
||||
if result.RowsAffected != int64(len(channels)) {
|
||||
return ChannelServiceErr("删除通道失败")
|
||||
return core.NewBizErr("删除通道数量不匹配")
|
||||
}
|
||||
|
||||
// 禁用代理端口并下线用过的节点
|
||||
@@ -113,7 +114,7 @@ func (s *channelService) RemoveChannels(id []int32, userId ...int32) error {
|
||||
if len(shortToRemove) > 0 {
|
||||
err := removeShortChannelExternal(proxies, shortToRemove)
|
||||
if err != nil {
|
||||
return err
|
||||
return core.NewBizErr("提交删除通道配置失败", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -160,7 +161,7 @@ func removeShortChannelExternal(proxies []*m.Proxy, channels []*m.Channel) error
|
||||
}
|
||||
proxy, ok := proxyMap[proxyId]
|
||||
if !ok {
|
||||
return ChannelServiceErr("代理不存在")
|
||||
return core.NewBizErr("代理不存在")
|
||||
}
|
||||
|
||||
var secret = strings.Split(proxy.Secret, ":")
|
||||
@@ -173,13 +174,13 @@ func removeShortChannelExternal(proxies []*m.Proxy, channels []*m.Channel) error
|
||||
// 查询节点配置
|
||||
actives, err := gateway.GatewayPortActive()
|
||||
if err != nil {
|
||||
return err
|
||||
return core.NewBizErr("查询节点配置失败", err)
|
||||
}
|
||||
|
||||
// 更新节点配置
|
||||
err = gateway.GatewayPortConfigs(configs)
|
||||
if err != nil {
|
||||
return err
|
||||
return core.NewBizErr("提交删除通道配置失败", err)
|
||||
}
|
||||
|
||||
// 下线对应节点
|
||||
@@ -187,7 +188,7 @@ func removeShortChannelExternal(proxies []*m.Proxy, channels []*m.Channel) error
|
||||
for portStr, active := range actives {
|
||||
port, err := strconv.Atoi(portStr)
|
||||
if err != nil {
|
||||
return err
|
||||
return core.NewBizErr("端口转换失败", err)
|
||||
}
|
||||
key := uint64(proxyId)<<32 | uint64(port)
|
||||
if _, ok := portMap[key]; ok {
|
||||
@@ -200,7 +201,7 @@ func removeShortChannelExternal(proxies []*m.Proxy, channels []*m.Channel) error
|
||||
Edge: edges,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
return core.NewBizErr("下线节点失败", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -232,7 +233,7 @@ func (s *channelService) CreateChannel(
|
||||
// 查找套餐
|
||||
resource, err = findResource(q, resourceId, userId, count, now)
|
||||
if err != nil {
|
||||
return err
|
||||
return core.NewBizErr("查找套餐失败", err)
|
||||
}
|
||||
|
||||
// 查找白名单
|
||||
@@ -240,7 +241,7 @@ func (s *channelService) CreateChannel(
|
||||
if authType == ChannelAuthTypeIp {
|
||||
whitelist, err = findWhitelist(q, userId)
|
||||
if err != nil {
|
||||
return err
|
||||
return core.NewBizErr("查找白名单失败", err)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -261,13 +262,13 @@ func (s *channelService) CreateChannel(
|
||||
channels, err = assignLongChannels(q, userId, resourceId, count, config, filter)
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
return core.NewBizErr("分配通道失败", err)
|
||||
}
|
||||
|
||||
// 保存通道开通结果
|
||||
err = saveAssigns(q, resource, channels, now)
|
||||
if err != nil {
|
||||
return err
|
||||
return core.NewBizErr("保存通道失败", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -294,7 +295,7 @@ func (s *channelService) CreateChannel(
|
||||
asynq.ProcessIn(duration),
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, core.NewBizErr("提交异步删除通道任务失败", err)
|
||||
}
|
||||
|
||||
return channels, nil
|
||||
@@ -352,7 +353,7 @@ func findResource(q *q.Query, resourceId int32, userId int32, count int, now tim
|
||||
// 检查套餐使用情况
|
||||
switch info.Mode {
|
||||
default:
|
||||
return nil, ChannelServiceErr("不支持的套餐模式")
|
||||
return nil, core.NewBizErr("不支持的套餐模式")
|
||||
|
||||
// 包时
|
||||
case resource2.ModeTime:
|
||||
@@ -388,10 +389,10 @@ func findWhitelist(q *q.Query, userId int32) ([]string, error) {
|
||||
Select(q.Whitelist.Host).
|
||||
Scan(&whitelist)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, core.NewBizErr("查询白名单失败", err)
|
||||
}
|
||||
if len(whitelist) == 0 {
|
||||
return nil, ChannelServiceErr("用户没有白名单")
|
||||
return nil, core.NewBizErr("没有配置白名单")
|
||||
}
|
||||
|
||||
return whitelist, nil
|
||||
@@ -404,7 +405,7 @@ func assignShortChannels(q *q.Query, userId int32, resourceId int32, count int,
|
||||
Where(q.Proxy.Type.Eq(int32(proxy2.TypeThirdParty))).
|
||||
Find()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, core.NewBizErr("查找网关失败", err)
|
||||
}
|
||||
|
||||
// 查找已使用的节点
|
||||
@@ -424,13 +425,13 @@ func assignShortChannels(q *q.Query, userId int32, resourceId int32, count int,
|
||||
q.Channel.ProxyID).
|
||||
Find()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, core.NewBizErr("查找已使用的节点失败", err)
|
||||
}
|
||||
|
||||
// 查询已配置的节点
|
||||
remoteConfigs, err := g.Cloud.CloudAutoQuery()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, core.NewBizErr("查询远端节点配置失败", err)
|
||||
}
|
||||
|
||||
// 统计已用节点量与端口查找表
|
||||
@@ -503,7 +504,7 @@ func assignShortChannels(q *q.Query, userId int32, resourceId int32, count int,
|
||||
AutoConfig: newConfigs,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, core.NewBizErr("提交节点配置失败", err)
|
||||
}
|
||||
|
||||
slog.Debug("提交节点配置",
|
||||
@@ -565,7 +566,7 @@ func assignShortChannels(q *q.Query, userId int32, resourceId int32, count int,
|
||||
newChannels = append(newChannels, newChannel)
|
||||
}
|
||||
if len(portConfigs) < acc {
|
||||
return nil, ChannelServiceErr("网关端口数量到达上限,无法分配")
|
||||
return nil, core.NewBizErr("网关端口数量到达上限,无法分配")
|
||||
}
|
||||
|
||||
// 提交端口配置
|
||||
@@ -580,7 +581,7 @@ func assignShortChannels(q *q.Query, userId int32, resourceId int32, count int,
|
||||
)
|
||||
err = gateway.GatewayPortConfigs(portConfigs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, core.NewBizErr("提交端口配置失败", err)
|
||||
}
|
||||
|
||||
slog.Debug("提交端口配置", "step", time.Since(step))
|
||||
@@ -588,7 +589,7 @@ func assignShortChannels(q *q.Query, userId int32, resourceId int32, count int,
|
||||
}
|
||||
|
||||
if len(newChannels) != count {
|
||||
return nil, ChannelServiceErr("分配节点失败")
|
||||
return nil, core.NewBizErr("分配节点失败")
|
||||
}
|
||||
|
||||
return newChannels, nil
|
||||
@@ -630,7 +631,7 @@ func assignLongChannels(q *q.Query, userId int32, resourceId int32, count int, c
|
||||
Limit(count).
|
||||
Scan(&edges)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("查询符合条件的节点失败: %w", err)
|
||||
return nil, core.NewBizErr("查询符合条件的节点失败", err)
|
||||
}
|
||||
if len(edges) == 0 {
|
||||
return nil, ErrEdgesNoAvailable
|
||||
@@ -712,7 +713,7 @@ func assignLongChannels(q *q.Query, userId int32, resourceId int32, count int, c
|
||||
proxy := proxies[id]
|
||||
err := g.Proxy.Permit(proxy.Host, proxy.Secret, reqs)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, core.NewBizErr("提交端口配置失败", err)
|
||||
}
|
||||
}
|
||||
slog.Debug("提交端口配置", "step", time.Since(step))
|
||||
@@ -741,19 +742,14 @@ func saveAssigns(q *q.Query, resource *ResourceInfo, channels []*m.Channel, now
|
||||
|
||||
_, err = pipe.Exec(context.Background())
|
||||
if err != nil {
|
||||
return err
|
||||
return core.NewBizErr("缓存通道数据失败", err)
|
||||
}
|
||||
|
||||
// 保存通道
|
||||
err = q.Channel.
|
||||
Omit(
|
||||
q.Channel.EdgeID,
|
||||
q.Channel.EdgeHost,
|
||||
q.Channel.DeletedAt,
|
||||
).
|
||||
Create(channels...)
|
||||
if err != nil {
|
||||
return err
|
||||
return core.NewBizErr("保存通道失败", err)
|
||||
}
|
||||
|
||||
// 更新套餐使用记录
|
||||
@@ -785,7 +781,7 @@ func saveAssigns(q *q.Query, resource *ResourceInfo, channels []*m.Channel, now
|
||||
)
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
return core.NewBizErr("更新套餐使用记录失败", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -841,17 +837,11 @@ type ResourceInfo struct {
|
||||
Expire time.Time
|
||||
}
|
||||
|
||||
type ChannelServiceErr string
|
||||
|
||||
func (c ChannelServiceErr) Error() string {
|
||||
return string(c)
|
||||
}
|
||||
|
||||
const (
|
||||
ErrResourceNotExist = ChannelServiceErr("套餐不存在")
|
||||
ErrResourceInvalid = ChannelServiceErr("套餐不可用")
|
||||
ErrResourceExhausted = ChannelServiceErr("套餐已用完")
|
||||
ErrResourceExpired = ChannelServiceErr("套餐已过期")
|
||||
ErrResourceDailyLimit = ChannelServiceErr("套餐每日配额已用完")
|
||||
ErrEdgesNoAvailable = ChannelServiceErr("没有可用的节点")
|
||||
var (
|
||||
ErrResourceNotExist = core.NewBizErr("套餐不存在")
|
||||
ErrResourceInvalid = core.NewBizErr("套餐不可用")
|
||||
ErrResourceExhausted = core.NewBizErr("套餐已用完")
|
||||
ErrResourceExpired = core.NewBizErr("套餐已过期")
|
||||
ErrResourceDailyLimit = core.NewBizErr("套餐每日配额已用完")
|
||||
ErrEdgesNoAvailable = core.NewBizErr("没有可用的节点")
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user