diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8744d82 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +# Created by .ignore support plugin (hsz.mobi) +node_modules/ +.idea/ +npm-debug.log* diff --git a/README.md b/README.md new file mode 100644 index 0000000..f833723 --- /dev/null +++ b/README.md @@ -0,0 +1,57 @@ +#Image Upload Service +This Image Upload Service uploads a given image of type jpeg/png with a description to AWS S3 and stores the image metadata to AWS MySQL RDS. The service is extendable to support Db migration as well. It handles all the edge cases and failures and displays user friendly message to the end user. +The service also handles logical inconsistency where it first tries to upload the image to S3, if it is successfully uploaded then it tries to insert the data into RDS. If RDS operation fails, then the uploaded image is deleted from S3 and user is notified that the upload was unsuccessful. +The backend is written in Javascript. + +##System Dependencies +Ensure following dependencies are present before installing the application. +1. ```AWS S3``` bucket for storing the images. Ensure that ```access key``` provided to the application has the permission to do ```PutObject``` and ```DeleteObject``` commands on the bucket. +2. ```AWS Mysql RDS``` version 5.x or later. Ensure that username and password combination provided to the application has access to connect to the RDS and do create, drop & insert query on it. + +##Installation of service + +###Local environment +1. Make sure ```node 8.x or higher``` and ```npm 6.x``` is installed. +2. Find ```deployConfig.js``` file inside ```config``` folder and put the bucket name and RDS host in ```dev``` config. Rest details need not be changed. + ``` + awsBucketName: + mysqlDbConfig: { + host: + port: + } + ``` +3. Find ```aws-credentials``` file in the project directory and put the following fields in under ```image-upload-service-dev``` tag. The fields are self-explanatory. + ``` + aws_access_key_id = + aws_secret_access_key = + rds_image_db_user = + rds_image_db_password = + ``` +4. Checkout the Project directory in terminal and run ```npm install ```. +5. Run ```npm start``` after the npm packages are installed successfully. +6. The server will start and create the required database and table on its own in the provided ```AWS RDS```. +7. Open ```127.0.0.1``` in browser (The Latest Chrome version), and the application will be ready to use. +8. Application logs can be found inside ```logs``` folder. + +###Production environment +1. Make sure ```node 8.x or higher``` and ```npm 6.x``` is installed. +2. Find ```deployConfig.js``` file inside ```config``` folder and put the bucket name and RDS host in ```prod``` config. Rest details need not be changed. + ``` + awsBucketName: + mysqlDbConfig: { + host: + port: + } + ``` +3. Find ```aws-credentials``` file in the project directory and put the following fields in under ```image-upload-service-prod``` tag. The fields are self-explanatory. + ``` + aws_access_key_id = + aws_secret_access_key = + rds_image_db_user = + rds_image_db_password = + ``` +4. Checkout the Project directory in terminal and run ```npm install ```. +5. Export env variable using command ```export NODE_ENV=prod```. +6. Run ```npm start``` after the npm packages are installed successfully. +7. The server will start and create the required database and table on its own in the provided ```AWS RDS```. +8. Application logs can be found inside ```logs``` folder. diff --git a/app.js b/app.js new file mode 100644 index 0000000..018fdb0 --- /dev/null +++ b/app.js @@ -0,0 +1,62 @@ +var express = require('express'); +var path = require('path'); +var cookieParser = require('cookie-parser'); +var logger = require("./logger"); +var expressWinston = require('express-winston'); +var winston = require('winston'); +var projectEnv = require('./config/projectEnv').projectEnv; +var accessLogsfile = projectEnv.accessLogs.filename; + +var indexRouter = require('./routes/index'); + +var app = express(); + +var allowCrossDomain = function(req, res, next) { + res.header('Access-Control-Allow-Origin', '*'); + res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); + res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); + next(); +}; +app.use(allowCrossDomain); + +app.use(expressWinston.logger({ + transports: [ + new winston.transports.DailyRotateFile({ + name : 'tps-access-file', + datePattern: '.yyyy-MM-dd', + filename: accessLogsfile, + handleExceptions: true, + json: true, + colorize: false + }) + ], + meta: true, // optional: control whether you want to log the meta data about the request (default to true) + expressFormat: true, // Use the default Express/morgan request formatting, with the same colors. Enabling this will override any msg and colorStatus if true. Will only output colors on transports with colorize set to true + colorStatus: true // Color the status code, using the Express/morgan color palette (default green, 3XX cyan, 4XX yellow, 5XX red). Will not be recognized if expressFormat is true +})); + +// view engine setup +app.set('views', path.join(__dirname, 'views')); + +app.use(express.json({ limit: '1mb'})); +app.use(express.urlencoded({ extended: false, limit: '1mb'})); +app.use(cookieParser()); +app.use(express.static(path.join(__dirname, 'public'))); + +app.use('/', indexRouter); + +// error handler +app.use(function(err, req, res, next) { + var errorObj={}; + errorObj['err_name'] = "APP_FAILURE"; + errorObj['err_stk'] = err.stack; + logger.error(JSON.stringify(errorObj)); + if(err.message === 'request entity too large') { + res.status(400).send(err); + } else { + res.status(500).send(err); + res.end(); + } +}); + +module.exports = app; diff --git a/aws-credentials b/aws-credentials new file mode 100644 index 0000000..ddac990 --- /dev/null +++ b/aws-credentials @@ -0,0 +1,13 @@ +#aws credentials for dev environment +[image-upload-service-dev] +aws_access_key_id = +aws_secret_access_key = +rds_image_db_user = +rds_image_db_password = + +#aws credentials for prod environment +[image-upload-service-prod] +aws_access_key_id = +aws_secret_access_key = +rds_image_db_user = +rds_image_db_password = \ No newline at end of file diff --git a/bin/www b/bin/www new file mode 100755 index 0000000..3065a97 --- /dev/null +++ b/bin/www @@ -0,0 +1,96 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var Q = require('q'); +var app = require('../app'); +var debug = require('debug')('alerts-framework:server'); +var http = require('http'); +var projectEnv = require('../config/projectEnv').projectEnv; +const logger = require('../logger'); + +/** + * Get port from environment and store in Express. + */ + +var port = normalizePort(process.env.PORT || projectEnv.httpPort); +app.set('port', port); + +/** + * Create HTTP server. + */ + +var server = http.createServer(app); +var defer = Q.defer(); + +var startServer = function () { + server.listen(port); + server.on('error', onError); + server.on('listening', onListening); + return defer.promise; +}; + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + var port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; +} + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== 'listen') { + throw error; + } + + var bind = typeof port === 'string' + ? 'Pipe ' + port + : 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + logger.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + logger.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + var addr = server.address(); + var bind = typeof addr === 'string' + ? 'pipe ' + addr + : 'port ' + addr.port; + logger.info('Listening on ' + bind); + defer.resolve(); +} + +exports.startServer = startServer; diff --git a/config/deployConfig.js b/config/deployConfig.js new file mode 100644 index 0000000..32e9e85 --- /dev/null +++ b/config/deployConfig.js @@ -0,0 +1,49 @@ +exports.envConfig = { + "dev": { + logPath:'./logs/', + logs: { + transports: [ + {name: 'image-upload-service-error-file', level: 'error', filename: './logs/image-upload-service-error-logs.log'}, + {name: 'image-upload-service-info-file', level: 'info', filename: './logs/image-upload-service-info-logs.log'} + ], + console: true + }, + // Bucket name for dev environment + awsBucketName: '', + // AWS mysql RDS details for dev environment + mysqlDbConfig: { + host: '', + port: 3306, + database: 'imagesmetadatadbdev', + tableName: 'image_metadata', + }, + awsCredProfile: 'image-upload-service-dev', + awsCredFilePath: __dirname.replace(/config$/,'') + 'aws-credentials', + accessLogs: {filename: './logs/image-upload-service-access-logs.log'}, + httpPort: 80 + }, + + "prod": { + logPath:'./logs/', + logs: { + transports: [ + {name: 'image-upload-service-error-file', level: 'error', filename: './logs/image-upload-service-error-logs.log'}, + {name: 'image-upload-service-info-file', level: 'info', filename: './logs/image-upload-service-info-logs.log'} + ], + console: true + }, + // Bucket name for production setup + awsBucketName: '', + // AWS mysql RDS details for production + mysqlDbConfig: { + host: '', + port: 3306, + database: 'imagesmetadatadbprod', + tableName: 'image_metadata', + }, + awsCredProfile: 'image-upload-service-prod', + awsCredFilePath: __dirname.replace(/config$/,'') + 'aws-credentials', + accessLogs: {filename: './logs/image-upload-service-access-logs.log'}, + httpPort: 80 + }, +}; \ No newline at end of file diff --git a/config/projectEnv.js b/config/projectEnv.js new file mode 100644 index 0000000..e42052d --- /dev/null +++ b/config/projectEnv.js @@ -0,0 +1,12 @@ +var config = require('./deployConfig').envConfig; +var env = process.env.NODE_ENV; + +if(env == undefined){ + env = "dev" +} + +console.log("env :" + env); +var projectEnv = config[env]; + +exports.projectEnv = projectEnv; +exports.env = env; \ No newline at end of file diff --git a/image-upload-service.iml b/image-upload-service.iml new file mode 100644 index 0000000..80cc739 --- /dev/null +++ b/image-upload-service.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/init/init.js b/init/init.js new file mode 100644 index 0000000..4446265 --- /dev/null +++ b/init/init.js @@ -0,0 +1,79 @@ +const async = require('async'); +const Q = require('q'); +const logger = require('../logger'); +const server = require('../bin/www'); +const initDbConnection = require('../persistence/dbConnection'); +const initMysqlDbAndTables = require('./initMysqlDbAndTables'); + +const initFunctions = [ + {promiseMethod: initDbConnection}, + {promiseMethod: initMysqlDbAndTables}, + {promiseMethod: server.startServer} +]; + +const executePromises = function (params) { + const defer = Q.defer(); + try { + async.eachSeries(params.promiseArray, function (currentPromiseObj, callback) { + try { + params.logger.info({'msg':'inprocess',promiseMethod:currentPromiseObj.promiseMethod.name}); + if (currentPromiseObj.sync) { + currentPromiseObj.promiseMethod(currentPromiseObj.params); + params.logger.info({'msg':"success",promiseMethod:currentPromiseObj.promiseMethod.name}); + callback(); + } + else { + currentPromiseObj.promiseMethod(currentPromiseObj.params).then(function () { + params.logger.info({'msg':"success",promiseMethod:currentPromiseObj.promiseMethod.name}); + callback(); + }, function (err) { + params.logger.error({err_name:'PROMISE_METHOD_ERROR',promiseMethod:currentPromiseObj.promiseMethod.name,err_stk:err.stack}); + if(currentPromiseObj.skipErrors) + callback(); + else + callback(err); + }) + } + } + catch (ex) { + params.logger.error({err_name:'PROMISE_METHOD_EXCEPTION',promiseMethod:currentPromiseObj.promiseMethod.name,err_stk:ex.stack}); + if(currentPromiseObj.skipErrors) + callback(); + else + callback(ex); + } + }, function (err) { + if (err) { + params.logger.error({err_name:'PROMISE_ARRAY_ERROR',err_stk:err.stack}); + defer.reject(err); + } + else + defer.resolve(); + }) + } + catch (ex) { + params.logger.error({err_name:'PROMISE_ARRAY_EXCEPTION',err_stk:ex.stack}); + defer.reject(ex); + } + return defer.promise; +}; + +var init = function () { + try { + executePromises({ + promiseArray: initFunctions, + sequence: true, + logger: logger + }).then(function () { + logger.info({msg: 'INIT_SUCCESS'}); + logger.info({msg: 'Application running on http://127.0.0.1/'}); + }, function (err) { + logger.error({err_name: 'INIT_FAILURE', err_stk: err.stack}); + }); + } + catch (ex) { + logger.error({err_name: 'INIT_FAILURE', err_stk: ex.stack}); + } +}; + +init(); \ No newline at end of file diff --git a/init/initMysqlDbAndTables.js b/init/initMysqlDbAndTables.js new file mode 100644 index 0000000..c83a39a --- /dev/null +++ b/init/initMysqlDbAndTables.js @@ -0,0 +1,25 @@ +const geDbConnection = require('../persistence/dbConnection'); +const projectEnv = require('../config/projectEnv').projectEnv; + +const initMysqlDbAndTables = function () { + return geDbConnection().then(mysqlClient => { + return new Promise((resolve, reject) => { + mysqlClient.query( + 'CREATE DATABASE IF NOT EXISTS ' + projectEnv.mysqlDbConfig.database + ';\n'+ + 'use ' + projectEnv.mysqlDbConfig.database + ';\n' + + 'CREATE TABLE IF NOT EXISTS ' + projectEnv.mysqlDbConfig.tableName + + '(uuid char(36) not null, ' + + 'description varchar(100) not null, ' + + 'file_type varchar(5) not null, ' + + 'size_in_kb decimal(5,2) not null, ' + + 'PRIMARY KEY (uuid));', + function (error, results, fields) { + if (error) reject(error); + resolve(results); + } + ); + }); + }); +}; + +module.exports = initMysqlDbAndTables; \ No newline at end of file diff --git a/logger.js b/logger.js new file mode 100644 index 0000000..992cf52 --- /dev/null +++ b/logger.js @@ -0,0 +1,47 @@ +var winston = require('winston'); +winston.emitErrs = true; +var logger; +var projectEnv = require('./config/projectEnv').projectEnv; +var logs = projectEnv.logs.transports; +var boolConsole = projectEnv.logs.console; + +var addDefaultValue = function(transportObj) +{ + transportObj['datePattern']='.yyyy-MM-dd'; + transportObj['handleExceptions']=true; + transportObj['json']=true; + transportObj['maxFiles']=5; + transportObj['colorize']=false; +}; + +var populateTransportArray = function() { + var transportArray=[]; + for (var index in logs) { + var currentLog = logs[index]; + var transportObj = {}; + transportObj['name'] = currentLog['name']; + transportObj['level'] = currentLog['level']; + transportObj['filename'] = currentLog['filename']; + addDefaultValue(transportObj); + transportArray.push(new winston.transports.DailyRotateFile(transportObj)); + } + + console.log("boolConsole : "+ boolConsole); + + if(boolConsole != undefined) { + transportArray.push(new winston.transports.Console({ + level: 'debug', + handleExceptions: true, + json: false, + colorize: true + })) + } + return transportArray; +}; + +logger = new winston.Logger({ + transports: populateTransportArray(), + exitOnError: false +}); + +module.exports = logger; \ No newline at end of file diff --git a/logs/image-upload-service-access-logs.log.2020-10-07 b/logs/image-upload-service-access-logs.log.2020-10-07 new file mode 100644 index 0000000..ab6110a --- /dev/null +++ b/logs/image-upload-service-access-logs.log.2020-10-07 @@ -0,0 +1,29 @@ +{"req":{"url":"/","headers":{"host":"localhost:8000","connection":"keep-alive","cache-control":"max-age=0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff","if-none-match":"W/\"16fe-17500babf09\"","if-modified-since":"Wed, 07 Oct 2020 01:44:00 GMT"},"method":"GET","httpVersion":"1.1","originalUrl":"/","query":{}},"res":{"statusCode":304},"responseTime":4,"level":"info","message":"\u001b[90mGET /\u001b[39m \u001b[36m304\u001b[39m \u001b[90m4ms\u001b[39m","timestamp":"2020-10-07T06:34:09.170Z"} +{"req":{"url":"/uploadImage","headers":{"host":"localhost:8000","connection":"keep-alive","content-length":"111403","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","content-type":"application/json","accept":"*/*","origin":"http://localhost:8000","sec-fetch-site":"same-origin","sec-fetch-mode":"cors","sec-fetch-dest":"empty","referer":"http://localhost:8000/","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff"},"method":"POST","httpVersion":"1.1","originalUrl":"/uploadImage","query":{}},"res":{"statusCode":201},"responseTime":6378,"level":"info","message":"\u001b[90mPOST /uploadImage\u001b[39m \u001b[32m201\u001b[39m \u001b[90m6378ms\u001b[39m","timestamp":"2020-10-07T06:34:31.249Z"} +{"req":{"url":"/","headers":{"host":"localhost:8000","connection":"keep-alive","cache-control":"max-age=0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff","if-none-match":"W/\"16fe-17500babf09\"","if-modified-since":"Wed, 07 Oct 2020 01:44:00 GMT"},"method":"GET","httpVersion":"1.1","originalUrl":"/","query":{}},"res":{"statusCode":200},"responseTime":7,"level":"info","message":"\u001b[90mGET /\u001b[39m \u001b[32m200\u001b[39m \u001b[90m7ms\u001b[39m","timestamp":"2020-10-07T06:37:00.914Z"} +{"req":{"url":"/uploadImage","headers":{"host":"localhost:8000","connection":"keep-alive","content-length":"111403","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","content-type":"application/json","accept":"*/*","origin":"http://localhost:8000","sec-fetch-site":"same-origin","sec-fetch-mode":"cors","sec-fetch-dest":"empty","referer":"http://localhost:8000/","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff"},"method":"POST","httpVersion":"1.1","originalUrl":"/uploadImage","query":{}},"res":{"statusCode":201},"responseTime":6203,"level":"info","message":"\u001b[90mPOST /uploadImage\u001b[39m \u001b[32m201\u001b[39m \u001b[90m6203ms\u001b[39m","timestamp":"2020-10-07T06:37:14.220Z"} +{"req":{"url":"/","headers":{"host":"localhost:8000","connection":"keep-alive","cache-control":"max-age=0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff","if-none-match":"W/\"17af-17501c6d849\"","if-modified-since":"Wed, 07 Oct 2020 06:36:50 GMT"},"method":"GET","httpVersion":"1.1","originalUrl":"/","query":{}},"res":{"statusCode":200},"responseTime":6,"level":"info","message":"\u001b[90mGET /\u001b[39m \u001b[32m200\u001b[39m \u001b[90m6ms\u001b[39m","timestamp":"2020-10-07T06:37:53.361Z"} +{"req":{"url":"/uploadImage","headers":{"host":"localhost:8000","connection":"keep-alive","content-length":"111403","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","content-type":"application/json","accept":"*/*","origin":"http://localhost:8000","sec-fetch-site":"same-origin","sec-fetch-mode":"cors","sec-fetch-dest":"empty","referer":"http://localhost:8000/","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff"},"method":"POST","httpVersion":"1.1","originalUrl":"/uploadImage","query":{}},"res":{"statusCode":201},"responseTime":6613,"level":"info","message":"\u001b[90mPOST /uploadImage\u001b[39m \u001b[32m201\u001b[39m \u001b[90m6613ms\u001b[39m","timestamp":"2020-10-07T06:38:06.891Z"} +{"req":{"url":"/","headers":{"host":"localhost:8000","connection":"keep-alive","cache-control":"max-age=0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff","if-none-match":"W/\"175d-17501c7aa28\"","if-modified-since":"Wed, 07 Oct 2020 06:37:43 GMT"},"method":"GET","httpVersion":"1.1","originalUrl":"/","query":{}},"res":{"statusCode":200},"responseTime":6,"level":"info","message":"\u001b[90mGET /\u001b[39m \u001b[32m200\u001b[39m \u001b[90m6ms\u001b[39m","timestamp":"2020-10-07T06:39:17.951Z"} +{"req":{"url":"/","headers":{"host":"localhost:8000","connection":"keep-alive","cache-control":"max-age=0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff","if-none-match":"W/\"1785-17501c9021b\"","if-modified-since":"Wed, 07 Oct 2020 06:39:11 GMT"},"method":"GET","httpVersion":"1.1","originalUrl":"/","query":{}},"res":{"statusCode":304},"responseTime":1,"level":"info","message":"\u001b[90mGET /\u001b[39m \u001b[36m304\u001b[39m \u001b[90m1ms\u001b[39m","timestamp":"2020-10-07T06:39:33.520Z"} +{"req":{"url":"/","headers":{"host":"localhost:8000","connection":"keep-alive","cache-control":"max-age=0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff","if-none-match":"W/\"1785-17501c9021b\"","if-modified-since":"Wed, 07 Oct 2020 06:39:11 GMT"},"method":"GET","httpVersion":"1.1","originalUrl":"/","query":{}},"res":{"statusCode":200},"responseTime":8,"level":"info","message":"\u001b[90mGET /\u001b[39m \u001b[32m200\u001b[39m \u001b[90m8ms\u001b[39m","timestamp":"2020-10-07T06:45:10.994Z"} +{"req":{"url":"/uploadImage","headers":{"host":"localhost:8000","connection":"keep-alive","content-length":"111403","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","content-type":"application/json","accept":"*/*","origin":"http://localhost:8000","sec-fetch-site":"same-origin","sec-fetch-mode":"cors","sec-fetch-dest":"empty","referer":"http://localhost:8000/","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff"},"method":"POST","httpVersion":"1.1","originalUrl":"/uploadImage","query":{}},"res":{"statusCode":201},"responseTime":21008,"level":"info","message":"\u001b[90mPOST /uploadImage\u001b[39m \u001b[32m201\u001b[39m \u001b[90m21008ms\u001b[39m","timestamp":"2020-10-07T06:45:40.537Z"} +{"req":{"url":"/","headers":{"host":"localhost:8000","connection":"keep-alive","cache-control":"max-age=0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff","if-none-match":"W/\"187e-17501ce23e0\"","if-modified-since":"Wed, 07 Oct 2020 06:44:48 GMT"},"method":"GET","httpVersion":"1.1","originalUrl":"/","query":{}},"res":{"statusCode":200},"responseTime":6,"level":"info","message":"\u001b[90mGET /\u001b[39m \u001b[32m200\u001b[39m \u001b[90m6ms\u001b[39m","timestamp":"2020-10-07T06:46:39.813Z"} +{"req":{"url":"/","headers":{"host":"localhost:8000","connection":"keep-alive","cache-control":"max-age=0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff","if-none-match":"W/\"187a-17501cfb1e5\"","if-modified-since":"Wed, 07 Oct 2020 06:46:30 GMT"},"method":"GET","httpVersion":"1.1","originalUrl":"/","query":{}},"res":{"statusCode":200},"responseTime":6,"level":"info","message":"\u001b[90mGET /\u001b[39m \u001b[32m200\u001b[39m \u001b[90m6ms\u001b[39m","timestamp":"2020-10-07T06:48:01.581Z"} +{"req":{"url":"/uploadImage","headers":{"host":"localhost:8000","connection":"keep-alive","content-length":"111403","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","content-type":"application/json","accept":"*/*","origin":"http://localhost:8000","sec-fetch-site":"same-origin","sec-fetch-mode":"cors","sec-fetch-dest":"empty","referer":"http://localhost:8000/","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff"},"method":"POST","httpVersion":"1.1","originalUrl":"/uploadImage","query":{}},"res":{"statusCode":201},"responseTime":5266,"level":"info","message":"\u001b[90mPOST /uploadImage\u001b[39m \u001b[32m201\u001b[39m \u001b[90m5266ms\u001b[39m","timestamp":"2020-10-07T06:48:21.284Z"} +{"req":{"url":"/","headers":{"host":"localhost:8000","connection":"keep-alive","cache-control":"max-age=0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff","if-none-match":"W/\"1876-17501d101d7\"","if-modified-since":"Wed, 07 Oct 2020 06:47:56 GMT"},"method":"GET","httpVersion":"1.1","originalUrl":"/","query":{}},"res":{"statusCode":200},"responseTime":6,"level":"info","message":"\u001b[90mGET /\u001b[39m \u001b[32m200\u001b[39m \u001b[90m6ms\u001b[39m","timestamp":"2020-10-07T06:50:51.760Z"} +{"req":{"url":"/uploadImage","headers":{"host":"localhost:8000","connection":"keep-alive","content-length":"198898","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","content-type":"application/json","accept":"*/*","origin":"http://localhost:8000","sec-fetch-site":"same-origin","sec-fetch-mode":"cors","sec-fetch-dest":"empty","referer":"http://localhost:8000/","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff"},"method":"POST","httpVersion":"1.1","originalUrl":"/uploadImage","query":{}},"res":{"statusCode":201},"responseTime":8083,"level":"info","message":"\u001b[90mPOST /uploadImage\u001b[39m \u001b[32m201\u001b[39m \u001b[90m8083ms\u001b[39m","timestamp":"2020-10-07T06:51:05.267Z"} +{"req":{"url":"/","headers":{"host":"localhost:8000","connection":"keep-alive","cache-control":"max-age=0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff","if-none-match":"W/\"19ac-17501d38f2a\"","if-modified-since":"Wed, 07 Oct 2020 06:50:43 GMT"},"method":"GET","httpVersion":"1.1","originalUrl":"/","query":{}},"res":{"statusCode":304},"responseTime":4,"level":"info","message":"\u001b[90mGET /\u001b[39m \u001b[36m304\u001b[39m \u001b[90m4ms\u001b[39m","timestamp":"2020-10-07T06:52:13.177Z"} +{"req":{"url":"/uploadImage","headers":{"host":"localhost:8000","connection":"keep-alive","content-length":"111403","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","content-type":"application/json","accept":"*/*","origin":"http://localhost:8000","sec-fetch-site":"same-origin","sec-fetch-mode":"cors","sec-fetch-dest":"empty","referer":"http://localhost:8000/","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff"},"method":"POST","httpVersion":"1.1","originalUrl":"/uploadImage","query":{}},"res":{"statusCode":400},"responseTime":7416,"level":"info","message":"\u001b[90mPOST /uploadImage\u001b[39m \u001b[33m400\u001b[39m \u001b[90m7416ms\u001b[39m","timestamp":"2020-10-07T06:52:27.783Z"} +{"req":{"url":"/","headers":{"host":"localhost:8000","connection":"keep-alive","cache-control":"max-age=0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff","if-none-match":"W/\"19ac-17501d38f2a\"","if-modified-since":"Wed, 07 Oct 2020 06:50:43 GMT"},"method":"GET","httpVersion":"1.1","originalUrl":"/","query":{}},"res":{"statusCode":304},"responseTime":4,"level":"info","message":"\u001b[90mGET /\u001b[39m \u001b[36m304\u001b[39m \u001b[90m4ms\u001b[39m","timestamp":"2020-10-07T06:52:55.023Z"} +{"req":{"url":"/","headers":{"host":"localhost:8000","connection":"keep-alive","cache-control":"max-age=0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff","if-none-match":"W/\"19ac-17501d38f2a\"","if-modified-since":"Wed, 07 Oct 2020 06:50:43 GMT"},"method":"GET","httpVersion":"1.1","originalUrl":"/","query":{}},"res":{"statusCode":304},"responseTime":1,"level":"info","message":"\u001b[90mGET /\u001b[39m \u001b[36m304\u001b[39m \u001b[90m1ms\u001b[39m","timestamp":"2020-10-07T06:52:55.578Z"} +{"req":{"url":"/","headers":{"host":"localhost:8000","connection":"keep-alive","cache-control":"max-age=0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","cookie":"Idea-343fff8e=7eac5116-87ee-4b63-9e32-06f9883100dd; _xsrf=2|af35c455|cba6ab28eb85e3fdda78a32985d64aa1|1599643891; username-localhost-8888=\"2|1:0|10:1601023329|23:username-localhost-8888|44:M2NhZTY3NzY0MmZjNGFmY2E1NzFkMzYwNzY0ZmE3NzY=|0551d4eec46e6feb7f6dc33ce3edf2ae82377b116a0b227369d16f40f937888b\"; Idea-987928b8=342f0da1-1e37-4076-898c-24913ea090ff","if-none-match":"W/\"19ac-17501d38f2a\"","if-modified-since":"Wed, 07 Oct 2020 06:50:43 GMT"},"method":"GET","httpVersion":"1.1","originalUrl":"/","query":{}},"res":{"statusCode":304},"responseTime":1,"level":"info","message":"\u001b[90mGET /\u001b[39m \u001b[36m304\u001b[39m \u001b[90m1ms\u001b[39m","timestamp":"2020-10-07T06:52:55.885Z"} +{"req":{"url":"/","headers":{"host":"127.0.0.1:8000","connection":"keep-alive","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9"},"method":"GET","httpVersion":"1.1","originalUrl":"/","query":{}},"res":{"statusCode":200},"responseTime":8,"level":"info","message":"\u001b[90mGET /\u001b[39m \u001b[32m200\u001b[39m \u001b[90m8ms\u001b[39m","timestamp":"2020-10-07T06:59:40.082Z"} +{"req":{"url":"/favicon.ico","headers":{"host":"127.0.0.1:8000","connection":"keep-alive","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"image/avif,image/webp,image/apng,image/*,*/*;q=0.8","sec-fetch-site":"same-origin","sec-fetch-mode":"no-cors","sec-fetch-dest":"image","referer":"http://127.0.0.1:8000/","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9"},"method":"GET","httpVersion":"1.1","originalUrl":"/favicon.ico","query":{}},"res":{"statusCode":404},"responseTime":2,"level":"info","message":"\u001b[90mGET /favicon.ico\u001b[39m \u001b[33m404\u001b[39m \u001b[90m2ms\u001b[39m","timestamp":"2020-10-07T06:59:40.379Z"} +{"req":{"url":"/","headers":{"host":"127.0.0.1","connection":"keep-alive","cache-control":"max-age=0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9"},"method":"GET","httpVersion":"1.1","originalUrl":"/","query":{}},"res":{"statusCode":200},"responseTime":7,"level":"info","message":"\u001b[90mGET /\u001b[39m \u001b[32m200\u001b[39m \u001b[90m7ms\u001b[39m","timestamp":"2020-10-07T07:00:32.815Z"} +{"req":{"url":"/favicon.ico","headers":{"host":"127.0.0.1","connection":"keep-alive","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"image/avif,image/webp,image/apng,image/*,*/*;q=0.8","sec-fetch-site":"same-origin","sec-fetch-mode":"no-cors","sec-fetch-dest":"image","referer":"http://127.0.0.1/","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9"},"method":"GET","httpVersion":"1.1","originalUrl":"/favicon.ico","query":{}},"res":{"statusCode":404},"responseTime":1,"level":"info","message":"\u001b[90mGET /favicon.ico\u001b[39m \u001b[33m404\u001b[39m \u001b[90m1ms\u001b[39m","timestamp":"2020-10-07T07:00:33.080Z"} +{"req":{"url":"/","headers":{"host":"127.0.0.1","connection":"keep-alive","cache-control":"max-age=0","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","if-none-match":"W/\"19ac-17501d38f2a\"","if-modified-since":"Wed, 07 Oct 2020 06:50:43 GMT"},"method":"GET","httpVersion":"1.1","originalUrl":"/","query":{}},"res":{"statusCode":304},"responseTime":3,"level":"info","message":"\u001b[90mGET /\u001b[39m \u001b[36m304\u001b[39m \u001b[90m3ms\u001b[39m","timestamp":"2020-10-07T07:00:50.408Z"} +{"req":{"url":"/","headers":{"host":"127.0.0.1","connection":"keep-alive","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","if-none-match":"W/\"19ac-17501d38f2a\"","if-modified-since":"Wed, 07 Oct 2020 06:50:43 GMT"},"method":"GET","httpVersion":"1.1","originalUrl":"/","query":{}},"res":{"statusCode":304},"responseTime":3,"level":"info","message":"\u001b[90mGET /\u001b[39m \u001b[36m304\u001b[39m \u001b[90m3ms\u001b[39m","timestamp":"2020-10-07T09:14:56.835Z"} +{"req":{"url":"/uploadImage","headers":{"host":"127.0.0.1","connection":"keep-alive","content-length":"111403","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","content-type":"application/json","accept":"*/*","origin":"http://127.0.0.1","sec-fetch-site":"same-origin","sec-fetch-mode":"cors","sec-fetch-dest":"empty","referer":"http://127.0.0.1/","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9"},"method":"POST","httpVersion":"1.1","originalUrl":"/uploadImage","query":{}},"res":{"statusCode":201},"responseTime":19778,"level":"info","message":"\u001b[90mPOST /uploadImage\u001b[39m \u001b[32m201\u001b[39m \u001b[90m19778ms\u001b[39m","timestamp":"2020-10-07T09:15:24.604Z"} +{"req":{"url":"/","headers":{"host":"127.0.0.1","connection":"keep-alive","upgrade-insecure-requests":"1","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9","sec-fetch-site":"none","sec-fetch-mode":"navigate","sec-fetch-user":"?1","sec-fetch-dest":"document","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9","if-none-match":"W/\"19ac-17501d38f2a\"","if-modified-since":"Wed, 07 Oct 2020 06:50:43 GMT"},"method":"GET","httpVersion":"1.1","originalUrl":"/","query":{}},"res":{"statusCode":304},"responseTime":4,"level":"info","message":"\u001b[90mGET /\u001b[39m \u001b[36m304\u001b[39m \u001b[90m4ms\u001b[39m","timestamp":"2020-10-07T11:55:22.479Z"} +{"req":{"url":"/uploadImage","headers":{"host":"127.0.0.1","connection":"keep-alive","content-length":"198898","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36","content-type":"application/json","accept":"*/*","origin":"http://127.0.0.1","sec-fetch-site":"same-origin","sec-fetch-mode":"cors","sec-fetch-dest":"empty","referer":"http://127.0.0.1/","accept-encoding":"gzip, deflate, br","accept-language":"en-US,en;q=0.9"},"method":"POST","httpVersion":"1.1","originalUrl":"/uploadImage","query":{}},"res":{"statusCode":201},"responseTime":19694,"level":"info","message":"\u001b[90mPOST /uploadImage\u001b[39m \u001b[32m201\u001b[39m \u001b[90m19694ms\u001b[39m","timestamp":"2020-10-07T11:55:50.329Z"} diff --git a/logs/image-upload-service-error-logs.log.2020-10-07 b/logs/image-upload-service-error-logs.log.2020-10-07 new file mode 100644 index 0000000..d464293 --- /dev/null +++ b/logs/image-upload-service-error-logs.log.2020-10-07 @@ -0,0 +1,13 @@ +{"level":"error","message":"undefined","timestamp":"2020-10-07T06:52:25.752Z"} +{"level":"error","message":"BadRequestError: UPLOAD_FAILED\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/src/handlers/uploadImage.js:16:31\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","timestamp":"2020-10-07T06:52:27.781Z"} +{"level":"error","message":"Error: ER_BAD_DB_ERROR: Unknown database 'imagesmetadatadbdev'\n at Handshake.Sequence._packetToError (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)\n at Handshake.ErrorPacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Handshake.js:123:18)\n at Protocol._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:291:23)\n at Parser._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:433:10)\n at Parser.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:43:10)\n at Protocol.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:38:16)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:88:28)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:526:10)\n at Socket.emit (events.js:315:20)\n at addChunk (_stream_readable.js:295:12)\n --------------------\n at Protocol._enqueue (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:144:48)\n at Protocol.handshake (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:51:23)\n at Connection.connect (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:116:18)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:22:28\n at new Promise ()\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:21:20\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","timestamp":"2020-10-07T08:58:54.052Z"} +{"level":"error","message":"Error: ER_BAD_DB_ERROR: Unknown database 'imagesmetadatadbdev'\n at Handshake.Sequence._packetToError (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)\n at Handshake.ErrorPacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Handshake.js:123:18)\n at Protocol._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:291:23)\n at Parser._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:433:10)\n at Parser.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:43:10)\n at Protocol.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:38:16)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:88:28)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:526:10)\n at Socket.emit (events.js:315:20)\n at addChunk (_stream_readable.js:295:12)\n --------------------\n at Protocol._enqueue (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:144:48)\n at Protocol.handshake (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:51:23)\n at Connection.connect (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:116:18)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:22:28\n at new Promise ()\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:21:20\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","timestamp":"2020-10-07T08:58:55.352Z"} +{"err_name":"PROMISE_METHOD_ERROR","promiseMethod":"initMysqlDbAndTables","err_stk":"TypeError: Cannot read property 'query' of null\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:7:25\n at new Promise ()\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:6:16\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","level":"error","message":"","timestamp":"2020-10-07T08:58:55.356Z"} +{"err_name":"PROMISE_ARRAY_ERROR","err_stk":"TypeError: Cannot read property 'query' of null\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:7:25\n at new Promise ()\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:6:16\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","level":"error","message":"","timestamp":"2020-10-07T08:58:55.357Z"} +{"err_name":"INIT_FAILURE","err_stk":"TypeError: Cannot read property 'query' of null\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:7:25\n at new Promise ()\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:6:16\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","level":"error","message":"","timestamp":"2020-10-07T08:58:55.358Z"} +{"err_name":"PROMISE_METHOD_ERROR","promiseMethod":"initMysqlDbAndTables","err_stk":"Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'use imagesmetadatadbdev\nCREATE TABLE IF NOT EXISTS image_metadata(uuid char(36) ' at line 1\n at Query.Sequence._packetToError (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)\n at Query.ErrorPacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Query.js:79:18)\n at Protocol._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:291:23)\n at Parser._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:433:10)\n at Parser.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:43:10)\n at Protocol.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:38:16)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:88:28)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:526:10)\n at Socket.emit (events.js:315:20)\n at addChunk (_stream_readable.js:295:12)\n --------------------\n at Protocol._enqueue (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:144:48)\n at Connection.query (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:198:25)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:7:25\n at new Promise ()\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:6:16\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","level":"error","message":"","timestamp":"2020-10-07T09:12:21.689Z"} +{"err_name":"PROMISE_ARRAY_ERROR","err_stk":"Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'use imagesmetadatadbdev\nCREATE TABLE IF NOT EXISTS image_metadata(uuid char(36) ' at line 1\n at Query.Sequence._packetToError (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)\n at Query.ErrorPacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Query.js:79:18)\n at Protocol._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:291:23)\n at Parser._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:433:10)\n at Parser.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:43:10)\n at Protocol.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:38:16)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:88:28)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:526:10)\n at Socket.emit (events.js:315:20)\n at addChunk (_stream_readable.js:295:12)\n --------------------\n at Protocol._enqueue (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:144:48)\n at Connection.query (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:198:25)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:7:25\n at new Promise ()\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:6:16\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","level":"error","message":"","timestamp":"2020-10-07T09:12:21.698Z"} +{"err_name":"INIT_FAILURE","err_stk":"Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'use imagesmetadatadbdev\nCREATE TABLE IF NOT EXISTS image_metadata(uuid char(36) ' at line 1\n at Query.Sequence._packetToError (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)\n at Query.ErrorPacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Query.js:79:18)\n at Protocol._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:291:23)\n at Parser._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:433:10)\n at Parser.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:43:10)\n at Protocol.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:38:16)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:88:28)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:526:10)\n at Socket.emit (events.js:315:20)\n at addChunk (_stream_readable.js:295:12)\n --------------------\n at Protocol._enqueue (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:144:48)\n at Connection.query (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:198:25)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:7:25\n at new Promise ()\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:6:16\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","level":"error","message":"","timestamp":"2020-10-07T09:12:21.707Z"} +{"err_name":"PROMISE_METHOD_EXCEPTION","promiseMethod":"getDbConnection","err_stk":"Error: ENOENT: no such file or directory, open '/Users/shivam.tay/Desktop/Projects/image-upload-service/configaws-credentials'\n at Object.openSync (fs.js:458:3)\n at Object.readFileSync (fs.js:360:35)\n at getRDSCredentials (/Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:9:33)\n at Object.getDbConnection [as promiseMethod] (/Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:19:16)\n at params.logger.error.err_name (/Users/shivam.tay/Desktop/Projects/image-upload-service/init/init.js:26:39)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:2154:44\n at replenish (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:440:21)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:445:13\n at eachLimit$1 (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:2243:34)\n at awaitable (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:208:32)","level":"error","message":"","timestamp":"2020-10-07T09:55:04.470Z"} +{"err_name":"PROMISE_ARRAY_ERROR","err_stk":"Error: ENOENT: no such file or directory, open '/Users/shivam.tay/Desktop/Projects/image-upload-service/configaws-credentials'\n at Object.openSync (fs.js:458:3)\n at Object.readFileSync (fs.js:360:35)\n at getRDSCredentials (/Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:9:33)\n at Object.getDbConnection [as promiseMethod] (/Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:19:16)\n at params.logger.error.err_name (/Users/shivam.tay/Desktop/Projects/image-upload-service/init/init.js:26:39)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:2154:44\n at replenish (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:440:21)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:445:13\n at eachLimit$1 (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:2243:34)\n at awaitable (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:208:32)","level":"error","message":"","timestamp":"2020-10-07T09:55:04.470Z"} +{"err_name":"INIT_FAILURE","err_stk":"Error: ENOENT: no such file or directory, open '/Users/shivam.tay/Desktop/Projects/image-upload-service/configaws-credentials'\n at Object.openSync (fs.js:458:3)\n at Object.readFileSync (fs.js:360:35)\n at getRDSCredentials (/Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:9:33)\n at Object.getDbConnection [as promiseMethod] (/Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:19:16)\n at params.logger.error.err_name (/Users/shivam.tay/Desktop/Projects/image-upload-service/init/init.js:26:39)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:2154:44\n at replenish (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:440:21)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:445:13\n at eachLimit$1 (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:2243:34)\n at awaitable (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:208:32)","level":"error","message":"","timestamp":"2020-10-07T09:55:04.477Z"} diff --git a/logs/image-upload-service-info-logs.log.2020-10-07 b/logs/image-upload-service-info-logs.log.2020-10-07 new file mode 100644 index 0000000..07d3d69 --- /dev/null +++ b/logs/image-upload-service-info-logs.log.2020-10-07 @@ -0,0 +1,233 @@ +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:31:13.761Z"} +{"level":"info","message":"Listening on port 8000","timestamp":"2020-10-07T06:31:13.765Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:31:13.765Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T06:31:13.765Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:34:02.239Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:34:03.699Z"} +{"msg":"inprocess","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:34:03.699Z"} +{"msg":"success","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:34:04.015Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:34:04.016Z"} +{"level":"info","message":"Listening on port 8000","timestamp":"2020-10-07T06:34:04.018Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:34:04.018Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T06:34:04.019Z"} +{"level":"info","message":"imageType: jpeg","timestamp":"2020-10-07T06:34:25.250Z"} +{"level":"info","message":"imageSizeInKB: 83.51846077293085","timestamp":"2020-10-07T06:34:25.251Z"} +{"level":"info","message":"upload image to s3 for: 4fe977eb-84a2-4154-a48b-051c6552adab.jpeg","timestamp":"2020-10-07T06:34:25.252Z"} +{"level":"info","message":"upload complete for image to s3 for: 4fe977eb-84a2-4154-a48b-051c6552adab.jpeg","timestamp":"2020-10-07T06:34:30.926Z"} +{"level":"info","message":"Setting image metadata for: 4fe977eb-84a2-4154-a48b-051c6552adab","timestamp":"2020-10-07T06:34:30.926Z"} +{"level":"info","message":"Set successful for image metadata : 4fe977eb-84a2-4154-a48b-051c6552adab","timestamp":"2020-10-07T06:34:31.247Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:36:54.141Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:36:55.491Z"} +{"msg":"inprocess","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:36:55.491Z"} +{"msg":"success","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:36:55.816Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:36:55.816Z"} +{"level":"info","message":"Listening on port 8000","timestamp":"2020-10-07T06:36:55.818Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:36:55.818Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T06:36:55.819Z"} +{"level":"info","message":"imageType: jpeg","timestamp":"2020-10-07T06:37:08.385Z"} +{"level":"info","message":"imageSizeInKB: 83.51846077293085","timestamp":"2020-10-07T06:37:08.386Z"} +{"level":"info","message":"upload image to s3 for: 99f87f82-62d7-40be-a204-b51f0c7eed74.jpeg","timestamp":"2020-10-07T06:37:08.386Z"} +{"level":"info","message":"upload complete for image to s3 for: 99f87f82-62d7-40be-a204-b51f0c7eed74.jpeg","timestamp":"2020-10-07T06:37:13.851Z"} +{"level":"info","message":"Setting image metadata for: 99f87f82-62d7-40be-a204-b51f0c7eed74","timestamp":"2020-10-07T06:37:13.852Z"} +{"level":"info","message":"Set successful for image metadata : 99f87f82-62d7-40be-a204-b51f0c7eed74","timestamp":"2020-10-07T06:37:14.217Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:37:46.576Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:37:48.204Z"} +{"msg":"inprocess","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:37:48.205Z"} +{"msg":"success","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:37:48.660Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:37:48.660Z"} +{"level":"info","message":"Listening on port 8000","timestamp":"2020-10-07T06:37:48.662Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:37:48.663Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T06:37:48.663Z"} +{"level":"info","message":"imageType: jpeg","timestamp":"2020-10-07T06:38:00.515Z"} +{"level":"info","message":"imageSizeInKB: 83.51846077293085","timestamp":"2020-10-07T06:38:00.515Z"} +{"level":"info","message":"upload image to s3 for: 972dd81b-9d75-4e08-98cc-284d521138e9.jpeg","timestamp":"2020-10-07T06:38:00.516Z"} +{"level":"info","message":"upload complete for image to s3 for: 972dd81b-9d75-4e08-98cc-284d521138e9.jpeg","timestamp":"2020-10-07T06:38:06.275Z"} +{"level":"info","message":"Setting image metadata for: 972dd81b-9d75-4e08-98cc-284d521138e9","timestamp":"2020-10-07T06:38:06.276Z"} +{"level":"info","message":"Set successful for image metadata : 972dd81b-9d75-4e08-98cc-284d521138e9","timestamp":"2020-10-07T06:38:06.889Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:39:13.826Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:39:15.103Z"} +{"msg":"inprocess","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:39:15.104Z"} +{"msg":"success","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:39:15.716Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:39:15.717Z"} +{"level":"info","message":"Listening on port 8000","timestamp":"2020-10-07T06:39:15.719Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:39:15.720Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T06:39:15.720Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:45:04.401Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:45:06.697Z"} +{"msg":"inprocess","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:45:06.698Z"} +{"msg":"success","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:45:08.068Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:45:08.068Z"} +{"level":"info","message":"Listening on port 8000","timestamp":"2020-10-07T06:45:08.071Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:45:08.072Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T06:45:08.072Z"} +{"level":"info","message":"imageType: jpeg","timestamp":"2020-10-07T06:45:19.950Z"} +{"level":"info","message":"imageSizeInKB: 83.51846077293085","timestamp":"2020-10-07T06:45:19.951Z"} +{"level":"info","message":"upload image to s3 for: 2600bac3-6929-471f-93c3-77beb35fc00b.jpeg","timestamp":"2020-10-07T06:45:19.951Z"} +{"level":"info","message":"upload complete for image to s3 for: 2600bac3-6929-471f-93c3-77beb35fc00b.jpeg","timestamp":"2020-10-07T06:45:39.562Z"} +{"level":"info","message":"Setting image metadata for: 2600bac3-6929-471f-93c3-77beb35fc00b","timestamp":"2020-10-07T06:45:39.562Z"} +{"level":"info","message":"Set successful for image metadata : 2600bac3-6929-471f-93c3-77beb35fc00b","timestamp":"2020-10-07T06:45:40.534Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:46:32.826Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:46:34.120Z"} +{"msg":"inprocess","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:46:34.120Z"} +{"msg":"success","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:46:34.538Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:46:34.538Z"} +{"level":"info","message":"Listening on port 8000","timestamp":"2020-10-07T06:46:34.541Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:46:34.542Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T06:46:34.542Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:47:58.889Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:48:00.140Z"} +{"msg":"inprocess","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:48:00.140Z"} +{"msg":"success","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:48:00.862Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:48:00.862Z"} +{"level":"info","message":"Listening on port 8000","timestamp":"2020-10-07T06:48:00.865Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:48:00.865Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T06:48:00.866Z"} +{"level":"info","message":"imageType: jpeg","timestamp":"2020-10-07T06:48:16.262Z"} +{"level":"info","message":"imageSizeInKB: 83.51846077293085","timestamp":"2020-10-07T06:48:16.262Z"} +{"level":"info","message":"upload image to s3 for: 8d429fc1-4fb6-499d-a0a0-0c1b3d978cdc.jpeg","timestamp":"2020-10-07T06:48:16.263Z"} +{"level":"info","message":"upload complete for image to s3 for: 8d429fc1-4fb6-499d-a0a0-0c1b3d978cdc.jpeg","timestamp":"2020-10-07T06:48:20.952Z"} +{"level":"info","message":"Setting image metadata for: 8d429fc1-4fb6-499d-a0a0-0c1b3d978cdc","timestamp":"2020-10-07T06:48:20.953Z"} +{"level":"info","message":"Set successful for image metadata : 8d429fc1-4fb6-499d-a0a0-0c1b3d978cdc","timestamp":"2020-10-07T06:48:21.281Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:50:46.495Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:50:48.165Z"} +{"msg":"inprocess","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:50:48.166Z"} +{"msg":"success","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:50:48.682Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:50:48.683Z"} +{"level":"info","message":"Listening on port 8000","timestamp":"2020-10-07T06:50:48.685Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:50:48.686Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T06:50:48.686Z"} +{"level":"info","message":"imageType: jpeg","timestamp":"2020-10-07T06:50:57.434Z"} +{"level":"info","message":"imageSizeInKB: 149.13850140985238","timestamp":"2020-10-07T06:50:57.435Z"} +{"level":"info","message":"upload image to s3 for: 0d7c2e40-c349-4456-850a-43f97f4d4188.jpeg","timestamp":"2020-10-07T06:50:57.436Z"} +{"level":"info","message":"upload complete for image to s3 for: 0d7c2e40-c349-4456-850a-43f97f4d4188.jpeg","timestamp":"2020-10-07T06:51:03.914Z"} +{"level":"info","message":"Setting image metadata for: 0d7c2e40-c349-4456-850a-43f97f4d4188","timestamp":"2020-10-07T06:51:03.915Z"} +{"level":"info","message":"Set successful for image metadata : 0d7c2e40-c349-4456-850a-43f97f4d4188","timestamp":"2020-10-07T06:51:05.265Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:52:08.879Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:52:10.155Z"} +{"msg":"inprocess","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:52:10.155Z"} +{"msg":"success","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:52:10.691Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:52:10.691Z"} +{"level":"info","message":"Listening on port 8000","timestamp":"2020-10-07T06:52:10.694Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:52:10.695Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T06:52:10.695Z"} +{"level":"info","message":"imageType: jpeg","timestamp":"2020-10-07T06:52:20.646Z"} +{"level":"info","message":"imageSizeInKB: 83.51846077293085","timestamp":"2020-10-07T06:52:20.647Z"} +{"level":"info","message":"upload image to s3 for: 7e53418d-f4e4-4176-82f1-c016c529d2db.jpeg","timestamp":"2020-10-07T06:52:20.648Z"} +{"level":"info","message":"upload complete for image to s3 for: 7e53418d-f4e4-4176-82f1-c016c529d2db.jpeg","timestamp":"2020-10-07T06:52:25.750Z"} +{"level":"error","message":"undefined","timestamp":"2020-10-07T06:52:25.752Z"} +{"level":"info","message":"delete image from s3 for: 7e53418d-f4e4-4176-82f1-c016c529d2db.jpeg","timestamp":"2020-10-07T06:52:25.752Z"} +{"level":"info","message":"delete successful for image from s3 for: 7e53418d-f4e4-4176-82f1-c016c529d2db.jpeg","timestamp":"2020-10-07T06:52:27.780Z"} +{"level":"error","message":"BadRequestError: UPLOAD_FAILED\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/src/handlers/uploadImage.js:16:31\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","timestamp":"2020-10-07T06:52:27.781Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:52:53.273Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:52:54.609Z"} +{"msg":"inprocess","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:52:54.609Z"} +{"msg":"success","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:52:54.939Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:52:54.939Z"} +{"level":"info","message":"Listening on port 8000","timestamp":"2020-10-07T06:52:54.941Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:52:54.942Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T06:52:54.942Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:59:18.728Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:59:20.313Z"} +{"msg":"inprocess","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:59:20.313Z"} +{"msg":"success","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:59:20.655Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:59:20.656Z"} +{"level":"info","message":"Listening on port 8000","timestamp":"2020-10-07T06:59:20.658Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:59:20.659Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T06:59:20.659Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:59:53.514Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T06:59:55.101Z"} +{"msg":"inprocess","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:59:55.102Z"} +{"msg":"success","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T06:59:55.420Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:59:55.420Z"} +{"level":"info","message":"Listening on port 8080","timestamp":"2020-10-07T06:59:55.422Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T06:59:55.423Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T06:59:55.423Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T07:00:28.964Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T07:00:30.845Z"} +{"msg":"inprocess","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T07:00:30.845Z"} +{"msg":"success","promiseMethod":"initMysqlTables","level":"info","message":"","timestamp":"2020-10-07T07:00:31.210Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T07:00:31.210Z"} +{"level":"info","message":"Listening on port 80","timestamp":"2020-10-07T07:00:31.213Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T07:00:31.213Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T07:00:31.214Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T08:58:49.568Z"} +{"level":"error","message":"Error: ER_BAD_DB_ERROR: Unknown database 'imagesmetadatadbdev'\n at Handshake.Sequence._packetToError (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)\n at Handshake.ErrorPacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Handshake.js:123:18)\n at Protocol._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:291:23)\n at Parser._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:433:10)\n at Parser.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:43:10)\n at Protocol.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:38:16)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:88:28)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:526:10)\n at Socket.emit (events.js:315:20)\n at addChunk (_stream_readable.js:295:12)\n --------------------\n at Protocol._enqueue (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:144:48)\n at Protocol.handshake (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:51:23)\n at Connection.connect (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:116:18)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:22:28\n at new Promise ()\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:21:20\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","timestamp":"2020-10-07T08:58:54.053Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T08:58:54.054Z"} +{"msg":"inprocess","promiseMethod":"initMysqlDbAndTables","level":"info","message":"","timestamp":"2020-10-07T08:58:54.074Z"} +{"level":"error","message":"Error: ER_BAD_DB_ERROR: Unknown database 'imagesmetadatadbdev'\n at Handshake.Sequence._packetToError (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)\n at Handshake.ErrorPacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Handshake.js:123:18)\n at Protocol._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:291:23)\n at Parser._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:433:10)\n at Parser.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:43:10)\n at Protocol.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:38:16)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:88:28)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:526:10)\n at Socket.emit (events.js:315:20)\n at addChunk (_stream_readable.js:295:12)\n --------------------\n at Protocol._enqueue (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:144:48)\n at Protocol.handshake (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:51:23)\n at Connection.connect (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:116:18)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:22:28\n at new Promise ()\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:21:20\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","timestamp":"2020-10-07T08:58:55.352Z"} +{"err_name":"PROMISE_METHOD_ERROR","promiseMethod":"initMysqlDbAndTables","err_stk":"TypeError: Cannot read property 'query' of null\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:7:25\n at new Promise ()\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:6:16\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","level":"error","message":"","timestamp":"2020-10-07T08:58:55.356Z"} +{"err_name":"PROMISE_ARRAY_ERROR","err_stk":"TypeError: Cannot read property 'query' of null\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:7:25\n at new Promise ()\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:6:16\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","level":"error","message":"","timestamp":"2020-10-07T08:58:55.358Z"} +{"err_name":"INIT_FAILURE","err_stk":"TypeError: Cannot read property 'query' of null\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:7:25\n at new Promise ()\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:6:16\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","level":"error","message":"","timestamp":"2020-10-07T08:58:55.358Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T09:12:18.447Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T09:12:21.001Z"} +{"msg":"inprocess","promiseMethod":"initMysqlDbAndTables","level":"info","message":"","timestamp":"2020-10-07T09:12:21.001Z"} +{"err_name":"PROMISE_METHOD_ERROR","promiseMethod":"initMysqlDbAndTables","err_stk":"Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'use imagesmetadatadbdev\nCREATE TABLE IF NOT EXISTS image_metadata(uuid char(36) ' at line 1\n at Query.Sequence._packetToError (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)\n at Query.ErrorPacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Query.js:79:18)\n at Protocol._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:291:23)\n at Parser._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:433:10)\n at Parser.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:43:10)\n at Protocol.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:38:16)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:88:28)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:526:10)\n at Socket.emit (events.js:315:20)\n at addChunk (_stream_readable.js:295:12)\n --------------------\n at Protocol._enqueue (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:144:48)\n at Connection.query (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:198:25)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:7:25\n at new Promise ()\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:6:16\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","level":"error","message":"","timestamp":"2020-10-07T09:12:21.690Z"} +{"err_name":"PROMISE_ARRAY_ERROR","err_stk":"Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'use imagesmetadatadbdev\nCREATE TABLE IF NOT EXISTS image_metadata(uuid char(36) ' at line 1\n at Query.Sequence._packetToError (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)\n at Query.ErrorPacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Query.js:79:18)\n at Protocol._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:291:23)\n at Parser._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:433:10)\n at Parser.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:43:10)\n at Protocol.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:38:16)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:88:28)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:526:10)\n at Socket.emit (events.js:315:20)\n at addChunk (_stream_readable.js:295:12)\n --------------------\n at Protocol._enqueue (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:144:48)\n at Connection.query (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:198:25)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:7:25\n at new Promise ()\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:6:16\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","level":"error","message":"","timestamp":"2020-10-07T09:12:21.698Z"} +{"err_name":"INIT_FAILURE","err_stk":"Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'use imagesmetadatadbdev\nCREATE TABLE IF NOT EXISTS image_metadata(uuid char(36) ' at line 1\n at Query.Sequence._packetToError (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)\n at Query.ErrorPacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/sequences/Query.js:79:18)\n at Protocol._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:291:23)\n at Parser._parsePacket (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:433:10)\n at Parser.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Parser.js:43:10)\n at Protocol.write (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:38:16)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:88:28)\n at Socket. (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:526:10)\n at Socket.emit (events.js:315:20)\n at addChunk (_stream_readable.js:295:12)\n --------------------\n at Protocol._enqueue (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/protocol/Protocol.js:144:48)\n at Connection.query (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/mysql/lib/Connection.js:198:25)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:7:25\n at new Promise ()\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/init/initMysqlDbAndTables.js:6:16\n at processTicksAndRejections (internal/process/task_queues.js:97:5)","level":"error","message":"","timestamp":"2020-10-07T09:12:21.707Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T09:14:23.691Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T09:14:26.151Z"} +{"msg":"inprocess","promiseMethod":"initMysqlDbAndTables","level":"info","message":"","timestamp":"2020-10-07T09:14:26.152Z"} +{"msg":"success","promiseMethod":"initMysqlDbAndTables","level":"info","message":"","timestamp":"2020-10-07T09:14:27.029Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T09:14:27.029Z"} +{"level":"info","message":"Listening on port 80","timestamp":"2020-10-07T09:14:27.034Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T09:14:27.035Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T09:14:27.035Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T09:14:33.612Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T09:14:37.082Z"} +{"msg":"inprocess","promiseMethod":"initMysqlDbAndTables","level":"info","message":"","timestamp":"2020-10-07T09:14:37.082Z"} +{"msg":"success","promiseMethod":"initMysqlDbAndTables","level":"info","message":"","timestamp":"2020-10-07T09:14:37.514Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T09:14:37.514Z"} +{"level":"info","message":"Listening on port 80","timestamp":"2020-10-07T09:14:37.517Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T09:14:37.517Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T09:14:37.518Z"} +{"level":"info","message":"imageType: jpeg","timestamp":"2020-10-07T09:15:05.274Z"} +{"level":"info","message":"imageSizeInKB: 83.51846077293085","timestamp":"2020-10-07T09:15:05.274Z"} +{"level":"info","message":"upload image to s3 for: eab6948e-3265-4abd-8d98-414a9921b073.jpeg","timestamp":"2020-10-07T09:15:05.275Z"} +{"level":"info","message":"upload complete for image to s3 for: eab6948e-3265-4abd-8d98-414a9921b073.jpeg","timestamp":"2020-10-07T09:15:24.192Z"} +{"level":"info","message":"Setting image metadata for: eab6948e-3265-4abd-8d98-414a9921b073","timestamp":"2020-10-07T09:15:24.193Z"} +{"level":"info","message":"Set successful for image metadata : eab6948e-3265-4abd-8d98-414a9921b073","timestamp":"2020-10-07T09:15:24.601Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T09:55:04.468Z"} +{"err_name":"PROMISE_METHOD_EXCEPTION","promiseMethod":"getDbConnection","err_stk":"Error: ENOENT: no such file or directory, open '/Users/shivam.tay/Desktop/Projects/image-upload-service/configaws-credentials'\n at Object.openSync (fs.js:458:3)\n at Object.readFileSync (fs.js:360:35)\n at getRDSCredentials (/Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:9:33)\n at Object.getDbConnection [as promiseMethod] (/Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:19:16)\n at params.logger.error.err_name (/Users/shivam.tay/Desktop/Projects/image-upload-service/init/init.js:26:39)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:2154:44\n at replenish (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:440:21)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:445:13\n at eachLimit$1 (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:2243:34)\n at awaitable (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:208:32)","level":"error","message":"","timestamp":"2020-10-07T09:55:04.470Z"} +{"err_name":"PROMISE_ARRAY_ERROR","err_stk":"Error: ENOENT: no such file or directory, open '/Users/shivam.tay/Desktop/Projects/image-upload-service/configaws-credentials'\n at Object.openSync (fs.js:458:3)\n at Object.readFileSync (fs.js:360:35)\n at getRDSCredentials (/Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:9:33)\n at Object.getDbConnection [as promiseMethod] (/Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:19:16)\n at params.logger.error.err_name (/Users/shivam.tay/Desktop/Projects/image-upload-service/init/init.js:26:39)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:2154:44\n at replenish (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:440:21)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:445:13\n at eachLimit$1 (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:2243:34)\n at awaitable (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:208:32)","level":"error","message":"","timestamp":"2020-10-07T09:55:04.470Z"} +{"err_name":"INIT_FAILURE","err_stk":"Error: ENOENT: no such file or directory, open '/Users/shivam.tay/Desktop/Projects/image-upload-service/configaws-credentials'\n at Object.openSync (fs.js:458:3)\n at Object.readFileSync (fs.js:360:35)\n at getRDSCredentials (/Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:9:33)\n at Object.getDbConnection [as promiseMethod] (/Users/shivam.tay/Desktop/Projects/image-upload-service/persistence/dbConnection.js:19:16)\n at params.logger.error.err_name (/Users/shivam.tay/Desktop/Projects/image-upload-service/init/init.js:26:39)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:2154:44\n at replenish (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:440:21)\n at /Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:445:13\n at eachLimit$1 (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:2243:34)\n at awaitable (/Users/shivam.tay/Desktop/Projects/image-upload-service/node_modules/async/dist/async.js:208:32)","level":"error","message":"","timestamp":"2020-10-07T09:55:04.477Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T09:55:33.981Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T09:55:35.952Z"} +{"msg":"inprocess","promiseMethod":"initMysqlDbAndTables","level":"info","message":"","timestamp":"2020-10-07T09:55:35.953Z"} +{"msg":"success","promiseMethod":"initMysqlDbAndTables","level":"info","message":"","timestamp":"2020-10-07T09:55:36.360Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T09:55:36.360Z"} +{"level":"info","message":"Listening on port 80","timestamp":"2020-10-07T09:55:36.363Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T09:55:36.364Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T09:55:36.364Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T11:54:50.602Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T11:54:53.887Z"} +{"msg":"inprocess","promiseMethod":"initMysqlDbAndTables","level":"info","message":"","timestamp":"2020-10-07T11:54:53.887Z"} +{"msg":"success","promiseMethod":"initMysqlDbAndTables","level":"info","message":"","timestamp":"2020-10-07T11:54:54.283Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T11:54:54.283Z"} +{"level":"info","message":"Listening on port 80","timestamp":"2020-10-07T11:54:54.286Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T11:54:54.287Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T11:54:54.287Z"} +{"msg":"Application running on http://127.0.0.1/","level":"info","message":"","timestamp":"2020-10-07T11:54:54.287Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T11:55:06.147Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T11:55:09.128Z"} +{"msg":"inprocess","promiseMethod":"initMysqlDbAndTables","level":"info","message":"","timestamp":"2020-10-07T11:55:09.128Z"} +{"msg":"success","promiseMethod":"initMysqlDbAndTables","level":"info","message":"","timestamp":"2020-10-07T11:55:09.586Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T11:55:09.586Z"} +{"level":"info","message":"Listening on port 80","timestamp":"2020-10-07T11:55:09.591Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T11:55:09.592Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T11:55:09.592Z"} +{"msg":"Application running on http://127.0.0.1/","level":"info","message":"","timestamp":"2020-10-07T11:55:09.593Z"} +{"msg":"inprocess","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T11:55:16.465Z"} +{"msg":"success","promiseMethod":"getDbConnection","level":"info","message":"","timestamp":"2020-10-07T11:55:19.883Z"} +{"msg":"inprocess","promiseMethod":"initMysqlDbAndTables","level":"info","message":"","timestamp":"2020-10-07T11:55:19.884Z"} +{"msg":"success","promiseMethod":"initMysqlDbAndTables","level":"info","message":"","timestamp":"2020-10-07T11:55:20.600Z"} +{"msg":"inprocess","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T11:55:20.601Z"} +{"level":"info","message":"Listening on port 80","timestamp":"2020-10-07T11:55:20.604Z"} +{"msg":"success","promiseMethod":"startServer","level":"info","message":"","timestamp":"2020-10-07T11:55:20.604Z"} +{"msg":"INIT_SUCCESS","level":"info","message":"","timestamp":"2020-10-07T11:55:20.604Z"} +{"msg":"Application running on http://127.0.0.1/","level":"info","message":"","timestamp":"2020-10-07T11:55:20.605Z"} +{"level":"info","message":"imageType: jpeg","timestamp":"2020-10-07T11:55:31.011Z"} +{"level":"info","message":"imageSizeInKB: 149.13850140985238","timestamp":"2020-10-07T11:55:31.011Z"} +{"level":"info","message":"upload image to s3 for: 2464fa18-83f9-401e-a71e-ac7f909012c9.jpeg","timestamp":"2020-10-07T11:55:31.013Z"} +{"level":"info","message":"upload complete for image to s3 for: 2464fa18-83f9-401e-a71e-ac7f909012c9.jpeg","timestamp":"2020-10-07T11:55:49.961Z"} +{"level":"info","message":"Setting image metadata for: 2464fa18-83f9-401e-a71e-ac7f909012c9","timestamp":"2020-10-07T11:55:49.963Z"} +{"level":"info","message":"Set successful for image metadata : 2464fa18-83f9-401e-a71e-ac7f909012c9","timestamp":"2020-10-07T11:55:50.327Z"} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..360c3e3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,989 @@ +{ + "name": "image-upload-service", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@middy/core": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@middy/core/-/core-1.4.0.tgz", + "integrity": "sha512-ek7sC1BVh11oPPoATrG44WDpqxws9dHnOY1Y2Kg/95+hCuIpH7mTWMf2ja3Hj5w81PVF9i/CmsIhK5RsOKNZVg==", + "requires": { + "once": "^1.4.0" + } + }, + "@middy/http-error-handler": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@middy/http-error-handler/-/http-error-handler-1.4.0.tgz", + "integrity": "sha512-n6vAx6oyPxF2PLQKf9cQq7sV3YJuq9Ugy3QNjBUf3JbKEiZ8NU24T38hNaNzTFfTmeKiulGPVlyULbiUSVZ6lg==", + "requires": { + "http-errors": "^1.6.3" + } + }, + "@middy/http-event-normalizer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@middy/http-event-normalizer/-/http-event-normalizer-1.4.0.tgz", + "integrity": "sha512-T1+loc9NJX6QMNPAGH5LuaUl60kA4i9g33XzE4cGDg/L1x+nZndkHq+Zss3AoQgWeVN3nWdE/G8Sz/vDeHXfAw==" + }, + "@middy/http-json-body-parser": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@middy/http-json-body-parser/-/http-json-body-parser-1.4.0.tgz", + "integrity": "sha512-jheXZkMkbPlE1KC5TpQ6vY03kSSpQxT66hCozXlboMEo2qZDaNJv4EtrNRVYo7eu/JxAVjLxTgtfB9rbmfJjvQ==", + "requires": { + "@types/http-errors": "^1.6.1", + "content-type": "^1.0.4", + "http-errors": "^1.6.3" + } + }, + "@middy/validator": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@middy/validator/-/validator-1.4.0.tgz", + "integrity": "sha512-6hTMbK50PogIPGHUX0JW1JYXCkSPSUZLaom/X73zDwC0RvKP4RvkEIa3amNGUUwfBweC/O6DlquvmSGAeWCNYQ==", + "requires": { + "@types/http-errors": "^1.6.1", + "ajv": "^6.5.0", + "ajv-errors": "^1.0.1", + "ajv-i18n": "^3.3.0", + "ajv-keywords": "^3.2.0", + "http-errors": "^1.6.3" + } + }, + "@types/http-errors": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.0.tgz", + "integrity": "sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "ajv": { + "version": "6.12.5", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz", + "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "ajv-i18n": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/ajv-i18n/-/ajv-i18n-3.6.0.tgz", + "integrity": "sha512-F21DzmzYq9aVtY8CGGtlnQDy3rFMaFW2KRlMuCQp76KiPIkvqN+mpq5MI9EsgC0VFwj+jeLIsvVCvPOa1sobBQ==" + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + }, + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, + "aws-sdk": { + "version": "2.760.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.760.0.tgz", + "integrity": "sha512-u1DhOXbN8/yLRaJ2sjY2ZmjiwEPl4KuGKafaM4oJXzEyOPo5Kwtvau62FgqeRSBVxkw9sipuA5sfYxdwLbq6vg==", + "requires": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + }, + "dependencies": { + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" + }, + "body-parser": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", + "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "requires": { + "bytes": "3.0.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "~1.6.3", + "iconv-lite": "0.4.23", + "on-finished": "~2.3.0", + "qs": "6.5.2", + "raw-body": "2.3.3", + "type-is": "~1.6.16" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", + "requires": { + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" + } + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-parser": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.5.tgz", + "integrity": "sha512-f13bPUj/gG/5mDr+xLmSxxDsB9DQiTIfhJS/sqjrmfAWiAN+x2O4i/XguTL9yDZ+/IFDanJ+5x7hC4CXT9Tdzw==", + "requires": { + "cookie": "0.4.0", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "express": { + "version": "4.16.4", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", + "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "requires": { + "accepts": "~1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.3", + "content-disposition": "0.5.2", + "content-type": "~1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.4", + "qs": "6.5.2", + "range-parser": "~1.2.0", + "safe-buffer": "5.1.2", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "~1.4.0", + "type-is": "~1.6.16", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + } + } + }, + "express-winston": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/express-winston/-/express-winston-0.3.1.tgz", + "integrity": "sha1-BJtXgjk4J2gRAQ2ie4qHmu9xbjc=", + "requires": { + "chalk": "~0.4.0", + "underscore": "~1.5.2", + "winston": "~0.9.0" + }, + "dependencies": { + "winston": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-0.9.0.tgz", + "integrity": "sha1-tXJubEIpHjBeNihs566fO3SlJ6g=", + "requires": { + "async": "0.9.x", + "colors": "1.0.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "pkginfo": "0.3.x", + "stack-trace": "0.0.x" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + } + } + } + } + }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.4.0", + "unpipe": "~1.0.0" + } + }, + "foreachasync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz", + "integrity": "sha1-VQKYfchxS+M5IJfzLgBxyd7gfPY=" + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" + }, + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "requires": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "locutus": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/locutus/-/locutus-2.0.14.tgz", + "integrity": "sha512-0H1o1iHNEp3kJ5rW57bT/CAP5g6Qm0Zd817Wcx2+rOMTYyIJoc482Ja1v9dB6IUjwvWKcBNdYi7x2lRXtlJ3bA==", + "requires": { + "es6-promise": "^4.2.5" + } + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "requires": { + "mime-db": "1.44.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "morgan": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "requires": { + "basic-auth": "~2.0.0", + "debug": "2.6.9", + "depd": "~1.1.2", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "requires": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "pkginfo": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", + "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=" + }, + "pop-iterate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pop-iterate/-/pop-iterate-1.0.1.tgz", + "integrity": "sha1-zqz9q0q/NT16DyqqLB/Hs/lBO6M=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "q": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/q/-/q-2.0.3.tgz", + "integrity": "sha1-dbjbAlWhpa+C9Yw/Oqoe/sfQ0TQ=", + "requires": { + "asap": "^2.0.0", + "pop-iterate": "^1.0.1", + "weak-map": "^1.0.5" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=" + }, + "twig": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/twig/-/twig-0.10.3.tgz", + "integrity": "sha1-Z2BOCOGSDr8vr4CpAeJWGJyKPGc=", + "requires": { + "locutus": "^2.0.5", + "minimatch": "3.0.x", + "walk": "2.3.x" + } + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "underscore": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.5.2.tgz", + "integrity": "sha1-EzXF5PXm0zu7SwBrqMhqAPVW3gg=" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "walk": { + "version": "2.3.14", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz", + "integrity": "sha512-5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==", + "requires": { + "foreachasync": "^3.0.0" + } + }, + "weak-map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz", + "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes=" + }, + "winston": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/winston/-/winston-1.0.1.tgz", + "integrity": "sha1-TG9aEWfrxRasKbduTq24c8FSiaQ=", + "requires": { + "async": "0.9.x", + "colors": "1.0.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "pkginfo": "0.3.x", + "stack-trace": "0.0.x" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1b98e80 --- /dev/null +++ b/package.json @@ -0,0 +1,31 @@ +{ + "name": "image-upload-service", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "node ./init/init.js" + }, + "dependencies": { + "@middy/core": "1.4.0", + "@middy/http-error-handler": "1.4.0", + "@middy/http-event-normalizer": "1.4.0", + "@middy/http-json-body-parser": "1.4.0", + "@middy/validator": "1.4.0", + "async": "3.2.0", + "aws-sdk": "2.760.0", + "cookie-parser": "1.4.5", + "debug": "2.6.9", + "express": "4.16.4", + "express-winston": "0.3.1", + "fs": "0.0.1-security", + "http-errors": "1.6.3", + "ini": "1.3.5", + "jsonwebtoken": "8.5.1", + "morgan": "1.9.1", + "mysql": "2.18.1", + "q": "2.0.3", + "twig": "0.10.3", + "uuid": "8.3.0", + "winston": "1.0.1" + } +} diff --git a/persistence/dbConnection.js b/persistence/dbConnection.js new file mode 100644 index 0000000..4ce1d88 --- /dev/null +++ b/persistence/dbConnection.js @@ -0,0 +1,41 @@ +const fs = require('fs'); +const ini = require('ini'); +const mysql = require('mysql'); +const projectEnv = require('../config/projectEnv').projectEnv; +let connection = null; +const logger = require('../logger'); + +const getRDSCredentials = function(profile) { + const config = ini.parse(fs.readFileSync(projectEnv.awsCredFilePath, 'utf-8')); + try { + return Promise.resolve({user: config[profile].rds_image_db_user, password: config[profile].rds_image_db_password }); + } catch (ex) { + return Promise.reject(ex); + } +} + +const getDbConnection = function () { + if(!connection) { + return getRDSCredentials(projectEnv.awsCredProfile).then(credentials => { + connection = mysql.createConnection({ + host: projectEnv.mysqlDbConfig.host, + port: projectEnv.mysqlDbConfig.port, + user: credentials.user, + password:credentials.password, + multipleStatements: true + }); + return new Promise((resolve, reject) => { + connection.connect(function(err) { + if (err) { + logger.error(err.stack); + connection = null; + } + resolve(connection); + }); + }); + }); + } + return Promise.resolve(connection); +}; + +module.exports = getDbConnection; \ No newline at end of file diff --git a/public/html/index.html b/public/html/index.html new file mode 100644 index 0000000..52437f4 --- /dev/null +++ b/public/html/index.html @@ -0,0 +1,152 @@ + + + + + Image Upload Service + + + + +
+

