From 146c01643b0c881a76d44ae3cd7280bb2d307e85 Mon Sep 17 00:00:00 2001 From: David Litvak Bruno Date: Tue, 7 Nov 2017 16:39:33 +0100 Subject: [PATCH] feat(analytics): add analytics on deploy script (#32) --- app.js | 43 ++++------------------------------- bin/vendor/analytics.html | 44 +++++++++++++++++++++++++++++++++++ bin/vendor/deploy.sh | 13 +++++++++++ lib/settings.js | 48 +++++++++++++++++++++++++++++++++++++++ package.json | 3 ++- views/layout.pug | 2 ++ 6 files changed, 113 insertions(+), 40 deletions(-) create mode 100644 bin/vendor/analytics.html create mode 100755 bin/vendor/deploy.sh create mode 100644 lib/settings.js diff --git a/app.js b/app.js index d1d715b..11e6375 100644 --- a/app.js +++ b/app.js @@ -13,14 +13,12 @@ require('dotenv').config({ path: 'variables.env' }) const helpers = require('./helpers') const { translate, initializeTranslations } = require('./i18n/i18n') const breadcrumb = require('./lib/breadcrumb') +const settings = require('./lib/settings') const routes = require('./routes/index') -const { initClients, getSpace } = require('./services/contentful') -const { updateCookie } = require('./lib/cookies') +const { getSpace } = require('./services/contentful') const app = express() -const SETTINGS_NAME = 'theExampleAppSettings' - // View engine setup app.set('views', path.join(__dirname, 'views')) app.set('view engine', 'pug') @@ -40,42 +38,9 @@ app.use(function (req, res, next) { } next() }) -// Set our application state based on environment variables or query parameters -app.use(async function (request, response, next) { - // Set default settings based on environment variables - let settings = { - spaceId: process.env.CONTENTFUL_SPACE_ID, - deliveryToken: process.env.CONTENTFUL_DELIVERY_TOKEN, - previewToken: process.env.CONTENTFUL_PREVIEW_TOKEN, - editorialFeatures: false, - // Overwrite default settings using those stored in cookie, if present - ...request.cookies.theExampleAppSettings - } - // Allow setting of API credentials via query parameters - const { space_id, preview_token, delivery_token } = request.query - if (space_id && preview_token && delivery_token) { // eslint-disable-line camelcase - settings = { - ...settings, - spaceId: space_id, - deliveryToken: delivery_token, - previewToken: preview_token - } - updateCookie(response, SETTINGS_NAME, settings) - } - - // Allow enabling of editorial features via query parameters - const { enable_editorial_features } = request.query - if (enable_editorial_features !== undefined) { // eslint-disable-line camelcase - delete request.query.enable_editorial_features - settings.editorialFeatures = true - updateCookie(response, SETTINGS_NAME, settings) - } - - initClients(settings) - response.locals.settings = settings - next() -}) +// Set our application settings based on environment variables or query parameters +app.use(settings) // Make data available for our views to consume app.use(async function (request, response, next) { diff --git a/bin/vendor/analytics.html b/bin/vendor/analytics.html new file mode 100644 index 0000000..62da75f --- /dev/null +++ b/bin/vendor/analytics.html @@ -0,0 +1,44 @@ + + + + + + + diff --git a/bin/vendor/deploy.sh b/bin/vendor/deploy.sh new file mode 100755 index 0000000..6f94fa0 --- /dev/null +++ b/bin/vendor/deploy.sh @@ -0,0 +1,13 @@ +#!/bin/bash +set -e + +analytics_file="../bin/vendor/analytics.html" +layout_file="$(dirname $0)/../../views/layout.pug" + +# Replace analytics script in layout +distro=`uname` +if [[ $distro != 'Linux' ]]; then + sed -i '' 's,'",include $analytics_file"',g' "$layout_file" +else # If running on macOS, the sed command has different syntax + sed -i 's,'",include $analytics_file"',g' "$layout_file" +fi diff --git a/lib/settings.js b/lib/settings.js new file mode 100644 index 0000000..366db17 --- /dev/null +++ b/lib/settings.js @@ -0,0 +1,48 @@ +/** + * The purpose of this middleware is to set our application settings based + * on environment variables or query parameters + */ + +const { initClients } = require('../services/contentful') +const { updateCookie } = require('./cookies') + +const SETTINGS_NAME = 'theExampleAppSettings' + +module.exports = async function settingsMiddleware (request, response, next) { + // Set default settings based on environment variables + let settings = { + spaceId: process.env.CONTENTFUL_SPACE_ID, + deliveryToken: process.env.CONTENTFUL_DELIVERY_TOKEN, + previewToken: process.env.CONTENTFUL_PREVIEW_TOKEN, + editorialFeatures: false, + // Overwrite default settings using those stored in cookie, if present + ...request.cookies.theExampleAppSettings + } + + // Allow setting of API credentials via query parameters + const { space_id, preview_token, delivery_token } = request.query + if (space_id && preview_token && delivery_token) { // eslint-disable-line camelcase + settings = { + ...settings, + spaceId: space_id, + deliveryToken: delivery_token, + previewToken: preview_token + } + updateCookie(response, SETTINGS_NAME, settings) + } + + // Allow enabling of editorial features via query parameters + const { enable_editorial_features } = request.query + if (enable_editorial_features !== undefined) { // eslint-disable-line camelcase + delete request.query.enable_editorial_features + settings.editorialFeatures = true + updateCookie(response, SETTINGS_NAME, settings) + } + + // The space id needs to be available in the frontend for our example app + response.cookie('space_id', settings.spaceId) + + initClients(settings) + response.locals.settings = settings + next() +} diff --git a/package.json b/package.json index 5f03afe..cd4337b 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "test:integration": "jest test/integration", "test:integration:watch": "jest test/integration --watch", "test:unit": "jest test/unit", - "test:unit:watch": "jest test/unit --watch" + "test:unit:watch": "jest test/unit --watch", + "heroku-postbuild": "./bin/vendor/deploy.sh" }, "engines": { "node": ">=8.4.0" diff --git a/views/layout.pug b/views/layout.pug index a99807f..ce7c4f1 100644 --- a/views/layout.pug +++ b/views/layout.pug @@ -139,3 +139,5 @@ html use(xlink:href='/icons/icons.svg#cross') script(src='/scripts/index.js') + +