mirror of
https://github.com/linux-odyssey/linux-odyssey.git
synced 2026-11-05 19:20:12 +08:00
50 lines
1.1 KiB
JavaScript
50 lines
1.1 KiB
JavaScript
import { Session, User } from '@linux-odyssey/models'
|
|
|
|
function loginMethods(user) {
|
|
const methods = []
|
|
if (user.hashedPassword) methods.push('password')
|
|
if (user.socialLogins) methods.push(...Object.keys(user.socialLogins))
|
|
return methods
|
|
}
|
|
|
|
export function userCount() {
|
|
return User.find().count()
|
|
}
|
|
|
|
export async function userList(pagination) {
|
|
const users = await Session.aggregate([
|
|
pagination.match('user'),
|
|
{
|
|
$group: {
|
|
_id: '$user',
|
|
count: { $sum: 1 },
|
|
lastActivityAt: { $max: '$lastActivityAt' },
|
|
},
|
|
},
|
|
{
|
|
$lookup: {
|
|
from: 'users',
|
|
localField: '_id',
|
|
foreignField: '_id',
|
|
as: 'userData',
|
|
},
|
|
},
|
|
{ $unwind: '$userData' },
|
|
pagination.sort('userData._id'),
|
|
pagination.limit(),
|
|
])
|
|
|
|
return users.map(({ userData, count, lastActivityAt }) => {
|
|
const { _id, username, email, createdAt } = userData
|
|
return {
|
|
_id,
|
|
username,
|
|
email,
|
|
createdAt: createdAt?.toLocaleString(),
|
|
method: loginMethods(userData),
|
|
sessionCount: count,
|
|
lastActivityAt: lastActivityAt?.toLocaleString(),
|
|
}
|
|
})
|
|
}
|