├── .gitignore ├── README.md ├── app.js ├── config └── config.json ├── models ├── index.js └── user.js ├── package-lock.json ├── package.json ├── postman_collection └── serverless-node-simple-crud.postman_collection.json ├── public ├── index.html └── stylesheets │ └── style.css ├── serverless.yml └── src ├── controller ├── home.js └── user.js ├── database └── user.js ├── routes ├── home.js └── users.js └── utils └── constants.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | *.log 3 | npm-debug.log* 4 | yarn-debug.log* 5 | yarn-error.log* 6 | 7 | # Runtime data 8 | pids 9 | *.pid 10 | *.seed 11 | *.pid.lock 12 | 13 | # Directory for instrumented libs generated by jscoverage/JSCover 14 | lib-cov 15 | 16 | # Coverage directory used by tools like istanbul 17 | coverage 18 | 19 | # nyc test coverage 20 | .nyc_output 21 | 22 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 23 | .grunt 24 | 25 | # Bower dependency directory (https://bower.io/) 26 | bower_components 27 | 28 | # node-waf configuration 29 | .lock-wscript 30 | 31 | # Compiled binary addons (http://nodejs.org/api/addons.html) 32 | build/Release 33 | 34 | # Dependency directories 35 | node_modules/ 36 | jspm_packages/ 37 | .serverless/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | # vs code configuration 61 | .vscode 62 | 63 | # Mac 64 | .DS_Store 65 | 66 | .idea/* 67 | 68 | temp/* 69 | !temp/.gitkeep 70 | 71 | logs/* 72 | !logs/.gitkeep -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # serverless-node-simple-crud 2 | 3 | Simple AWS lambda serverless function for crud operations using Expressjs. 4 | 5 | ## Setup 6 | - Install `node`, `npm` 7 | - Run the following commands 8 | 9 | ```sh 10 | # Install serverless globally 11 | $ npm install -g serverless 12 | 13 | # Provide credentials of AWS to serverless 14 | $ sls config credentials --provider aws --key PUBLIC_KEY --secret SECRET_KEY 15 | 16 | # Install dependencies 17 | $ npm install 18 | 19 | # Export Env variable 20 | $ export MY_API_KEY= Some text for api key generation 21 | 22 | ``` 23 | 24 | ## Deployment 25 | Setup the following variables into your AWS lambda function. 26 | ``` 27 | NODE_ENV=production/development 28 | DATABASE= Name of the database. 29 | DB_USERNAME= Database user name 30 | DB_PASSWORD= Database password 31 | DB_HOST= Database host 32 | DB_PORT= Database port 33 | ``` 34 | Deploying serverless function to AWS. 35 | ```sh 36 | $ sls deploy # Deploying serverless function to AWS 37 | ``` 38 | ## Running 39 | - Make a POST APIs call with the API URL returned. 40 | - Set API key value in the x-api-key header of every request. 41 | - The API key is auto-generated by AWS and printed on the screen while running 'sls deploy'. 42 | - Refer to postman collection in the codebase with the file named 'serverless-node-simple-crud.postman_collection.json' 43 | 44 | ## Contributors 45 | [Vikas Patidar](https://www.linkedin.com/in/vikas-patidar-0106/) 46 | 47 | ## License 48 | 49 | Built under [MIT](http://www.opensource.org/licenses/mit-license.php) license. 50 | 51 | -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var express = require('express'); 3 | var path = require('path'); 4 | var cookieParser = require('cookie-parser'); 5 | var logger = require('morgan'); 6 | var bodyParser = require('body-parser') 7 | var fs = require('fs') 8 | 9 | var sls = require('serverless-http') 10 | var routePath = './src/routes/'; 11 | var app = express(); 12 | // parse application/json 13 | app.use(bodyParser.json()) 14 | 15 | let loggerOption = (process.env.NODE_ENV === 'production') ? 'common' : 'dev'; 16 | app.use(logger(loggerOption)); 17 | app.use(express.json()); 18 | app.use(express.urlencoded({ 19 | extended: false 20 | })); 21 | app.use(cookieParser()); 22 | app.use(express.static(path.join(__dirname, 'public'))); 23 | 24 | fs.readdirSync(routePath).forEach((file) => { 25 | let route = routePath + file; 26 | require(route)(app); 27 | }); 28 | 29 | // app.listen(3000); 30 | // module.exports = app; 31 | 32 | module.exports.handler = sls(app); -------------------------------------------------------------------------------- /config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "development": { 3 | "username": "root", 4 | "password": "root", 5 | "database": "lamda-example-dev", 6 | "host": "localhost", 7 | "port": "3306", 8 | "dialect": "mysql" 9 | }, 10 | "test": { 11 | "username": "root", 12 | "password": "root", 13 | "database": "lamda-example-test", 14 | "host": "localhost", 15 | "port": "3306", 16 | "dialect": "mysql" 17 | }, 18 | "production": { 19 | "username": "root", 20 | "password": "root", 21 | "database": "lamda-example-prod", 22 | "host": "localhost", 23 | "port": "3306", 24 | "dialect": "mysql" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /models/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const fs = require('fs'); 4 | const path = require('path'); 5 | const Sequelize = require('sequelize'); 6 | const basename = path.basename(__filename); 7 | const env = process.env.NODE_ENV || 'development'; 8 | const config = require(__dirname + '/../config/config.json')[env]; 9 | const db = {}; 10 | let database = process.env.DATABASE || config.database; 11 | let username = process.env.DB_USERNAME || config.username; 12 | let password = process.env.DB_PASSWORD || config.password; 13 | let dbHost = process.env.DB_HOST || config.host; 14 | let dialect = config.dialect; 15 | let dbPort = process.env.DB_PORT || config.port; 16 | 17 | let sequelize; 18 | 19 | sequelize = new Sequelize(database, username, password, { 20 | host: dbHost, 21 | port: dbPort, 22 | dialect: dialect, 23 | pool: { 24 | max: 5, 25 | min: 0, 26 | idle: 10000 27 | } 28 | }); 29 | 30 | fs 31 | .readdirSync(__dirname) 32 | .filter(file => { 33 | return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); 34 | }) 35 | .forEach(file => { 36 | const model = sequelize['import'](path.join(__dirname, file)); 37 | db[model.name] = model; 38 | }); 39 | 40 | Object.keys(db).forEach(modelName => { 41 | if (db[modelName].associate) { 42 | db[modelName].associate(db); 43 | } 44 | }); 45 | 46 | db.sequelize = sequelize; 47 | db.Sequelize = Sequelize; 48 | 49 | module.exports = db; -------------------------------------------------------------------------------- /models/user.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | module.exports = (sequelize, DataTypes) => { 3 | var User = sequelize.define('User', { 4 | firstName: DataTypes.STRING, 5 | lastName: DataTypes.STRING, 6 | address: DataTypes.STRING, 7 | contact: DataTypes.BIGINT 8 | }); 9 | 10 | User.associate = function (models) {}; 11 | User.sync({}); 12 | 13 | return User; 14 | }; -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "serverless-node-simple-crud", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/aws-lambda": { 8 | "version": "8.10.24", 9 | "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.24.tgz", 10 | "integrity": "sha512-9F70bcb2oBGZUZCyisE1Ap3vwgt04uiSmr4s9mhQf89vBrttgraBs2Rc8l9YrKiemCndCH7wxnYNWk5qEuv6rA==", 11 | "optional": true 12 | }, 13 | "@types/node": { 14 | "version": "11.13.6", 15 | "resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.6.tgz", 16 | "integrity": "sha512-Xoo/EBzEe8HxTSwaZNLZjaW6M6tA/+GmD3/DZ6uo8qSaolE/9Oarko0oV1fVfrLqOz0tx0nXJB4rdD5c+vixLw==" 17 | }, 18 | "abbrev": { 19 | "version": "1.1.1", 20 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 21 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 22 | }, 23 | "accepts": { 24 | "version": "1.3.5", 25 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 26 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 27 | "requires": { 28 | "mime-types": "2.1.24", 29 | "negotiator": "0.6.1" 30 | } 31 | }, 32 | "ansi-regex": { 33 | "version": "2.1.1", 34 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 35 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 36 | }, 37 | "any-promise": { 38 | "version": "1.3.0", 39 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 40 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" 41 | }, 42 | "array-flatten": { 43 | "version": "1.1.1", 44 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 45 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 46 | }, 47 | "babel-runtime": { 48 | "version": "6.26.0", 49 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 50 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", 51 | "requires": { 52 | "core-js": "2.6.5", 53 | "regenerator-runtime": "0.11.1" 54 | } 55 | }, 56 | "balanced-match": { 57 | "version": "1.0.0", 58 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 59 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 60 | }, 61 | "basic-auth": { 62 | "version": "2.0.1", 63 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 64 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 65 | "requires": { 66 | "safe-buffer": "5.1.2" 67 | } 68 | }, 69 | "bluebird": { 70 | "version": "3.5.4", 71 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", 72 | "integrity": "sha512-FG+nFEZChJrbQ9tIccIfZJBz3J7mLrAhxakAbnrJWn8d7aKOC+LWifa0G+p4ZqKp4y13T7juYvdhq9NzKdsrjw==" 73 | }, 74 | "body-parser": { 75 | "version": "1.18.3", 76 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 77 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 78 | "requires": { 79 | "bytes": "3.0.0", 80 | "content-type": "1.0.4", 81 | "debug": "2.6.9", 82 | "depd": "1.1.2", 83 | "http-errors": "1.6.3", 84 | "iconv-lite": "0.4.23", 85 | "on-finished": "2.3.0", 86 | "qs": "6.5.2", 87 | "raw-body": "2.3.3", 88 | "type-is": "1.6.16" 89 | } 90 | }, 91 | "brace-expansion": { 92 | "version": "1.1.11", 93 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 94 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 95 | "requires": { 96 | "balanced-match": "1.0.0", 97 | "concat-map": "0.0.1" 98 | } 99 | }, 100 | "bytes": { 101 | "version": "3.0.0", 102 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 103 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 104 | }, 105 | "camelcase": { 106 | "version": "5.3.1", 107 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 108 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 109 | }, 110 | "chai-as-promised": { 111 | "version": "7.1.1", 112 | "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", 113 | "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", 114 | "requires": { 115 | "check-error": "1.0.2" 116 | } 117 | }, 118 | "check-error": { 119 | "version": "1.0.2", 120 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 121 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" 122 | }, 123 | "cli-color": { 124 | "version": "1.4.0", 125 | "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-1.4.0.tgz", 126 | "integrity": "sha512-xu6RvQqqrWEo6MPR1eixqGPywhYBHRs653F9jfXB2Hx4jdM/3WxiNE1vppRmxtMIfl16SFYTpYlrnqH/HsK/2w==", 127 | "requires": { 128 | "ansi-regex": "2.1.1", 129 | "d": "1.0.0", 130 | "es5-ext": "0.10.49", 131 | "es6-iterator": "2.0.3", 132 | "memoizee": "0.4.14", 133 | "timers-ext": "0.1.7" 134 | } 135 | }, 136 | "cliui": { 137 | "version": "4.1.0", 138 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", 139 | "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", 140 | "requires": { 141 | "string-width": "2.1.1", 142 | "strip-ansi": "4.0.0", 143 | "wrap-ansi": "2.1.0" 144 | } 145 | }, 146 | "cls-bluebird": { 147 | "version": "2.1.0", 148 | "resolved": "https://registry.npmjs.org/cls-bluebird/-/cls-bluebird-2.1.0.tgz", 149 | "integrity": "sha1-N+8eCAqP+1XC9BZPU28ZGeeWiu4=", 150 | "requires": { 151 | "is-bluebird": "1.0.2", 152 | "shimmer": "1.2.1" 153 | } 154 | }, 155 | "code-point-at": { 156 | "version": "1.1.0", 157 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 158 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 159 | }, 160 | "commander": { 161 | "version": "2.20.0", 162 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", 163 | "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==" 164 | }, 165 | "concat-map": { 166 | "version": "0.0.1", 167 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 168 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 169 | }, 170 | "config-chain": { 171 | "version": "1.1.12", 172 | "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", 173 | "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", 174 | "requires": { 175 | "ini": "1.3.5", 176 | "proto-list": "1.2.4" 177 | } 178 | }, 179 | "content-disposition": { 180 | "version": "0.5.2", 181 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 182 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 183 | }, 184 | "content-type": { 185 | "version": "1.0.4", 186 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 187 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 188 | }, 189 | "cookie": { 190 | "version": "0.3.1", 191 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 192 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 193 | }, 194 | "cookie-parser": { 195 | "version": "1.4.4", 196 | "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.4.tgz", 197 | "integrity": "sha512-lo13tqF3JEtFO7FyA49CqbhaFkskRJ0u/UAiINgrIXeRCY41c88/zxtrECl8AKH3B0hj9q10+h3Kt8I7KlW4tw==", 198 | "requires": { 199 | "cookie": "0.3.1", 200 | "cookie-signature": "1.0.6" 201 | } 202 | }, 203 | "cookie-signature": { 204 | "version": "1.0.6", 205 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 206 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 207 | }, 208 | "core-js": { 209 | "version": "2.6.5", 210 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", 211 | "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==" 212 | }, 213 | "cross-spawn": { 214 | "version": "6.0.5", 215 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 216 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 217 | "requires": { 218 | "nice-try": "1.0.5", 219 | "path-key": "2.0.1", 220 | "semver": "5.7.0", 221 | "shebang-command": "1.2.0", 222 | "which": "1.3.1" 223 | } 224 | }, 225 | "d": { 226 | "version": "1.0.0", 227 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", 228 | "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", 229 | "requires": { 230 | "es5-ext": "0.10.49" 231 | } 232 | }, 233 | "debug": { 234 | "version": "2.6.9", 235 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 236 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 237 | "requires": { 238 | "ms": "2.0.0" 239 | } 240 | }, 241 | "decamelize": { 242 | "version": "1.2.0", 243 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 244 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 245 | }, 246 | "denque": { 247 | "version": "1.4.1", 248 | "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", 249 | "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" 250 | }, 251 | "depd": { 252 | "version": "1.1.2", 253 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 254 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 255 | }, 256 | "destroy": { 257 | "version": "1.0.4", 258 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 259 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 260 | }, 261 | "dottie": { 262 | "version": "2.0.1", 263 | "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.1.tgz", 264 | "integrity": "sha512-ch5OQgvGDK2u8pSZeSYAQaV/lczImd7pMJ7BcEPXmnFVjy4yJIzP6CsODJUTH8mg1tyH1Z2abOiuJO3DjZ/GBw==" 265 | }, 266 | "editorconfig": { 267 | "version": "0.15.3", 268 | "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz", 269 | "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==", 270 | "requires": { 271 | "commander": "2.20.0", 272 | "lru-cache": "4.1.5", 273 | "semver": "5.7.0", 274 | "sigmund": "1.0.1" 275 | } 276 | }, 277 | "ee-first": { 278 | "version": "1.1.1", 279 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 280 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 281 | }, 282 | "encodeurl": { 283 | "version": "1.0.2", 284 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 285 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 286 | }, 287 | "end-of-stream": { 288 | "version": "1.4.1", 289 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 290 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 291 | "requires": { 292 | "once": "1.4.0" 293 | } 294 | }, 295 | "es5-ext": { 296 | "version": "0.10.49", 297 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.49.tgz", 298 | "integrity": "sha512-3NMEhi57E31qdzmYp2jwRArIUsj1HI/RxbQ4bgnSB+AIKIxsAmTiK83bYMifIcpWvEc3P1X30DhUKOqEtF/kvg==", 299 | "requires": { 300 | "es6-iterator": "2.0.3", 301 | "es6-symbol": "3.1.1", 302 | "next-tick": "1.0.0" 303 | } 304 | }, 305 | "es6-iterator": { 306 | "version": "2.0.3", 307 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", 308 | "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", 309 | "requires": { 310 | "d": "1.0.0", 311 | "es5-ext": "0.10.49", 312 | "es6-symbol": "3.1.1" 313 | } 314 | }, 315 | "es6-symbol": { 316 | "version": "3.1.1", 317 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", 318 | "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", 319 | "requires": { 320 | "d": "1.0.0", 321 | "es5-ext": "0.10.49" 322 | } 323 | }, 324 | "es6-weak-map": { 325 | "version": "2.0.2", 326 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", 327 | "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", 328 | "requires": { 329 | "d": "1.0.0", 330 | "es5-ext": "0.10.49", 331 | "es6-iterator": "2.0.3", 332 | "es6-symbol": "3.1.1" 333 | } 334 | }, 335 | "escape-html": { 336 | "version": "1.0.3", 337 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 338 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 339 | }, 340 | "etag": { 341 | "version": "1.8.1", 342 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 343 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 344 | }, 345 | "event-emitter": { 346 | "version": "0.3.5", 347 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", 348 | "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", 349 | "requires": { 350 | "d": "1.0.0", 351 | "es5-ext": "0.10.49" 352 | } 353 | }, 354 | "execa": { 355 | "version": "1.0.0", 356 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 357 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 358 | "requires": { 359 | "cross-spawn": "6.0.5", 360 | "get-stream": "4.1.0", 361 | "is-stream": "1.1.0", 362 | "npm-run-path": "2.0.2", 363 | "p-finally": "1.0.0", 364 | "signal-exit": "3.0.2", 365 | "strip-eof": "1.0.0" 366 | } 367 | }, 368 | "express": { 369 | "version": "4.16.4", 370 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", 371 | "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", 372 | "requires": { 373 | "accepts": "1.3.5", 374 | "array-flatten": "1.1.1", 375 | "body-parser": "1.18.3", 376 | "content-disposition": "0.5.2", 377 | "content-type": "1.0.4", 378 | "cookie": "0.3.1", 379 | "cookie-signature": "1.0.6", 380 | "debug": "2.6.9", 381 | "depd": "1.1.2", 382 | "encodeurl": "1.0.2", 383 | "escape-html": "1.0.3", 384 | "etag": "1.8.1", 385 | "finalhandler": "1.1.1", 386 | "fresh": "0.5.2", 387 | "merge-descriptors": "1.0.1", 388 | "methods": "1.1.2", 389 | "on-finished": "2.3.0", 390 | "parseurl": "1.3.3", 391 | "path-to-regexp": "0.1.7", 392 | "proxy-addr": "2.0.5", 393 | "qs": "6.5.2", 394 | "range-parser": "1.2.0", 395 | "safe-buffer": "5.1.2", 396 | "send": "0.16.2", 397 | "serve-static": "1.13.2", 398 | "setprototypeof": "1.1.0", 399 | "statuses": "1.4.0", 400 | "type-is": "1.6.16", 401 | "utils-merge": "1.0.1", 402 | "vary": "1.1.2" 403 | } 404 | }, 405 | "finalhandler": { 406 | "version": "1.1.1", 407 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 408 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 409 | "requires": { 410 | "debug": "2.6.9", 411 | "encodeurl": "1.0.2", 412 | "escape-html": "1.0.3", 413 | "on-finished": "2.3.0", 414 | "parseurl": "1.3.3", 415 | "statuses": "1.4.0", 416 | "unpipe": "1.0.0" 417 | } 418 | }, 419 | "find-up": { 420 | "version": "3.0.0", 421 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 422 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 423 | "requires": { 424 | "locate-path": "3.0.0" 425 | } 426 | }, 427 | "forwarded": { 428 | "version": "0.1.2", 429 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 430 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 431 | }, 432 | "fresh": { 433 | "version": "0.5.2", 434 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 435 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 436 | }, 437 | "fs-extra": { 438 | "version": "7.0.1", 439 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", 440 | "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", 441 | "requires": { 442 | "graceful-fs": "4.1.15", 443 | "jsonfile": "4.0.0", 444 | "universalify": "0.1.2" 445 | } 446 | }, 447 | "fs.realpath": { 448 | "version": "1.0.0", 449 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 450 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 451 | }, 452 | "generate-function": { 453 | "version": "2.3.1", 454 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", 455 | "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", 456 | "requires": { 457 | "is-property": "1.0.2" 458 | } 459 | }, 460 | "get-caller-file": { 461 | "version": "1.0.3", 462 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", 463 | "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" 464 | }, 465 | "get-stream": { 466 | "version": "4.1.0", 467 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 468 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 469 | "requires": { 470 | "pump": "3.0.0" 471 | } 472 | }, 473 | "glob": { 474 | "version": "7.1.3", 475 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 476 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 477 | "requires": { 478 | "fs.realpath": "1.0.0", 479 | "inflight": "1.0.6", 480 | "inherits": "2.0.3", 481 | "minimatch": "3.0.4", 482 | "once": "1.4.0", 483 | "path-is-absolute": "1.0.1" 484 | } 485 | }, 486 | "graceful-fs": { 487 | "version": "4.1.15", 488 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 489 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" 490 | }, 491 | "http-errors": { 492 | "version": "1.6.3", 493 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 494 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 495 | "requires": { 496 | "depd": "1.1.2", 497 | "inherits": "2.0.3", 498 | "setprototypeof": "1.1.0", 499 | "statuses": "1.4.0" 500 | } 501 | }, 502 | "iconv-lite": { 503 | "version": "0.4.23", 504 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 505 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 506 | "requires": { 507 | "safer-buffer": "2.1.2" 508 | } 509 | }, 510 | "inflection": { 511 | "version": "1.12.0", 512 | "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", 513 | "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" 514 | }, 515 | "inflight": { 516 | "version": "1.0.6", 517 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 518 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 519 | "requires": { 520 | "once": "1.4.0", 521 | "wrappy": "1.0.2" 522 | } 523 | }, 524 | "inherits": { 525 | "version": "2.0.3", 526 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 527 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 528 | }, 529 | "ini": { 530 | "version": "1.3.5", 531 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 532 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 533 | }, 534 | "invert-kv": { 535 | "version": "2.0.0", 536 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", 537 | "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" 538 | }, 539 | "ipaddr.js": { 540 | "version": "1.9.0", 541 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", 542 | "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" 543 | }, 544 | "is-bluebird": { 545 | "version": "1.0.2", 546 | "resolved": "https://registry.npmjs.org/is-bluebird/-/is-bluebird-1.0.2.tgz", 547 | "integrity": "sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=" 548 | }, 549 | "is-fullwidth-code-point": { 550 | "version": "2.0.0", 551 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 552 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 553 | }, 554 | "is-promise": { 555 | "version": "2.1.0", 556 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 557 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 558 | }, 559 | "is-property": { 560 | "version": "1.0.2", 561 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 562 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" 563 | }, 564 | "is-stream": { 565 | "version": "1.1.0", 566 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 567 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 568 | }, 569 | "isexe": { 570 | "version": "2.0.0", 571 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 572 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 573 | }, 574 | "js-beautify": { 575 | "version": "1.9.1", 576 | "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.9.1.tgz", 577 | "integrity": "sha512-oxxvVZdOdUfzk8IOLBF2XUZvl2GoBEfA+b0of4u2EBY/46NlXasi8JdFvazA5lCrf9/lQhTjyVy2QCUW7iq0MQ==", 578 | "requires": { 579 | "config-chain": "1.1.12", 580 | "editorconfig": "0.15.3", 581 | "glob": "7.1.3", 582 | "mkdirp": "0.5.1", 583 | "nopt": "4.0.1" 584 | } 585 | }, 586 | "jsonfile": { 587 | "version": "4.0.0", 588 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 589 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 590 | "requires": { 591 | "graceful-fs": "4.1.15" 592 | } 593 | }, 594 | "lcid": { 595 | "version": "2.0.0", 596 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", 597 | "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", 598 | "requires": { 599 | "invert-kv": "2.0.0" 600 | } 601 | }, 602 | "locate-path": { 603 | "version": "3.0.0", 604 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 605 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 606 | "requires": { 607 | "p-locate": "3.0.0", 608 | "path-exists": "3.0.0" 609 | } 610 | }, 611 | "lodash": { 612 | "version": "4.17.11", 613 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 614 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" 615 | }, 616 | "long": { 617 | "version": "4.0.0", 618 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 619 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 620 | }, 621 | "lru-cache": { 622 | "version": "4.1.5", 623 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 624 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 625 | "requires": { 626 | "pseudomap": "1.0.2", 627 | "yallist": "2.1.2" 628 | } 629 | }, 630 | "lru-queue": { 631 | "version": "0.1.0", 632 | "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", 633 | "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", 634 | "requires": { 635 | "es5-ext": "0.10.49" 636 | } 637 | }, 638 | "map-age-cleaner": { 639 | "version": "0.1.3", 640 | "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", 641 | "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", 642 | "requires": { 643 | "p-defer": "1.0.0" 644 | } 645 | }, 646 | "media-typer": { 647 | "version": "0.3.0", 648 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 649 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 650 | }, 651 | "mem": { 652 | "version": "4.3.0", 653 | "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", 654 | "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", 655 | "requires": { 656 | "map-age-cleaner": "0.1.3", 657 | "mimic-fn": "2.1.0", 658 | "p-is-promise": "2.1.0" 659 | } 660 | }, 661 | "memoizee": { 662 | "version": "0.4.14", 663 | "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz", 664 | "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==", 665 | "requires": { 666 | "d": "1.0.0", 667 | "es5-ext": "0.10.49", 668 | "es6-weak-map": "2.0.2", 669 | "event-emitter": "0.3.5", 670 | "is-promise": "2.1.0", 671 | "lru-queue": "0.1.0", 672 | "next-tick": "1.0.0", 673 | "timers-ext": "0.1.7" 674 | } 675 | }, 676 | "merge-descriptors": { 677 | "version": "1.0.1", 678 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 679 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 680 | }, 681 | "methods": { 682 | "version": "1.1.2", 683 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 684 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 685 | }, 686 | "mime": { 687 | "version": "1.4.1", 688 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 689 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 690 | }, 691 | "mime-db": { 692 | "version": "1.40.0", 693 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 694 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" 695 | }, 696 | "mime-types": { 697 | "version": "2.1.24", 698 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 699 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 700 | "requires": { 701 | "mime-db": "1.40.0" 702 | } 703 | }, 704 | "mimic-fn": { 705 | "version": "2.1.0", 706 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 707 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" 708 | }, 709 | "minimatch": { 710 | "version": "3.0.4", 711 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 712 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 713 | "requires": { 714 | "brace-expansion": "1.1.11" 715 | } 716 | }, 717 | "minimist": { 718 | "version": "0.0.8", 719 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 720 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 721 | }, 722 | "mkdirp": { 723 | "version": "0.5.1", 724 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 725 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 726 | "requires": { 727 | "minimist": "0.0.8" 728 | } 729 | }, 730 | "moment": { 731 | "version": "2.24.0", 732 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", 733 | "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" 734 | }, 735 | "moment-timezone": { 736 | "version": "0.5.25", 737 | "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.25.tgz", 738 | "integrity": "sha512-DgEaTyN/z0HFaVcVbSyVCUU6HeFdnNC3vE4c9cgu2dgMTvjBUBdBzWfasTBmAW45u5OIMeCJtU8yNjM22DHucw==", 739 | "requires": { 740 | "moment": "2.24.0" 741 | } 742 | }, 743 | "morgan": { 744 | "version": "1.9.1", 745 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", 746 | "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", 747 | "requires": { 748 | "basic-auth": "2.0.1", 749 | "debug": "2.6.9", 750 | "depd": "1.1.2", 751 | "on-finished": "2.3.0", 752 | "on-headers": "1.0.2" 753 | } 754 | }, 755 | "ms": { 756 | "version": "2.0.0", 757 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 758 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 759 | }, 760 | "mysql2": { 761 | "version": "1.6.5", 762 | "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-1.6.5.tgz", 763 | "integrity": "sha512-zedaOOyb3msuuZcJJnxIX/EGOpmljDG7B+UevRH5lqcv+yhy9eCwkArBz8/AO+/rlY3/oCsOdG8R5oD6k0hNfg==", 764 | "requires": { 765 | "denque": "1.4.1", 766 | "generate-function": "2.3.1", 767 | "iconv-lite": "0.4.24", 768 | "long": "4.0.0", 769 | "lru-cache": "4.1.5", 770 | "named-placeholders": "1.1.2", 771 | "seq-queue": "0.0.5", 772 | "sqlstring": "2.3.1" 773 | }, 774 | "dependencies": { 775 | "iconv-lite": { 776 | "version": "0.4.24", 777 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 778 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 779 | "requires": { 780 | "safer-buffer": "2.1.2" 781 | } 782 | } 783 | } 784 | }, 785 | "named-placeholders": { 786 | "version": "1.1.2", 787 | "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", 788 | "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", 789 | "requires": { 790 | "lru-cache": "4.1.5" 791 | } 792 | }, 793 | "negotiator": { 794 | "version": "0.6.1", 795 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 796 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 797 | }, 798 | "next-tick": { 799 | "version": "1.0.0", 800 | "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", 801 | "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" 802 | }, 803 | "nice-try": { 804 | "version": "1.0.5", 805 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 806 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" 807 | }, 808 | "nopt": { 809 | "version": "4.0.1", 810 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", 811 | "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", 812 | "requires": { 813 | "abbrev": "1.1.1", 814 | "osenv": "0.1.5" 815 | } 816 | }, 817 | "npm-run-path": { 818 | "version": "2.0.2", 819 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 820 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 821 | "requires": { 822 | "path-key": "2.0.1" 823 | } 824 | }, 825 | "number-is-nan": { 826 | "version": "1.0.1", 827 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 828 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 829 | }, 830 | "on-finished": { 831 | "version": "2.3.0", 832 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 833 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 834 | "requires": { 835 | "ee-first": "1.1.1" 836 | } 837 | }, 838 | "on-headers": { 839 | "version": "1.0.2", 840 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", 841 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" 842 | }, 843 | "once": { 844 | "version": "1.4.0", 845 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 846 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 847 | "requires": { 848 | "wrappy": "1.0.2" 849 | } 850 | }, 851 | "os-homedir": { 852 | "version": "1.0.2", 853 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 854 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" 855 | }, 856 | "os-locale": { 857 | "version": "3.1.0", 858 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", 859 | "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", 860 | "requires": { 861 | "execa": "1.0.0", 862 | "lcid": "2.0.0", 863 | "mem": "4.3.0" 864 | } 865 | }, 866 | "os-tmpdir": { 867 | "version": "1.0.2", 868 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 869 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 870 | }, 871 | "osenv": { 872 | "version": "0.1.5", 873 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 874 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 875 | "requires": { 876 | "os-homedir": "1.0.2", 877 | "os-tmpdir": "1.0.2" 878 | } 879 | }, 880 | "p-defer": { 881 | "version": "1.0.0", 882 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", 883 | "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" 884 | }, 885 | "p-finally": { 886 | "version": "1.0.0", 887 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 888 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 889 | }, 890 | "p-is-promise": { 891 | "version": "2.1.0", 892 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", 893 | "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" 894 | }, 895 | "p-limit": { 896 | "version": "2.2.0", 897 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", 898 | "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", 899 | "requires": { 900 | "p-try": "2.2.0" 901 | } 902 | }, 903 | "p-locate": { 904 | "version": "3.0.0", 905 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 906 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 907 | "requires": { 908 | "p-limit": "2.2.0" 909 | } 910 | }, 911 | "p-try": { 912 | "version": "2.2.0", 913 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 914 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 915 | }, 916 | "parseurl": { 917 | "version": "1.3.3", 918 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 919 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 920 | }, 921 | "path-exists": { 922 | "version": "3.0.0", 923 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 924 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 925 | }, 926 | "path-is-absolute": { 927 | "version": "1.0.1", 928 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 929 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 930 | }, 931 | "path-key": { 932 | "version": "2.0.1", 933 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 934 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 935 | }, 936 | "path-parse": { 937 | "version": "1.0.6", 938 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 939 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 940 | }, 941 | "path-to-regexp": { 942 | "version": "0.1.7", 943 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 944 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 945 | }, 946 | "proto-list": { 947 | "version": "1.2.4", 948 | "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", 949 | "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" 950 | }, 951 | "proxy-addr": { 952 | "version": "2.0.5", 953 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", 954 | "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", 955 | "requires": { 956 | "forwarded": "0.1.2", 957 | "ipaddr.js": "1.9.0" 958 | } 959 | }, 960 | "pseudomap": { 961 | "version": "1.0.2", 962 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 963 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 964 | }, 965 | "pump": { 966 | "version": "3.0.0", 967 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 968 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 969 | "requires": { 970 | "end-of-stream": "1.4.1", 971 | "once": "1.4.0" 972 | } 973 | }, 974 | "qs": { 975 | "version": "6.5.2", 976 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 977 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 978 | }, 979 | "range-parser": { 980 | "version": "1.2.0", 981 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 982 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 983 | }, 984 | "raw-body": { 985 | "version": "2.3.3", 986 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 987 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 988 | "requires": { 989 | "bytes": "3.0.0", 990 | "http-errors": "1.6.3", 991 | "iconv-lite": "0.4.23", 992 | "unpipe": "1.0.0" 993 | } 994 | }, 995 | "regenerator-runtime": { 996 | "version": "0.11.1", 997 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 998 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" 999 | }, 1000 | "require-directory": { 1001 | "version": "2.1.1", 1002 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1003 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 1004 | }, 1005 | "require-main-filename": { 1006 | "version": "1.0.1", 1007 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", 1008 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" 1009 | }, 1010 | "resolve": { 1011 | "version": "1.10.0", 1012 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", 1013 | "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", 1014 | "requires": { 1015 | "path-parse": "1.0.6" 1016 | } 1017 | }, 1018 | "retry-as-promised": { 1019 | "version": "3.2.0", 1020 | "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", 1021 | "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", 1022 | "requires": { 1023 | "any-promise": "1.3.0" 1024 | } 1025 | }, 1026 | "safe-buffer": { 1027 | "version": "5.1.2", 1028 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1029 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1030 | }, 1031 | "safer-buffer": { 1032 | "version": "2.1.2", 1033 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1034 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1035 | }, 1036 | "semver": { 1037 | "version": "5.7.0", 1038 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 1039 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" 1040 | }, 1041 | "send": { 1042 | "version": "0.16.2", 1043 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 1044 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 1045 | "requires": { 1046 | "debug": "2.6.9", 1047 | "depd": "1.1.2", 1048 | "destroy": "1.0.4", 1049 | "encodeurl": "1.0.2", 1050 | "escape-html": "1.0.3", 1051 | "etag": "1.8.1", 1052 | "fresh": "0.5.2", 1053 | "http-errors": "1.6.3", 1054 | "mime": "1.4.1", 1055 | "ms": "2.0.0", 1056 | "on-finished": "2.3.0", 1057 | "range-parser": "1.2.0", 1058 | "statuses": "1.4.0" 1059 | } 1060 | }, 1061 | "seq-queue": { 1062 | "version": "0.0.5", 1063 | "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", 1064 | "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" 1065 | }, 1066 | "sequelize": { 1067 | "version": "5.7.1", 1068 | "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-5.7.1.tgz", 1069 | "integrity": "sha512-l6aJCR1ac55f0mL0MLnw2/45n46MjWqX7ysh2z+gHF52LnXpeuY/gSEg4XSQixLgh8pR8KuaQEeYEtZl2NRSEA==", 1070 | "requires": { 1071 | "bluebird": "3.5.4", 1072 | "cls-bluebird": "2.1.0", 1073 | "debug": "4.1.1", 1074 | "dottie": "2.0.1", 1075 | "inflection": "1.12.0", 1076 | "lodash": "4.17.11", 1077 | "moment": "2.24.0", 1078 | "moment-timezone": "0.5.25", 1079 | "retry-as-promised": "3.2.0", 1080 | "semver": "5.7.0", 1081 | "sequelize-pool": "1.0.2", 1082 | "toposort-class": "1.0.1", 1083 | "uuid": "3.3.2", 1084 | "validator": "10.11.0", 1085 | "wkx": "0.4.6" 1086 | }, 1087 | "dependencies": { 1088 | "debug": { 1089 | "version": "4.1.1", 1090 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 1091 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 1092 | "requires": { 1093 | "ms": "2.1.1" 1094 | } 1095 | }, 1096 | "ms": { 1097 | "version": "2.1.1", 1098 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1099 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1100 | } 1101 | } 1102 | }, 1103 | "sequelize-cli": { 1104 | "version": "5.4.0", 1105 | "resolved": "https://registry.npmjs.org/sequelize-cli/-/sequelize-cli-5.4.0.tgz", 1106 | "integrity": "sha512-4Gvl0yH0T3hhSdiiOci3+IKIfVG9x2os0hGWsbfa8QuyGgk9mZOqgTBnSCRtuxsdAyzUix9kfcTnfNolVNtprg==", 1107 | "requires": { 1108 | "bluebird": "3.5.4", 1109 | "cli-color": "1.4.0", 1110 | "fs-extra": "7.0.1", 1111 | "js-beautify": "1.9.1", 1112 | "lodash": "4.17.11", 1113 | "resolve": "1.10.0", 1114 | "umzug": "2.2.0", 1115 | "yargs": "12.0.5" 1116 | } 1117 | }, 1118 | "sequelize-pool": { 1119 | "version": "1.0.2", 1120 | "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-1.0.2.tgz", 1121 | "integrity": "sha512-VMKl/gCCdIvB1gFZ7p+oqLFEyZEz3oMMYjkKvfEC7GoO9bBcxmfOOU9RdkoltfXGgBZFigSChihRly2gKtsh2w==", 1122 | "requires": { 1123 | "bluebird": "3.5.4" 1124 | } 1125 | }, 1126 | "serve-static": { 1127 | "version": "1.13.2", 1128 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 1129 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 1130 | "requires": { 1131 | "encodeurl": "1.0.2", 1132 | "escape-html": "1.0.3", 1133 | "parseurl": "1.3.3", 1134 | "send": "0.16.2" 1135 | } 1136 | }, 1137 | "serverless-http": { 1138 | "version": "2.0.1", 1139 | "resolved": "https://registry.npmjs.org/serverless-http/-/serverless-http-2.0.1.tgz", 1140 | "integrity": "sha512-ROGjIuEOtgGCmCuVxuCaVrmSmVsISxS4YdKae5AZqPlznLQnQkrUwwemNF0+QA/eEi9XSM3fDUlv4TSNhVJItQ==", 1141 | "requires": { 1142 | "@types/aws-lambda": "8.10.24", 1143 | "chai-as-promised": "7.1.1" 1144 | } 1145 | }, 1146 | "set-blocking": { 1147 | "version": "2.0.0", 1148 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1149 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 1150 | }, 1151 | "setprototypeof": { 1152 | "version": "1.1.0", 1153 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 1154 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 1155 | }, 1156 | "shebang-command": { 1157 | "version": "1.2.0", 1158 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1159 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1160 | "requires": { 1161 | "shebang-regex": "1.0.0" 1162 | } 1163 | }, 1164 | "shebang-regex": { 1165 | "version": "1.0.0", 1166 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1167 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 1168 | }, 1169 | "shimmer": { 1170 | "version": "1.2.1", 1171 | "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", 1172 | "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" 1173 | }, 1174 | "sigmund": { 1175 | "version": "1.0.1", 1176 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", 1177 | "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" 1178 | }, 1179 | "signal-exit": { 1180 | "version": "3.0.2", 1181 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1182 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 1183 | }, 1184 | "sqlstring": { 1185 | "version": "2.3.1", 1186 | "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", 1187 | "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" 1188 | }, 1189 | "statuses": { 1190 | "version": "1.4.0", 1191 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 1192 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 1193 | }, 1194 | "string-width": { 1195 | "version": "2.1.1", 1196 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1197 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1198 | "requires": { 1199 | "is-fullwidth-code-point": "2.0.0", 1200 | "strip-ansi": "4.0.0" 1201 | } 1202 | }, 1203 | "strip-ansi": { 1204 | "version": "4.0.0", 1205 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1206 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1207 | "requires": { 1208 | "ansi-regex": "3.0.0" 1209 | }, 1210 | "dependencies": { 1211 | "ansi-regex": { 1212 | "version": "3.0.0", 1213 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1214 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 1215 | } 1216 | } 1217 | }, 1218 | "strip-eof": { 1219 | "version": "1.0.0", 1220 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 1221 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 1222 | }, 1223 | "timers-ext": { 1224 | "version": "0.1.7", 1225 | "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", 1226 | "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", 1227 | "requires": { 1228 | "es5-ext": "0.10.49", 1229 | "next-tick": "1.0.0" 1230 | } 1231 | }, 1232 | "toposort-class": { 1233 | "version": "1.0.1", 1234 | "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", 1235 | "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" 1236 | }, 1237 | "type-is": { 1238 | "version": "1.6.16", 1239 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 1240 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 1241 | "requires": { 1242 | "media-typer": "0.3.0", 1243 | "mime-types": "2.1.24" 1244 | } 1245 | }, 1246 | "umzug": { 1247 | "version": "2.2.0", 1248 | "resolved": "https://registry.npmjs.org/umzug/-/umzug-2.2.0.tgz", 1249 | "integrity": "sha512-xZLW76ax70pND9bx3wqwb8zqkFGzZIK8dIHD9WdNy/CrNfjWcwQgQkGCuUqcuwEBvUm+g07z+qWvY+pxDmMEEw==", 1250 | "requires": { 1251 | "babel-runtime": "6.26.0", 1252 | "bluebird": "3.5.4" 1253 | } 1254 | }, 1255 | "universalify": { 1256 | "version": "0.1.2", 1257 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 1258 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" 1259 | }, 1260 | "unpipe": { 1261 | "version": "1.0.0", 1262 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1263 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1264 | }, 1265 | "utils-merge": { 1266 | "version": "1.0.1", 1267 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1268 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1269 | }, 1270 | "uuid": { 1271 | "version": "3.3.2", 1272 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 1273 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 1274 | }, 1275 | "validator": { 1276 | "version": "10.11.0", 1277 | "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", 1278 | "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" 1279 | }, 1280 | "vary": { 1281 | "version": "1.1.2", 1282 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1283 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1284 | }, 1285 | "which": { 1286 | "version": "1.3.1", 1287 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1288 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1289 | "requires": { 1290 | "isexe": "2.0.0" 1291 | } 1292 | }, 1293 | "which-module": { 1294 | "version": "2.0.0", 1295 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 1296 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 1297 | }, 1298 | "wkx": { 1299 | "version": "0.4.6", 1300 | "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.6.tgz", 1301 | "integrity": "sha512-LHxXlzRCYQXA9ZHgs8r7Gafh0gVOE8o3QmudM1PIkOdkXXjW7Thcl+gb2P2dRuKgW8cqkitCRZkkjtmWzpHi7A==", 1302 | "requires": { 1303 | "@types/node": "11.13.6" 1304 | } 1305 | }, 1306 | "wrap-ansi": { 1307 | "version": "2.1.0", 1308 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 1309 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 1310 | "requires": { 1311 | "string-width": "1.0.2", 1312 | "strip-ansi": "3.0.1" 1313 | }, 1314 | "dependencies": { 1315 | "is-fullwidth-code-point": { 1316 | "version": "1.0.0", 1317 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1318 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1319 | "requires": { 1320 | "number-is-nan": "1.0.1" 1321 | } 1322 | }, 1323 | "string-width": { 1324 | "version": "1.0.2", 1325 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1326 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1327 | "requires": { 1328 | "code-point-at": "1.1.0", 1329 | "is-fullwidth-code-point": "1.0.0", 1330 | "strip-ansi": "3.0.1" 1331 | } 1332 | }, 1333 | "strip-ansi": { 1334 | "version": "3.0.1", 1335 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1336 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1337 | "requires": { 1338 | "ansi-regex": "2.1.1" 1339 | } 1340 | } 1341 | } 1342 | }, 1343 | "wrappy": { 1344 | "version": "1.0.2", 1345 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1346 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1347 | }, 1348 | "y18n": { 1349 | "version": "4.0.0", 1350 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 1351 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" 1352 | }, 1353 | "yallist": { 1354 | "version": "2.1.2", 1355 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1356 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 1357 | }, 1358 | "yargs": { 1359 | "version": "12.0.5", 1360 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", 1361 | "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", 1362 | "requires": { 1363 | "cliui": "4.1.0", 1364 | "decamelize": "1.2.0", 1365 | "find-up": "3.0.0", 1366 | "get-caller-file": "1.0.3", 1367 | "os-locale": "3.1.0", 1368 | "require-directory": "2.1.1", 1369 | "require-main-filename": "1.0.1", 1370 | "set-blocking": "2.0.0", 1371 | "string-width": "2.1.1", 1372 | "which-module": "2.0.0", 1373 | "y18n": "4.0.0", 1374 | "yargs-parser": "11.1.1" 1375 | } 1376 | }, 1377 | "yargs-parser": { 1378 | "version": "11.1.1", 1379 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", 1380 | "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", 1381 | "requires": { 1382 | "camelcase": "5.3.1", 1383 | "decamelize": "1.2.0" 1384 | } 1385 | } 1386 | } 1387 | } 1388 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "serverless-node-simple-crud", 3 | "version": "1.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node app.js" 7 | }, 8 | "dependencies": { 9 | "body-parser": "^1.18.3", 10 | "cookie-parser": "~1.4.3", 11 | "debug": "~2.6.9", 12 | "express": "~4.16.0", 13 | "morgan": "~1.9.0", 14 | "mysql2": "^1.6.5", 15 | "sequelize": "^5.7.1", 16 | "sequelize-cli": "^5.4.0", 17 | "serverless-http": "^2.0.1" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /postman_collection/serverless-node-simple-crud.postman_collection.json: -------------------------------------------------------------------------------- 1 | { 2 | "info": { 3 | "_postman_id": "eac08e3c-b64a-41c9-ae48-af234d8b020c", 4 | "name": "Serverless Exampe Lambda", 5 | "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" 6 | }, 7 | "item": [ 8 | { 9 | "name": "Get Users", 10 | "request": { 11 | "method": "GET", 12 | "header": [ 13 | { 14 | "key": "x-api-key", 15 | "value": "" 16 | } 17 | ], 18 | "body": { 19 | "mode": "raw", 20 | "raw": "" 21 | }, 22 | "url": { 23 | "raw": "/users", 24 | "host": [ 25 | "" 26 | ], 27 | "path": [ 28 | "users" 29 | ] 30 | } 31 | }, 32 | "response": [] 33 | }, 34 | { 35 | "name": "Create Users", 36 | "request": { 37 | "method": "POST", 38 | "header": [ 39 | { 40 | "key": "Content-Type", 41 | "value": "application/json" 42 | }, 43 | { 44 | "key": "x-api-key", 45 | "value": "" 46 | } 47 | ], 48 | "body": { 49 | "mode": "raw", 50 | "raw": "{\n\t\"firstName\":\"Vikas\",\n \"lastName\": \"Patidar\",\n \"address\": \"Indore MP\",\n \"contact\": 1234567\n}" 51 | }, 52 | "url": { 53 | "raw": "/users", 54 | "host": [ 55 | "" 56 | ], 57 | "path": [ 58 | "users" 59 | ], 60 | "query": [ 61 | { 62 | "key": "", 63 | "value": "", 64 | "disabled": true 65 | } 66 | ] 67 | } 68 | }, 69 | "response": [] 70 | }, 71 | { 72 | "name": "Update User", 73 | "request": { 74 | "method": "PUT", 75 | "header": [ 76 | { 77 | "key": "Content-Type", 78 | "value": "application/json" 79 | }, 80 | { 81 | "key": "x-api-key", 82 | "value": "" 83 | } 84 | ], 85 | "body": { 86 | "mode": "raw", 87 | "raw": "{\n\t\"firstName\":\"Manu\",\n \"lastName\": \"Patel\",\n \"address\": \"Neemuch MP\",\n \"contact\": 1234567890\n}" 88 | }, 89 | "url": { 90 | "raw": "/users/6", 91 | "host": [ 92 | "" 93 | ], 94 | "path": [ 95 | "users", 96 | "6" 97 | ] 98 | } 99 | }, 100 | "response": [] 101 | }, 102 | { 103 | "name": "Get User Details", 104 | "request": { 105 | "method": "GET", 106 | "header": [ 107 | { 108 | "key": "Content-Type", 109 | "value": "application/json" 110 | }, 111 | { 112 | "key": "x-api-key", 113 | "value": "" 114 | } 115 | ], 116 | "body": { 117 | "mode": "raw", 118 | "raw": "" 119 | }, 120 | "url": { 121 | "raw": "/users/5", 122 | "host": [ 123 | "" 124 | ], 125 | "path": [ 126 | "users", 127 | "5" 128 | ] 129 | } 130 | }, 131 | "response": [] 132 | }, 133 | { 134 | "name": "Delete User", 135 | "request": { 136 | "method": "DELETE", 137 | "header": [ 138 | { 139 | "key": "Content-Type", 140 | "value": "application/json" 141 | }, 142 | { 143 | "key": "x-api-key", 144 | "value": "" 145 | } 146 | ], 147 | "body": { 148 | "mode": "raw", 149 | "raw": "" 150 | }, 151 | "url": { 152 | "raw": "/users/7", 153 | "host": [ 154 | "" 155 | ], 156 | "path": [ 157 | "users", 158 | "7" 159 | ] 160 | } 161 | }, 162 | "response": [] 163 | } 164 | ] 165 | } -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Express 5 | 6 | 7 | 8 | 9 |

