diff --git a/packages/analytics/public/css/style.css b/packages/analytics/public/css/style.css index 3f78b7a..f77ad99 100644 --- a/packages/analytics/public/css/style.css +++ b/packages/analytics/public/css/style.css @@ -4,6 +4,12 @@ td, th { border-collapse: collapse; border-spacing: 0; - width: 50%; + width: 100%; border: 2px solid black; } + +th, +td { + width: 1px; + white-space: nowrap; +} diff --git a/packages/analytics/src/controllers/users.js b/packages/analytics/src/controllers/users.js new file mode 100644 index 0000000..5eb16b9 --- /dev/null +++ b/packages/analytics/src/controllers/users.js @@ -0,0 +1,6 @@ +import { userList } from '../models/users.js' + +// eslint-disable-next-line import/prefer-default-export +export async function userListController(req, res) { + res.render('users', { users: await userList() }) +} diff --git a/packages/analytics/src/models/users.js b/packages/analytics/src/models/users.js index 4862af2..9d1a545 100644 --- a/packages/analytics/src/models/users.js +++ b/packages/analytics/src/models/users.js @@ -1,6 +1,47 @@ -import { User } from '@linux-odyssey/models' +import { Session, User } from '@linux-odyssey/models' + +function loginMethods(user) { + const methods = [] + if (user.hashedPassword) methods.push('password') + if (user.google?.id) methods.push('google') + if (user.github?.id) methods.push('github') + return methods +} -// eslint-disable-next-line import/prefer-default-export export function userCount() { return User.find().count() } + +export async function userList() { + const users = await Session.aggregate([ + { + $group: { + _id: '$user', + count: { $sum: 1 }, + lastActivityAt: { $max: '$lastActivityAt' }, + }, + }, + { + $lookup: { + from: 'users', + localField: '_id', + foreignField: '_id', + as: 'userData', + }, + }, + { $unwind: '$userData' }, + { $sort: { 'userData.createdAt': 1 } }, + ]) + console.log(users) + return users.map(({ userData, count, lastActivityAt }) => { + const { username, email, createdAt } = userData + return { + username, + email, + createdAt: createdAt.toLocaleString(), + method: loginMethods(userData), + sessionCount: count, + lastActivityAt: lastActivityAt.toLocaleString(), + } + }) +} diff --git a/packages/analytics/src/router.js b/packages/analytics/src/router.js index 20b35bd..6e3b0ae 100644 --- a/packages/analytics/src/router.js +++ b/packages/analytics/src/router.js @@ -1,9 +1,11 @@ import { Router } from 'express' import { homeController } from './controllers/index.js' +import { userListController } from './controllers/users.js' const router = Router() router.get('/', homeController) +router.get('/users', userListController) export default router diff --git a/packages/analytics/views/users.handlebars b/packages/analytics/views/users.handlebars new file mode 100644 index 0000000..acc6233 --- /dev/null +++ b/packages/analytics/views/users.handlebars @@ -0,0 +1,23 @@ +
| Username | +Registration Method | +Registration Time | +Sessions Count | +Last Activity | +|
|---|---|---|---|---|---|
| {{username}} | +{{email}} | +{{method}} | +{{createdAt}} | +{{sessionCount}} | +{{lastActivityAt}} | +