structure changes

This commit is contained in:
krish 2024-03-18 16:21:42 +05:30
parent f5a5955656
commit 5175354aa3
39 changed files with 95 additions and 7382 deletions

3
.dockerignore Normal file
View File

@ -0,0 +1,3 @@
node_modules
combined.log
error.log

View File

@ -3,8 +3,7 @@ EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587 EMAIL_PORT=587
EMAIL_USERNAME=krish@sentientgeeks.com EMAIL_USERNAME=krish@sentientgeeks.com
EMAIL_PASSWORD=123456 EMAIL_PASSWORD=123456
NODE_ENV=development
PORT=3000 PORT=3000
MONGO_URI_TESTS=mongodb://localhost:27017/sg-node-express-rest-api # MONGO_URI_TESTS=mongodb://localhost:27017/sg-node-express-rest-api
MONGO_URI=mongodb://localhost:27017/sg-node-express-rest-api MONGO_URI=mongodb://mongo:27017/sg-node-express-rest-api
JWT_EXPIRATION_MINUTES=300 JWT_EXPIRATION_MINUTES=300

View File

@ -1,10 +0,0 @@
JWT_SECRET=sajdhgjhasdhgads
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USERNAME=krish@sentientgeeks.com
EMAIL_PASSWORD=123456
NODE_ENV=development
PORT=3000
MONGO_URI_TESTS=mongodb://mongodb:27017/sg-node-express-rest-api
MONGO_URI=mongodb://mongodb:27017/sg-node-express-rest-api
JWT_EXPIRATION_MINUTES=300

View File

@ -3,8 +3,7 @@ EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587 EMAIL_PORT=587
EMAIL_USERNAME=krish@sentientgeeks.com EMAIL_USERNAME=krish@sentientgeeks.com
EMAIL_PASSWORD=123456 EMAIL_PASSWORD=123456
NODE_ENV=development
PORT=3000 PORT=3000
MONGO_URI_TESTS=mongodb://localhost:27017/sg-node-express-rest-api # MONGO_URI_TESTS=mongodb://localhost:27017/sg-node-express-rest-api
MONGO_URI=mongodb://localhost:27017/sg-node-express-rest-api MONGO_URI=mongodb://localhost:27017/sg-node-express-rest-api
JWT_EXPIRATION_MINUTES=300 JWT_EXPIRATION_MINUTES=300

View File

@ -3,8 +3,7 @@ EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587 EMAIL_PORT=587
EMAIL_USERNAME=krish@sentientgeeks.com EMAIL_USERNAME=krish@sentientgeeks.com
EMAIL_PASSWORD=123456 EMAIL_PASSWORD=123456
NODE_ENV=development
PORT=3000 PORT=3000
MONGO_URI_TESTS=mongodb://localhost:27017/sg-node-express-rest-api # MONGO_URI_TESTS=mongodb://localhost:27017/sg-node-express-rest-api
MONGO_URI=mongodb://localhost:27017/sg-node-express-rest-api MONGO_URI=mongodb://mongo:27017/sg-node-express-rest-api
JWT_EXPIRATION_MINUTES=300 JWT_EXPIRATION_MINUTES=300

1
.gitignore vendored
View File

@ -6,3 +6,4 @@ dist/
coverage coverage
docs/ docs/
yarn.lock yarn.lock
package-lock.json

View File

@ -1,14 +1,11 @@
FROM node:8-alpine FROM node:latest
EXPOSE 3000
ARG NODE_ENV
ENV NODE_ENV $NODE_ENV
RUN mkdir /app
WORKDIR /app WORKDIR /app
ADD package.json yarn.lock /app/
RUN yarn --pure-lockfile
ADD . /app
CMD ["yarn", "docker:start"] COPY package.json package-lock.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]

View File

@ -1,6 +1,29 @@
version: '2' version: '3'
services: services:
boilerplate-api: node:
command: yarn dev -- -L container_name: nodejs-api
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
environment: environment:
- NODE_ENV=development - NODE_ENV=development
volumes:
- .:/app
depends_on:
- mongo
restart: always
mongo:
container_name: mongodb
image: mongo:latest
ports:
- "27017:27017"
volumes:
- mongo_data:/data/db
restart: always
volumes:
mongo_data:

View File

@ -1,6 +1,30 @@
version: '2' version: '3'
services: services:
boilerplate-api: node:
command: yarn start container_name: nodejs-api
build:
context: .
dockerfile: Dockerfile
ports:
- "3000:3000"
environment: environment:
- NODE_ENV=production - NODE_ENV=production
volumes:
- .:/app
depends_on:
- mongo
restart: always
mongo:
container_name: mongodb
image: mongo:latest
ports:
- "27017:27017"
volumes:
- mongo_data:/data/db
restart: always
volumes:
mongo_data:

