From 2f89b0d791faf06819833b2dc9ad4d8d23767ce2 Mon Sep 17 00:00:00 2001 From: Julian Lam Date: Wed, 24 Feb 2021 11:22:44 -0500 Subject: [PATCH] feat: recent logins sessions table in dashbaord subpage --- public/language/en-GB/admin/dashboard.json | 4 +++- src/controllers/admin/dashboard.js | 16 +++++++++++++++ src/views/admin/dashboard/logins.tpl | 24 ++++++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/public/language/en-GB/admin/dashboard.json b/public/language/en-GB/admin/dashboard.json index 6406c8c985..b5ff928dd4 100644 --- a/public/language/en-GB/admin/dashboard.json +++ b/public/language/en-GB/admin/dashboard.json @@ -81,5 +81,7 @@ "back-to-dashboard": "Back to Dashboard", "details.no-users": "No users have joined within the selected timeframe", "details.no-topics": "No topics have been posted within the selected timeframe", - "details.no-logins": "No logins have been recorded within the selected timeframe" + "details.no-logins": "No logins have been recorded within the selected timeframe", + "details.logins-static": "NodeBB only saves session data for %1 days, and so this table below will only show the most recently active sessions", + "details.logins-login-time": "Login Time" } diff --git a/src/controllers/admin/dashboard.js b/src/controllers/admin/dashboard.js index d864706c41..d4a75cfa27 100644 --- a/src/controllers/admin/dashboard.js +++ b/src/controllers/admin/dashboard.js @@ -242,11 +242,27 @@ dashboardController.getLogins = async (req, res) => { month: stats[0].thismonth, }; + // List recent sessions + const start = Date.now() - (1000 * 60 * 60 * 24 * meta.config.loginDays); + const uids = await db.getSortedSetRangeByScore('users:online', 0, 500, start, Date.now()); + const usersData = await user.getUsersData(uids); + let sessions = await Promise.all(uids.map(async (uid) => { + const sessions = await user.auth.getSessions(uid); + sessions.forEach((session) => { + session.user = usersData[uids.indexOf(uid)]; + }); + + return sessions; + })); + sessions = _.flatten(sessions).sort((a, b) => b.datetime - a.datetime); + res.render('admin/dashboard/logins', { set: 'logins', query: req.query, stats, summary, + sessions, + loginDays: meta.config.loginDays, }); }; diff --git a/src/views/admin/dashboard/logins.tpl b/src/views/admin/dashboard/logins.tpl index ec9f431882..9f3be1d1d6 100644 --- a/src/views/admin/dashboard/logins.tpl +++ b/src/views/admin/dashboard/logins.tpl @@ -7,5 +7,29 @@ + +
[[admin/dashboard:details.logins-static, {loginDays}]]
+ + + + + + + {{{ if !sessions.length}}} + + + + {{{ end }}} + {{{ each sessions }}} + + + + + {{{ end }}} + +
[[admin/manage/users:users.username]][[admin/dashboard:details.logins-login-time]]
[[admin/dashboard:details.no-logins]]
+ {buildAvatar(./user, "sm", true)} {../username} + {function.userAgentIcons} {../browser} {../version} on {../platform} +
\ No newline at end of file