ServerLess Example

10 |

Welcome to serverless demo

11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /serverless.yml: -------------------------------------------------------------------------------- 1 | # serverless.yml 2 | #test 3 | service: crud-demo 4 | 5 | provider: 6 | name: aws 7 | apiKeys: 8 | - ${env:MY_API_KEY} 9 | usagePlan: 10 | quota: 11 | limit: 50 #The maximum number of requests that can be made in a given time period. 12 | offset: 2 #The number of requests subtracted from the given limit in the initial time period. 13 | period: MONTH #The time period in which the limit applies. Valid values are "DAY", "WEEK" or "MONTH". 14 | throttle: 15 | burstLimit: 10 #The maximum API request rate limit over a time ranging from one to a few seconds. The maximum API request rate limit depends on whether the underlying token bucket is at its full capacity. 16 | rateLimit: 10 #The API request steady-state rate limit (average requests per second over an extended period of time) 17 | runtime: nodejs8.10 18 | stage: dev 19 | region: ap-south-1 20 | 21 | vpc: 22 | securityGroupIds: 23 | - "" 24 | subnetIds: 25 | - "" 26 | 27 | functions: 28 | app: 29 | handler: app.handler # reference the file and exported method 30 | CodeUri: ./ 31 | events: # this is an API Gateway HTTP event trigger 32 | - http: 33 | path: / 34 | method: ANY 35 | cors: true 36 | private: true 37 | - http: # all routes get proxied to the Express router 38 | path: /{proxy+} 39 | method: ANY 40 | cors: true 41 | private: true 42 | 43 | -------------------------------------------------------------------------------- /src/controller/home.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Show home page. 5 | */ 6 | exports.homePage = async (req, res) => { 7 | return res.render('index', { title: 'Server Less Example' }); 8 | } 9 | -------------------------------------------------------------------------------- /src/controller/user.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var User = require('../database/user'); 3 | 4 | /** 5 | * Get Users details from database. 6 | * @param {Object} req request object 7 | * @param {Object} res response object 8 | */ 9 | exports.getUsers = async (req, res) => { 10 | try { 11 | let results = await User.getAllUsers(); 12 | if (results && results.length) { 13 | return res.status(200).json(results); 14 | } else { 15 | return res.status(204).json(); 16 | } 17 | } catch (error) { 18 | console.log('Error while getting users', error); 19 | return res.status(500).json({ 20 | message: error.message 21 | }); 22 | } 23 | } 24 | 25 | /** 26 | * Create user and save data in database. 27 | * @param {Object} req request object 28 | * @param {Object} res response object 29 | */ 30 | exports.createUser = async (req, res) => { 31 | try { 32 | await User.saveUser(req.body); 33 | return res.status(201).json(); 34 | } catch (error) { 35 | console.log('Error while creating user', error); 36 | return res.status(500).json({ 37 | message: error.message 38 | }); 39 | } 40 | } 41 | 42 | /** 43 | * Update user details 44 | * @param {Object} req request object 45 | * @param {Object} res response object 46 | */ 47 | exports.updateUser = async (req, res) => { 48 | try { 49 | let data = req.body; 50 | let filter = { 51 | id: req.params.userId 52 | } 53 | let result = await User.updateUserDetails(filter, data); 54 | if (result && result.length && result[0]) { 55 | return res.status(201).json(); 56 | } else { 57 | return res.status(204).json(); 58 | } 59 | } catch (error) { 60 | console.log('Error while updating user', error); 61 | return res.status(500).json({ 62 | message: error.message 63 | }); 64 | } 65 | } 66 | 67 | /** 68 | * Controller get user details based on userid. 69 | * @param {Object} req request object 70 | * @param {Object} res response object 71 | */ 72 | exports.getUserDetails = async (req, res) => { 73 | try { 74 | let filter = { 75 | id: req.params.userId 76 | } 77 | let details = await User.getUser(filter); 78 | if (details) { 79 | return res.status(200).json(details); 80 | } else { 81 | return res.status(204).json(); 82 | } 83 | } catch (error) { 84 | console.log('Error while getting user details', error); 85 | return res.status(500).json({ 86 | message: error.message 87 | }); 88 | } 89 | } 90 | 91 | /** 92 | * Delete user information. 93 | * @param {Object} req request object 94 | * @param {Object} res response object 95 | */ 96 | exports.deleteUser = async (req, res) => { 97 | try { 98 | let filter = { 99 | id: req.params.userId 100 | } 101 | let result = await User.deleteUser(filter); 102 | if (result) { 103 | return res.status(204).json(); 104 | } else { 105 | return res.status(404).json(); 106 | } 107 | } catch (error) { 108 | console.log('Error while deleting user', error); 109 | return res.status(500).json({ 110 | message: error.message 111 | }); 112 | } 113 | } -------------------------------------------------------------------------------- /src/database/user.js: -------------------------------------------------------------------------------- 1 | 'use-strict' 2 | 3 | var User = require('../../models').User; 4 | 5 | /** 6 | * Function get all the users from database based on the filter. 7 | * @param {Object} filter={} Json object contains filter data. 8 | */ 9 | exports.getAllUsers = async (filter = {}) => { 10 | try { 11 | let result = await User.findAll({ 12 | where: filter 13 | }); 14 | return Promise.resolve(result); 15 | } catch (error) { 16 | console.log('Error while getting users from database', error); 17 | return Promise.reject(error); 18 | } 19 | } 20 | 21 | /** 22 | * Function get user details from database based on the filter provided. 23 | * @param {Object} filter Json object contains filter data. 24 | */ 25 | exports.getUser = async (filter = {}) => { 26 | try { 27 | let details = await User.findOne({ 28 | where: filter 29 | }); 30 | return Promise.resolve(details); 31 | } catch (error) { 32 | console.log('Error while getting user details from database', error); 33 | return Promise.reject(error); 34 | } 35 | } 36 | 37 | /** 38 | * Function save user information in database. 39 | * @param {Object} bodyData Json object contains user data. 40 | */ 41 | exports.saveUser = async (bodyData) => { 42 | try { 43 | await User.create(bodyData); 44 | return Promise.resolve(); 45 | } catch (error) { 46 | console.log('Error while saving user in database', error); 47 | return Promise.reject(error); 48 | } 49 | } 50 | 51 | /** 52 | * Function update user based on the filter provided. 53 | * @param {Object} filter Json object contains filter data. 54 | * @param {Object} bodyData Json object contains data which need to update. 55 | */ 56 | exports.updateUserDetails = async (filter, bodyData) => { 57 | try { 58 | let result = await User.update(bodyData, { 59 | where: filter 60 | }); 61 | return Promise.resolve(result); 62 | } catch (error) { 63 | console.log('Error while updating user information in database', error); 64 | return Promise.reject(error); 65 | } 66 | } 67 | 68 | /** 69 | * Function delete user from database based on filter. 70 | * @param {} filter Json object contains filter data. 71 | */ 72 | exports.deleteUser = async (filter) => { 73 | try { 74 | let result = await User.destroy({ 75 | where: filter 76 | }); 77 | return Promise.resolve(result); 78 | } catch (error) { 79 | console.log('Error while updating user information in database', error); 80 | return Promise.reject(error); 81 | } 82 | } -------------------------------------------------------------------------------- /src/routes/home.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var express = require('express'); 3 | var router = express.Router(); 4 | var controller = require('../controller/home'); 5 | 6 | router.get('/', controller.homePage); 7 | 8 | module.exports = (app) => { 9 | app.use('/', router); 10 | } 11 | -------------------------------------------------------------------------------- /src/routes/users.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var express = require('express'); 3 | var router = express.Router(); 4 | var userController = require('../controller/user'); 5 | 6 | router.post('/', userController.createUser); 7 | 8 | router.get('/', userController.getUsers); 9 | 10 | router.put('/:userId', userController.updateUser); 11 | 12 | router.get('/:userId', userController.getUserDetails); 13 | 14 | router.delete('/:userId', userController.deleteUser); 15 | 16 | 17 | module.exports = (app) => { 18 | app.use('/users', router); 19 | } -------------------------------------------------------------------------------- /src/utils/constants.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | exports.constants = { 3 | 4 | }; 5 | --------------------------------------------------------------------------------