Analytics Update #43
8 changed files with 147 additions and 7 deletions
72
controllers/analyticsController.js
Normal file
72
controllers/analyticsController.js
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
const logger = require('winston');
|
||||||
|
const db = require('../models');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
getAnalyticsSummary: () => {
|
||||||
|
const deferred = new Promise((resolve, reject) => {
|
||||||
|
// get the raw analytics data
|
||||||
|
db.Analytics
|
||||||
|
.findAll()
|
||||||
|
.then(data => {
|
||||||
|
const resultHashTable = {};
|
||||||
|
let totalRequests = 0;
|
||||||
|
let totalPublish = 0;
|
||||||
|
let totalShow = 0;
|
||||||
|
let totalCount = 0;
|
||||||
|
let totalSuccess = 0;
|
||||||
|
let totalFailure = 0;
|
||||||
|
|
||||||
|
// sumarise the data
|
||||||
|
for (let i = 0; i < data.length; i++) {
|
||||||
|
let key = data[i].action + data[i].url;
|
||||||
|
totalCount += 1;
|
||||||
|
switch (data[i].action) {
|
||||||
|
case 'request':
|
||||||
|
totalRequests += 1;
|
||||||
|
break;
|
||||||
|
case 'publish':
|
||||||
|
totalPublish += 1;
|
||||||
|
break;
|
||||||
|
case 'show':
|
||||||
|
totalShow += 1;
|
||||||
|
break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
if (resultHashTable[key]) {
|
||||||
|
resultHashTable[key]['count'] += 1;
|
||||||
|
if (data[i].result === 'success') {
|
||||||
|
resultHashTable[key]['success'] += 1;
|
||||||
|
totalSuccess += 1;
|
||||||
|
} else {
|
||||||
|
resultHashTable[key]['failure'] += 1;
|
||||||
|
totalFailure += 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
resultHashTable[key] = {
|
||||||
|
action : data[i].action,
|
||||||
|
url : data[i].url,
|
||||||
|
count : 1,
|
||||||
|
success: 0,
|
||||||
|
failure: 0,
|
||||||
|
};
|
||||||
|
if (data[i].result === 'success') {
|
||||||
|
resultHashTable[key]['success'] += 1;
|
||||||
|
totalSuccess += 1;
|
||||||
|
} else {
|
||||||
|
resultHashTable[key]['failure'] += 1;
|
||||||
|
totalFailure += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const percentSuccess = Math.round(totalSuccess / totalCount * 100);
|
||||||
|
// return results
|
||||||
|
resolve({ records: resultHashTable, totals: { totalRequests, totalPublish, totalShow, totalCount, totalSuccess, totalFailure }, percentSuccess });
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
logger.error('sequelize error', error);
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return deferred;
|
||||||
|
},
|
||||||
|
};
|
|
@ -80,6 +80,10 @@ h4 {
|
||||||
padding: 3px;
|
padding: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.center-text {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
.code {
|
.code {
|
||||||
font-family: monospace;
|
font-family: monospace;
|
||||||
color: darkgrey;
|
color: darkgrey;
|
||||||
|
@ -87,6 +91,10 @@ h4 {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* other */
|
/* other */
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
.stop-float {
|
.stop-float {
|
||||||
clear: both;
|
clear: both;
|
||||||
|
|
|
@ -65,3 +65,10 @@ canvas {
|
||||||
float: left;
|
float: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* analytics */
|
||||||
|
.totals-row {
|
||||||
|
border-top: 1px solid grey;
|
||||||
|
border-bottom: 1px solid grey;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
17
routes/analytics-routes.js
Normal file
17
routes/analytics-routes.js
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
const errorHandlers = require('../helpers/libraries/errorHandlers.js');
|
||||||
|
const analyticsController = require('../controllers/analyticsController.js');
|
||||||
|
|
||||||
|
module.exports = (app) => {
|
||||||
|
// route to show analytics
|
||||||
|
app.get('/analytics', (req, res) => {
|
||||||
|
// get and serve content
|
||||||
|
analyticsController
|
||||||
|
.getAnalyticsSummary()
|
||||||
|
.then(result => {
|
||||||
|
res.status(200).render('analytics', result);
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
errorHandlers.handleRequestError(error, res);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
|
@ -3,7 +3,7 @@ const showController = require('../controllers/showController.js');
|
||||||
const logger = require('winston');
|
const logger = require('winston');
|
||||||
const { postShowAnalytics } = require('../helpers/libraries/analytics');
|
const { postShowAnalytics } = require('../helpers/libraries/analytics');
|
||||||
|
|
||||||
module.exports = (app, ua, googleAnalyticsId) => {
|
module.exports = (app) => {
|
||||||
// route to fetch all free public claims
|
// route to fetch all free public claims
|
||||||
app.get('/meme-fodder/play', ({ originalUrl, ip }, res) => {
|
app.get('/meme-fodder/play', ({ originalUrl, ip }, res) => {
|
||||||
logger.debug(`GET request on ${originalUrl} from ${ip}`);
|
logger.debug(`GET request on ${originalUrl} from ${ip}`);
|
||||||
|
|
|
@ -4,7 +4,7 @@ const publishHelpers = require('../helpers/libraries/publishHelpers.js');
|
||||||
const errorHandlers = require('../helpers/libraries/errorHandlers.js');
|
const errorHandlers = require('../helpers/libraries/errorHandlers.js');
|
||||||
const { postPublishAnalytics } = require('../helpers/libraries/analytics');
|
const { postPublishAnalytics } = require('../helpers/libraries/analytics');
|
||||||
|
|
||||||
module.exports = (app, siofu, hostedContentPath, ua, googleAnalyticsId) => {
|
module.exports = (app, siofu, hostedContentPath) => {
|
||||||
const http = require('http').Server(app);
|
const http = require('http').Server(app);
|
||||||
const io = require('socket.io')(http);
|
const io = require('socket.io')(http);
|
||||||
|
|
||||||
|
|
|
@ -5,10 +5,8 @@ const siofu = require('socketio-file-upload');
|
||||||
const expressHandlebars = require('express-handlebars');
|
const expressHandlebars = require('express-handlebars');
|
||||||
const Handlebars = require('handlebars');
|
const Handlebars = require('handlebars');
|
||||||
const config = require('config');
|
const config = require('config');
|
||||||
const ua = require('universal-analytics');
|
|
||||||
const winston = require('winston');
|
const winston = require('winston');
|
||||||
|
|
||||||
const googleAnalyticsId = config.get('AnalyticsConfig.GoogleId');
|
|
||||||
const hostedContentPath = config.get('Database.PublishUploadPath');
|
const hostedContentPath = config.get('Database.PublishUploadPath');
|
||||||
|
|
||||||
// configure logging
|
// configure logging
|
||||||
|
@ -57,12 +55,13 @@ app.set('view engine', 'handlebars');
|
||||||
|
|
||||||
// require express routes
|
// require express routes
|
||||||
require('./routes/api-routes.js')(app);
|
require('./routes/api-routes.js')(app);
|
||||||
require('./routes/show-routes.js')(app, ua, googleAnalyticsId);
|
require('./routes/analytics-routes.js')(app);
|
||||||
require('./routes/serve-routes.js')(app, ua, googleAnalyticsId);
|
require('./routes/show-routes.js')(app);
|
||||||
|
require('./routes/serve-routes.js')(app);
|
||||||
require('./routes/home-routes.js')(app);
|
require('./routes/home-routes.js')(app);
|
||||||
|
|
||||||
// require socket.io routes
|
// require socket.io routes
|
||||||
const http = require('./routes/sockets-routes.js')(app, siofu, hostedContentPath, ua, googleAnalyticsId);
|
const http = require('./routes/sockets-routes.js')(app, siofu, hostedContentPath);
|
||||||
|
|
||||||
// sync sequelize
|
// sync sequelize
|
||||||
// wrap the server in socket.io to intercept incoming sockets requests
|
// wrap the server in socket.io to intercept incoming sockets requests
|
||||||
|
|
37
views/analytics.handlebars
Normal file
37
views/analytics.handlebars
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
<div class="wrapper">
|
||||||
|
<div class="top-bar">
|
||||||
|
{{> topBar}}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h3>Analytics</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<th>action</th>
|
||||||
|
<th>url</th>
|
||||||
|
<th class="center-text">count</th>
|
||||||
|
<th class="center-text">success</th>
|
||||||
|
<th class="center-text">failure</th>
|
||||||
|
</tr>
|
||||||
|
{{#each records}}
|
||||||
|
<tr>
|
||||||
|
<td>{{ this.action }}</td>
|
||||||
|
<td>{{ this.url }}</td>
|
||||||
|
<td class="center-text">{{ this.count }}</td>
|
||||||
|
<td class="center-text">{{ this.success }}</td>
|
||||||
|
<td class="center-text">{{ this.failure }}</td>
|
||||||
|
</tr>
|
||||||
|
{{/each}}
|
||||||
|
<tr>
|
||||||
|
<td></td>
|
||||||
|
<td></td>
|
||||||
|
<td class="totals-row center-text">{{ totals.totalCount }}</td>
|
||||||
|
<td class="totals-row center-text">{{ totals.totalSuccess }}</td>
|
||||||
|
<td class="totals-row center-text">{{ totals.totalFailure }}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<p>Requests: {{ totals.totalRequests }}</p>
|
||||||
|
<p>Publish: {{ totals.totalPublish }}</p>
|
||||||
|
<p>Show: {{ totals.totalShow }}</p>
|
||||||
|
<p>Percent Success: {{ percentSuccess}}%</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
Loading…
Reference in a new issue