View File

@ -1,17 +0,0 @@
version: '2'
services:
boilerplate-api:
build: .
environment:
- MONGO_URI=mongodb://mongodb:27017/sg-node-express-rest-api
volumes:
- .:/app
ports:
- '3000:3000'
depends_on:
- mongodb
mongodb:
image: mongo
ports:
- '27017:27017'

View File

@ -4,14 +4,10 @@
"description": "Sentientgeeks Boilerplate Node Express RESTApi ES2017", "description": "Sentientgeeks Boilerplate Node Express RESTApi ES2017",
"author": "sentientgeeks", "author": "sentientgeeks",
"main": "src/index.js", "main": "src/index.js",
"engines": {
"node": ">=8",
"yarn": "*"
},
"scripts": { "scripts": {
"precommit": "yarn lint", "start": "node src/index.js",
"prestart": "yarn docs", "start:local": "dotenv -v NODE_ENV=local -- nodemon ./src/index.js",
"start:dev": "dotenv -v NODE_ENV=development -- nodemon ./src/index.js", "start:dev": "dotenv -v NODE_ENV=development -- node ./src/index.js",
"start:prod": "dotenv -v NODE_ENV=production -- pm2 start ./src/index.js", "start:prod": "dotenv -v NODE_ENV=production -- pm2 start ./src/index.js",
"lint": "eslint ./src/ --ignore-path .gitignore --ignore-pattern internals/scripts", "lint": "eslint ./src/ --ignore-path .gitignore --ignore-pattern internals/scripts",
"lint:fix": "npx eslint --fix", "lint:fix": "npx eslint --fix",
@ -28,7 +24,6 @@
"deploy": "sh ./deploy.sh", "deploy": "sh ./deploy.sh",
"docs": "apidoc -i src -o docs", "docs": "apidoc -i src -o docs",
"postdocs": "open-cli docs/index.html", "postdocs": "open-cli docs/index.html",
"docker:start": "cross-env NODE_ENV=production pm2-docker start ./src/index.js",
"docker:prod": "docker-compose -f docker-compose.yml -f docker-compose.prod.yml up", "docker:prod": "docker-compose -f docker-compose.yml -f docker-compose.prod.yml up",
"docker:dev": "docker-compose -f docker-compose.yml -f docker-compose.dev.yml up", "docker:dev": "docker-compose -f docker-compose.yml -f docker-compose.dev.yml up",
"docker:test": "docker-compose -f docker-compose.yml -f docker-compose.test.yml up --abort-on-container-exit" "docker:test": "docker-compose -f docker-compose.yml -f docker-compose.test.yml up --abort-on-container-exit"

View File

@ -1,51 +0,0 @@
const Joi = require('joi');
module.exports = {
// POST /v1/auth/register
register: {
body: Joi.object({
email: Joi.string().email().required(),
password: Joi.string().required().min(6).max(128),
}),
},
// POST /v1/auth/login
login: {
body: Joi.object({
email: Joi.string().email().required(),
password: Joi.string().required().max(128),
}),
},
// POST /v1/auth/facebook
// POST /v1/auth/google
oAuth: {
body: Joi.object({
access_token: Joi.string().required(),
}),
},
// POST /v1/auth/refresh
refresh: {
body: Joi.object({
email: Joi.string().email().required(),
refreshToken: Joi.string().required(),
}),
},
// POST /v1/auth/refresh
sendPasswordReset: {
body: Joi.object({
email: Joi.string().email().required(),
}),
},
// POST /v1/auth/password-reset
passwordReset: {
body: Joi.object({
email: Joi.string().email().required(),
password: Joi.string().required().min(6).max(128),
resetToken: Joi.string().required(),
}),
},
};

View File

@ -44,15 +44,15 @@ passport.use('facebook', strategies.facebook);
passport.use('google', strategies.google); passport.use('google', strategies.google);
// mount api v1 routes // mount api v1 routes
app.use('/v1', routes); // app.use('/v1', routes);
// if error is not an instanceOf APIError, convert it. // // if error is not an instanceOf APIError, convert it.
app.use(error.converter); // app.use(error.converter);
// catch 404 and forward to error handler // // catch 404 and forward to error handler
app.use(error.notFound); // app.use(error.notFound);
// error handler, send stacktrace only during development // // error handler, send stacktrace only during development
app.use(error.handler); // app.use(error.handler);
module.exports = app; module.exports = app;

View File

@ -26,7 +26,7 @@ exports.connect = () => {
mongoose mongoose
.connect(mongo.uri, { .connect(mongo.uri, {
//useCreateIndex: true, //useCreateIndex: true,
keepAlive: 1, // keepAlive: 1,
//useNewUrlParser: true, //useNewUrlParser: true,
//useUnifiedTopology: true, //useUnifiedTopology: true,
//useFindAndModify: false, //useFindAndModify: false,

View File

@ -12,10 +12,7 @@ module.exports = {
jwtSecret: process.env.JWT_SECRET, jwtSecret: process.env.JWT_SECRET,
jwtExpirationInterval: process.env.JWT_EXPIRATION_MINUTES, jwtExpirationInterval: process.env.JWT_EXPIRATION_MINUTES,
mongo: { mongo: {
uri: uri: process.env.MONGO_URI,
process.env.NODE_ENV === 'test'
? process.env.MONGO_URI_TESTS
: process.env.MONGO_URI,
}, },
logs: process.env.NODE_ENV === 'production' ? 'combined' : 'dev', logs: process.env.NODE_ENV === 'production' ? 'combined' : 'dev',
emailConfig: { emailConfig: {

View File

@ -1,6 +1,6 @@
const httpStatus = require('http-status'); const httpStatus = require('http-status');
const { omit } = require('lodash'); const { omit } = require('lodash');
const User = require('../models/user.model'); const User = require('../api/models/user.model');
/** /**
* Load user and append to req. * Load user and append to req.

View File

@ -1,7 +1,7 @@
const httpStatus = require('http-status'); const httpStatus = require('http-status');
const expressValidation = require('express-validation'); const expressValidation = require('express-validation');
const APIError = require('../utils/APIError'); const APIError = require('../api/utils/APIError');
const { env } = require('../../config/vars'); const { env } = require('../config/vars');
/** /**
* Error handler. Send stacktrace only during development * Error handler. Send stacktrace only during development

View File

@ -4,7 +4,7 @@ const { omitBy, isNil } = require('lodash');
const bcrypt = require('bcryptjs'); const bcrypt = require('bcryptjs');
const moment = require('moment-timezone'); const moment = require('moment-timezone');
const jwt = require('jwt-simple'); const jwt = require('jwt-simple');
const uuidv4 = require('uuid/v4'); // const uuidv4 = require('uuid/v4');
const APIError = require('../utils/APIError'); const APIError = require('../utils/APIError');
const { env, jwtSecret, jwtExpirationInterval } = require('../../config/vars'); const { env, jwtSecret, jwtExpirationInterval } = require('../../config/vars');

View File

@ -12,9 +12,9 @@ router.get('/status', (req, res) => res.send('OK'));
/** /**
* GET v1/docs * GET v1/docs
*/ */
router.use('/docs', express.static('docs')); // router.use('/docs', express.static('docs'));
router.use('/users', userRoutes); // router.use('/users', userRoutes);
router.use('/auth', authRoutes); router.use('/auth', authRoutes);
module.exports = router; module.exports = router;

View File

@ -1,13 +1,13 @@
const express = require('express'); const express = require('express');
const { validate, ValidationError, Joi } = require('express-validation'); const { validate, ValidationError, Joi } = require('express-validation');
const controller = require('../../controllers/user.controller'); const controller = require('../../../controllers/user.controller');
const { authorize, ADMIN, LOGGED_USER } = require('../../middlewares/auth'); const { authorize, ADMIN, LOGGED_USER } = require('../../../middlewares/auth');
const { const {
listUsers, listUsers,
createUser, createUser,
replaceUser, replaceUser,
updateUser, updateUser,
} = require('../../validations/user.validation'); } = require('../../../validations/user.validation');
const router = express.Router(); const router = express.Router();

View File

@ -1,5 +1,5 @@
const nodemailer = require('nodemailer'); const nodemailer = require('nodemailer');
const { emailConfig } = require('../../../config/vars'); const { emailConfig } = require('../../config/vars');
const Email = require('email-templates'); const Email = require('email-templates');
// SMTP is the main transport in Nodemailer for delivering messages. // SMTP is the main transport in Nodemailer for delivering messages.

View File

@ -6,9 +6,9 @@ const { expect } = require('chai');
const sinon = require('sinon'); const sinon = require('sinon');
const bcrypt = require('bcryptjs'); const bcrypt = require('bcryptjs');
const { some, omitBy, isNil } = require('lodash'); const { some, omitBy, isNil } = require('lodash');
const app = require('../../../index'); const app = require('../../index');
const User = require('../../models/user.model'); const User = require('../../models/user.model');
const JWT_EXPIRATION = require('../../../config/vars').jwtExpirationInterval; const JWT_EXPIRATION = require('../../config/vars').jwtExpirationInterval;
/** /**
* root level hooks * root level hooks

View File

@ -1,5 +1,5 @@
const Joi = require('joi'); const Joi = require('joi');
const User = require('../models/user.model'); const User = require('../api/models/user.model');
module.exports = { module.exports = {
// GET /v1/users // GET /v1/users

7246
yarn.lock

File diff suppressed because it is too large Load Diff