fix(server): update server filtering to support multiple tags

This commit is contained in:
Chang lue Tsen
2025-04-30 12:53:01 +09:00
parent cdc3d8b8f1
commit f856dc7c01
5 changed files with 68 additions and 31 deletions
@@ -32,11 +32,15 @@ func NewGetNodeListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetNo
}
func (l *GetNodeListLogic) GetNodeList(req *types.GetNodeServerListRequest) (resp *types.GetNodeServerListResponse, err error) {
tags := make([]string, 0)
if req.Tags != "" {
tags = strings.Split(req.Tags, ",")
}
total, list, err := l.svcCtx.ServerModel.FindServerListByFilter(l.ctx, &server.ServerFilter{
Page: req.Page,
Size: req.Size,
Search: req.Search,
Tag: req.Tag,
Tags: tags,
Group: req.GroupId,
})
if err != nil {
@@ -2,16 +2,10 @@ package server
import (
"context"
"strings"
"github.com/perfect-panel/server/internal/model/server"
"github.com/perfect-panel/server/internal/svc"
"github.com/perfect-panel/server/internal/types"
"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"
"gorm.io/gorm"
)
type GetNodeTagListLogic struct {
@@ -30,24 +24,8 @@ func NewGetNodeTagListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Ge
}
func (l *GetNodeTagListLogic) GetNodeTagList() (resp *types.GetNodeTagListResponse, err error) {
var nodeTags, tags []string
err = l.svcCtx.ServerModel.Transaction(l.ctx, func(db *gorm.DB) error {
return db.Model(&server.Server{}).Select("tags").Pluck("tags", &nodeTags).Error
})
if err != nil {
return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "get node tag list failed, %s", err.Error())
}
for _, tag := range nodeTags {
tags = append(tags, strings.Split(tag, ",")...)
}
// Remove duplicate tags
tags = tool.RemoveDuplicateElements(tags...)
tags, err := l.svcCtx.ServerModel.FindServerTags(l.ctx)
return &types.GetNodeTagListResponse{
Tags: tags,
Tags: tool.RemoveDuplicateElements(tags...),
}, nil
}
+24 -2
View File
@@ -175,10 +175,32 @@ func (l *SubscribeLogic) getRules() ([]*server.RuleGroup, error) {
}
func (l *SubscribeLogic) buildClientConfig(req *types.SubscribeRequest, userSub *user.Subscribe, servers []*server.Server, rules []*server.RuleGroup) ([]byte, string, error) {
proxyManager := adapter.NewAdapter(servers, rules)
tags := make(map[string][]*server.Server)
groups, err := l.svc.ServerModel.QueryAllGroup(l.ctx)
if err != nil {
l.Errorw("[Generate Subscribe]find group error: %v", logger.Field("error", err.Error()))
return nil, "", errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "find group error: %v", err.Error())
}
for _, group := range groups {
total, servers, err := l.svc.ServerModel.FindServerListByFilter(l.ctx, &server.ServerFilter{
Tags: []string{group.Name},
})
if err != nil {
continue
}
if total > 0 {
tags[group.Name] = servers
}
}
proxyManager := adapter.NewAdapter(&adapter.Config{
Nodes: servers,
Rules: rules,
Tags: make(map[string][]*server.Server),
})
clientType := l.getClientType(req)
var resp []byte
var err error
l.Logger.Info(fmt.Sprintf("[Generate Subscribe] %s", clientType), logger.Field("ua", req.UA), logger.Field("flag", req.Flag))