From ee289ab5a69b4ece8202ab8aece9186389d900da Mon Sep 17 00:00:00 2001 From: Luke Childs Date: Thu, 12 Jan 2017 14:02:21 +0700 Subject: [PATCH] Make use of Keen addons for event data --- lib/keen-middleware.js | 83 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 71 insertions(+), 12 deletions(-) diff --git a/lib/keen-middleware.js b/lib/keen-middleware.js index 8ac3e11..3820e83 100644 --- a/lib/keen-middleware.js +++ b/lib/keen-middleware.js @@ -6,20 +6,79 @@ const client = new KeenTracking({ }); module.exports = (req, res, next) => { - // Record an event + + // Setup event data const eventData = { - url: req.url, - path: req.path, - ip: req.ip, method: req.method, - ips: req.ips, - url: req.originalUrl, - headers: req.headers, - params: req.params, - protocol: req.protocol, - query: req.query, - hostname: req.hostname + url: { + string: `${req.protocol}://${req.headers.host}${req.originalUrl}` + }, + ip: req.ip, + userAgent: { + string: req.headers['user-agent'] + }, + referrer: { + url: req.headers.referer + } + }; + + // Enable keen date time addon + eventData.keen = { + addons: [ + { + name: 'keen:date_time_parser', + input: { + date_time: 'keen.timestamp', + }, + output: 'timestamp_info' + } + ] }; - client.recordEvent('pageviews', eventData); + + // Only enable other keen addons if we have the required input + const keenAddons = [ + { + name: 'keen:url_parser', + input: { + url: 'url.string' + }, + output: 'url.components' + }, + { + name: 'keen:ip_to_geo', + input: { + ip: 'ip' + }, + output: 'location' + }, + { + name: 'keen:ua_parser', + input: { + ua_string: 'userAgent.string' + }, + output: 'userAgent.info' + }, + { + name: 'keen:referrer_parser', + input: { + referrer_url: 'referrer.url', + page_url: 'url.string' + }, + output: 'referrer.info' + } + ]; + keenAddons.forEach(addon => { + const hasRequiredProperties = Object + .keys(addon.input) + .map(key => addon.input[key]) + .every(requiredProp => requiredProp.split('.').reduce((obj, i) => obj[i], eventData)); + + if(hasRequiredProperties) { + eventData.keen.addons.push(addon); + } + }); + + // Send event data + client.recordEvent('pageviewsv2', eventData); next(); }