feat(refs): Initial referral source tracking

This commit is contained in:
Stuart Taylor
2018-08-03 14:43:28 +01:00
committed by mrugesh mohapatra
parent a0d5841560
commit ed7aa8f074

View File

@ -14,7 +14,7 @@ export default function newsBoot(app) {
const api = app.loopback.Router();
router.get('/n', (req, res) => res.redirect('/news'));
router.get('/n/:shortId', createReferralHandler(app));
router.get('/n/:shortId', createShortLinkHandler(app));
router.get('/news', serveNewsApp);
router.get('/news/*', serveNewsApp);
@ -41,11 +41,19 @@ function serveNewsApp(req, res) {
return res.render('layout-news', { title: 'News | freeCodeCamp', markup });
}
function createReferralHandler(app) {
function createShortLinkHandler(app) {
const { Article } = app.models;
return function referralHandler(req, res, next) {
const referralHandler = createRerralHandler(app);
return function shortLinkHandler(req, res, next) {
const { query, user } = req;
const { shortId } = req.params;
referralHandler(query, shortId, !!user);
routerLog(req.origin);
routerLog(query.refsource);
if (!shortId) {
return res.redirect('/news');
}
@ -80,6 +88,7 @@ function createPopularityHandler(app) {
return function handlePopularityStats(req, res, next) {
const { body, user } = req;
if (
!has(body, 'event') ||
!has(body, 'timestamp') ||
@ -149,3 +158,57 @@ function createPopularityHandler(app) {
: null;
};
}
function createRerralHandler(app) {
const { Popularity } = app.models;
return function referralHandler(query, shortId, byAuthenticatedUser) {
if (!query.refsource) {
return null;
}
const eventUpdate = {
event: `referral - ${query.refsource}`,
timestamp: new Date(Date.now()),
byAuthenticatedUser
};
return Popularity.findOne(
{ where: { articleId: shortId } },
(err, popularity) => {
if (err) {
console.error(
'Failed finding a `Popularity` in a referral handler',
err
);
return null;
}
if (popularity) {
return popularity.updateAttribute(
'events',
[eventUpdate, ...popularity.events],
err => {
if (err) {
console.error(
'Failed in updating the `events` attribute of a `popularity`',
err
);
}
}
);
}
return Popularity.create(
{
events: [eventUpdate],
articleId: shortId
},
err => {
if (err) {
return console.error('Failed creating a new `Popularity`', err);
}
return apiLog('poulartiy created');
}
);
}
);
};
}