46 lines
1.2 KiB
Go
46 lines
1.2 KiB
Go
package user
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// FindActiveSubscribesByUserIds Find active subscriptions for multiple users
|
|
func (m *customUserModel) FindActiveSubscribesByUserIds(ctx context.Context, userIds []int64) (map[int64]*UserStatusInfo, error) {
|
|
if len(userIds) == 0 {
|
|
return map[int64]*UserStatusInfo{}, nil
|
|
}
|
|
|
|
type Result struct {
|
|
UserId int64
|
|
Name string
|
|
UpdatedAt *time.Time
|
|
}
|
|
var results []Result
|
|
|
|
// Query latest active subscription for each user
|
|
err := m.QueryNoCacheCtx(ctx, &results, func(conn *gorm.DB, v interface{}) error {
|
|
return conn.Table("user_subscribe").
|
|
Select("user_subscribe.user_id, subscribe.name, user_subscribe.updated_at").
|
|
Joins("LEFT JOIN subscribe ON user_subscribe.subscribe_id = subscribe.id").
|
|
Where("user_subscribe.user_id IN ? AND user_subscribe.status IN (0, 1) AND user_subscribe.expire_time > ?", userIds, time.Now()).
|
|
Order("user_subscribe.created_at ASC"). // Ascending so we can overwrite in map to get the latest
|
|
Scan(v).Error
|
|
})
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
userMap := make(map[int64]*UserStatusInfo)
|
|
for _, r := range results {
|
|
userMap[r.UserId] = &UserStatusInfo{
|
|
MemberStatus: r.Name,
|
|
LastTrafficAt: r.UpdatedAt,
|
|
}
|
|
}
|
|
return userMap, nil
|
|
}
|