api: Add config parsing from JSON file

This commit is contained in:
Paul Bienkowski 2021-02-27 13:03:35 +01:00
parent d5a1eed27a
commit ad448efd7c
15 changed files with 80 additions and 37 deletions

1
.gitignore vendored
View file

@ -1 +1,2 @@
local
config.json

4
api/config.dev.json Normal file
View file

@ -0,0 +1,4 @@
{
"secret": "CHANGEME!!!!!!!!!!@##@!!$$$$$$$$$$$$$!!",
"mail": false
}

View file

@ -0,0 +1,12 @@
{
"secret": "CHANGEME",
"mail": {
"from": "Sender Name <sender@example.com>",
"smtp" : {
"host": "mail.example.com",
"port": 587,
"username": "sender@example.com",
"password": "hunter2"
}
}
}

View file

@ -1,18 +1,29 @@
const nodemailer = require('nodemailer');
const config = require('../config/email');
const config = require('../config');
module.exports = sendEmail;
async function sendEmail({ to, subject, html, from = config.emailFrom }) {
if (config.sendMails) {
const transporter = nodemailer.createTransport(config.smtpOptions);
async function sendEmail({ to, subject, html }) {
if (config.mail) {
const from = config.mail.from;
const transporter = nodemailer.createTransport({
host: config.mail.smtp.host,
port: config.mail.smtp.port,
secure: true,
auth: {
user: config.mail.smtp.username,
pass: config.mail.smtp.password,
},
});
await transporter.sendMail({ from, to, subject, html });
} else {
console.log({
to,
subject,
html,
from,
});
console.log(`========== E-Mail disabled, see contents below =========
To: ${to}
Subject: ${subject}
${html}
`)
}
}

33
api/src/config.js Normal file
View file

@ -0,0 +1,33 @@
const fs = require('fs');
const Joi = require('joi');
const configSchema = Joi.object()
.required()
.keys({
secret: Joi.string().min(16).max(128).required(),
mail: Joi.alternatives().try(
Joi.object({
from: Joi.string().required(),
smtp: Joi.object().required().keys({
host: Joi.string().required(),
port: Joi.number().default(587),
username: Joi.string().required(),
password: Joi.string().required(),
}),
}),
Joi.boolean().valid(false),
),
});
const configFiles = [
process.env.CONFIG_FILE,
process.env.NODE_ENV === 'production' ? 'config.prod.json' : 'config.dev.json',
'config.json',
].filter((x) => x && fs.existsSync(x));
if (!configFiles.length) {
throw new Error('No config file found.');
}
module.exports = Joi.attempt(JSON.parse(fs.readFileSync(configFiles[0], 'utf8')), configSchema);

View file

@ -1,15 +0,0 @@
const isProduction = process.env.NODE_ENV === 'production';
const forcedMail = process.argv.findIndex((s) => s === '--devSendMails') !== -1;
module.exports = {
sendMails: isProduction || forcedMail,
emailFrom: process.env.MAILSENDER,
smtpOptions: {
host: process.env.MAILSERVER,
port: 587,
auth: {
user: process.env.MAILUSER,
pass: process.env.MAILPW,
},
},
};

View file

@ -1,3 +0,0 @@
module.exports = {
secret: process.env.NODE_ENV === 'production' ? process.env.SECRET : 'secret',
};

View file

@ -10,6 +10,6 @@ require('./models/TrackData');
require('./models/User');
require('./models/Track');
require('./models/Comment');
require('./config/passport');
require('./passport');
module.exports = mongoose;

View file

@ -6,7 +6,7 @@ const cors = require('cors');
const errorhandler = require('errorhandler');
const passport = require('passport');
require('./config/passport');
require('./passport');
const isProduction = process.env.NODE_ENV === 'production';

View file

@ -4,9 +4,9 @@ const { Strategy: BearerStrategy } = require('passport-http-bearer');
const { Strategy: JwtStrategy } = require('passport-jwt');
const { Strategy: CustomStrategy } = require('passport-custom');
const { User, AccessToken, RefreshToken } = require('../models');
const { User, AccessToken, RefreshToken } = require('./models');
const secret = require('../config').secret;
const secret = require('./config').secret;
// used to serialize the user for the session
passport.serializeUser(function (user, done) {

View file

@ -2,7 +2,7 @@ const router = require('express').Router();
const mongoose = require('mongoose');
const User = mongoose.model('User');
const wrapRoute = require('../../_helpers/wrapRoute');
const auth = require('../../config/passport');
const auth = require('../../passport');
// Preload user profile on routes with ':username'
router.param('username', async function (req, res, next, username) {

View file

@ -5,7 +5,7 @@ const Track = mongoose.model('Track');
const Comment = mongoose.model('Comment');
const User = mongoose.model('User');
const busboy = require('connect-busboy');
const auth = require('../../config/passport');
const auth = require('../../passport');
const { normalizeUserAgent, buildObsver1 } = require('../../logic/tracks');
const wrapRoute = require('../../_helpers/wrapRoute');

View file

@ -1,7 +1,6 @@
const router = require('express').Router();
const passport = require('passport');
const wrapRoute = require('../../_helpers/wrapRoute');
const auth = require('../../config/passport');
const auth = require('../../passport');
router.get(
'/user',

View file

@ -4,7 +4,7 @@ const { URL } = require('url');
const { createChallenge } = require('pkce');
const { AuthorizationCode, AccessToken, RefreshToken, Client } = require('../models');
const auth = require('../config/passport');
const auth = require('../passport');
const wrapRoute = require('../_helpers/wrapRoute');
// Check whether the "bigScope" fully includes the "smallScope".

View file

@ -20,6 +20,7 @@ services:
- ./local/api-data:/data
- ./api/.migrations.js:/opt/obs/api/.migrations.js
- ./api/migrations:/opt/obs/api/migrations/
- ./api/config.dev.json:/opt/obs/api/config.json
environment:
- PORT=3000
- MONGODB_URL=mongodb://mongo/obsTest