env, mailer, README

This commit is contained in:
Kaushik 2022-11-08 00:18:35 +05:30
parent 1973247ae4
commit 60cb9813ab
6 changed files with 107 additions and 35 deletions

9
.env Normal file
View File

@ -0,0 +1,9 @@
PORT=5000
AUTOMAILER_ID = "mailerID@mailserver.domain"
AUTOMAILER_APP_PASSWD = "mailerpasswd"
JWTSECRET="somerandomstring"
ADMIN_USER = "ADMIN_USER"
ADMIN_PASSWD = "SOME_ADMIN_PASSWD"

5
.env.development Normal file
View File

@ -0,0 +1,5 @@
DB_USERNAME='your_local_db_username'
DB_PASSWORD='your_local_db_password'
DB_NAME='your_local_db_name'
CAPTCHA_SECRET = "6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe"

View File

@ -1,5 +1,18 @@
# Back-end server template # Express-Sequelize backend server template
- Run npm i to install all dependencies first ### To get started:
- Env config: .env, .env.development, .env.staging, .env.production - Clone this repo: `git clone https://gitlab.com/ctf-tech-2023/backend-template`
- npm run staging_prep and npm run staging to deploy on Render after configuring a new web service on Render dashboard - Reset the git remote repo URL: `git remote rm origin`
- Set new git remote URL: `git remote add origin https://gitlab.com/ctf-tech-2023/new-repo-name`
### Project setup:
- Edit `package.json` to reflect the new name and URLs
- Run `npm i` to install all dependencies
- Before running `sequelize-cli` commands while developing, make sure to set `$env:NODE_ENV='development'` on Windows, or `NODE_ENV=development` on Linux/MacOS
- Env config:
- **.env** - All things common to all environments (port, mailer creds, JWT secret, admin data access creds, etc.)
- **.env.development** - Development environment (dev captcha secret, dev DB details)
- **.env.staging** - Staging environment (dev captcha secret, staging DB conn. string) - **for sysadmins**
- **.env.production** - Production environment (production captcha secret, prod DB conn. string) - **for sysadmins**
- Staging: `npm run staging_prep` and `npm run staging` to deploy on Render after configuring a new web service on Render dashboard

