|
|
@ -87,10 +87,19 @@ Analytics.pageView = async function (payload) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function sortedSetIncrByBulk(data) {
|
|
|
|
|
|
|
|
if ('sortedSetIncrByBulk' in db) {
|
|
|
|
|
|
|
|
return db.sortedSetIncrByBulk(data);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
const queue = data.map(([key, increment, value]) => db.sortedSetIncrBy(key, increment, value));
|
|
|
|
|
|
|
|
return Promise.all(queue);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Analytics.writeData = async function () {
|
|
|
|
Analytics.writeData = async function () {
|
|
|
|
const today = new Date();
|
|
|
|
const today = new Date();
|
|
|
|
const month = new Date();
|
|
|
|
const month = new Date();
|
|
|
|
const dbQueue = [];
|
|
|
|
const dbQueue = [];
|
|
|
|
|
|
|
|
const incrByBulk = [];
|
|
|
|
|
|
|
|
|
|
|
|
// Build list of metrics that were updated
|
|
|
|
// Build list of metrics that were updated
|
|
|
|
let metrics = [
|
|
|
|
let metrics = [
|
|
|
@ -108,31 +117,31 @@ Analytics.writeData = async function () {
|
|
|
|
month.setHours(0, 0, 0, 0);
|
|
|
|
month.setHours(0, 0, 0, 0);
|
|
|
|
|
|
|
|
|
|
|
|
if (pageViews > 0) {
|
|
|
|
if (pageViews > 0) {
|
|
|
|
dbQueue.push(db.sortedSetIncrBy('analytics:pageviews', pageViews, today.getTime()));
|
|
|
|
incrByBulk.push(['analytics:pageviews', pageViews, today.getTime()]);
|
|
|
|
dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:month', pageViews, month.getTime()));
|
|
|
|
incrByBulk.push(['analytics:pageviews:month', pageViews, month.getTime()]);
|
|
|
|
pageViews = 0;
|
|
|
|
pageViews = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (pageViewsRegistered > 0) {
|
|
|
|
if (pageViewsRegistered > 0) {
|
|
|
|
dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:registered', pageViewsRegistered, today.getTime()));
|
|
|
|
incrByBulk.push(['analytics:pageviews:registered', pageViewsRegistered, today.getTime()]);
|
|
|
|
dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:month:registered', pageViewsRegistered, month.getTime()));
|
|
|
|
incrByBulk.push(['analytics:pageviews:month:registered', pageViewsRegistered, month.getTime()]);
|
|
|
|
pageViewsRegistered = 0;
|
|
|
|
pageViewsRegistered = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (pageViewsGuest > 0) {
|
|
|
|
if (pageViewsGuest > 0) {
|
|
|
|
dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:guest', pageViewsGuest, today.getTime()));
|
|
|
|
incrByBulk.push(['analytics:pageviews:guest', pageViewsGuest, today.getTime()]);
|
|
|
|
dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:month:guest', pageViewsGuest, month.getTime()));
|
|
|
|
incrByBulk.push(['analytics:pageviews:month:guest', pageViewsGuest, month.getTime()]);
|
|
|
|
pageViewsGuest = 0;
|
|
|
|
pageViewsGuest = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (pageViewsBot > 0) {
|
|
|
|
if (pageViewsBot > 0) {
|
|
|
|
dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:bot', pageViewsBot, today.getTime()));
|
|
|
|
incrByBulk.push(['analytics:pageviews:bot', pageViewsBot, today.getTime()]);
|
|
|
|
dbQueue.push(db.sortedSetIncrBy('analytics:pageviews:month:bot', pageViewsBot, month.getTime()));
|
|
|
|
incrByBulk.push(['analytics:pageviews:month:bot', pageViewsBot, month.getTime()]);
|
|
|
|
pageViewsBot = 0;
|
|
|
|
pageViewsBot = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (uniquevisitors > 0) {
|
|
|
|
if (uniquevisitors > 0) {
|
|
|
|
dbQueue.push(db.sortedSetIncrBy('analytics:uniquevisitors', uniquevisitors, today.getTime()));
|
|
|
|
incrByBulk.push(['analytics:uniquevisitors', uniquevisitors, today.getTime()]);
|
|
|
|
uniquevisitors = 0;
|
|
|
|
uniquevisitors = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -142,11 +151,15 @@ Analytics.writeData = async function () {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (const [key, value] of Object.entries(counters)) {
|
|
|
|
for (const [key, value] of Object.entries(counters)) {
|
|
|
|
dbQueue.push(db.sortedSetIncrBy(`analytics:${key}`, value, today.getTime()));
|
|
|
|
incrByBulk.push([`analytics:${key}`, value, today.getTime()]);
|
|
|
|
metrics.push(key);
|
|
|
|
metrics.push(key);
|
|
|
|
delete counters[key];
|
|
|
|
delete counters[key];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (incrByBulk.length) {
|
|
|
|
|
|
|
|
dbQueue.push(sortedSetIncrByBulk(incrByBulk));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Update list of tracked metrics
|
|
|
|
// Update list of tracked metrics
|
|
|
|
dbQueue.push(db.sortedSetAdd('analyticsKeys', metrics.map(() => +Date.now()), metrics));
|
|
|
|
dbQueue.push(db.sortedSetAdd('analyticsKeys', metrics.map(() => +Date.now()), metrics));
|
|
|
|
|
|
|
|
|
|
|
|