From c5be0081ca29c93858d1006211aedc837b51dbec Mon Sep 17 00:00:00 2001 From: Chang lue Tsen Date: Fri, 3 Oct 2025 14:53:52 -0400 Subject: [PATCH] fix(model): simplify tag filtering using GORM scopes --- internal/model/node/model.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/internal/model/node/model.go b/internal/model/node/model.go index 8828a99..5bfa0ce 100644 --- a/internal/model/node/model.go +++ b/internal/model/node/model.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/perfect-panel/server/pkg/tool" + "gorm.io/gorm" ) type customServerLogicModel interface { @@ -85,10 +86,7 @@ func (m *customServerModel) FilterNodeList(ctx context.Context, params *FilterNo query = query.Where("server_id IN ?", params.ServerId) } if len(params.Tag) > 0 { - query = query.Where("1 = 0") - for _, tag := range params.Tag { - query = query.Or("FIND_IN_SET(?,tags)", tag) - } + query = query.Scopes(InSet("tags", params.Tag)) } if params.Protocol != "" { query = query.Where("protocol = ?", params.Protocol) @@ -165,3 +163,18 @@ func (m *customServerModel) ClearServerCache(ctx context.Context, serverId int64 } return nil } + +// InSet GORM InSet +func InSet(field string, values []string) func(db *gorm.DB) *gorm.DB { + return func(db *gorm.DB) *gorm.DB { + if len(values) == 0 { + return db + } + + query := db.Where("1=0") + for _, v := range values { + query = query.Or("FIND_IN_SET(?, "+field+")", v) + } + return query + } +}