From 6048991b2d34697cd4c058c6f4f69bb77b098fbd Mon Sep 17 00:00:00 2001 From: Linus Miller Date: Fri, 28 Aug 2020 20:42:15 +0200 Subject: [PATCH] new config loading logic - remove unused config files - load all server env variables from ./config/env - still define PWD as midwest seems to be using it --- package.json | 1 - server/config/dir.js | 2 +- server/config/env.js | 30 +++++ .../{error-handler.js => error_handler.js} | 4 +- server/config/globals.js | 4 - server/config/index.js | 11 ++ server/config/membership.js | 108 ------------------ server/config/port.js | 4 +- server/config/postgres.js | 6 +- server/config/session.js | 38 ------ server/config/site.js | 22 ++-- server/config/smtp.js | 15 --- server/server.js | 22 ++-- yarn.lock | 5 - 14 files changed, 71 insertions(+), 201 deletions(-) create mode 100644 server/config/env.js rename server/config/{error-handler.js => error_handler.js} (94%) delete mode 100644 server/config/globals.js create mode 100644 server/config/index.js delete mode 100644 server/config/membership.js delete mode 100644 server/config/session.js delete mode 100644 server/config/smtp.js diff --git a/package.json b/package.json index 4ff9d2b..01ad5d9 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,6 @@ "redux": "^4.0.5", "redux-logger": "^3.0.6", "redux-thunk": "^2.2.0", - "require-dir": "^1.2.0", "superagent": "^6.0.0", "useragent": "^2.1.12", "xml2json": "^0.12.0" diff --git a/server/config/dir.js b/server/config/dir.js index 0b422f0..6326ff8 100644 --- a/server/config/dir.js +++ b/server/config/dir.js @@ -3,5 +3,5 @@ const p = require('path') module.exports = { - static: p.join(PWD, 'dist'), + static: p.join(process.cwd(), 'dist'), } diff --git a/server/config/env.js b/server/config/env.js new file mode 100644 index 0000000..4c7869c --- /dev/null +++ b/server/config/env.js @@ -0,0 +1,30 @@ +'use strict' + +function readFromEnv(columns, defaults) { + const missing = [] + + const result = columns.reduce((result, variable) => { + const value = (result[variable] = process.env[variable] || defaults[variable]) + + if (!value) { + missing.push(variable) + } + + return result + }, {}) + + if (missing.length) { + throw new Error(`Missing required env variables: ${missing.join(', ')}`) + } + + return result +} + +const defaults = { + NODE_ENV: 'development', + POSTGRES_HOST: 'localhost', +} + +module.exports = { + ...readFromEnv(['NODE_ENV', 'POSTGRES_HOST'], defaults), +} diff --git a/server/config/error-handler.js b/server/config/error_handler.js similarity index 94% rename from server/config/error-handler.js rename to server/config/error_handler.js index 24cbf50..393bdbd 100644 --- a/server/config/error-handler.js +++ b/server/config/error_handler.js @@ -4,6 +4,8 @@ const _ = require('lodash') const errorTemplate = require('../templates/Error') +const env = require('./env') + const defaults = { post: (req, res, next) => { res.template = errorTemplate @@ -50,5 +52,5 @@ module.exports = _.merge( console: false, }, }, - }[ENV], + }[env.NODE_ENV], ) diff --git a/server/config/globals.js b/server/config/globals.js deleted file mode 100644 index 403bb38..0000000 --- a/server/config/globals.js +++ /dev/null @@ -1,4 +0,0 @@ -'use strict' - -// global.LOGIN_USER = 'linus.miller@bitmill.co'; -// global.LOGIN_USER = 'zarac@zarac.se'; diff --git a/server/config/index.js b/server/config/index.js new file mode 100644 index 0000000..59d6ec3 --- /dev/null +++ b/server/config/index.js @@ -0,0 +1,11 @@ +'use strict' + +module.exports = { + dir: require('./dir'), + env: require('./env'), + errorHandler: require('./error_handler'), + port: require('./port'), + postgres: require('./postgres'), + shim: require('./shim'), + site: require('./site'), +} diff --git a/server/config/membership.js b/server/config/membership.js deleted file mode 100644 index 8aa06f6..0000000 --- a/server/config/membership.js +++ /dev/null @@ -1,108 +0,0 @@ -'use strict' - -const _ = require('lodash') - -const config = { - site: require('./site'), -} - -module.exports = { - invite: { - from: `${config.site.title} Robot <${config.site.emails.robot}>`, - subject: `You have been invited to ${config.site.title}`, - }, - - changePassword: { - from: `${config.site.title} Robot <${config.site.emails.robot}>`, - subject: `Password Reset Request for ${config.site.title}`, - }, - - timeouts: { - // 1 day - changePassword: 24 * 60 * 60 * 1000, - // verify email - verifyEmail: 7 * 24 * 60 * 60 * 1000, - }, - - paths: { - register: '/register', - login: '/login', - forgotPassword: '/forgot', - resetPassword: '/reset', - verifyEmail: '/verify', - }, - - redirects: { - login: '/', - logout: '/login', - register: '/login', - }, - - remember: { - // if expires is defined, it will be used. otherwise maxage - expires: new Date('2038-01-19T03:14:07.000Z'), - // expires: Date.now() - 1, - maxAge: 30 * 24 * 60 * 60 * 1000, - }, - - messages: { - login: { - notLocal: 'Account requires external login.', - wrongPassword: 'Wrong password.', - noUserFound: 'No user registered with that email.', - noExternalUser: 'The account is not connected to this website.', - externalLoginFailed: 'External login failed.', - emailNotVerified: "This account's email has not been verified.", - banned: 'User is banned.', - blocked: 'User is blocked due to too many login attempts.', - }, - - register: { - missingProperties: 'Oh no missing stuff', - notAuthorized: 'The email is not authorized to create an account.', - duplicateEmail: 'The email has already been registered.', - }, - }, - - passport: { - local: { - usernameField: 'email', - }, - - scope: ['email'], - - //providers: { - // facebook: { - // clientID: 'change-this-fool', - // clientSecret: 'change-this-fool', - // callbackURL: p.join(config.site.domain, '/auth/facebook/callback'), - // passReqToCallback: true - // }, - }, - - userColumns: [ - 'givenName', - 'familyName', - 'dateBanned', - 'dateBlocked', - 'dateMuted', - 'dateVerified', - // ['array(SELECT name FROM user_roles LEFT OUTER JOIN roles ON user_roles.role_id = roles.id WHERE user_roles.user_id = users.id)', 'roles'], - [ - `(SELECT array_to_json(array_agg(row_to_json(d))) - FROM ( - SELECT id, name - FROM user_roles - LEFT OUTER JOIN roles ON user_roles.role_id = roles.id WHERE user_roles.user_id = users.id - ORDER BY roles.id DESC - ) d - )`, - 'roles', - ], - ], - - // needs to be even - tokenLength: 64, - // needs to be even - saltLength: 16, -} diff --git a/server/config/port.js b/server/config/port.js index 5ddeaf6..d4c84bf 100644 --- a/server/config/port.js +++ b/server/config/port.js @@ -1,5 +1,7 @@ 'use strict' +const env = require('./env') + const basePort = 3060 module.exports = { @@ -7,4 +9,4 @@ module.exports = { testing: basePort + 1, staging: basePort + 2, production: basePort + 3, -}[ENV] +}[env.NODE_ENV] diff --git a/server/config/postgres.js b/server/config/postgres.js index 7cca1fa..c14505b 100644 --- a/server/config/postgres.js +++ b/server/config/postgres.js @@ -1,6 +1,8 @@ -import env from './env' +'use strict' -export default { +const env = require('./env') + +module.exports = { database: 'journey', user: 'journey', password: 'journey', diff --git a/server/config/session.js b/server/config/session.js deleted file mode 100644 index 18f06c0..0000000 --- a/server/config/session.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict' - -const chalk = require('chalk') -const session = require('express-session') - -let redisStore - -const config = { - secret: - 'asdfpoi7u987777777777777777777sdkafjxxjasdhfhsadfhashdfh`1111111khjjashdfkasjhdflGGGGGGGGGGaaa^^^^^^^^^^yaghsdfqw3u7679`', - resave: false, - saveUninitialized: true, -} - -const redisConfig = { - host: 'localhost', - port: 6379, -} - -if (ENV === 'production') { - const RedisStore = require('connect-redis')(require('express-session')) - - redisStore = new RedisStore(redisConfig) - - redisStore.on('connect', () => { - console.info(`[${chalk.cyan('INIT')}] Redis connected succcessfully`) - }) - - redisStore.on('disconnect', () => { - throw new Error('Unable to connect to redis. Has it been started?') - }) - - config.store = redisStore -} else { - config.store = new session.MemoryStore() -} - -module.exports = config diff --git a/server/config/site.js b/server/config/site.js index 85c2c9e..3ec39a4 100644 --- a/server/config/site.js +++ b/server/config/site.js @@ -1,13 +1,14 @@ 'use strict' const _ = require('lodash') +const env = require('./env') -const domain = 'newseri.com' +const domain = 'journey.bitmill.io' const defaults = { domain, - title: 'Newseri Admin', - name: 'newseri-admin', + title: 'Journey', + name: 'journey', protocol: 'http', get host() { return this.port ? this.hostname + ':' + this.port : this.hostname @@ -16,10 +17,9 @@ const defaults = { return this.protocol + '://' + this.host + '/' }, emails: { - robot: 'no-reply@thecodebureau.com', - info: 'info@thecodebureau.com', - webmaster: 'webmaster@thecodebureau.com', - order: 'info@thecodebureau.com', + robot: 'no-reply@bitmill.io', + info: 'info@bitmill.io', + webmaster: 'webmaster@tbitmill.io', }, } @@ -43,12 +43,6 @@ module.exports = _.merge( production: { hostname: `admin.${domain}`, protocol: 'https', - // emails: { - // robot: 'no-reply@' + domain, - // info: 'info@' + domain, - // webmaster: 'webmaster@' + domain, - // order: 'order@' + domain, - // }, }, - }[ENV], + }[env.NODE_ENV], ) diff --git a/server/config/smtp.js b/server/config/smtp.js deleted file mode 100644 index 39bbe83..0000000 --- a/server/config/smtp.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict' - -const _ = require('lodash') - -const defaults = { - auth: { - user: 'SMTP_Injection', - // dev key - pass: '2eec390c5b3f5d593c9f152179bf51e90b073784', - }, - host: 'smtp.sparkpostmail.com', - port: 587, -} - -module.exports = _.merge(defaults, {}[ENV]) diff --git a/server/server.js b/server/server.js index 9aaf5c9..e319396 100644 --- a/server/server.js +++ b/server/server.js @@ -7,24 +7,24 @@ * @type {Express instance} */ -global.ENV = process.env.NODE_ENV || 'development' global.PWD = process.env.NODE_PWD || process.cwd() +const config = require('./config') + // modules > native const p = require('path') -if (ENV === 'development') { +if (config.env.NODE_ENV === 'development') { // output filename in console log and colour console.dir require('midwest/util/console') // needed so symlinked modules get access to main projects node_modules/ - require('app-module-path').addPath(p.join(PWD, 'node_modules')) + require('app-module-path').addPath(p.join(process.cwd(), 'node_modules')) } // modules > 3rd party const _ = require('lodash') const chalk = require('chalk') const express = require('express') -const requireDir = require('require-dir') // modules > express middlewares const bodyParser = require('body-parser') @@ -43,15 +43,13 @@ process.on('uncaughtException', (err) => { process.exit(1) }) -const config = requireDir('./config', { mapKey: (value, key) => _.camelCase(key) }) - const prewares = [ - express.static(config.dir.static, ENV === 'production' ? { maxAge: '1 year' } : null), + express.static(config.dir.static, config.env.NODE_ENV === 'production' ? { maxAge: '1 year' } : null), bodyParser.json(), bodyParser.urlencoded({ extended: true }), ] -if (ENV === 'development') { +if (config.env.NODE_ENV === 'development') { // only log requests to console in development mode prewares.unshift(require('morgan')('dev')) // prewares.push(require('midwest-module-membership/passport/automatic-login')); @@ -83,11 +81,11 @@ server.response.render = function (template) { } try { - server.locals.js = require(p.join(PWD, 'public/js.json')) + server.locals.js = require(p.join(process.cwd(), 'public/js.json')) } catch (e) {} try { - server.locals.css = require(p.join(PWD, 'public/css.json')) + server.locals.css = require(p.join(process.cwd(), 'public/css.json')) } catch (e) {} // load prewares @@ -105,7 +103,9 @@ server.use(...postwares) if (require.main === module) { server.http = server.listen(config.port, () => { console.info( - `[${chalk.cyan('INIT')}] HTTP Server listening on port ${chalk.magenta(config.port)} (${chalk.yellow(ENV)})`, + `[${chalk.cyan('INIT')}] HTTP Server listening on port ${chalk.magenta(config.port)} (${chalk.yellow( + config.env.NODE_ENV, + )})`, ) }) } diff --git a/yarn.lock b/yarn.lock index ce3e347..11aa49d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6262,11 +6262,6 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -require-dir@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/require-dir/-/require-dir-1.2.0.tgz#0d443b75e96012d3ca749cf19f529a789ae74817" - integrity sha512-LY85DTSu+heYgDqq/mK+7zFHWkttVNRXC9NKcKGyuGLdlsfbjEPrIEYdCVrx6hqnJb+xSu3Lzaoo8VnmOhhjNA== - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"