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 }