Choose the file to Upload

+
+
+
+ Image: + + +
+
+ +
+
+ + + diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css new file mode 100644 index 0000000..9453385 --- /dev/null +++ b/public/stylesheets/style.css @@ -0,0 +1,8 @@ +body { + padding: 50px; + font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; +} + +a { + color: #00B7FF; +} diff --git a/routes/index.js b/routes/index.js new file mode 100644 index 0000000..fea942b --- /dev/null +++ b/routes/index.js @@ -0,0 +1,26 @@ +var express = require('express'); +var router = express.Router(); + +/* GET home page. */ +router.get('/', function(req, res, next) { + res.sendFile('/public/html/index.html', {root: __dirname.replace(/routes$/, '') }) +}); + +router.post('/uploadImage', function (req, res, next) { + try { + const uploadImageHandler = require('../src/handlers/uploadImage'); + uploadImageHandler(req.body).then(result => { + res.status(201).send(result); + res.end(); + }).catch(err => { + res.status(400).send(err); + res.end(); + }); + } catch(err) { + console.error(err.stack); + res.status(500).send(err); + res.end(); + } +}); + +module.exports = router; diff --git a/src/handlers/uploadImage.js b/src/handlers/uploadImage.js new file mode 100644 index 0000000..5d73c3e --- /dev/null +++ b/src/handlers/uploadImage.js @@ -0,0 +1,62 @@ +const commonMiddleware = require('../lib/commonMiddleware'); +const createError = require('http-errors'); +const uuid = require('uuid').v4; +const validator = require('@middy/validator'); +const uploadPictureToS3 = require('../lib/uploadPictureToS3').uploadPictureToS3; +const setImageMetadata = require("../lib/setImageMetadata").setImageMetadata; +const removePictureFromS3 = require("../lib/uploadPictureToS3").removePictureFromS3; +const uploadImageSchema = require('../lib/schemas/uploadImageSchema'); +const logger = require('../../logger'); + + +const rollbackUpload = function (id, imageType) { + return Promise.all([ + removePictureFromS3(id + '.' + imageType), + ]).then(_ => { + return Promise.reject(new createError["400"]('UPLOAD_FAILED')); + }); +}; + +const uploadImage = function (params) { + const { + imageDesc, + imageData + } = params; + + const imageType = imageData.substring("data:image/".length, imageData.indexOf(";base64")); + logger.info('imageType:', imageType); + if(imageType !== 'png' && imageType !== 'jpeg') { + throw new createError.BadRequest('IMAGE_TYPE_ERROR'); + } + + // Calculate image size from base64 string + // ref: https://stackoverflow.com/questions/29939635/how-to-get-file-size-of-newly-created-image-if-src-is-base64-string + const imageSizeInKB = (4 * Math.ceil((imageData.length / 3)) * 0.5624896334383812 ) / 1000; + logger.info('imageSizeInKB:', imageSizeInKB); + if(imageSizeInKB > 500) { + throw new createError.BadRequest('IMAGE_SIZE_ERROR'); + } + const imageBase64 = imageData.replace(/^data:image\/\w+;base64,/, ''); + const buffer = Buffer.from(imageBase64, 'base64'); + const id = uuid(); + try { + return uploadPictureToS3(id + '.' + imageType, buffer, imageType) + .then(imageUrl => { + return setImageMetadata({id, imageDesc, imageType, imageSizeInKB}) + .then(_ => { + return Promise.resolve({message: "Upload successful!"}); + }).catch(err => { + logger.error(err.stack); + return rollbackUpload(id, imageType); + }); + }).catch(err => { + logger.error(err.stack); + return Promise.reject(err); + }); + } catch (error) { + throw new createError.InternalServerError(error); + } +}; + +module.exports = commonMiddleware(uploadImage) + .use(validator({inputSchema: uploadImageSchema})); \ No newline at end of file diff --git a/src/lib/commonMiddleware.js b/src/lib/commonMiddleware.js new file mode 100644 index 0000000..f9fdc3d --- /dev/null +++ b/src/lib/commonMiddleware.js @@ -0,0 +1,9 @@ +const middy = require('@middy/core'); +const httpJsonBodyParser = require('@middy/http-json-body-parser'); +const httpEventNormalizer = require('@middy/http-event-normalizer'); + +module.exports = (handler) => middy(handler) + .use([ + httpJsonBodyParser(), + httpEventNormalizer() + ]); \ No newline at end of file diff --git a/src/lib/schemas/uploadImageSchema.js b/src/lib/schemas/uploadImageSchema.js new file mode 100644 index 0000000..aa276f3 --- /dev/null +++ b/src/lib/schemas/uploadImageSchema.js @@ -0,0 +1,17 @@ +const schema = { + type: 'object', + properties: { + imageData: { + type: 'string', + minLength: 1, + pattern: '\=$', + }, + imageDesc: { + type: 'string', + minLength: 1, + }, + }, + required: ['imageData', 'imageDesc'], +}; + +module.exports = schema; \ No newline at end of file diff --git a/src/lib/setImageMetadata.js b/src/lib/setImageMetadata.js new file mode 100644 index 0000000..affd20e --- /dev/null +++ b/src/lib/setImageMetadata.js @@ -0,0 +1,35 @@ +const geDbConnection = require('../../persistence/dbConnection'); +const projectEnv = require('../../config/projectEnv').projectEnv; +const logger = require('../../logger'); + +const setImageMetadata = function (params) { + const { + id, + imageDesc, + imageType, + imageSizeInKB + } = params; + + logger.info('Setting image metadata for: ', id); + return geDbConnection() + .then(mysqlClient => { + try { + return new Promise((resolve, reject) => { + mysqlClient.query( + 'use ' + projectEnv.mysqlDbConfig.database+ ';\n' + + 'INSERT INTO ' + projectEnv.mysqlDbConfig.tableName + ' (uuid, description, file_type, size_in_kb) VALUES(?,?,?,?)', + [id, imageDesc, imageType, imageSizeInKB], + function (error, results, fields) { + if (error) reject(error); + logger.info('Set successful for image metadata : ', id); + resolve(results); + } + ); + }); + } catch(err) { + return Promise.reject(err); + } + }); +} + +exports.setImageMetadata = setImageMetadata; \ No newline at end of file diff --git a/src/lib/uploadPictureToS3.js b/src/lib/uploadPictureToS3.js new file mode 100644 index 0000000..d597b29 --- /dev/null +++ b/src/lib/uploadPictureToS3.js @@ -0,0 +1,47 @@ +const AWS = require('aws-sdk'); +const projectEnv = require('../../config/projectEnv').projectEnv; +const logger = require('../../logger'); + +const credentials = new AWS.SharedIniFileCredentials(projectEnv.awsCredFilePath); +AWS.config.credentials = credentials; +const s3 = new AWS.S3(); + +const uploadPictureToS3 = function (key, body, imageType) { + logger.info('upload image to s3 for: ', key); + return new Promise((resolve, reject) => { + s3.upload({ + Bucket: projectEnv.awsBucketName, + Key: key, + Body: body, + ContentEncoding: 'base64', + ContentType: 'image/' + imageType, + }, function (err, result) { + if (err) { + reject(err); + } else { + logger.info('upload complete for image to s3 for: ', key); + resolve(result.Location); + } + }); + }); +} + +const removePictureFromS3 = function (key) { + logger.info('delete image from s3 for: ', key); + return new Promise((resolve, reject) => { + s3.deleteObject({ + Bucket: projectEnv.awsBucketName, + Key: key, + }, function (err, result) { + if (err) { + reject(err); + } else { + logger.info('delete successful for image from s3 for: ', key); + resolve(result.DeleteMarker); + } + }); + }); +}; + +exports.uploadPictureToS3 = uploadPictureToS3; +exports.removePictureFromS3 = removePictureFromS3; \ No newline at end of file diff --git a/views/error.twig b/views/error.twig new file mode 100644 index 0000000..caf7ce0 --- /dev/null +++ b/views/error.twig @@ -0,0 +1,7 @@ +{% extends 'layout.twig' %} + +{% block body %} +

{{message}}

+

{{error.status}}

+
{{error.stack}}
+{% endblock %} diff --git a/views/index.twig b/views/index.twig new file mode 100644 index 0000000..20372e3 --- /dev/null +++ b/views/index.twig @@ -0,0 +1,6 @@ +{% extends 'layout.twig' %} + +{% block body %} +

{{title}}

+

Welcome to {{title}}

+{% endblock %} diff --git a/views/layout.twig b/views/layout.twig new file mode 100644 index 0000000..bce6dd5 --- /dev/null +++ b/views/layout.twig @@ -0,0 +1,10 @@ + + + + {{ title }} + + + + {% block body %}{% endblock %} + +