Browse Source

structure changes

master
krish 10 months ago
parent
commit
5175354aa3
39 changed files with 94 additions and 7381 deletions
  1. +3
    -0
      .dockerignore
  2. +2
    -3
      .env.development
  3. +0
    -10
      .env.example
  4. +1
    -2
      .env.local
  5. +2
    -3
      .env.production
  6. +1
    -0
      .gitignore
  7. +7
    -10
      Dockerfile
  8. +26
    -3
      docker-compose.dev.yml
  9. +27
    -3
      docker-compose.prod.yml
  10. +0
    -17
      docker-compose.yml
  11. +3
    -8
      package.json
  12. +0
    -51
      src/api/validations/auth.validation.js
  13. +7
    -7
      src/configs/express.js
  14. +0
    -0
      src/configs/logger.js
  15. +1
    -1
      src/configs/mongoose.js
  16. +0
    -0
      src/configs/passport.js
  17. +1
    -4
      src/configs/vars.js
  18. +0
    -0
      src/controllers/auth.controller.js
  19. +1
    -1
      src/controllers/user.controller.js
  20. +0
    -0
      src/middlewares/auth.js
  21. +2
    -2
      src/middlewares/error.js
  22. +0
    -0
      src/models/passwordResetToken.model.js
  23. +0
    -0
      src/models/refreshToken.model.js
  24. +1
    -1
      src/models/user.model.js
  25. +0
    -0
      src/routes/api/v1/auth.route.js
  26. +2
    -2
      src/routes/api/v1/index.js
  27. +3
    -3
      src/routes/api/v1/user.route.js
  28. +0
    -0
      src/services/authProviders.js
  29. +1
    -1
      src/services/emails/emailProvider.js
  30. +0
    -0
      src/services/emails/passwordChange/html.pug
  31. +0
    -0
      src/services/emails/passwordChange/subject.pug
  32. +0
    -0
      src/services/emails/passwordReset/html.pug
  33. +0
    -0
      src/services/emails/passwordReset/subject.pug
  34. +0
    -0
      src/tests/integration/auth.test.js
  35. +2
    -2
      src/tests/integration/user.test.js
  36. +0
    -0
      src/utils/APIError.js
  37. +0
    -0
      src/utils/passwordResetEmailTemplate.html
  38. +1
    -1
      src/validations/user.validation.js
  39. +0
    -7246
      yarn.lock

+ 3
- 0
.dockerignore View File

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

+ 2
- 3
.env.development 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=mongodb://localhost:27017/sg-node-express-rest-api
# MONGO_URI_TESTS=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

+ 0
- 10
.env.example 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

.env → .env.local 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

+ 2
- 3
.env.production 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=mongodb://localhost:27017/sg-node-express-rest-api
# MONGO_URI_TESTS=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
- 0
.gitignore View File

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

+ 7
- 10
Dockerfile View File

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

+ 26
- 3
docker-compose.dev.yml View File

@ -1,6 +1,29 @@
version: '2'
version: '3'
services: services:
boilerplate-api:
command: yarn dev -- -L
node:
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:

+ 27
- 3
docker-compose.prod.yml View File

@ -1,6 +1,30 @@
version: '2'
version: '3'
services: services:
boilerplate-api:
command: yarn start
node:
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:

+ 0
- 17
docker-compose.yml 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'

+ 3
- 8
package.json 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",
"prestart": "yarn docs",
"start:dev": "dotenv -v NODE_ENV=development -- nodemon ./src/index.js",
"start": "node src/index.js",
"start:local": "dotenv -v NODE_ENV=local -- 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"


+ 0
- 51
src/api/validations/auth.validation.js 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(),
}),
},
};

src/config/express.js → src/configs/express.js 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.
app.use(error.converter);
// // if error is not an instanceOf APIError, convert it.
// app.use(error.converter);
// catch 404 and forward to error handler
app.use(error.notFound);
// // catch 404 and forward to error handler
// app.use(error.notFound);
// error handler, send stacktrace only during development
app.use(error.handler);
// // error handler, send stacktrace only during development
// app.use(error.handler);
module.exports = app; module.exports = app;

src/config/logger.js → src/configs/logger.js View File


src/config/mongoose.js → src/configs/mongoose.js 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,

src/config/passport.js → src/configs/passport.js View File


src/config/vars.js → src/configs/vars.js 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:
process.env.NODE_ENV === 'test'
? process.env.MONGO_URI_TESTS
: process.env.MONGO_URI,
uri: process.env.MONGO_URI,
}, },
logs: process.env.NODE_ENV === 'production' ? 'combined' : 'dev', logs: process.env.NODE_ENV === 'production' ? 'combined' : 'dev',
emailConfig: { emailConfig: {

src/api/controllers/auth.controller.js → src/controllers/auth.controller.js View File


src/api/controllers/user.controller.js → src/controllers/user.controller.js 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.

src/api/middlewares/auth.js → src/middlewares/auth.js View File


src/api/middlewares/error.js → src/middlewares/error.js 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 { env } = require('../../config/vars');
const APIError = require('../api/utils/APIError');
const { env } = require('../config/vars');
/** /**
* Error handler. Send stacktrace only during development * Error handler. Send stacktrace only during development

src/api/models/passwordResetToken.model.js → src/models/passwordResetToken.model.js View File


src/api/models/refreshToken.model.js → src/models/refreshToken.model.js View File


src/api/models/user.model.js → src/models/user.model.js 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');

src/api/routes/v1/auth.route.js → src/routes/api/v1/auth.route.js View File


src/api/routes/v1/index.js → src/routes/api/v1/index.js 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;

src/api/routes/v1/user.route.js → src/routes/api/v1/user.route.js 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 { authorize, ADMIN, LOGGED_USER } = require('../../middlewares/auth');
const controller = require('../../../controllers/user.controller');
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();

src/api/services/authProviders.js → src/services/authProviders.js View File


src/api/services/emails/emailProvider.js → src/services/emails/emailProvider.js 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.

src/api/services/emails/passwordChange/html.pug → src/services/emails/passwordChange/html.pug View File


src/api/services/emails/passwordChange/subject.pug → src/services/emails/passwordChange/subject.pug View File


src/api/services/emails/passwordReset/html.pug → src/services/emails/passwordReset/html.pug View File


src/api/services/emails/passwordReset/subject.pug → src/services/emails/passwordReset/subject.pug View File


src/api/tests/integration/auth.test.js → src/tests/integration/auth.test.js View File


src/api/tests/integration/user.test.js → src/tests/integration/user.test.js 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

src/api/utils/APIError.js → src/utils/APIError.js View File


src/api/utils/passwordResetEmailTemplate.html → src/utils/passwordResetEmailTemplate.html View File


src/api/validations/user.validation.js → src/validations/user.validation.js 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

+ 0
- 7246
yarn.lock
File diff suppressed because it is too large
View File


Loading…
Cancel
Save