diff --git a/public/language/en-GB/admin/dashboard.json b/public/language/en-GB/admin/dashboard.json index 6ad973f5f3..0be6d5866c 100644 --- a/public/language/en-GB/admin/dashboard.json +++ b/public/language/en-GB/admin/dashboard.json @@ -75,6 +75,7 @@ "graphs.page-views-registered": "Page Views Registered", "graphs.page-views-guest": "Page Views Guest", "graphs.page-views-bot": "Page Views Bot", + "graphs.page-views-ap": "ActivityPub Page Views", "graphs.unique-visitors": "Unique Visitors", "graphs.registered-users": "Registered Users", "graphs.guest-users": "Guest Users", diff --git a/public/src/admin/dashboard.js b/public/src/admin/dashboard.js index a2b624c5a8..5fa55a7e0d 100644 --- a/public/src/admin/dashboard.js +++ b/public/src/admin/dashboard.js @@ -165,6 +165,7 @@ function setupGraphs(callback) { t.translateKey('admin/dashboard:graphs.page-views-registered', []), t.translateKey('admin/dashboard:graphs.page-views-guest', []), t.translateKey('admin/dashboard:graphs.page-views-bot', []), + t.translateKey('admin/dashboard:graphs.page-views-ap', []), t.translateKey('admin/dashboard:graphs.unique-visitors', []), t.translateKey('admin/dashboard:graphs.registered-users', []), t.translateKey('admin/dashboard:graphs.guest-users', []), @@ -231,6 +232,18 @@ function setupGraphs(callback) { fill: 'origin', tension: tension, backgroundColor: 'rgba(151,187,205,0.2)', + borderColor: 'rgba(110, 187, 132, 1)', + pointBackgroundColor: 'rgba(110, 187, 132, 1)', + pointHoverBackgroundColor: 'rgba(110, 187, 132, 1)', + pointBorderColor: '#fff', + pointHoverBorderColor: 'rgba(110, 187, 132, 1)', + data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + }, + { + label: translations[5], + fill: 'origin', + tension: tension, + backgroundColor: 'rgba(151,187,205,0.2)', borderColor: 'rgba(151,187,205,1)', pointBackgroundColor: 'rgba(151,187,205,1)', pointHoverBackgroundColor: 'rgba(151,187,205,1)', @@ -247,7 +260,8 @@ function setupGraphs(callback) { data.datasets[1].yAxisID = 'left-y-axis'; data.datasets[2].yAxisID = 'left-y-axis'; data.datasets[3].yAxisID = 'left-y-axis'; - data.datasets[4].yAxisID = 'right-y-axis'; + data.datasets[4].yAxisID = 'left-y-axis'; + data.datasets[5].yAxisID = 'right-y-axis'; graphs.traffic = new Chart(trafficCtx, { type: 'line', @@ -269,7 +283,7 @@ function setupGraphs(callback) { type: 'linear', title: { display: true, - text: translations[4], + text: translations[5], }, beginAtZero: true, }, @@ -446,7 +460,8 @@ function updateTrafficGraph(units, until, amount) { graphs.traffic.data.datasets[1].data = data.pageviewsRegistered; graphs.traffic.data.datasets[2].data = data.pageviewsGuest; graphs.traffic.data.datasets[3].data = data.pageviewsBot; - graphs.traffic.data.datasets[4].data = data.uniqueVisitors; + graphs.traffic.data.datasets[4].data = data.appageviews; + graphs.traffic.data.datasets[5].data = data.uniqueVisitors; graphs.traffic.data.labels = graphs.traffic.data.xLabels; graphs.traffic.update(); diff --git a/src/analytics.js b/src/analytics.js index b70aec7e5c..a0fadeab68 100644 --- a/src/analytics.js +++ b/src/analytics.js @@ -21,6 +21,7 @@ let local = { pageViewsRegistered: 0, pageViewsGuest: 0, pageViewsBot: 0, + apPageViews: 0, uniquevisitors: 0, }; const empty = _.cloneDeep(local); @@ -117,6 +118,10 @@ Analytics.pageView = async function (payload) { } }; +Analytics.apPageView = function () { + local.apPageViews += 1; +}; + Analytics.writeData = async function () { const today = new Date(); const month = new Date(); @@ -162,6 +167,12 @@ Analytics.writeData = async function () { total.pageViewsBot = 0; } + if (total.apPageViews > 0) { + incrByBulk.push(['analytics:pageviews:ap', total.apPageViews, today.getTime()]); + incrByBulk.push(['analytics:pageviews:ap:month', total.apPageViews, month.getTime()]); + total.apPageViews = 0; + } + if (total.uniquevisitors > 0) { incrByBulk.push(['analytics:uniquevisitors', total.uniquevisitors, today.getTime()]); total.uniquevisitors = 0; diff --git a/src/controllers/admin/dashboard.js b/src/controllers/admin/dashboard.js index aa173eca07..20f31c2b67 100644 --- a/src/controllers/admin/dashboard.js +++ b/src/controllers/admin/dashboard.js @@ -91,7 +91,7 @@ async function getLatestVersion() { dashboardController.getAnalytics = async (req, res, next) => { // Basic validation const validUnits = ['days', 'hours']; - const validSets = ['uniquevisitors', 'pageviews', 'pageviews:registered', 'pageviews:bot', 'pageviews:guest']; + const validSets = ['uniquevisitors', 'pageviews', 'pageviews:registered', 'pageviews:bot', 'pageviews:guest', 'pageviews:ap']; const until = req.query.until ? new Date(parseInt(req.query.until, 10)) : Date.now(); const count = req.query.count || (req.query.units === 'hours' ? 24 : 30); if (isNaN(until) || !validUnits.includes(req.query.units)) { diff --git a/src/middleware/activitypub.js b/src/middleware/activitypub.js index b38caa552a..4390335c0b 100644 --- a/src/middleware/activitypub.js +++ b/src/middleware/activitypub.js @@ -3,11 +3,17 @@ const db = require('../database'); const meta = require('../meta'); const activitypub = require('../activitypub'); +const analytics = require('../analytics'); const middleware = module.exports; middleware.enabled = async (req, res, next) => next(!meta.config.activitypubEnabled ? 'route' : undefined); +middleware.pageview = async (req, res, next) => { + analytics.apPageView(); + next(); +}; + middleware.assertS2S = async function (req, res, next) { // For whatever reason, express accepts does not recognize "profile" as a valid differentiator // Therefore, manual header parsing is used here. diff --git a/src/routes/activitypub.js b/src/routes/activitypub.js index 760287e102..815fd738ef 100644 --- a/src/routes/activitypub.js +++ b/src/routes/activitypub.js @@ -14,6 +14,7 @@ module.exports = function (app, middleware, controllers) { const middlewares = [ middleware.activitypub.enabled, + middleware.activitypub.pageview, middleware.activitypub.assertS2S, middleware.activitypub.verify, middleware.activitypub.configureResponse, diff --git a/src/socket.io/admin/analytics.js b/src/socket.io/admin/analytics.js index 8af8881873..03cffb6d20 100644 --- a/src/socket.io/admin/analytics.js +++ b/src/socket.io/admin/analytics.js @@ -30,6 +30,7 @@ Analytics.get = async function (socket, data) { pageviewsRegistered: getStats('analytics:pageviews:registered', until, data.amount), pageviewsGuest: getStats('analytics:pageviews:guest', until, data.amount), pageviewsBot: getStats('analytics:pageviews:bot', until, data.amount), + appageviews: getStats('analytics:pageviews:ap', until, data.amount), summary: analytics.getSummary(), }); result.pastDay = result.pageviews.reduce((a, b) => parseInt(a, 10) + parseInt(b, 10));