feat(userlist): enhance GetServerUserListLogic with improved node and tag handling

This commit is contained in:
Chang lue Tsen 2025-09-04 13:46:24 -04:00
parent 805fca90e0
commit 61ac829c37
3 changed files with 36 additions and 6 deletions

View File

@ -23,7 +23,7 @@ type GetServerUserListLogic struct {
svcCtx *svc.ServiceContext svcCtx *svc.ServiceContext
} }
// Get user list // NewGetServerUserListLogic Get user list
func NewGetServerUserListLogic(ctx *gin.Context, svcCtx *svc.ServiceContext) *GetServerUserListLogic { func NewGetServerUserListLogic(ctx *gin.Context, svcCtx *svc.ServiceContext) *GetServerUserListLogic {
return &GetServerUserListLogic{ return &GetServerUserListLogic{
Logger: logger.WithContext(ctx.Request.Context()), Logger: logger.WithContext(ctx.Request.Context()),

View File

@ -4,8 +4,11 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"strings"
"github.com/perfect-panel/server/internal/model/node"
"github.com/perfect-panel/server/pkg/cache" "github.com/perfect-panel/server/pkg/cache"
"github.com/perfect-panel/server/pkg/tool"
"github.com/redis/go-redis/v9" "github.com/redis/go-redis/v9"
"gorm.io/gorm" "gorm.io/gorm"
) )
@ -57,7 +60,34 @@ func (m *defaultSubscribeModel) getCacheKeys(data *Subscribe) []string {
if data == nil { if data == nil {
return []string{} 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 { func (m *defaultSubscribeModel) Insert(ctx context.Context, data *Subscribe, tx ...*gorm.DB) error {

View File

@ -147,14 +147,14 @@ func InSet(field string, values []string) func(db *gorm.DB) *gorm.DB {
return db return db
} }
conds := db query := db
for i, v := range values { for i, v := range values {
if i == 0 { if i == 0 {
conds = conds.Where("FIND_IN_SET(?, "+field+")", v) query = query.Where("FIND_IN_SET(?, "+field+")", v)
} else { } else {
conds = conds.Or("FIND_IN_SET(?, "+field+")", v) query = query.Or("FIND_IN_SET(?, "+field+")", v)
} }
} }
return conds return query
} }
} }