From 61ac829c3739f974eb39609d9a232075751a29fc Mon Sep 17 00:00:00 2001 From: Chang lue Tsen Date: Thu, 4 Sep 2025 13:46:24 -0400 Subject: [PATCH] feat(userlist): enhance GetServerUserListLogic with improved node and tag handling --- .../logic/server/getServerUserListLogic.go | 2 +- internal/model/subscribe/default.go | 32 ++++++++++++++++++- internal/model/subscribe/model.go | 8 ++--- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/internal/logic/server/getServerUserListLogic.go b/internal/logic/server/getServerUserListLogic.go index aa6900a..70ea51f 100644 --- a/internal/logic/server/getServerUserListLogic.go +++ b/internal/logic/server/getServerUserListLogic.go @@ -23,7 +23,7 @@ type GetServerUserListLogic struct { svcCtx *svc.ServiceContext } -// Get user list +// NewGetServerUserListLogic Get user list func NewGetServerUserListLogic(ctx *gin.Context, svcCtx *svc.ServiceContext) *GetServerUserListLogic { return &GetServerUserListLogic{ Logger: logger.WithContext(ctx.Request.Context()), diff --git a/internal/model/subscribe/default.go b/internal/model/subscribe/default.go index 67f15d9..29e748c 100644 --- a/internal/model/subscribe/default.go +++ b/internal/model/subscribe/default.go @@ -4,8 +4,11 @@ import ( "context" "errors" "fmt" + "strings" + "github.com/perfect-panel/server/internal/model/node" "github.com/perfect-panel/server/pkg/cache" + "github.com/perfect-panel/server/pkg/tool" "github.com/redis/go-redis/v9" "gorm.io/gorm" ) @@ -57,7 +60,34 @@ func (m *defaultSubscribeModel) getCacheKeys(data *Subscribe) []string { if data == nil { return []string{} } - return []string{fmt.Sprintf("%s%v", cacheSubscribeIdPrefix, data.Id)} + var keys []string + if data.Nodes != "" { + var nodes []*node.Node + ids := strings.Split(data.Nodes, ",") + + err := m.QueryNoCacheCtx(context.Background(), &nodes, func(conn *gorm.DB, v interface{}) error { + return conn.Model(&node.Node{}).Where("id IN (?)", tool.StringSliceToInt64Slice(ids)).Find(&nodes).Error + }) + if err == nil { + for _, n := range nodes { + keys = append(keys, fmt.Sprintf("%s%d", node.ServerUserListCacheKey, n.ServerId)) + } + } + } + if data.NodeTags != "" { + var nodes []*node.Node + tags := tool.RemoveDuplicateElements(strings.Split(data.NodeTags, ",")...) + err := m.QueryNoCacheCtx(context.Background(), &nodes, func(conn *gorm.DB, v interface{}) error { + return conn.Model(&node.Node{}).Scopes(InSet("tags", tags)).Find(&nodes).Error + }) + if err == nil { + for _, n := range nodes { + keys = append(keys, fmt.Sprintf("%s%d", node.ServerUserListCacheKey, n.ServerId)) + } + } + } + + return append(keys, fmt.Sprintf("%s%v", cacheSubscribeIdPrefix, data.Id)) } func (m *defaultSubscribeModel) Insert(ctx context.Context, data *Subscribe, tx ...*gorm.DB) error { diff --git a/internal/model/subscribe/model.go b/internal/model/subscribe/model.go index eed3a8c..82aad76 100644 --- a/internal/model/subscribe/model.go +++ b/internal/model/subscribe/model.go @@ -147,14 +147,14 @@ func InSet(field string, values []string) func(db *gorm.DB) *gorm.DB { return db } - conds := db + query := db for i, v := range values { if i == 0 { - conds = conds.Where("FIND_IN_SET(?, "+field+")", v) + query = query.Where("FIND_IN_SET(?, "+field+")", v) } else { - conds = conds.Or("FIND_IN_SET(?, "+field+")", v) + query = query.Or("FIND_IN_SET(?, "+field+")", v) } } - return conds + return query } }