@defra/hapi-gapi
Version:
hapi plugin to enable server-side google analytics platform integration
67 lines (60 loc) • 2.19 kB
JavaScript
const Joi = require('@hapi/joi')
const Analytics = require('./analytics')
const debug = require('debug')('hapi-gapi')
const configSchema = Joi.object({
propertySettings: Joi.array()
.items(
Joi.object({
id: Joi.string()
.min(2)
.required(),
key: Joi.string()
.min(2)
.required(),
hitTypes: Joi.array()
.items(Joi.string().valid('page_view'))
.min(1)
.required()
})
)
.required(),
trackAnalytics: Joi.function(),
sessionIdProducer: Joi.function()
.arity(1)
.required()
})
exports.plugin = {
pkg: require('../package.json'),
/**
* Initialise the hapi-gapi plugin
*
* @param server the hapi server instance
* @param options the hapi-gapi configuration settings
*/
register: async (server, options) => {
const configValidation = configSchema.validate(options)
if (configValidation.error) {
throw configValidation.error
}
const analytics = new Analytics(options)
server.decorate('request', 'ga', request => analytics.ga(request), { apply: true })
server.ext('onPreResponse', async (request, h) => {
const shouldTrack = options.trackAnalytics ? await options.trackAnalytics(request) : true
const response = request.response
const statusFamily = Math.floor(response.statusCode / 100)
if (shouldTrack) {
debug('Session is being tracked')
if (statusFamily === 2 && response.variety === 'view') {
debug('Sending analytics page-view for %s', request.route.path)
await request.ga.view(request, { name: 'pageview', params: { page_path: request.route.path, page_title: request.route.fingerprint } })
} else if (statusFamily === 5) {
debug('Sending exception event for route %s with with status code %s', request.route.path, response.statusCode)
await request.ga.view(request, { name: 'exception', params: { page_path: request.route.path, page_title: request.route.fingerprint, error: response.statusCode } })
}
} else {
debug('Session is not being tracked')
}
return h.continue
})
}
}