This commit is contained in:
@@ -3,6 +3,7 @@ package user
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/perfect-panel/server/internal/model/order"
|
||||
@@ -57,13 +58,17 @@ type LoginLogFilterParams struct {
|
||||
}
|
||||
|
||||
type UserFilterParams struct {
|
||||
Search string
|
||||
UserId *int64
|
||||
SubscribeId *int64
|
||||
UserSubscribeId *int64
|
||||
ShortCode string
|
||||
Order string // Order by id, e.g., "desc"
|
||||
Unscoped bool // Whether to include soft-deleted records
|
||||
Search string
|
||||
UserId *int64
|
||||
SubscribeId *int64
|
||||
UserSubscribeId *int64
|
||||
ShortCode string
|
||||
FamilyJoined *bool
|
||||
FamilyStatus string
|
||||
FamilyOwnerUserId *int64
|
||||
FamilyId *int64
|
||||
Order string // Order by id, e.g., "desc"
|
||||
Unscoped bool // Whether to include soft-deleted records
|
||||
}
|
||||
|
||||
type customUserLogicModel interface {
|
||||
@@ -117,8 +122,9 @@ type customUserLogicModel interface {
|
||||
}
|
||||
|
||||
type UserStatusInfo struct {
|
||||
MemberStatus string
|
||||
LastTrafficAt *time.Time
|
||||
MemberStatus string
|
||||
LastTrafficAt *time.Time
|
||||
PurchasedPackage string
|
||||
}
|
||||
|
||||
type UserStatisticsWithDate struct {
|
||||
@@ -140,6 +146,26 @@ func (m *customUserModel) QueryPageList(ctx context.Context, page, size int, fil
|
||||
var list []*User
|
||||
var total int64
|
||||
err := m.QueryNoCacheCtx(ctx, &list, func(conn *gorm.DB, v interface{}) error {
|
||||
joinedFamily := false
|
||||
joinFamily := func(c *gorm.DB) *gorm.DB {
|
||||
if joinedFamily {
|
||||
return c
|
||||
}
|
||||
joinedFamily = true
|
||||
return c.
|
||||
Joins("JOIN user_family_member ufm ON ufm.user_id = user.id AND ufm.deleted_at IS NULL AND ufm.status = ?", FamilyMemberActive).
|
||||
Joins("JOIN user_family uf ON uf.id = ufm.family_id AND uf.deleted_at IS NULL")
|
||||
}
|
||||
joinFamilyLeft := func(c *gorm.DB) *gorm.DB {
|
||||
if joinedFamily {
|
||||
return c
|
||||
}
|
||||
joinedFamily = true
|
||||
return c.
|
||||
Joins("LEFT JOIN user_family_member ufm ON ufm.user_id = user.id AND ufm.deleted_at IS NULL AND ufm.status = ?", FamilyMemberActive).
|
||||
Joins("LEFT JOIN user_family uf ON uf.id = ufm.family_id AND uf.deleted_at IS NULL")
|
||||
}
|
||||
|
||||
if filter != nil {
|
||||
if filter.UserId != nil {
|
||||
conn = conn.Where("user.id =?", *filter.UserId)
|
||||
@@ -160,6 +186,46 @@ func (m *customUserModel) QueryPageList(ctx context.Context, page, size int, fil
|
||||
conn = conn.Joins("LEFT JOIN user_device ON user.id = user_device.user_id").
|
||||
Where("user_device.short_code LIKE ?", "%"+filter.ShortCode+"%")
|
||||
}
|
||||
|
||||
if filter.FamilyJoined != nil {
|
||||
if *filter.FamilyJoined {
|
||||
conn = joinFamily(conn)
|
||||
} else {
|
||||
conn = joinFamilyLeft(conn)
|
||||
conn = conn.Where("ufm.id IS NULL")
|
||||
}
|
||||
}
|
||||
|
||||
if filter.FamilyOwnerUserId != nil {
|
||||
conn = joinFamily(conn)
|
||||
conn = conn.Where("uf.owner_user_id = ?", *filter.FamilyOwnerUserId)
|
||||
}
|
||||
|
||||
if filter.FamilyId != nil {
|
||||
conn = joinFamily(conn)
|
||||
conn = conn.Where("uf.id = ?", *filter.FamilyId)
|
||||
}
|
||||
|
||||
if filter.FamilyStatus != "" {
|
||||
normalizedStatus := strings.ToLower(strings.TrimSpace(filter.FamilyStatus))
|
||||
var (
|
||||
statusValue uint8
|
||||
hasStatus bool
|
||||
)
|
||||
switch normalizedStatus {
|
||||
case "active", "1":
|
||||
statusValue = FamilyStatusActive
|
||||
hasStatus = true
|
||||
case "disabled", "0":
|
||||
statusValue = 0
|
||||
hasStatus = true
|
||||
}
|
||||
if hasStatus {
|
||||
conn = joinFamily(conn)
|
||||
conn = conn.Where("uf.status = ?", statusValue)
|
||||
}
|
||||
}
|
||||
|
||||
if filter.Order != "" {
|
||||
conn = conn.Order(fmt.Sprintf("user.id %s", filter.Order))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user