fix(server): update server filtering to support multiple tags
This commit is contained in:
parent
cdc3d8b8f1
commit
f856dc7c01
@ -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) {
|
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{
|
total, list, err := l.svcCtx.ServerModel.FindServerListByFilter(l.ctx, &server.ServerFilter{
|
||||||
Page: req.Page,
|
Page: req.Page,
|
||||||
Size: req.Size,
|
Size: req.Size,
|
||||||
Search: req.Search,
|
Search: req.Search,
|
||||||
Tag: req.Tag,
|
Tags: tags,
|
||||||
Group: req.GroupId,
|
Group: req.GroupId,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@ -2,16 +2,10 @@ package server
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/perfect-panel/server/internal/model/server"
|
|
||||||
"github.com/perfect-panel/server/internal/svc"
|
"github.com/perfect-panel/server/internal/svc"
|
||||||
"github.com/perfect-panel/server/internal/types"
|
"github.com/perfect-panel/server/internal/types"
|
||||||
"github.com/perfect-panel/server/pkg/logger"
|
"github.com/perfect-panel/server/pkg/logger"
|
||||||
"github.com/perfect-panel/server/pkg/tool"
|
"github.com/perfect-panel/server/pkg/tool"
|
||||||
"github.com/perfect-panel/server/pkg/xerr"
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
"gorm.io/gorm"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type GetNodeTagListLogic struct {
|
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) {
|
func (l *GetNodeTagListLogic) GetNodeTagList() (resp *types.GetNodeTagListResponse, err error) {
|
||||||
var nodeTags, tags []string
|
tags, err := l.svcCtx.ServerModel.FindServerTags(l.ctx)
|
||||||
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...)
|
|
||||||
|
|
||||||
return &types.GetNodeTagListResponse{
|
return &types.GetNodeTagListResponse{
|
||||||
Tags: tags,
|
Tags: tool.RemoveDuplicateElements(tags...),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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) {
|
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)
|
clientType := l.getClientType(req)
|
||||||
var resp []byte
|
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))
|
l.Logger.Info(fmt.Sprintf("[Generate Subscribe] %s", clientType), logger.Field("ua", req.UA), logger.Field("flag", req.Flag))
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,7 @@ package server
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/perfect-panel/server/internal/config"
|
"github.com/perfect-panel/server/internal/config"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
@ -29,6 +30,8 @@ type customServerLogicModel interface {
|
|||||||
UpdateRuleGroup(ctx context.Context, data *RuleGroup) error
|
UpdateRuleGroup(ctx context.Context, data *RuleGroup) error
|
||||||
DeleteRuleGroup(ctx context.Context, id int64) error
|
DeleteRuleGroup(ctx context.Context, id int64) error
|
||||||
QueryAllRuleGroup(ctx context.Context) ([]*RuleGroup, error)
|
QueryAllRuleGroup(ctx context.Context) ([]*RuleGroup, error)
|
||||||
|
FindServersByTag(ctx context.Context, tag string) ([]*Server, error)
|
||||||
|
FindServerTags(ctx context.Context) ([]string, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -227,10 +230,16 @@ func (m *customServerModel) FindServerListByFilter(ctx context.Context, filter *
|
|||||||
query = conn.Where("group_id = ?", filter.Group)
|
query = conn.Where("group_id = ?", filter.Group)
|
||||||
}
|
}
|
||||||
if filter.Search != "" {
|
if filter.Search != "" {
|
||||||
query = query.Where("name LIKE ? OR server_addr LIKE ?", "%"+filter.Search+"%", "%"+filter.Search+"%")
|
query = query.Where("name LIKE ? OR server_addr LIKE ? OR tags LIKE ?", "%"+filter.Search+"%", "%"+filter.Search+"%", "%"+filter.Search+"%")
|
||||||
|
}
|
||||||
|
if len(filter.Tags) > 0 {
|
||||||
|
for i, tag := range filter.Tags {
|
||||||
|
if i == 0 {
|
||||||
|
query = query.Where("tags LIKE ?", "%"+tag+"%")
|
||||||
|
} else {
|
||||||
|
query = query.Or("tags LIKE ?", "%"+tag+"%")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if filter.Tag != "" {
|
|
||||||
query = query.Where("tag LIKE ?", "%"+filter.Tag+"%")
|
|
||||||
}
|
}
|
||||||
return query.Count(&total).Limit(filter.Size).Offset((filter.Page - 1) * filter.Size).Find(v).Error
|
return query.Count(&total).Limit(filter.Size).Offset((filter.Page - 1) * filter.Size).Find(v).Error
|
||||||
})
|
})
|
||||||
@ -239,3 +248,27 @@ func (m *customServerModel) FindServerListByFilter(ctx context.Context, filter *
|
|||||||
}
|
}
|
||||||
return total, data, nil
|
return total, data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *customServerModel) FindServerTags(ctx context.Context) ([]string, error) {
|
||||||
|
var data []string
|
||||||
|
err := m.QueryNoCacheCtx(ctx, &data, func(conn *gorm.DB, v interface{}) error {
|
||||||
|
return conn.Model(&Server{}).Distinct("tags").Pluck("tags", v).Error
|
||||||
|
})
|
||||||
|
var tags []string
|
||||||
|
for _, tag := range data {
|
||||||
|
if strings.Contains(tag, ",") {
|
||||||
|
tags = append(tags, strings.Split(tag, ",")...)
|
||||||
|
} else {
|
||||||
|
tags = append(tags, tag)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tags, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *customServerModel) FindServersByTag(ctx context.Context, tag string) ([]*Server, error) {
|
||||||
|
var data []*Server
|
||||||
|
err := m.QueryNoCacheCtx(ctx, &data, func(conn *gorm.DB, v interface{}) error {
|
||||||
|
return conn.Model(&Server{}).Where("FIND_IN_SET(?, tags)", tag).Order("sort ASC").Find(v).Error
|
||||||
|
})
|
||||||
|
return data, err
|
||||||
|
}
|
||||||
|
|||||||
@ -16,7 +16,7 @@ const (
|
|||||||
|
|
||||||
type ServerFilter struct {
|
type ServerFilter struct {
|
||||||
Id int64
|
Id int64
|
||||||
Tag string
|
Tags []string
|
||||||
Group int64
|
Group int64
|
||||||
Search string
|
Search string
|
||||||
Page int
|
Page int
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user