56
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "induction-api-2023", "name": "backend-template",
"version": "1.0.0", "version": "1.3.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "induction-api-2023", "name": "backend-template",
"version": "1.0.0", "version": "1.3.0",
"license": "ISC", "license": "ISC",
"dependencies": { "dependencies": {
"cors": "^2.8.5", "cors": "^2.8.5",
@ -87,14 +87,14 @@
"integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA=="
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "14.18.32", "version": "14.18.33",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.32.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz",
"integrity": "sha512-Y6S38pFr04yb13qqHf8uk1nHE3lXgQ30WZbv1mLliV9pt0NjvqdWttLcrOYLnXbOafknVYRHZGoMSpR9UwfYow==" "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg=="
}, },
"node_modules/@types/validator": { "node_modules/@types/validator": {
"version": "13.7.9", "version": "13.7.10",
"resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.9.tgz", "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.10.tgz",
"integrity": "sha512-y5KJ1PjGXPpU4CZ7lThDu31s+FqvzhqwMOR6Go/x6xaQMFjgzwfzfOvCwABsylr/5n8sB1qFQm1Vi7TaCB8P+A==" "integrity": "sha512-t1yxFAR2n0+VO6hd/FJ9F2uezAZVWHLmpmlJzm1eX03+H7+HsuTAp7L8QJs+2pQCfWkP1+EXsGK9Z9v7o/qPVQ=="
}, },
"node_modules/abbrev": { "node_modules/abbrev": {
"version": "1.1.1", "version": "1.1.1",
@ -1920,9 +1920,9 @@
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
}, },
"node_modules/sequelize": { "node_modules/sequelize": {
"version": "6.25.3", "version": "6.25.4",
"resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.25.3.tgz", "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.25.4.tgz",
"integrity": "sha512-sbbvDGft6UfSRdIC0dcZvMxxJYi6g0+IgWvIpTuk6ccEoIyLcr7Sk6nXWwGfkdlDabGeunhhhI4yH8PleVMvtw==", "integrity": "sha512-gD6RoEVlTKxQh9GC6Qd+pW2A9uhmqeuwBHGMGcZtDg2CchXQhrwS+k6ZnWZ1ggYZ3tUkk4q8fkFL3/XmXnMFFQ==",
"funding": [ "funding": [
{ {
"type": "opencollective", "type": "opencollective",
@ -1981,9 +1981,9 @@
} }
}, },
"node_modules/sequelize-cli": { "node_modules/sequelize-cli": {
"version": "6.5.1", "version": "6.5.2",
"resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.5.1.tgz", "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.5.2.tgz",
"integrity": "sha512-36hfZKNeZkIshp6L0jPVQ27xNLzgDPpiZokQsvo0M882AtAm+KhGOIViR0BecWb0Xz8+uSq03xxcl7RfMgyIRA==", "integrity": "sha512-ltXvQOxFFb9pVuDqPJYOS3/X32OVni9zK1S0d0JfloSjmCKZmMDFBWndZbcbJH0QBfyxTt7FLt/kSmKwTRlbsQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"cli-color": "^2.0.3", "cli-color": "^2.0.3",
@ -2600,14 +2600,14 @@
"integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA=="
}, },
"@types/node": { "@types/node": {
"version": "14.18.32", "version": "14.18.33",
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.32.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.33.tgz",
"integrity": "sha512-Y6S38pFr04yb13qqHf8uk1nHE3lXgQ30WZbv1mLliV9pt0NjvqdWttLcrOYLnXbOafknVYRHZGoMSpR9UwfYow==" "integrity": "sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg=="
}, },
"@types/validator": { "@types/validator": {
"version": "13.7.9", "version": "13.7.10",
"resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.9.tgz", "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.10.tgz",
"integrity": "sha512-y5KJ1PjGXPpU4CZ7lThDu31s+FqvzhqwMOR6Go/x6xaQMFjgzwfzfOvCwABsylr/5n8sB1qFQm1Vi7TaCB8P+A==" "integrity": "sha512-t1yxFAR2n0+VO6hd/FJ9F2uezAZVWHLmpmlJzm1eX03+H7+HsuTAp7L8QJs+2pQCfWkP1+EXsGK9Z9v7o/qPVQ=="
}, },
"abbrev": { "abbrev": {
"version": "1.1.1", "version": "1.1.1",
@ -4058,9 +4058,9 @@
} }
}, },
"sequelize": { "sequelize": {
"version": "6.25.3", "version": "6.25.4",
"resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.25.3.tgz", "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.25.4.tgz",
"integrity": "sha512-sbbvDGft6UfSRdIC0dcZvMxxJYi6g0+IgWvIpTuk6ccEoIyLcr7Sk6nXWwGfkdlDabGeunhhhI4yH8PleVMvtw==", "integrity": "sha512-gD6RoEVlTKxQh9GC6Qd+pW2A9uhmqeuwBHGMGcZtDg2CchXQhrwS+k6ZnWZ1ggYZ3tUkk4q8fkFL3/XmXnMFFQ==",
"requires": { "requires": {
"@types/debug": "^4.1.7", "@types/debug": "^4.1.7",
"@types/validator": "^13.7.1", "@types/validator": "^13.7.1",
@ -4117,9 +4117,9 @@
} }
}, },
"sequelize-cli": { "sequelize-cli": {
"version": "6.5.1", "version": "6.5.2",
"resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.5.1.tgz", "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-6.5.2.tgz",
"integrity": "sha512-36hfZKNeZkIshp6L0jPVQ27xNLzgDPpiZokQsvo0M882AtAm+KhGOIViR0BecWb0Xz8+uSq03xxcl7RfMgyIRA==", "integrity": "sha512-ltXvQOxFFb9pVuDqPJYOS3/X32OVni9zK1S0d0JfloSjmCKZmMDFBWndZbcbJH0QBfyxTt7FLt/kSmKwTRlbsQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"cli-color": "^2.0.3", "cli-color": "^2.0.3",

View File

@ -1,7 +1,7 @@
{ {
"name": "backend-template", "name": "backend-template",
"version": "1.1.0", "version": "1.3.0",
"description": "Template for back-end server using Express, Node, and Sequelize.", "description": "Template for back-end server using Express and Sequelize.",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"dev": "cross-env NODE_ENV=development nodemon --exitcrash index.js", "dev": "cross-env NODE_ENV=development nodemon --exitcrash index.js",
@ -13,7 +13,7 @@
"type": "git", "type": "git",
"url": "git+https://gitlab.com/ctf-tech-2023/backend-template.git" "url": "git+https://gitlab.com/ctf-tech-2023/backend-template.git"
}, },
"author": "", "author": "Kaushik Ravishankar <rknarayan02@gmail.com>",
"license": "ISC", "license": "ISC",
"bugs": { "bugs": {
"url": "https://gitlab.com/ctf-tech-2023/backend-template/issues" "url": "https://gitlab.com/ctf-tech-2023/backend-template/issues"

45
utils/mailer.js Normal file
View File

@ -0,0 +1,45 @@
const mailer = require("nodemailer");
const logger = require("./logger")(module);
// Creates a mailer transporter object with authentication and base config
const transport = mailer.createTransport({
host: "smtp.gmail.com",
port: 465,
secure: true,
service: "gmail",
auth: {
user: process.env.AUTOMAILER_ID,
pass: process.env.AUTOMAILER_APP_PASSWD,
}
});
/**
* Sends a mail from web user to a mail inside organization
* @param {string} mailTarget Target mail - must be within organization
* @param {string} mailSubject Mail subject
* @param {{name: string, email: string, message: string}} userData User details: name, email, and message
*/
const inboundMailer = (mailTarget, mailSubject, userData) => {
if (!mailTarget.endsWith("cegtechforum.in")) {
throw new Error("Invalid target mail domain.");
}
const message = {
to: mailTarget,
subject: mailSubject,
html:
"<p>Name: " + userData.name + "</p><p>Email: " + userData.email + "</p><br/><p>Message:<br/>" + userData.message + "</p>"
};
transport.sendMail(message, (err, info) => {
if (err) {
logger.error("Failure: QUERY mail NOT sent", { err, userData });
} else {
logger.info("Success: QUERY mail sent", { info });
}
});
};
module.exports = {
inboundMailer
}