diff --git a/packages/analytics/public/css/style.css b/packages/analytics/public/css/style.css index f77ad99..d973b00 100644 --- a/packages/analytics/public/css/style.css +++ b/packages/analytics/public/css/style.css @@ -1,3 +1,7 @@ +body { + font-family: 'sans'; +} + table, tr, td, diff --git a/packages/analytics/src/controllers/index.js b/packages/analytics/src/controllers/index.js index 283a03b..d5a6967 100644 --- a/packages/analytics/src/controllers/index.js +++ b/packages/analytics/src/controllers/index.js @@ -1,5 +1,5 @@ import { userCount } from '../models/users.js' -import { sessionCount, sessionCompleted } from '../models/quests.js' +import { sessionCount, sessionCompleted } from '../models/sessions.js' // eslint-disable-next-line import/prefer-default-export export async function homeController(req, res) { diff --git a/packages/analytics/src/controllers/sessions.js b/packages/analytics/src/controllers/sessions.js new file mode 100644 index 0000000..3da3ef4 --- /dev/null +++ b/packages/analytics/src/controllers/sessions.js @@ -0,0 +1,7 @@ +import { sessionList } from '../models/sessions.js' + +// eslint-disable-next-line import/prefer-default-export +export async function sessionListController(req, res) { + const sessions = await sessionList() + res.render('sessions', { sessions }) +} diff --git a/packages/analytics/src/models/quests.js b/packages/analytics/src/models/quests.js deleted file mode 100644 index 7a0a3b3..0000000 --- a/packages/analytics/src/models/quests.js +++ /dev/null @@ -1,24 +0,0 @@ -import { Session } from '@linux-odyssey/models' - -export function sessionCount() { - return Session.find().count() -} - -export function sessionCompleted() { - return Session.find({ status: 'finished' }).count() -} - -export function averageTimeUsage() { - return Session.aggregate([ - { - $group: { - _id: '$quest', - average: { - $avg: { - $subtract: ['$finishedAt', '$createdAt'], - }, - }, - }, - }, - ]) -} diff --git a/packages/analytics/src/models/sessions.js b/packages/analytics/src/models/sessions.js new file mode 100644 index 0000000..9b429a8 --- /dev/null +++ b/packages/analytics/src/models/sessions.js @@ -0,0 +1,67 @@ +import { Session } from '@linux-odyssey/models' + +export function sessionCount() { + return Session.find().count() +} + +export function sessionCompleted() { + return Session.find({ status: 'finished' }).count() +} + +export function averageTimeUsage() { + return Session.aggregate([ + { + $group: { + _id: '$quest', + average: { + $avg: { + $subtract: ['$finishedAt', '$createdAt'], + }, + }, + }, + }, + ]) +} + +function formatTime(time) { + const seconds = Math.floor(time / 1000) + const minutes = Math.floor(seconds / 60) + const hours = Math.floor(minutes / 60) + return `${hours}h ${minutes % 60}m ${seconds % 60}s` +} + +export async function sessionList() { + const sessions = await Session.aggregate([ + { + $lookup: { + from: 'users', + localField: 'user', + foreignField: '_id', + as: 'user', + }, + }, + { $unwind: '$user' }, + { + $lookup: { + from: 'commands', + localField: '_id', + foreignField: 'session', + as: 'commands', + }, + }, + ]) + console.log(sessions) + return sessions.map( + ({ user, quest, status, createdAt, finishedAt, commands }) => { + return { + user: user.username, + quest, + status, + createdAt: createdAt.toLocaleString(), + finishedAt: finishedAt?.toLocaleString(), + usedTime: finishedAt ? formatTime(finishedAt - createdAt) : '', + commandCount: commands.length, + } + } + ) +} diff --git a/packages/analytics/src/router.js b/packages/analytics/src/router.js index b6c9b98..8194b55 100644 --- a/packages/analytics/src/router.js +++ b/packages/analytics/src/router.js @@ -3,11 +3,13 @@ import { Router } from 'express' import { homeController } from './controllers/index.js' import { userListController } from './controllers/users.js' import { commandListController } from './controllers/commands.js' +import { sessionListController } from './controllers/sessions.js' const router = Router() router.get('/', homeController) router.get('/users', userListController) router.get('/commands', commandListController) +router.get('/sessions', sessionListController) export default router diff --git a/packages/analytics/views/layouts/main.handlebars b/packages/analytics/views/layouts/main.handlebars index feb46cd..e269d7b 100644 --- a/packages/analytics/views/layouts/main.handlebars +++ b/packages/analytics/views/layouts/main.handlebars @@ -9,6 +9,7 @@
  • Home
  • Users
  • Commands
  • +
  • Sessions
  • {{{body}}} diff --git a/packages/analytics/views/sessions.handlebars b/packages/analytics/views/sessions.handlebars new file mode 100644 index 0000000..2d0c3f3 --- /dev/null +++ b/packages/analytics/views/sessions.handlebars @@ -0,0 +1,25 @@ +

    Sessions

    +
    + + + + + + + + + + + {{#each sessions}} + + + + + + + + + + {{/each}} +
    UserQuestStatusCreated AtFinished AtUsed TimeCommand Count
    {{user}}{{quest}}{{status}}{{createdAt}}{{finishedAt}}{{usedTime}}{{commandCount}}
    +
    \ No newline at end of file