From 3dceb422c50baf1d64afd1e5deaf8e0767fa16df Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Sat, 8 Oct 2022 09:24:03 -0400 Subject: [PATCH] Added base config manager --- src/cache.js | 2 +- src/config-manager.js | 52 ++++++++++++++++++++++++++ src/database.js | 2 +- src/mailer.js | 2 +- src/server.js | 9 +++-- src/services/api/routes/v1/register.js | 2 +- src/services/api/routes/v1/user.js | 2 +- src/services/nnid/routes/miis.js | 2 +- src/util.js | 2 +- 9 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 src/config-manager.js diff --git a/src/cache.js b/src/cache.js index 7d263e9..6cd90de 100644 --- a/src/cache.js +++ b/src/cache.js @@ -1,6 +1,6 @@ const fs = require('fs-extra'); const redis = require('redis'); -const config = require('../config.json'); +const { config } = require('./config-manager'); let client; const SERVICE_CERTS_BASE = `${__dirname}/../certs/service`; diff --git a/src/config-manager.js b/src/config-manager.js new file mode 100644 index 0000000..bfde2ea --- /dev/null +++ b/src/config-manager.js @@ -0,0 +1,52 @@ +const fs = require('fs-extra'); +const logger = require('../logger'); + +/** + * @typedef {Object} Config + * @property {object} http HTTP server settings + * @property {number} http.port HTTP port the server will listen on + * @property {object} mongoose Mongose connection settings + * @property {string} mongoose.uri URI Mongoose will connect to + * @property {string} mongoose.database MongoDB database name + * @property {object} mongoose.options MongoDB connection options + * @property {object} redis redis settings + * @property {string} redis.client redis client settings + * @property {string} redis.client.url redis server URL + * @property {object} email node-mailer client settings + * @property {string} email.host SMTP server address + * @property {number} email.port SMTP server port + * @property {boolean} email.secure Secure SMTP + * @property {string} email.from Email "from" name/address + * @property {object} email.auth Email authentication settings + * @property {string} email.auth.user Email username + * @property {string} email.auth.pass Email password + * @property {object} aws s3 client settings + * @property {object} aws.spaces Digital Ocean Spaces settings + * @property {string} aws.spaces.key s3 access key + * @property {string} aws.spaces.secret s3 access secret + * @property {object} hcaptcha hCaptcha settings + * @property {string} hcaptcha.secret hCaptcha secret + * @property {string} cdn_base Base URL for CDN location + * @property {string} website_base Base URL for service website (used with emails) + */ + +/** + * @type {Config} + */ +let config = {}; + +function configure() { + if (!fs.pathExistsSync(`${__dirname}/../config.json`)) { + logger.error('Failed to locate config.json file'); + process.exit(0); + } + + config = require(`${__dirname}/../config.json`); + + module.exports.config = config; +} + +module.exports = { + configure, + config +}; \ No newline at end of file diff --git a/src/database.js b/src/database.js index 53b9cdc..fcb136e 100644 --- a/src/database.js +++ b/src/database.js @@ -5,7 +5,7 @@ const util = require('./util'); const { PNID } = require('./models/pnid'); const { Server } = require('./models/server'); const logger = require('../logger'); -const config = require('../config.json'); +const { config } = require('./config-manager'); const { uri, database, options } = config.mongoose; // TODO: Extend this later with more settings diff --git a/src/mailer.js b/src/mailer.js index 6f00665..bf67714 100644 --- a/src/mailer.js +++ b/src/mailer.js @@ -1,5 +1,5 @@ const nodemailer = require('nodemailer'); -const config = require('../config.json'); +const { config } = require('./config-manager'); const transporter = nodemailer.createTransport(config.email); diff --git a/src/server.js b/src/server.js index 5711f6d..b3202c6 100644 --- a/src/server.js +++ b/src/server.js @@ -1,5 +1,9 @@ process.title = 'Pretendo - Account'; +const configManager = require('./config-manager'); + +configManager.configure(); + const express = require('express'); const morgan = require('morgan'); const xmlparser = require('./middleware/xml-parser'); @@ -7,7 +11,8 @@ const cache = require('./cache'); const database = require('./database'); const util = require('./util'); const logger = require('../logger'); -const config = require('../config.json'); + +const { config } = configManager; const { http: { port } } = config; const app = express(); @@ -19,8 +24,6 @@ const datastore = require('./services/datastore'); const api = require('./services/api'); // START APPLICATION -app.set('etag', false); -app.disable('x-powered-by'); // Create router logger.info('Setting up Middleware'); diff --git a/src/services/api/routes/v1/register.js b/src/services/api/routes/v1/register.js index 5f91aac..f2bfa06 100644 --- a/src/services/api/routes/v1/register.js +++ b/src/services/api/routes/v1/register.js @@ -12,7 +12,7 @@ const database = require('../../../../database'); const cache = require('../../../../cache'); const util = require('../../../../util'); const logger = require('../../../../../logger'); -const config = require('../../../../../config.json'); +const { config } = require('../../../../config-manager'); const PNID_VALID_CHARACTERS_REGEX = /^[\w\-\.]*$/gm; const PNID_PUNCTUATION_START_REGEX = /^[\_\-\.]/gm; diff --git a/src/services/api/routes/v1/user.js b/src/services/api/routes/v1/user.js index 07c014d..ee8ad4a 100644 --- a/src/services/api/routes/v1/user.js +++ b/src/services/api/routes/v1/user.js @@ -1,7 +1,7 @@ const router = require('express').Router(); const joi = require('joi'); const { PNID } = require('../../../../models/pnid'); -const config = require('../../../../../config.json'); +const { config } = require('../../../../config-manager'); // TODO: Extend this later with more settings const userSchema = joi.object({ diff --git a/src/services/nnid/routes/miis.js b/src/services/nnid/routes/miis.js index bc99ce9..82ff0d6 100644 --- a/src/services/nnid/routes/miis.js +++ b/src/services/nnid/routes/miis.js @@ -1,7 +1,7 @@ const router = require('express').Router(); const xmlbuilder = require('xmlbuilder'); const { PNID } = require('../../../models/pnid'); -const config = require('../../../../config.json'); +const { config } = require('../../../config-manager'); /** * [GET] diff --git a/src/util.js b/src/util.js index 32f3cab..c7073f6 100644 --- a/src/util.js +++ b/src/util.js @@ -3,7 +3,7 @@ const NodeRSA = require('node-rsa'); const aws = require('aws-sdk'); const mailer = require('./mailer'); const cache = require('./cache'); -const config = require('../config.json'); +const { config } = require('./config-manager'); const spacesEndpoint = new aws.Endpoint('nyc3.digitaloceanspaces.com'); const s3 = new aws.S3({