Commit 0b6272e09aba091c99777431b4ce6b0c65ca09b9

Authored by sumatek
1 parent e57c30ae
Exists in master

update template

app.config.json
1 1 {
2 2 "default": {
3   - "appName": "Hostpital service",
  3 + "appName": "Hostpital",
4 4 "appPort": 3000,
5 5 "apiUrlPrefix": "/api",
6 6 "requestTimeout": 10,
7 7 "mongoDB" : {
8 8 "hopitalIp" : "10.1.2.155:27017",
9   - "hopitalName" : "spw"
10   - }
  9 + "hopitalName" : "hospital"
  10 + },
  11 + "configlog" : {
  12 + "log" : {
  13 + "time" : 15,
  14 + "size" : null,
  15 + "path" : "./logs/log",
  16 + "level" : "debug",
  17 + "console" : false,
  18 + "file" : true
  19 + },
  20 + "summary" : {
  21 + "time" : 15,
  22 + "size" : null,
  23 + "path" : "./logs/summary",
  24 + "console" : false,
  25 + "file" : true
  26 + },
  27 + "detail" : {
  28 + "time" : 15,
  29 + "size" : null,
  30 + "path" : "./logs/detail",
  31 + "console" : false,
  32 + "file" : true
  33 + },
  34 + "stat" : {
  35 + "time" : 15,
  36 + "size" : null,
  37 + "path" : "./logs/stat",
  38 + "mode" : 0,
  39 + "pathDB" : "undefined",
  40 + "statInterval" : 15,
  41 + "console" : false,
  42 + "file" : true
  43 + }
  44 + }
  45 +
11 46  
12 47  
13 48  
... ...
app.js
... ... @@ -3,6 +3,10 @@ const express = require('express');
3 3 const app = express();
4 4 const conf = require('utils/config');
5 5 const utils = require('utils/utils');
  6 +var log = require('./utils/log');
  7 +
  8 +var logg = require('commonlog-kb').init(conf.get("configlog"),app);
  9 +
6 10  
7 11 // console.log(conf.get('redis.host'));
8 12  
... ... @@ -10,6 +14,8 @@ const utils = require('utils/utils');
10 14 const addRequestId = require('express-request-id')();
11 15 app.use(addRequestId);
12 16  
  17 +
  18 +
13 19 // setup express-session with redis store
14 20 const session = require('express-session');
15 21 // const RedisStore = require('connect-redis')(session);
... ... @@ -31,6 +37,46 @@ const uuidV4 = require('uuid/v4');
31 37 // }));
32 38  
33 39  
  40 +
  41 +function logResponseBody(req, res, next) {
  42 + var oldWrite = res.write,
  43 + oldEnd = res.end;
  44 +
  45 + var chunks = [];
  46 +
  47 + res.write = function (chunk) {
  48 + chunks.push(chunk);
  49 + oldWrite.apply(res, arguments);
  50 + };
  51 +
  52 + res.end = function (chunk) {
  53 + var body = '';
  54 +
  55 + if (typeof chunk !== 'string' && !(chunk instanceof Buffer)) {
  56 + res["resBody"] = body ;
  57 + oldEnd.apply(res, arguments);
  58 + return ;
  59 + }
  60 +
  61 + if (!(chunk instanceof String || typeof chunk === 'string' ) )
  62 + chunks.push(chunk);
  63 + try {
  64 + //console.dir(chunks);
  65 + body = chunks.length > 0? Buffer.concat(chunks).toString('utf8') :'';
  66 + } catch (error) {
  67 + logger.errorStack(error);
  68 + }
  69 +
  70 + res["resBody"] = body ;
  71 +
  72 + oldEnd.apply(res, arguments);
  73 + };
  74 +
  75 + next();
  76 + }
  77 +
  78 +app.use(logResponseBody);
  79 +
34 80 // setup json body parser
35 81 const bodyParser = require('body-parser');
36 82 app.use(bodyParser.json());
... ... @@ -39,8 +85,8 @@ app.use(bodyParser.json());
39 85 // const logger = require('utils/request-logger');
40 86  
41 87 // setup express request/response logger
42   -const log4js = require('log4js');
43   -log4js.configure('./config/log4js_config.json');
  88 +// const log4js = require('log4js');
  89 +// log4js.configure('./config/log4js_config.json');
44 90 // const log4jsLogger = log4js.getLogger('express-project');
45 91  
46 92 // const fileTransport = logger.fileTransport;
... ... @@ -88,11 +134,17 @@ app.use(function (req, res, next) {
88 134 });
89 135  
90 136  
91   -app.use( function( req, res, next ) {
  137 +app.use(function( req, res, next ) {
  138 + if(req.headers["x-user"] && req.headers["usertoken"])
  139 + next();
  140 + else
  141 + res.status(401).json({resultCode:40100,resultDescription:'Access denied'});
  142 +
  143 + });
92 144  
  145 +app.use( function( req, res, next ) {
  146 + // log.startEC(req);
93 147 req = utils.findQueryString(req);
94   -
95   -
96 148 next();
97 149 });
98 150  
... ... @@ -111,18 +163,40 @@ app.use(apiUrlPrefix+'/preference', preference);
111 163 // let apiLogin = require('./controllers/login/login')(passport);
112 164 // app.use('/', apiLogin);
113 165  
114   -
  166 +app.use( function( req, res, next ) {
  167 + if(req.res.resBody)
  168 + {
  169 + try{
  170 + log.logSummary(req,JSON.parse(req.res.resBody));
  171 + } catch(err) {
  172 + log.logSummary(req,req.res.resBody);
  173 + }
  174 +
  175 + }else
  176 + {
  177 + // var response = responseMsg.unknow(req);
  178 +
  179 + // log.startlog(req,req.method+"_"+"Unknow","Unknow","Unknow");
  180 + // log.logDetail.addInput(req,"Unknow",req.method+"_"+"Unknow","Request",req,req.body);
  181 + // log.logDetail.addOutput(req,"Unknow",req.method+"_"+"Unknow","Response",response,response);
  182 +
  183 + // log.addErrorSummary(req,req.body.clientName,req.method+"_"+"Unknow","null","Unknown URL");
  184 + // res.status(200).json(response);
  185 + // log.logSummary(req,response);
  186 + }
  187 +
  188 + // log.endEC(req,res);
  189 + next();
  190 +} );
115 191  
116 192 // handle not found
117   -app.all('*', function(req, res) {
118   - res.status(404);
  193 +// app.all('*', function(req, res) {
119 194  
120   - // respond with json
121   - res.send({
122   - error: 'Not found'
123   - });
  195 +// var response = {resultCode: 40400,resultDescription: 'Data not found'};
  196 +// log.endEC(req,response);
  197 +// res.status(404).send(response);
124 198  
125   -});
  199 +// });
126 200  
127 201 // // handle errors
128 202 // app.use(function (err, req, res, next) {
... ...
config/log4js_config.json
... ... @@ -1,18 +0,0 @@
1   -{
2   - "appenders": {
3   - "express-project": {
4   - "type": "dateFile",
5   - "filename": "./logs/express-project",
6   - "pattern": "-yyyyMMdd.log",
7   - "alwaysIncludePattern": false
8   - }
9   - },
10   - "categories": {
11   - "default": {
12   - "appenders": [
13   - "express-project"
14   - ],
15   - "level": "all"
16   - }
17   - }
18   -}
19 0 \ No newline at end of file
controllers/preference/index.js
... ... @@ -2,33 +2,56 @@ let express = require('express');
2 2 let router = express.Router();
3 3 let connection = require("../../utils/mongoDB")
4 4 var utils = require('../../utils/utils');
  5 +var stats = require('../../utils/stats');
  6 +var log = require('../../utils/log');
5 7  
6 8  
7   -router.get('/:collection',async function (req, res) {
  9 +
  10 +router.get('/:collection',async function (req, res,next)
  11 +{
  12 + start(req)
  13 + var collection = req.params.collection;
  14 +
8 15 var query = Object.assign(req.params, req.query);
9 16 var filter = await utils.getQueryFilter(query.filter);
10   - var result = await connection.reqMongo(req,req.method,filter,req.params.collection)
11   - res.status(200).json(result);
  17 + var result = await connection.reqMongo(req,req.method,filter,collection)
12 18  
13   -
14   -});
15   -
16   -router.post('/:collection',async function (req, res) {
17   - var query = Object.assign(req.params, req.query);
18   - var result = await connection.reqMongo(req, query)
  19 + end(req);
19 20 res.status(200).json(result);
  21 + next();
20 22 });
21 23  
22   -router.put('/:collection',async function (req, res) {
23   - var query = Object.assign(req.params, req.query);
24   - var result = await connection.reqMongo(req, query)
25   - res.status(200).json(result);
26   -});
  24 +router.post('/:collection',async function (req, res,next) {
  25 + var collection = req.params.collection;
27 26  
28   -router.delete('/:collection',async function (req, res) {
29   - var query = Object.assign(req.params, req.query);
30   - var result = await connection.reqMongo(req, query)
  27 + var query = req.body;
  28 + var result = await connection.reqMongo(req,req.method,query,collection)
31 29 res.status(200).json(result);
  30 + next();
32 31 });
33 32  
  33 +// router.put('/:collection',async function (req, res) {
  34 +// var query = Object.assign(req.params, req.query);
  35 +// var result = await connection.reqMongo(req, query)
  36 +// res.status(200).json(result);
  37 +// });
  38 +
  39 +// router.delete('/:collection',async function (req, res) {
  40 +// var query = Object.assign(req.params, req.query);
  41 +// var result = await connection.reqMongo(req, query)
  42 +// res.status(200).json(result);
  43 +// });
  44 +
  45 +function start(req) {
  46 + var cmd = req.params.collection;
  47 + log.startlog(req,cmd,'session','identity');
  48 + stats.receiveRequest(req.method,cmd);
  49 + log.detailRequestFE(req);
  50 +};
  51 +
  52 +function end(req) {
  53 + var collection = req.params.collection;
  54 + stats.sendResponse(req.method,collection);
  55 + log.detailResponseFE(req);
  56 +};
34 57 module.exports = router;
35 58 \ No newline at end of file
... ...
logs/app.log
1   -{"message":"phoenix-partner - :: ## - - ## BE Receive HTTP GET mongodb://10.1.2.155:27017/ response-header: undefined response-body: [{\"table\":\"get_spwHashtags\",\"value\":\"bbb\"}]","level":"info"}
2   -{"message":"phoenix-partner - :: ## - - ## BE Receive HTTP GET mongodb://10.1.2.155:27017/ response-header: undefined response-body: [{\"table\":\"get_spwHashtags\",\"value\":\"bbb\"}]","level":"info"}
3   -{"message":"phoenix-partner - :: ## - - ## BE Receive HTTP GET mongodb://10.1.2.155:27017/ response-header: undefined response-body: \"[{\\\"table\\\":\\\"get_spwHashtags\\\",\\\"value\\\":\\\"bbb\\\"}]\"","level":"info"}
4   -{"message":"phoenix-partner - :: ## - - ## BE Receive HTTP GET mongodb://10.1.2.155:27017/ response-header: undefined response-body: [{\"table\":\"get_spwHashtags\",\"value\":\"bbb\"}]","level":"info"}
5   -{"message":"phoenix-partner - :: ## - - ## BE Receive HTTP GET mongodb://10.1.2.155:27017/ response-header: undefined response-body: [{\"table\":\"get_spwHashtags\",\"value\":\"bbb\"}]","level":"info"}
6   -{"message":"phoenix-partner - :: ## - - ## BE Receive HTTP GET mongodb://10.1.2.155:27017/ response-header: undefined response-body: [{\"table\":\"get_spwHashtags\",\"value\":\"bbb\"}]","level":"info"}
7   -{"message":"phoenix-partner - :: ## - - ## BE Receive HTTP GET mongodb://10.1.2.155:27017/ response-header: undefined response-body: [{\"table\":\"get_spwHashtags\",\"value\":\"bbb\"}]","level":"info"}
8   -{"message":"phoenix-partner - :: ## - - ## BE Receive HTTP GET mongodb://10.1.2.155:27017/ response-header: undefined response-body: [{\"table\":\"get_spwHashtags\",\"value\":\"bbb\"}]","level":"info"}
9   -{"message":"phoenix-partner - :: ## - - ## BE Receive SQL Result: [{\"table\":\"get_spwHashtags\",\"value\":\"bbb\"}]","level":"info"}
10   -{"message":"phoenix-partner - :: ## - - ## BE Receive SQL Result: [{\"table\":\"get_spwHashtags\",\"value\":\"bbb\"}]","level":"info"}
11   -{"message":"phoenix-partner - :: ## - session - 001bed68-f6d3-4b43-b955-5178249d3e81 ## BE Receive SQL Result: [{\"table\":\"get_spwHashtags\",\"value\":\"bbb\"}]","level":"info"}
12   -{"message":"phoenix-partner - :: ## - session - a78f627a-aef2-477a-ac52-d144167170f1 ## BE Receive SQL Result: [{\"table\":\"get_spwHashtags\",\"value\":\"bbb\"}]","level":"info"}
13   -{"message":"phoenix-partner - :: ## - session - 85a0f68c-6543-4db9-9bb3-8f25a6597cb0 ## BE Send SQL Query: {\"table\":\"get_spwHashtags\"}","level":"info"}
14   -{"message":"phoenix-partner - :: ## - session - 85a0f68c-6543-4db9-9bb3-8f25a6597cb0 ## BE Receive SQL Result: [{\"table\":\"get_spwHashtags\",\"value\":\"bbb\"}]","level":"info"}
15   -{"message":"phoenix-partner - :: ## - session - 24b3d4de-356c-4bd4-a07b-c419a0466f57 ## BE Send SQL Query: {\"collection\":\"general\",\"filter\":\"(&(companyName=เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™))\",\"fields\":\"companyName\"}","level":"info"}
16   -{"message":"phoenix-partner - :: ## - session - 24b3d4de-356c-4bd4-a07b-c419a0466f57 ## BE Receive SQL Result: []","level":"info"}
17   -{"message":"phoenix-partner - :: ## - session - 3a1fad66-0e0f-4499-848e-ac5dae13ba7f ## BE Send SQL Query: {\"companyName\":{}}","level":"info"}
18   -{"message":"phoenix-partner - :: ## - session - 3a1fad66-0e0f-4499-848e-ac5dae13ba7f ## BE Receive SQL Result: []","level":"info"}
19   -{"message":"phoenix-partner - :: ## - session - 330610bf-2f1f-4f45-a7b5-5a4d686eab52 ## BE Send SQL Query: {\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}","level":"info"}
20   -{"message":"phoenix-partner - :: ## - session - 330610bf-2f1f-4f45-a7b5-5a4d686eab52 ## BE Receive SQL Result: []","level":"info"}
  1 +{"message":"phoenix-partner - :: ## - session - 04d98ad6-9059-4da1-bbbf-d7303d09dd2e ## BE Send SQL Query: {}","level":"info"}
  2 +{"message":"phoenix-partner - :: ## - session - 04d98ad6-9059-4da1-bbbf-d7303d09dd2e ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  3 +{"message":"phoenix-partner - :: ## - session - 1780404a-077a-4b70-a8c1-1b7d0571923c ## BE Send SQL Query: {}","level":"info"}
  4 +{"message":"phoenix-partner - :: ## - session - 1780404a-077a-4b70-a8c1-1b7d0571923c ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  5 +{"message":"phoenix-partner - :: ## - session - 8f655908-8aa4-4725-9d62-55ba2ea9d1ab ## BE Send SQL Query: {}","level":"info"}
  6 +{"message":"phoenix-partner - :: ## - session - 8f655908-8aa4-4725-9d62-55ba2ea9d1ab ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  7 +{"message":"phoenix-partner - :: ## - session - 506859e0-4b65-4f0f-a412-4d46cc19e5f5 ## BE Send SQL Query: {}","level":"info"}
  8 +{"message":"phoenix-partner - :: ## - session - 7329ea83-69f1-404b-9e2c-26d12ac387ba ## BE Send SQL Query: {}","level":"info"}
  9 +{"message":"phoenix-partner - :: ## - session - 7329ea83-69f1-404b-9e2c-26d12ac387ba ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  10 +{"message":"phoenix-partner - :: ## - session - df2b4246-948b-49fd-8a2e-68d5eb2fc341 ## BE Send SQL Query: {}","level":"info"}
  11 +{"message":"phoenix-partner - :: ## - session - df2b4246-948b-49fd-8a2e-68d5eb2fc341 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  12 +{"message":"phoenix-partner - :: ## - session - c01c884a-0974-4ffe-ae15-4e718d22102c ## BE Send SQL Query: {}","level":"info"}
  13 +{"message":"phoenix-partner - :: ## - session - c01c884a-0974-4ffe-ae15-4e718d22102c ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  14 +{"message":"phoenix-partner - :: ## - session - 6b72cc36-0b98-4748-bd94-24a2cb61f8fa ## BE Send SQL Query: {}","level":"info"}
  15 +{"message":"phoenix-partner - :: ## - session - 6b72cc36-0b98-4748-bd94-24a2cb61f8fa ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  16 +{"message":"phoenix-partner - :: ## - session - b0ba16a9-bd43-43c6-b15d-b8a028186ee6 ## BE Send SQL Query: {}","level":"info"}
  17 +{"message":"phoenix-partner - :: ## - session - b0ba16a9-bd43-43c6-b15d-b8a028186ee6 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  18 +{"message":"phoenix-partner - :: ## - session - b70a2d8a-7773-4f38-9fde-dc3be93846ea ## BE Send SQL Query: {}","level":"info"}
  19 +{"message":"phoenix-partner - :: ## - session - b70a2d8a-7773-4f38-9fde-dc3be93846ea ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  20 +{"message":"phoenix-partner - :: ## - session - d630c3ee-495d-4708-8332-b98b2f0be3d2 ## BE Send SQL Query: {}","level":"info"}
  21 +{"message":"phoenix-partner - :: ## - session - d630c3ee-495d-4708-8332-b98b2f0be3d2 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  22 +{"message":"phoenix-partner - :: ## - session - 02df435b-e197-4db8-9d53-3847d9ed5169 ## BE Send SQL Query: {}","level":"info"}
  23 +{"message":"phoenix-partner - :: ## - session - 02df435b-e197-4db8-9d53-3847d9ed5169 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  24 +{"message":"phoenix-partner - :: ## - session - 823a373e-c3dd-4bd5-b623-48361a952bd0 ## BE Send SQL Query: {}","level":"info"}
  25 +{"message":"phoenix-partner - :: ## - session - 823a373e-c3dd-4bd5-b623-48361a952bd0 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  26 +{"message":"phoenix-partner - :: ## - session - d48011c1-f2b3-40bb-9090-18ef6c0f5b7e ## BE Send SQL Query: {}","level":"info"}
  27 +{"message":"phoenix-partner - :: ## - session - d48011c1-f2b3-40bb-9090-18ef6c0f5b7e ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  28 +{"message":"phoenix-partner - :: ## - session - 71840e4c-231d-41dc-9d43-50a88b611980 ## BE Send SQL Query: {}","level":"info"}
  29 +{"message":"phoenix-partner - :: ## - session - 71840e4c-231d-41dc-9d43-50a88b611980 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  30 +{"message":"phoenix-partner - :: ## - session - a7a3a04c-df6e-4515-b851-c7c5282ee3b3 ## BE Send SQL Query: {}","level":"info"}
  31 +{"message":"phoenix-partner - :: ## - session - a7a3a04c-df6e-4515-b851-c7c5282ee3b3 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  32 +{"message":"phoenix-partner - :: ## - session - 23601cfc-b4d3-4b19-afcd-57c78820b83a ## BE Send SQL Query: {}","level":"info"}
  33 +{"message":"phoenix-partner - :: ## - session - 23601cfc-b4d3-4b19-afcd-57c78820b83a ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  34 +{"message":"phoenix-partner - :: ## - session - c6efa713-d937-4cad-af8f-ad312a621bbc ## BE Send SQL Query: {}","level":"info"}
  35 +{"message":"phoenix-partner - :: ## - session - c6efa713-d937-4cad-af8f-ad312a621bbc ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  36 +{"message":"phoenix-partner - :: ## - session - a753c21e-8e1d-47d9-8e95-a55d5bdad3c5 ## BE Send SQL Query: {}","level":"info"}
  37 +{"message":"phoenix-partner - :: ## - session - a753c21e-8e1d-47d9-8e95-a55d5bdad3c5 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  38 +{"message":"phoenix-partner - :: ## - session - 594f180c-7bbc-40be-979b-f96098dda0eb ## BE Send SQL Query: {}","level":"info"}
  39 +{"message":"phoenix-partner - :: ## - session - 594f180c-7bbc-40be-979b-f96098dda0eb ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  40 +{"message":"phoenix-partner - :: ## - session - fa98e57d-e0cf-4586-8b1e-751776699864 ## BE Send SQL Query: {}","level":"info"}
  41 +{"message":"phoenix-partner - :: ## - session - fa98e57d-e0cf-4586-8b1e-751776699864 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  42 +{"message":"phoenix-partner - :: ## - session - 12c6a016-ab6f-4c85-ba10-f45e1c3225f4 ## BE Send SQL Query: {}","level":"info"}
  43 +{"message":"phoenix-partner - :: ## - session - 12c6a016-ab6f-4c85-ba10-f45e1c3225f4 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  44 +{"message":"phoenix-partner - :: ## - session - 1a1e9e3f-70ca-47db-aaeb-f1fd604fa418 ## BE Send SQL Query: {}","level":"info"}
  45 +{"message":"phoenix-partner - :: ## - session - 1a1e9e3f-70ca-47db-aaeb-f1fd604fa418 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  46 +{"message":"phoenix-partner - :: ## - session - d00c1de0-0efc-4972-826c-d474aa03d1a8 ## BE Send SQL Query: {}","level":"info"}
  47 +{"message":"phoenix-partner - :: ## - session - d00c1de0-0efc-4972-826c-d474aa03d1a8 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  48 +{"message":"phoenix-partner - :: ## - session - 7d6f045c-9556-4b80-9084-9c5c6991c730 ## BE Send SQL Query: {}","level":"info"}
  49 +{"message":"phoenix-partner - :: ## - session - 7d6f045c-9556-4b80-9084-9c5c6991c730 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  50 +{"message":"phoenix-partner - :: ## - session - 60be9925-ae7a-4e2f-ac64-53a04444f9d1 ## BE Send SQL Query: {}","level":"info"}
  51 +{"message":"phoenix-partner - :: ## - session - 60be9925-ae7a-4e2f-ac64-53a04444f9d1 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  52 +{"message":"phoenix-partner - :: ## - session - ac1f92c2-e419-4015-aeb7-7a4ca0b50e3b ## BE Send SQL Query: {}","level":"info"}
  53 +{"message":"phoenix-partner - :: ## - session - ac1f92c2-e419-4015-aeb7-7a4ca0b50e3b ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  54 +{"message":"phoenix-partner - :: ## - session - 19e0b589-3830-4312-b217-bd6aeb4d98fd ## BE Send SQL Query: {}","level":"info"}
  55 +{"message":"phoenix-partner - :: ## - session - 19e0b589-3830-4312-b217-bd6aeb4d98fd ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  56 +{"message":"phoenix-partner - :: ## - session - 5dfae968-dc62-45dc-810c-de7760786cfd ## BE Send SQL Query: {}","level":"info"}
  57 +{"message":"phoenix-partner - :: ## - session - 5dfae968-dc62-45dc-810c-de7760786cfd ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  58 +{"message":"phoenix-partner - :: ## - session - f7b5c420-8948-4c44-801e-f692503a89c8 ## BE Send SQL Query: {}","level":"info"}
  59 +{"message":"phoenix-partner - :: ## - session - f7b5c420-8948-4c44-801e-f692503a89c8 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  60 +{"message":"phoenix-partner - :: ## - session - f48ff59b-e4e2-413a-8a2f-5c164017277b ## BE Send SQL Query: {}","level":"info"}
  61 +{"message":"phoenix-partner - :: ## - session - f48ff59b-e4e2-413a-8a2f-5c164017277b ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  62 +{"message":"phoenix-partner - :: ## - session - cd1a1dd2-b3bf-4613-81ba-20a54a71509d ## BE Send SQL Query: {}","level":"info"}
  63 +{"message":"phoenix-partner - :: ## - session - cd1a1dd2-b3bf-4613-81ba-20a54a71509d ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  64 +{"message":"phoenix-partner - :: ## - session - 72d831a2-f27d-4ba6-96eb-df88ff72b2a6 ## BE Send SQL Query: {}","level":"info"}
  65 +{"message":"phoenix-partner - :: ## - session - 72d831a2-f27d-4ba6-96eb-df88ff72b2a6 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  66 +{"message":"phoenix-partner - :: ## - session - ecbdab24-bd90-4d98-9864-51460f488c6a ## BE Send SQL Query: {}","level":"info"}
  67 +{"message":"phoenix-partner - :: ## - session - ecbdab24-bd90-4d98-9864-51460f488c6a ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  68 +{"message":"phoenix-partner - :: ## - session - 2cb96fa4-8d9e-4014-868d-40f52a94a6b3 ## BE Send SQL Query: {}","level":"info"}
  69 +{"message":"phoenix-partner - :: ## - session - 2cb96fa4-8d9e-4014-868d-40f52a94a6b3 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  70 +{"message":"phoenix-partner - :: ## - session - a34107f5-9985-4057-afdf-80b0c3a556ce ## BE Send SQL Query: {}","level":"info"}
  71 +{"message":"phoenix-partner - :: ## - session - a34107f5-9985-4057-afdf-80b0c3a556ce ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  72 +{"message":"phoenix-partner - :: ## - session - cb93ee52-410c-4fcc-9705-40a15ff27589 ## BE Send SQL Query: {}","level":"info"}
  73 +{"message":"phoenix-partner - :: ## - session - cb93ee52-410c-4fcc-9705-40a15ff27589 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  74 +{"message":"phoenix-partner - :: ## - session - 40677992-5b74-4dea-aa23-bc00960e6c8f ## BE Send SQL Query: {}","level":"info"}
  75 +{"message":"phoenix-partner - :: ## - session - 40677992-5b74-4dea-aa23-bc00960e6c8f ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  76 +{"message":"phoenix-partner - :: ## - session - 74f770f3-fa62-42fc-9928-f38eb1bb7c7a ## BE Send SQL Query: {}","level":"info"}
  77 +{"message":"phoenix-partner - :: ## - session - 74f770f3-fa62-42fc-9928-f38eb1bb7c7a ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  78 +{"message":"phoenix-partner - :: ## - session - a546d09f-50ae-4aa6-867c-f5218a5c8ac3 ## BE Send SQL Query: {}","level":"info"}
  79 +{"message":"phoenix-partner - :: ## - session - a546d09f-50ae-4aa6-867c-f5218a5c8ac3 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
  80 +{"message":"phoenix-partner - :: ## - session - 4b3918ad-4407-4bb2-a213-a0da612da513 ## BE Send SQL Query: {}","level":"info"}
  81 +{"message":"phoenix-partner - :: ## - session - 4b3918ad-4407-4bb2-a213-a0da612da513 ## BE Receive SQL Result: [{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"},{\"companyName\":\"เน‚เธฃเธ‡เธžเธขเธฒเธšเธฒเธฅเน€เธ›เธฒเน‚เธฅ เธžเธซเธฅเน‚เธขเธ˜เธดเธ™\"}]","level":"info"}
... ...
logs/express-project
node_modules/log4js/package.json
1 1 {
2   - "_from": "log4js@^3.0.4",
  2 + "_from": "log4js@^3.0.6",
3 3 "_id": "log4js@3.0.6",
4 4 "_inBundle": false,
5 5 "_integrity": "sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==",
... ... @@ -8,12 +8,12 @@
8 8 "_requested": {
9 9 "type": "range",
10 10 "registry": true,
11   - "raw": "log4js@^3.0.4",
  11 + "raw": "log4js@^3.0.6",
12 12 "name": "log4js",
13 13 "escapedName": "log4js",
14   - "rawSpec": "^3.0.4",
  14 + "rawSpec": "^3.0.6",
15 15 "saveSpec": null,
16   - "fetchSpec": "^3.0.4"
  16 + "fetchSpec": "^3.0.6"
17 17 },
18 18 "_requiredBy": [
19 19 "#USER",
... ... @@ -21,8 +21,8 @@
21 21 ],
22 22 "_resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz",
23 23 "_shasum": "e6caced94967eeeb9ce399f9f8682a4b2b28c8ff",
24   - "_spec": "log4js@^3.0.4",
25   - "_where": "C:\\Users\\admin\\Documents\\express-project",
  24 + "_spec": "log4js@^3.0.6",
  25 + "_where": "C:\\myWork\\git\\hospital",
26 26 "author": {
27 27 "name": "Gareth Jones",
28 28 "email": "gareth.nomiddlename@gmail.com"
... ...
node_modules/log4js/types/log4js.d.ts
... ... @@ -1,297 +0,0 @@
1   -// Type definitions for log4js
2   -
3   -type Format = string | ((req: any, res: any, formatter: ((str: string) => string)) => string);
4   -
5   -export interface Log4js {
6   - getLogger(category?: string): Logger;
7   - configure(filename: string): Log4js;
8   - configure(config: Configuration): Log4js;
9   - addLayout(name: string, config: (a: any) => (logEvent: LoggingEvent) => string): void;
10   - connectLogger(logger: Logger, options: { format?: Format; level?: string; nolog?: any; }): any; // express.Handler;
11   - levels: Levels;
12   - shutdown(cb: (error: Error) => void): void | null;
13   -}
14   -
15   -export function getLogger(category?: string): Logger;
16   -
17   -export function configure(filename: string): Log4js;
18   -export function configure(config: Configuration): Log4js;
19   -
20   -export function addLayout(name: string, config: (a: any) => (logEvent: LoggingEvent) => string): void;
21   -
22   -export function connectLogger(logger: Logger, options: { format?: Format; level?: string; nolog?: any; }): any; // express.Handler;
23   -
24   -export const levels: Levels;
25   -
26   -export function shutdown(cb?: (error: Error) => void): void | null;
27   -
28   -export interface BaseLayout {
29   - type: 'basic';
30   -}
31   -
32   -export interface ColoredLayout {
33   - type: 'colored' | 'coloured';
34   -}
35   -
36   -export interface MessagePassThroughLayout {
37   - type: 'messagePassThrough';
38   -}
39   -
40   -export interface DummyLayout {
41   - type: 'dummy';
42   -}
43   -
44   -export interface Level {
45   - isEqualTo(other: string): boolean;
46   - isEqualTo(otherLevel: Level): boolean;
47   - isLessThanOrEqualTo(other: string): boolean;
48   - isLessThanOrEqualTo(otherLevel: Level): boolean;
49   - isGreaterThanOrEqualTo(other: string): boolean;
50   - isGreaterThanOrEqualTo(otherLevel: Level): boolean;
51   -}
52   -
53   -export interface LoggingEvent {
54   - categoryName: string; // name of category
55   - level: Level; // level of message
56   - data: any[]; // objects to log
57   - startTime: Date;
58   - pid: number;
59   - context: any;
60   - cluster?: {
61   - workerId: number;
62   - worker: number;
63   - };
64   -}
65   -
66   -export type Token = ((logEvent: LoggingEvent) => string) | string;
67   -
68   -export interface PatternLayout {
69   - type: 'pattern';
70   - // specifier for the output format, using placeholders as described below
71   - pattern: string;
72   - // user-defined tokens to be used in the pattern
73   - tokens?: { [name: string]: Token };
74   -}
75   -
76   -export interface CustomLayout {
77   - [key: string]: any;
78   - type: string;
79   -}
80   -
81   -export type Layout = BaseLayout | ColoredLayout | MessagePassThroughLayout | DummyLayout | PatternLayout | CustomLayout;
82   -
83   -/**
84   - * Category Filter
85   - *
86   - * @see https://log4js-node.github.io/log4js-node/categoryFilter.html
87   - */
88   -export interface CategoryFilterAppender {
89   - type: "categoryFilter";
90   - // the category (or categories if you provide an array of values) that will be excluded from the appender.
91   - exclude?: string | string[];
92   - // the name of the appender to filter. see https://log4js-node.github.io/log4js-node/layouts.html
93   - appender?: string;
94   -}
95   -
96   -/**
97   - * Console Appender
98   - *
99   - * @see https://log4js-node.github.io/log4js-node/console.html
100   - */
101   -export interface ConsoleAppender {
102   - type: 'console';
103   - // defaults to colouredLayout
104   - layout?: Layout;
105   -}
106   -
107   -export interface FileAppender {
108   - type: 'file';
109   - // the path of the file where you want your logs written.
110   - filename: string;
111   - // the maximum size (in bytes) for the log file. If not specified, then no log rolling will happen.
112   - maxLogSize?: number | string;
113   - // (default value = 5) - the number of old log files to keep during log rolling.
114   - backups?: number;
115   - // defaults to basic layout
116   - layout?: Layout;
117   - numBackups?: number;
118   - compress?: boolean; // compress the backups
119   - // keep the file extension when rotating logs
120   - keepFileExt?: boolean;
121   - encoding?: string;
122   - mode?: number;
123   - flags?: string;
124   -}
125   -
126   -export interface SyncfileAppender {
127   - type: 'fileSync';
128   - // the path of the file where you want your logs written.
129   - filename: string;
130   - // the maximum size (in bytes) for the log file. If not specified, then no log rolling will happen.
131   - maxLogSize?: number | string;
132   - // (default value = 5) - the number of old log files to keep during log rolling.
133   - backups?: number;
134   - // defaults to basic layout
135   - layout?: Layout;
136   -}
137   -
138   -export interface DateFileAppender {
139   - type: 'dateFile';
140   - // the path of the file where you want your logs written.
141   - filename: string;
142   - // defaults to basic layout
143   - layout?: Layout;
144   - // defaults to .yyyy-MM-dd - the pattern to use to determine when to roll the logs.
145   - /**
146   - * The following strings are recognised in the pattern:
147   - * - yyyy : the full year, use yy for just the last two digits
148   - * - MM : the month
149   - * - dd : the day of the month
150   - * - hh : the hour of the day (24-hour clock)
151   - * - mm : the minute of the hour
152   - * - ss : seconds
153   - * - SSS : milliseconds (although I'm not sure you'd want to roll your logs every millisecond)
154   - * - O : timezone (capital letter o)
155   - */
156   - pattern?: string;
157   - // default โ€œutf-8โ€
158   - encoding?: string;
159   - // default 0644
160   - mode?: number;
161   - // default โ€˜aโ€™
162   - flags?: string;
163   - // compress the backup files during rolling (backup files will have .gz extension)(default false)
164   - compress?: boolean;
165   - // include the pattern in the name of the current log file as well as the backups.(default false)
166   - alwaysIncludePattern?: boolean;
167   - // keep the file extension when rotating logs
168   - keepFileExt?: boolean;
169   - // if this value is greater than zero, then files older than that many days will be deleted during log rolling.(default 0)
170   - daysToKeep?: number;
171   -}
172   -
173   -export interface LogLevelFilterAppender {
174   - type: 'logLevelFilter';
175   - // the name of an appender, defined in the same configuration, that you want to filter
176   - appender: string;
177   - // the minimum level of event to allow through the filter
178   - level: string;
179   - // (defaults to FATAL) - the maximum level of event to allow through the filter
180   - maxLevel?: string;
181   -}
182   -
183   -export interface MultiFileAppender {
184   - type: 'multiFile';
185   - // the base part of the generated log filename
186   - base: string;
187   - // the value to use to split files (see below).
188   - property: string;
189   - // the suffix for the generated log filename.
190   - extension: string;
191   -}
192   -
193   -export interface MultiprocessAppender {
194   - type: 'multiprocess';
195   - // controls whether the appender listens for log events sent over the network, or is responsible for serialising events and sending them to a server.
196   - mode: 'master' | 'worker';
197   - // (only needed if mode == master)- the name of the appender to send the log events to
198   - appender?: string;
199   - // (defaults to 5000) - the port to listen on, or send to
200   - loggerPort?: number;
201   - // (defaults to localhost) - the host/IP address to listen on, or send to
202   - loggerHost?: string;
203   -}
204   -
205   -export interface RecordingAppender {
206   - type: 'recording';
207   -}
208   -
209   -export interface StandardErrorAppender {
210   - type: 'stderr';
211   - // (defaults to colouredLayout)
212   - layout?: Layout;
213   -}
214   -
215   -export interface StandardOutputAppender {
216   - type: 'stdout';
217   - // (defaults to colouredLayout)
218   - layout?: Layout;
219   -}
220   -
221   -export interface CustomAppender {
222   - type: string;
223   - [key: string]: any;
224   -}
225   -
226   -export type Appender = CategoryFilterAppender
227   - | ConsoleAppender
228   - | FileAppender
229   - | SyncfileAppender
230   - | DateFileAppender
231   - | LogLevelFilterAppender
232   - | MultiFileAppender
233   - | MultiprocessAppender
234   - | RecordingAppender
235   - | StandardErrorAppender
236   - | StandardOutputAppender
237   - | CustomAppender;
238   -
239   -export interface Levels {
240   - ALL: Level;
241   - MARK: Level;
242   - TRACE: Level;
243   - DEBUG: Level;
244   - INFO: Level;
245   - WARN: Level;
246   - ERROR: Level;
247   - FATAL: Level;
248   - OFF: Level;
249   - levels: Level[];
250   - getLevel(level: string): Level;
251   -}
252   -
253   -export interface Configuration {
254   - appenders: { [name: string]: Appender; };
255   - categories: { [name: string]: { appenders: string[]; level: string; } };
256   - pm2?: boolean;
257   - pm2InstanceVar?: string;
258   - levels?: Levels;
259   - disableClustering?: boolean;
260   -}
261   -
262   -export class Logger {
263   - new(dispatch: Function, name: string): Logger;
264   -
265   - level: string;
266   -
267   - log(...args: any[]): void;
268   -
269   - isLevelEnabled(level?: string): boolean;
270   -
271   - isTraceEnabled(): boolean;
272   - isDebugEnabled(): boolean;
273   - isInfoEnabled(): boolean;
274   - isWarnEnabled(): boolean;
275   - isErrorEnabled(): boolean;
276   - isFatalEnabled(): boolean;
277   -
278   - _log(level: string, data: any): void;
279   -
280   - addContext(key: string, value: any): void;
281   -
282   - removeContext(key: string): void;
283   -
284   - clearContext(): void;
285   -
286   - trace(message: any, ...args: any[]): void;
287   -
288   - debug(message: any, ...args: any[]): void;
289   -
290   - info(message: any, ...args: any[]): void;
291   -
292   - warn(message: any, ...args: any[]): void;
293   -
294   - error(message: any, ...args: any[]): void;
295   -
296   - fatal(message: any, ...args: any[]): void;
297   -}
node_modules/log4js/types/test.ts
... ... @@ -1,131 +0,0 @@
1   -import * as log4js from './log4js';
2   -
3   -log4js.configure('./filename');
4   -const logger1 = log4js.getLogger();
5   -logger1.level = 'debug';
6   -logger1.debug("Some debug messages");
7   -logger1.fatal({
8   - whatever: 'foo'
9   -})
10   -
11   -const logger3 = log4js.getLogger('cheese');
12   -logger3.trace('Entering cheese testing');
13   -logger3.debug('Got cheese.');
14   -logger3.info('Cheese is Gouda.');
15   -logger3.warn('Cheese is quite smelly.');
16   -logger3.error('Cheese is too ripe!');
17   -logger3.fatal('Cheese was breeding ground for listeria.');
18   -
19   -log4js.configure({
20   - appenders: { cheese: { type: 'console', filename: 'cheese.log' } },
21   - categories: { default: { appenders: ['cheese'], level: 'error' } }
22   -});
23   -
24   -log4js.configure({
25   - appenders: {
26   - out: { type: 'file', filename: 'pm2logs.log' }
27   - },
28   - categories: {
29   - default: { appenders: ['out'], level: 'info' }
30   - },
31   - pm2: true,
32   - pm2InstanceVar: 'INSTANCE_ID'
33   -});
34   -
35   -log4js.addLayout('json', config => function (logEvent) {
36   - return JSON.stringify(logEvent) + config.separator;
37   -});
38   -
39   -log4js.configure({
40   - appenders: {
41   - out: { type: 'stdout', layout: { type: 'json', separator: ',' } }
42   - },
43   - categories: {
44   - default: { appenders: ['out'], level: 'info' }
45   - }
46   -});
47   -
48   -log4js.configure({
49   - appenders: {
50   - file: { type: 'dateFile', filename: 'thing.log', pattern: '.mm' }
51   - },
52   - categories: {
53   - default: { appenders: ['file'], level: 'debug' }
54   - }
55   -});
56   -
57   -const logger4 = log4js.getLogger('thing');
58   -logger4.log('logging a thing');
59   -
60   -const logger5 = log4js.getLogger('json-test');
61   -logger5.info('this is just a test');
62   -logger5.error('of a custom appender');
63   -logger5.warn('that outputs json');
64   -log4js.shutdown(() => { });
65   -
66   -log4js.configure({
67   - appenders: {
68   - cheeseLogs: { type: 'file', filename: 'cheese.log' },
69   - console: { type: 'console' }
70   - },
71   - categories: {
72   - cheese: { appenders: ['cheeseLogs'], level: 'error' },
73   - another: { appenders: ['console'], level: 'trace' },
74   - default: { appenders: ['console', 'cheeseLogs'], level: 'trace' }
75   - }
76   -});
77   -
78   -const logger6 = log4js.getLogger('cheese');
79   -// only errors and above get logged.
80   -const otherLogger = log4js.getLogger();
81   -
82   -// this will get coloured output on console, and appear in cheese.log
83   -otherLogger.error('AAArgh! Something went wrong', { some: 'otherObject', useful_for: 'debug purposes' });
84   -otherLogger.log('This should appear as info output');
85   -
86   -// these will not appear (logging level beneath error)
87   -logger6.trace('Entering cheese testing');
88   -logger6.debug('Got cheese.');
89   -logger6.info('Cheese is Gouda.');
90   -logger6.log('Something funny about cheese.');
91   -logger6.warn('Cheese is quite smelly.');
92   -// these end up only in cheese.log
93   -logger6.error('Cheese %s is too ripe!', 'gouda');
94   -logger6.fatal('Cheese was breeding ground for listeria.');
95   -
96   -// these don't end up in cheese.log, but will appear on the console
97   -const anotherLogger = log4js.getLogger('another');
98   -anotherLogger.debug('Just checking');
99   -
100   -// will also go to console and cheese.log, since that's configured for all categories
101   -const pantsLog = log4js.getLogger('pants');
102   -pantsLog.debug('Something for pants');
103   -
104   -
105   -import { configure, getLogger } from './log4js';
106   -configure('./filename');
107   -const logger2 = getLogger();
108   -logger2.level = 'debug';
109   -logger2.debug("Some debug messages");
110   -
111   -configure({
112   - appenders: { cheese: { type: 'file', filename: 'cheese.log' } },
113   - categories: { default: { appenders: ['cheese'], level: 'error' } }
114   -});
115   -
116   -log4js.configure('./filename').getLogger();
117   -const logger7 = log4js.getLogger();
118   -logger7.level = 'debug';
119   -logger7.debug("Some debug messages");
120   -
121   -const levels: log4js.Levels = log4js.levels;
122   -const level: log4js.Level = levels.getLevel('info');
123   -
124   -log4js.connectLogger(logger1, {
125   - format: ':x, :y',
126   - level: 'info'
127   -});
128   -
129   -log4js.connectLogger(logger2, {
130   - format: (req, _res, format) => format(`:remote-addr - ${req.id} - ":method :url HTTP/:http-version" :status :content-length ":referrer" ":user-agent"`)
131   -});
node_modules/log4js/types/tsconfig.json
... ... @@ -1,9 +0,0 @@
1   -{
2   - "compileOnSave": false,
3   - "compilerOptions": {
4   - "strict": true,
5   - "noUnusedParameters": true,
6   - "noUnusedLocals": false,
7   - "noEmit": true
8   - }
9   -}
package-lock.json
... ... @@ -18,6 +18,11 @@
18 18 "lodash.kebabcase": "4.1.1"
19 19 }
20 20 },
  21 + "abbrev": {
  22 + "version": "1.1.1",
  23 + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
  24 + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
  25 + },
21 26 "accepts": {
22 27 "version": "1.3.5",
23 28 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
... ... @@ -27,6 +32,17 @@
27 32 "negotiator": "0.6.1"
28 33 }
29 34 },
  35 + "ajv": {
  36 + "version": "5.5.2",
  37 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
  38 + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
  39 + "requires": {
  40 + "co": "4.6.0",
  41 + "fast-deep-equal": "1.1.0",
  42 + "fast-json-stable-stringify": "2.0.0",
  43 + "json-schema-traverse": "0.3.1"
  44 + }
  45 + },
30 46 "align-text": {
31 47 "version": "0.1.4",
32 48 "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
... ... @@ -52,6 +68,20 @@
52 68 "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz",
53 69 "integrity": "sha1-ZBqlXft9am8KgUHEucCqULbCTdU="
54 70 },
  71 + "aproba": {
  72 + "version": "1.2.0",
  73 + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
  74 + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
  75 + },
  76 + "are-we-there-yet": {
  77 + "version": "1.1.5",
  78 + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
  79 + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
  80 + "requires": {
  81 + "delegates": "1.0.0",
  82 + "readable-stream": "2.3.6"
  83 + }
  84 + },
55 85 "array-flatten": {
56 86 "version": "1.1.1",
57 87 "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
... ... @@ -78,6 +108,11 @@
78 108 "lodash": "4.17.11"
79 109 }
80 110 },
  111 + "asynckit": {
  112 + "version": "0.4.0",
  113 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
  114 + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
  115 + },
81 116 "aws-sign2": {
82 117 "version": "0.6.0",
83 118 "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
... ... @@ -101,6 +136,14 @@
101 136 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
102 137 "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
103 138 },
  139 + "basic-auth": {
  140 + "version": "2.0.1",
  141 + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
  142 + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
  143 + "requires": {
  144 + "safe-buffer": "5.1.2"
  145 + }
  146 + },
104 147 "bcrypt-pbkdf": {
105 148 "version": "1.0.2",
106 149 "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
... ... @@ -241,6 +284,11 @@
241 284 "es6-object-assign": "1.1.0"
242 285 }
243 286 },
  287 + "chownr": {
  288 + "version": "1.1.1",
  289 + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz",
  290 + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g=="
  291 + },
244 292 "circular-json": {
245 293 "version": "0.5.7",
246 294 "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.7.tgz",
... ... @@ -256,6 +304,16 @@
256 304 "wordwrap": "0.0.2"
257 305 }
258 306 },
  307 + "co": {
  308 + "version": "4.6.0",
  309 + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
  310 + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
  311 + },
  312 + "code-point-at": {
  313 + "version": "1.1.0",
  314 + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
  315 + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
  316 + },
259 317 "color": {
260 318 "version": "3.0.0",
261 319 "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz",
... ... @@ -319,6 +377,18 @@
319 377 "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
320 378 "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg=="
321 379 },
  380 + "commonlog-kb": {
  381 + "version": "1.3.5",
  382 + "resolved": "https://registry.npmjs.org/commonlog-kb/-/commonlog-kb-1.3.5.tgz",
  383 + "integrity": "sha512-kU73yTQtO67Cs84+OL8Fi/xlbIT1fQ+vl4pcd69kkW+8PU2JZD9lRtcJ+K/AeKh+LUiTQdxrsQP/9sUJG4UD1A==",
  384 + "requires": {
  385 + "dateformat": "3.0.3",
  386 + "node-cron": "1.2.1",
  387 + "on-headers": "1.0.1",
  388 + "rotating-file-stream": "1.3.9",
  389 + "sqlite3": "4.0.2"
  390 + }
  391 + },
322 392 "concat-map": {
323 393 "version": "0.0.1",
324 394 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
... ... @@ -363,6 +433,11 @@
363 433 }
364 434 }
365 435 },
  436 + "console-control-strings": {
  437 + "version": "1.1.0",
  438 + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
  439 + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
  440 + },
366 441 "content-disposition": {
367 442 "version": "0.5.2",
368 443 "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
... ... @@ -435,6 +510,11 @@
435 510 "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz",
436 511 "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg="
437 512 },
  513 + "dateformat": {
  514 + "version": "3.0.3",
  515 + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
  516 + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q=="
  517 + },
438 518 "debug": {
439 519 "version": "2.6.9",
440 520 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
... ... @@ -448,11 +528,21 @@
448 528 "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
449 529 "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
450 530 },
  531 + "deep-extend": {
  532 + "version": "0.6.0",
  533 + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
  534 + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
  535 + },
451 536 "delayed-stream": {
452 537 "version": "0.0.5",
453 538 "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz",
454 539 "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8="
455 540 },
  541 + "delegates": {
  542 + "version": "1.0.0",
  543 + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
  544 + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
  545 + },
456 546 "depd": {
457 547 "version": "1.1.2",
458 548 "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
... ... @@ -463,6 +553,11 @@
463 553 "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
464 554 "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
465 555 },
  556 + "detect-libc": {
  557 + "version": "1.0.3",
  558 + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
  559 + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
  560 + },
466 561 "diagnostics": {
467 562 "version": "1.1.1",
468 563 "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz",
... ... @@ -646,6 +741,16 @@
646 741 "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
647 742 "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
648 743 },
  744 + "fast-deep-equal": {
  745 + "version": "1.1.0",
  746 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
  747 + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
  748 + },
  749 + "fast-json-stable-stringify": {
  750 + "version": "2.0.0",
  751 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
  752 + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
  753 + },
649 754 "fast-safe-stringify": {
650 755 "version": "2.0.6",
651 756 "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz",
... ... @@ -715,11 +820,34 @@
715 820 "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
716 821 "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
717 822 },
  823 + "fs-minipass": {
  824 + "version": "1.2.5",
  825 + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
  826 + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
  827 + "requires": {
  828 + "minipass": "2.3.4"
  829 + }
  830 + },
718 831 "fs.realpath": {
719 832 "version": "1.0.0",
720 833 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
721 834 "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
722 835 },
  836 + "gauge": {
  837 + "version": "2.7.4",
  838 + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
  839 + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
  840 + "requires": {
  841 + "aproba": "1.2.0",
  842 + "console-control-strings": "1.1.0",
  843 + "has-unicode": "2.0.1",
  844 + "object-assign": "4.1.1",
  845 + "signal-exit": "3.0.2",
  846 + "string-width": "1.0.2",
  847 + "strip-ansi": "3.0.1",
  848 + "wide-align": "1.1.3"
  849 + }
  850 + },
723 851 "generate-function": {
724 852 "version": "2.3.1",
725 853 "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
... ... @@ -769,6 +897,11 @@
769 897 "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
770 898 "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA=="
771 899 },
  900 + "har-schema": {
  901 + "version": "2.0.0",
  902 + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
  903 + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
  904 + },
772 905 "har-validator": {
773 906 "version": "2.0.6",
774 907 "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
... ... @@ -793,6 +926,11 @@
793 926 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
794 927 "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
795 928 },
  929 + "has-unicode": {
  930 + "version": "2.0.1",
  931 + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
  932 + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
  933 + },
796 934 "hawk": {
797 935 "version": "3.1.3",
798 936 "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
... ... @@ -851,6 +989,14 @@
851 989 "safer-buffer": "2.1.2"
852 990 }
853 991 },
  992 + "ignore-walk": {
  993 + "version": "3.0.1",
  994 + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz",
  995 + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
  996 + "requires": {
  997 + "minimatch": "3.0.4"
  998 + }
  999 + },
854 1000 "indicative": {
855 1001 "version": "3.0.6",
856 1002 "resolved": "https://registry.npmjs.org/indicative/-/indicative-3.0.6.tgz",
... ... @@ -881,6 +1027,11 @@
881 1027 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
882 1028 "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
883 1029 },
  1030 + "ini": {
  1031 + "version": "1.3.5",
  1032 + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
  1033 + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
  1034 + },
884 1035 "ipaddr.js": {
885 1036 "version": "1.8.0",
886 1037 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
... ... @@ -896,6 +1047,14 @@
896 1047 "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
897 1048 "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
898 1049 },
  1050 + "is-fullwidth-code-point": {
  1051 + "version": "1.0.0",
  1052 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
  1053 + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
  1054 + "requires": {
  1055 + "number-is-nan": "1.0.1"
  1056 + }
  1057 + },
899 1058 "is-my-ip-valid": {
900 1059 "version": "1.0.0",
901 1060 "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
... ... @@ -948,6 +1107,11 @@
948 1107 "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
949 1108 "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
950 1109 },
  1110 + "json-schema-traverse": {
  1111 + "version": "0.3.1",
  1112 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
  1113 + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A="
  1114 + },
951 1115 "json-stringify-safe": {
952 1116 "version": "5.0.1",
953 1117 "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
... ... @@ -1154,6 +1318,23 @@
1154 1318 "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1155 1319 "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
1156 1320 },
  1321 + "minipass": {
  1322 + "version": "2.3.4",
  1323 + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.4.tgz",
  1324 + "integrity": "sha512-mlouk1OHlaUE8Odt1drMtG1bAJA4ZA6B/ehysgV0LUIrDHdKgo1KorZq3pK0b/7Z7LJIQ12MNM6aC+Tn6lUZ5w==",
  1325 + "requires": {
  1326 + "safe-buffer": "5.1.2",
  1327 + "yallist": "3.0.2"
  1328 + }
  1329 + },
  1330 + "minizlib": {
  1331 + "version": "1.1.1",
  1332 + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.1.tgz",
  1333 + "integrity": "sha512-TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg==",
  1334 + "requires": {
  1335 + "minipass": "2.3.4"
  1336 + }
  1337 + },
1157 1338 "mkdirp": {
1158 1339 "version": "0.5.1",
1159 1340 "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
... ... @@ -1228,6 +1409,18 @@
1228 1409 "saslprep": "1.0.2"
1229 1410 }
1230 1411 },
  1412 + "morgan": {
  1413 + "version": "1.9.1",
  1414 + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz",
  1415 + "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==",
  1416 + "requires": {
  1417 + "basic-auth": "2.0.1",
  1418 + "debug": "2.6.9",
  1419 + "depd": "1.1.2",
  1420 + "on-finished": "2.3.0",
  1421 + "on-headers": "1.0.1"
  1422 + }
  1423 + },
1231 1424 "ms": {
1232 1425 "version": "2.0.0",
1233 1426 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
... ... @@ -1256,11 +1449,26 @@
1256 1449 "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=",
1257 1450 "optional": true
1258 1451 },
  1452 + "needle": {
  1453 + "version": "2.2.4",
  1454 + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz",
  1455 + "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==",
  1456 + "requires": {
  1457 + "debug": "2.6.9",
  1458 + "iconv-lite": "0.4.23",
  1459 + "sax": "1.2.4"
  1460 + }
  1461 + },
1259 1462 "negotiator": {
1260 1463 "version": "0.6.1",
1261 1464 "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
1262 1465 "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
1263 1466 },
  1467 + "node-cron": {
  1468 + "version": "1.2.1",
  1469 + "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-1.2.1.tgz",
  1470 + "integrity": "sha1-jJC8XccjpWKJsHhmVatKHEy2A2g="
  1471 + },
1264 1472 "node-forge": {
1265 1473 "version": "0.7.6",
1266 1474 "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz",
... ... @@ -1271,11 +1479,82 @@
1271 1479 "resolved": "https://registry.npmjs.org/node-json-config/-/node-json-config-0.0.4.tgz",
1272 1480 "integrity": "sha1-6e+xih5l/TSMudKVGIlwjmaEheo="
1273 1481 },
  1482 + "node-pre-gyp": {
  1483 + "version": "0.10.3",
  1484 + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz",
  1485 + "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==",
  1486 + "requires": {
  1487 + "detect-libc": "1.0.3",
  1488 + "mkdirp": "0.5.1",
  1489 + "needle": "2.2.4",
  1490 + "nopt": "4.0.1",
  1491 + "npm-packlist": "1.1.12",
  1492 + "npmlog": "4.1.2",
  1493 + "rc": "1.2.8",
  1494 + "rimraf": "2.6.2",
  1495 + "semver": "5.6.0",
  1496 + "tar": "4.4.6"
  1497 + },
  1498 + "dependencies": {
  1499 + "rimraf": {
  1500 + "version": "2.6.2",
  1501 + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
  1502 + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
  1503 + "requires": {
  1504 + "glob": "7.1.2"
  1505 + }
  1506 + }
  1507 + }
  1508 + },
  1509 + "nopt": {
  1510 + "version": "4.0.1",
  1511 + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
  1512 + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
  1513 + "requires": {
  1514 + "abbrev": "1.1.1",
  1515 + "osenv": "0.1.5"
  1516 + }
  1517 + },
  1518 + "npm-bundled": {
  1519 + "version": "1.0.5",
  1520 + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz",
  1521 + "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g=="
  1522 + },
  1523 + "npm-packlist": {
  1524 + "version": "1.1.12",
  1525 + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.12.tgz",
  1526 + "integrity": "sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g==",
  1527 + "requires": {
  1528 + "ignore-walk": "3.0.1",
  1529 + "npm-bundled": "1.0.5"
  1530 + }
  1531 + },
  1532 + "npmlog": {
  1533 + "version": "4.1.2",
  1534 + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
  1535 + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
  1536 + "requires": {
  1537 + "are-we-there-yet": "1.1.5",
  1538 + "console-control-strings": "1.1.0",
  1539 + "gauge": "2.7.4",
  1540 + "set-blocking": "2.0.0"
  1541 + }
  1542 + },
  1543 + "number-is-nan": {
  1544 + "version": "1.0.1",
  1545 + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
  1546 + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
  1547 + },
1274 1548 "oauth-sign": {
1275 1549 "version": "0.8.2",
1276 1550 "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
1277 1551 "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM="
1278 1552 },
  1553 + "object-assign": {
  1554 + "version": "4.1.1",
  1555 + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
  1556 + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
  1557 + },
1279 1558 "on-finished": {
1280 1559 "version": "2.3.0",
1281 1560 "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
... ... @@ -1302,6 +1581,25 @@
1302 1581 "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz",
1303 1582 "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4="
1304 1583 },
  1584 + "os-homedir": {
  1585 + "version": "1.0.2",
  1586 + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
  1587 + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
  1588 + },
  1589 + "os-tmpdir": {
  1590 + "version": "1.0.2",
  1591 + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
  1592 + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
  1593 + },
  1594 + "osenv": {
  1595 + "version": "0.1.5",
  1596 + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
  1597 + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
  1598 + "requires": {
  1599 + "os-homedir": "1.0.2",
  1600 + "os-tmpdir": "1.0.2"
  1601 + }
  1602 + },
1305 1603 "p-lazy": {
1306 1604 "version": "1.0.0",
1307 1605 "resolved": "https://registry.npmjs.org/p-lazy/-/p-lazy-1.0.0.tgz",
... ... @@ -1404,6 +1702,11 @@
1404 1702 "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
1405 1703 "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10="
1406 1704 },
  1705 + "performance-now": {
  1706 + "version": "2.1.0",
  1707 + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
  1708 + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
  1709 + },
1407 1710 "pinkie": {
1408 1711 "version": "2.0.4",
1409 1712 "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
... ... @@ -1446,6 +1749,11 @@
1446 1749 "ipaddr.js": "1.8.0"
1447 1750 }
1448 1751 },
  1752 + "psl": {
  1753 + "version": "1.1.29",
  1754 + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
  1755 + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ=="
  1756 + },
1449 1757 "punycode": {
1450 1758 "version": "1.4.1",
1451 1759 "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
... ... @@ -1482,6 +1790,24 @@
1482 1790 "unpipe": "1.0.0"
1483 1791 }
1484 1792 },
  1793 + "rc": {
  1794 + "version": "1.2.8",
  1795 + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
  1796 + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
  1797 + "requires": {
  1798 + "deep-extend": "0.6.0",
  1799 + "ini": "1.3.5",
  1800 + "minimist": "1.2.0",
  1801 + "strip-json-comments": "2.0.1"
  1802 + },
  1803 + "dependencies": {
  1804 + "minimist": {
  1805 + "version": "1.2.0",
  1806 + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
  1807 + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
  1808 + }
  1809 + }
  1810 + },
1485 1811 "readable-stream": {
1486 1812 "version": "2.3.6",
1487 1813 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
... ... @@ -1635,6 +1961,11 @@
1635 1961 }
1636 1962 }
1637 1963 },
  1964 + "rotating-file-stream": {
  1965 + "version": "1.3.9",
  1966 + "resolved": "https://registry.npmjs.org/rotating-file-stream/-/rotating-file-stream-1.3.9.tgz",
  1967 + "integrity": "sha512-LQEN1lYP/fOvNsjJsfQUW93cXRxt5Yp0BHVxUhreZAjFRlQ4Hyv7Pt6MKuek8U2ZpKpA8dvKvjzyOapvsRK7Fg=="
  1968 + },
1638 1969 "safe-buffer": {
1639 1970 "version": "5.1.2",
1640 1971 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
... ... @@ -1701,11 +2032,21 @@
1701 2032 "send": "0.16.2"
1702 2033 }
1703 2034 },
  2035 + "set-blocking": {
  2036 + "version": "2.0.0",
  2037 + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
  2038 + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
  2039 + },
1704 2040 "setprototypeof": {
1705 2041 "version": "1.1.0",
1706 2042 "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
1707 2043 "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
1708 2044 },
  2045 + "signal-exit": {
  2046 + "version": "3.0.2",
  2047 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
  2048 + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
  2049 + },
1709 2050 "simple-swizzle": {
1710 2051 "version": "0.2.2",
1711 2052 "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
... ... @@ -1736,6 +2077,139 @@
1736 2077 "memory-pager": "1.1.0"
1737 2078 }
1738 2079 },
  2080 + "sqlite3": {
  2081 + "version": "4.0.2",
  2082 + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.0.2.tgz",
  2083 + "integrity": "sha512-51ferIRwYOhzUEtogqOa/y9supADlAht98bF/gbIi6WkzRJX6Yioldxbzj1MV4yV+LgdKD/kkHwFTeFXOG4htA==",
  2084 + "requires": {
  2085 + "nan": "2.10.0",
  2086 + "node-pre-gyp": "0.10.3",
  2087 + "request": "2.88.0"
  2088 + },
  2089 + "dependencies": {
  2090 + "assert-plus": {
  2091 + "version": "1.0.0",
  2092 + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
  2093 + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
  2094 + },
  2095 + "aws-sign2": {
  2096 + "version": "0.7.0",
  2097 + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
  2098 + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
  2099 + },
  2100 + "caseless": {
  2101 + "version": "0.12.0",
  2102 + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
  2103 + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
  2104 + },
  2105 + "combined-stream": {
  2106 + "version": "1.0.7",
  2107 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
  2108 + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
  2109 + "requires": {
  2110 + "delayed-stream": "1.0.0"
  2111 + }
  2112 + },
  2113 + "delayed-stream": {
  2114 + "version": "1.0.0",
  2115 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
  2116 + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
  2117 + },
  2118 + "form-data": {
  2119 + "version": "2.3.2",
  2120 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
  2121 + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
  2122 + "requires": {
  2123 + "asynckit": "0.4.0",
  2124 + "combined-stream": "1.0.6",
  2125 + "mime-types": "2.1.20"
  2126 + },
  2127 + "dependencies": {
  2128 + "combined-stream": {
  2129 + "version": "1.0.6",
  2130 + "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
  2131 + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
  2132 + "requires": {
  2133 + "delayed-stream": "1.0.0"
  2134 + }
  2135 + }
  2136 + }
  2137 + },
  2138 + "har-validator": {
  2139 + "version": "5.1.0",
  2140 + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
  2141 + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
  2142 + "requires": {
  2143 + "ajv": "5.5.2",
  2144 + "har-schema": "2.0.0"
  2145 + }
  2146 + },
  2147 + "http-signature": {
  2148 + "version": "1.2.0",
  2149 + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
  2150 + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
  2151 + "requires": {
  2152 + "assert-plus": "1.0.0",
  2153 + "jsprim": "1.4.1",
  2154 + "sshpk": "1.15.1"
  2155 + }
  2156 + },
  2157 + "nan": {
  2158 + "version": "2.10.0",
  2159 + "resolved": "http://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
  2160 + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA=="
  2161 + },
  2162 + "oauth-sign": {
  2163 + "version": "0.9.0",
  2164 + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
  2165 + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
  2166 + },
  2167 + "request": {
  2168 + "version": "2.88.0",
  2169 + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
  2170 + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
  2171 + "requires": {
  2172 + "aws-sign2": "0.7.0",
  2173 + "aws4": "1.8.0",
  2174 + "caseless": "0.12.0",
  2175 + "combined-stream": "1.0.7",
  2176 + "extend": "3.0.2",
  2177 + "forever-agent": "0.6.1",
  2178 + "form-data": "2.3.2",
  2179 + "har-validator": "5.1.0",
  2180 + "http-signature": "1.2.0",
  2181 + "is-typedarray": "1.0.0",
  2182 + "isstream": "0.1.2",
  2183 + "json-stringify-safe": "5.0.1",
  2184 + "mime-types": "2.1.20",
  2185 + "oauth-sign": "0.9.0",
  2186 + "performance-now": "2.1.0",
  2187 + "qs": "6.5.2",
  2188 + "safe-buffer": "5.1.2",
  2189 + "tough-cookie": "2.4.3",
  2190 + "tunnel-agent": "0.6.0",
  2191 + "uuid": "3.3.2"
  2192 + }
  2193 + },
  2194 + "tough-cookie": {
  2195 + "version": "2.4.3",
  2196 + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
  2197 + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
  2198 + "requires": {
  2199 + "psl": "1.1.29",
  2200 + "punycode": "1.4.1"
  2201 + }
  2202 + },
  2203 + "tunnel-agent": {
  2204 + "version": "0.6.0",
  2205 + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
  2206 + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
  2207 + "requires": {
  2208 + "safe-buffer": "5.1.2"
  2209 + }
  2210 + }
  2211 + }
  2212 + },
1739 2213 "sshpk": {
1740 2214 "version": "1.15.1",
1741 2215 "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz",
... ... @@ -1795,6 +2269,16 @@
1795 2269 }
1796 2270 }
1797 2271 },
  2272 + "string-width": {
  2273 + "version": "1.0.2",
  2274 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
  2275 + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
  2276 + "requires": {
  2277 + "code-point-at": "1.1.0",
  2278 + "is-fullwidth-code-point": "1.0.0",
  2279 + "strip-ansi": "3.0.1"
  2280 + }
  2281 + },
1798 2282 "string_decoder": {
1799 2283 "version": "1.1.1",
1800 2284 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
... ... @@ -1816,11 +2300,30 @@
1816 2300 "ansi-regex": "2.1.1"
1817 2301 }
1818 2302 },
  2303 + "strip-json-comments": {
  2304 + "version": "2.0.1",
  2305 + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
  2306 + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
  2307 + },
1819 2308 "supports-color": {
1820 2309 "version": "2.0.0",
1821 2310 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1822 2311 "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
1823 2312 },
  2313 + "tar": {
  2314 + "version": "4.4.6",
  2315 + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.6.tgz",
  2316 + "integrity": "sha512-tMkTnh9EdzxyfW+6GK6fCahagXsnYk6kE6S9Gr9pjVdys769+laCTbodXDhPAjzVtEBazRgP0gYqOjnk9dQzLg==",
  2317 + "requires": {
  2318 + "chownr": "1.1.1",
  2319 + "fs-minipass": "1.2.5",
  2320 + "minipass": "2.3.4",
  2321 + "minizlib": "1.1.1",
  2322 + "mkdirp": "0.5.1",
  2323 + "safe-buffer": "5.1.2",
  2324 + "yallist": "3.0.2"
  2325 + }
  2326 + },
1824 2327 "text-hex": {
1825 2328 "version": "1.0.0",
1826 2329 "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
... ... @@ -1964,6 +2467,14 @@
1964 2467 }
1965 2468 }
1966 2469 },
  2470 + "wide-align": {
  2471 + "version": "1.1.3",
  2472 + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
  2473 + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
  2474 + "requires": {
  2475 + "string-width": "1.0.2"
  2476 + }
  2477 + },
1967 2478 "window-size": {
1968 2479 "version": "0.1.0",
1969 2480 "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
... ... @@ -2074,6 +2585,11 @@
2074 2585 "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
2075 2586 "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
2076 2587 },
  2588 + "yallist": {
  2589 + "version": "3.0.2",
  2590 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz",
  2591 + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k="
  2592 + },
2077 2593 "yargs": {
2078 2594 "version": "3.10.0",
2079 2595 "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
... ...
package.json
... ... @@ -12,6 +12,7 @@
12 12 "dependencies": {
13 13 "app-module-path": "^2.2.0",
14 14 "body-parser": "^1.18.3",
  15 + "commonlog-kb": "^1.3.5",
15 16 "connect-flash": "^0.1.1",
16 17 "connect-redis": "^3.4.0",
17 18 "cookie-parser": "^1.4.3",
... ... @@ -24,6 +25,7 @@
24 25 "mocha": "^5.2.0",
25 26 "moment": "^2.22.2",
26 27 "mongodb": "^3.1.8",
  28 + "morgan": "^1.9.1",
27 29 "node-json-config": "0.0.4",
28 30 "passport": "^0.4.0",
29 31 "passport-local": "^1.0.0",
... ...
utils/config.js
... ... @@ -6,17 +6,17 @@ const NodeJsonConfig = require('node-json-config');
6 6 const conf = new NodeJsonConfig('app.config.json');
7 7  
8 8 let defaultConfObj = conf.get('default');
9   -console.log('defaultConfObj');
10   -console.log(defaultConfObj);
  9 +// console.log('defaultConfObj');
  10 +// console.log(defaultConfObj);
11 11  
12 12 let envConfObj = conf.get(nodeEnv);
13   -console.log('envConfObj');
14   -console.log(envConfObj);
  13 +// console.log('envConfObj');
  14 +// console.log(envConfObj);
15 15  
16 16 let currentConfObj = Object.assign(defaultConfObj, envConfObj);
17 17  
18   -console.log('currentConfObj');
19   -console.log(currentConfObj);
  18 +// console.log('currentConfObj');
  19 +// console.log(currentConfObj);
20 20  
21 21 conf.put(nodeEnv, currentConfObj);
22 22  
... ...
utils/constants.js 0 โ†’ 100644
... ... @@ -0,0 +1,90 @@
  1 +module.exports = Object.freeze({
  2 + REQUEST: 'Request',
  3 + RESPONSE: 'Response',
  4 + SUCCESS: 'Success',
  5 + ERROR: 'Error',
  6 + FAIL: 'Fail',
  7 + URLKEYWORD : ["filter","offset","orderby","limit","fields"],
  8 + METHOD:{
  9 + GET : 'GET',
  10 + POST : 'POST',
  11 + PUT : 'PUT',
  12 + DELETE : 'DELETE'
  13 + },
  14 + RESPONSECONN:{
  15 + STATS:{
  16 + ETIMEDOUT:'ETIMEDOUT',
  17 + ECONNREFUSED : 'ECONNREFUSED',
  18 + ESOCKETTIMEDOUT : 'ESOCKETTIMEDOUT',
  19 + MISSING : 'Missing'
  20 + },
  21 + MESSAGE:{
  22 + ETIMEDOUT:{
  23 + resultCode : 'null',
  24 + resultDescription : 'Time out'
  25 + },
  26 + ECONNREFUSED:{
  27 + resultCode : 'null',
  28 + resultDescription : 'Reject'
  29 + },
  30 + ESOCKETTIMEDOUT:{
  31 + resultCode : 'null',
  32 + resultDescription : 'Time out'
  33 + },
  34 + EOTHERERROR:{
  35 + resultCode : 'null',
  36 + resultDescription : 'Error'
  37 + },
  38 + ERROR:{
  39 + resultCode : '50000',
  40 + resultDescription : 'System error'
  41 + },
  42 + SUCCESS:{
  43 + resultCode : '20000',
  44 + resultDescription : 'Success'
  45 + },
  46 + EXCEED:{
  47 + resultCode : '40302',
  48 + resultDescription : 'Exceed data allowances'
  49 + },
  50 + DBERROR:{
  51 + resultCode : '50001',
  52 + resultDescription : 'Database error'
  53 + },
  54 + SUCCESSWITHCON:{
  55 + resultCode : '20001',
  56 + resultDescription : 'Success with condition'
  57 + }
  58 + }
  59 + },
  60 + RESPONSERESULT:{
  61 + SUCCESS:{
  62 + resultCode : '20000',
  63 + developerMessage : 'Success'
  64 + },
  65 + MISSING_INVALID:{
  66 + resultCode : '40300',
  67 + developerMessage : 'Missing or invalid parameter'
  68 + },
  69 + DATA_NOT_FOUND:{
  70 + resultCode : '40401',
  71 + developerMessage : 'Data Not Found'
  72 + },
  73 + DATA_EXIST:{
  74 + resultCode : '40301',
  75 + developerMessage : 'Data Exist'
  76 + },
  77 + ERROR:{
  78 + resultCode : '50000',
  79 + developerMessage : 'System error'
  80 + },
  81 + DENIED:{
  82 + resultCode : '40100',
  83 + developerMessage : 'Access Denied'
  84 + },
  85 + UNKNOW:{
  86 + resultCode : '40400',
  87 + developerMessage : 'Unknown URL'
  88 + }
  89 + }
  90 +});
0 91 \ No newline at end of file
... ...
utils/errors.js
... ... @@ -1,16 +0,0 @@
1   -class ValidationError extends Error {
2   - constructor(err, ...params) {
3   - super(...params);
4   - this.instance = err;
5   - }
6   -}
7   -
8   -class UnirestError extends Error {
9   - constructor(err, ...params) {
10   - super(...params);
11   - this.instance = err;
12   - }
13   -}
14   -
15   -module.exports.ValidationError = ValidationError;
16   -module.exports.UnirestError = UnirestError;
17 0 \ No newline at end of file
utils/log.js 0 โ†’ 100644
... ... @@ -0,0 +1,264 @@
  1 +const os = require("os");
  2 +var cfg = require('./config');
  3 +var utils = require('./utils');
  4 +var conf = cfg.get("configlog");
  5 +conf.projectName = cfg.get("appName");
  6 +var logg = require('commonlog-kb');
  7 +var constants = require('./constants');
  8 +
  9 +var log4js = require('log4js');
  10 +var appenders = {};
  11 +appenders[conf.projectName] = { type: 'file', filename: conf.detail.path+"/"+os.hostname() + '_'+conf.projectName+'.detail' };
  12 +log4js.configure({
  13 + appenders: appenders ,
  14 + categories: { default: { appenders: [conf.projectName], level: 'info' } }
  15 + });
  16 +
  17 +var logger4jDetail = log4js.getLogger(conf.projectName);
  18 +var logger = [];
  19 +
  20 +var mapLog = {};
  21 +
  22 +logger.startlog = function (req,cmdData,session,identity)
  23 +{
  24 +
  25 +
  26 + var start = {
  27 + session : utils.undefinedToNull(session),
  28 + cmd : cmdData,
  29 + identity : utils.undefinedToNull(identity)
  30 + };
  31 +
  32 + mapLog[req.id].start = start;
  33 +}
  34 +
  35 +logger.stat = function (msg){
  36 + logg.stat(msg);
  37 +}
  38 +
  39 +logger.log = function (msg,type)
  40 +{
  41 +
  42 + if(!type)
  43 + type = 'debug';
  44 +
  45 + type = type.toLowerCase();
  46 +
  47 + switch(type) {
  48 + case 'debug':
  49 + logg.debug(msg);
  50 + break;
  51 + case 'info':
  52 + logg.info(msg);
  53 + break;
  54 + case 'warn':
  55 + logg.warn(msg);
  56 + break;
  57 + case 'error':
  58 + logg.error(msg);
  59 + break;
  60 + default:
  61 + logg.debug(msg);
  62 + }
  63 +
  64 + console.log(msg);
  65 +}
  66 +
  67 +logger.addSuccessSummary = function (req,nodeData,cmdData,result)
  68 +{
  69 + summary = {
  70 + node : utils.undefinedToNull(nodeData),
  71 + cmd : cmdData,
  72 + resultCode : result.resultCode,
  73 + resultDescription : result.resultDescription,
  74 + type : constants.SUCCESS
  75 + };
  76 + mapLog[req.id].summaryList.push(summary);
  77 +}
  78 +
  79 +logger.addErrorSummary = function (req,nodeData,cmdData,result)
  80 +{
  81 + summary = {
  82 + node : utils.undefinedToNull(nodeData),
  83 + cmd : cmdData,
  84 + resultCode : result.resultCode,
  85 + resultDescription : result.resultDescription,
  86 + type : constants.ERROR
  87 + };
  88 +
  89 + mapLog[req.id].summaryList.push(summary);
  90 +}
  91 +
  92 +logger.logSummary = function (req,response)
  93 +{
  94 +
  95 + var start = mapLog[req.id].start;
  96 + var summaryList = mapLog[req.id].summaryList;
  97 +
  98 + var log = logg.summary(start.session,start.cmd,start.identity);
  99 + var row;
  100 + for (let index = 0; index < summaryList.length; index++) {
  101 + row = summaryList[index];
  102 + if(row.type === constants.SUCCESS){
  103 + log.addSuccessBlock(row.node,row.cmd,row.resultCode,row.resultDescription);
  104 + } else {
  105 + log.addErrorBlock(row.node,row.cmd,utils.undefinedToNull(row.resultCode),utils.undefinedToNull(row.resultDescription));
  106 + }
  107 + }
  108 +
  109 + if(response){
  110 + log.end(response.resultCode,response.resultDescription)
  111 + } else {
  112 + log.end()
  113 + }
  114 +}
  115 +
  116 +logger.startEC = function(req)
  117 +{
  118 + var objectLog = {
  119 + summaryList : [],
  120 + start : {},
  121 + detail : {},
  122 + startTime : new Date()
  123 + }
  124 +
  125 +
  126 + mapLog[req.id] = objectLog;
  127 +
  128 + var newLine = "\r\n";
  129 + var messageRes = '';
  130 + var startTime = mapLog[req.id].startTime;
  131 +
  132 +
  133 + if(req.body)
  134 + {
  135 + if(typeof req.body === 'string')
  136 + body = req.bod;
  137 + else
  138 + body = JSON.stringify(req.body);
  139 + }
  140 +
  141 + var header = "";
  142 + if(req.headers)
  143 + {
  144 + if(typeof req.headers === 'string')
  145 + header = req.headers;
  146 + else
  147 + header = JSON.stringify(req.headers);
  148 + }
  149 +
  150 + messageRes += newLine+newLine+"#====> Incoming Message <====# ";
  151 + messageRes += newLine+"Session : "+req.id;
  152 + messageRes += newLine+"Url : "+req.url;
  153 + messageRes += newLine+"Method : "+req.method;
  154 + messageRes += newLine+"Header : "+header;
  155 + messageRes += newLine+"Body : "+body;
  156 + messageRes += newLine+"Time in : "+startTime.toISOString();
  157 + messageRes += newLine
  158 +
  159 + logg.debug(messageRes);
  160 +}
  161 +
  162 +logger.endEC = function(req,res)
  163 +{
  164 +
  165 + var newLine = "\r\n";
  166 + var messageRes = '';
  167 + var startTime = mapLog[req.id].startTime;
  168 + var endTime = new Date();
  169 +
  170 + var body = "";
  171 + if(res.resBody)
  172 + {
  173 + if(typeof res.resBody === 'string')
  174 + body = res.resBody;
  175 + else
  176 + body = JSON.stringify(res.resBody);
  177 + }
  178 +
  179 + var header = "";
  180 + if(res.req.headers)
  181 + {
  182 + if(typeof res.req.headers === 'string')
  183 + header = res.req.headers;
  184 + else
  185 + header = JSON.stringify(res.req.headers);
  186 + }
  187 +
  188 + messageRes += newLine+newLine+"#====> Outgoing Message <====# ";
  189 + messageRes += newLine+"Session : "+req.id;
  190 + messageRes += newLine+"Header : "+header;
  191 + messageRes += newLine+"Body : "+body;
  192 + messageRes += newLine+"Time out : "+endTime.toISOString();
  193 + messageRes += newLine+"Use times : "+Math.abs(endTime - startTime)+" ms";
  194 +
  195 +
  196 +
  197 +
  198 + logg.debug(messageRes);
  199 + messageRes += newLine
  200 +}
  201 +
  202 +//detail
  203 +logger.detailRequestFE = function(req)
  204 +{
  205 + // console.log(req);
  206 + var protocal = "HTTP";
  207 + var method = req.method;
  208 + var url = req.headers.host+req.originalUrl;
  209 + var body = JSON.stringify(req.body);
  210 + logger4jDetail.info(logPrefix(req)+protocal+" "+method+" "+url+" Request from FE - body: "+body);
  211 +
  212 +}
  213 +
  214 +logger.detailResponseFE = function(req)
  215 +{
  216 + var protocal = "HTTP";
  217 + var method = req.method;
  218 + var url = req.headers.host+req.originalUrl;
  219 + var body = JSON.stringify(req.body);
  220 + logger4jDetail.info(logPrefix(req)+protocal+" "+method+" "+url+" Response to FE - body: "+body);
  221 +}
  222 +
  223 +logger.detailSqlQuery = function(req,method,data)
  224 +{
  225 + logger4jDetail.info(logPrefix(req)+method+": "+JSON.stringify(data));
  226 +}
  227 +
  228 +logger.detailSqlResult = function(req,method,data)
  229 +{
  230 + logger4jDetail.info(logPrefix(req)+method+": "+JSON.stringify(data));
  231 +}
  232 +
  233 +logger.detailRequestBE = function(req,data)
  234 +{
  235 + var protocal = data.protocal;
  236 + var method = data.method;
  237 + var url = data.url;
  238 + var header = JSON.stringify(data.header);
  239 + var body = JSON.stringify(data.body);
  240 + logger4jDetail.info(logPrefix(req)+"BE Send "+protocal+" "+method+" "+url+" request-header: "+header+" request-body:"+body);
  241 +}
  242 +
  243 +logger.detailResponseBE = function(req,data)
  244 +{
  245 + var protocal = data.protocal;
  246 + var method = data.method;
  247 + var url = data.url;
  248 + var header = JSON.stringify(data.header);
  249 + var body = JSON.stringify(data.body);
  250 + logger4jDetail.info(logPrefix(req)+"BE Receive "+protocal+" "+method+" "+url+" response-header: "+header+" response-body:"+body);
  251 +}
  252 +
  253 +function logPrefix(req)
  254 +{
  255 +
  256 + var userName = "userName";
  257 + var sessionID = "sessionID";
  258 + var session = "session";
  259 +
  260 + return ":: ## "+userName+" - "+sessionID+" - "+session+ " ## ";
  261 +
  262 +}
  263 +
  264 +module.exports = logger;
... ...
utils/mongoDB.js
1   -const logger = require('./request-logger');
  1 +const log = require('./log');
  2 +var constants = require('./constants');
2 3 var MongoClient = require('mongodb').MongoClient;
3 4 var config = require('./config');
4 5  
... ... @@ -16,93 +17,82 @@ connection.reqMongo = async function (req,method, query, collection) {
16 17  
17 18  
18 19 function mongoReq(req,url,database,method, query, collection){
19   -
20   - logger.logSqlQuery({id : "session", reqId : req.id}, query);
  20 +
  21 + var nodeName = "MongoDB";
  22 + var funStats = {
  23 + detailSqlQuery : function(query){log.detailSqlQuery(req,method,query);},
  24 + detailSqlResult : function(result, err){log.detailSqlResult(req,method,result || err);},
  25 + addSuccessSummary : function(result){log.addSuccessSummary(req,nodeName,collection,result);},
  26 + addErrorSummary : function(result){log.addErrorSummary(req,nodeName,collection,result);}
  27 + };
  28 +
  29 +
21 30  
22 31 return new Promise((resolve, reject) => {
23 32 MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
24 33 if (err) {
25   - console.log(err)
26   - logger.logSqlResult({id : "session", reqId : req.id}, err.errmsg);
27   - resolve({
28   - resultCode : "50001",
29   - message : err.errmsg
30   - });
  34 + console.log(err)
  35 + resolve(constants.RESPONSECONN.MESSAGE.DBERROR);
31 36 }
32   -
  37 + funStats.detailSqlQuery(query);
  38 + var dbInstant = db.db(database).collection(collection);
33 39 switch (method) {
34   - case "GET":
35   - db.db(database).collection(collection).find(query, { projection: { _id: 0 } }).toArray(function(err, result) {
36   - db.close();
37   -
38   - if (err) {
39   - console.log(err)
40   - resolve(checkResponse(req,{err:err}));
41   - }else
42   - resolve(checkResponse(req,result));
  40 + case constants.METHOD.GET:
  41 + dbInstant.find(query, { projection: { _id: 0 } }).toArray(function(err, result) {
  42 + resolve(checkResponse(result,err,funStats));
43 43 });
44 44 break;
45   - case "POST":
46   - db.db(database).collection(collection).find(query, { projection: { _id: 0 } }).toArray(function(err, result) {
47   - db.close();
48   -
49   - if (err) {
50   - console.log(err)
51   - resolve(checkResponse(req,{err:err}));
52   - }else
53   - resolve(checkResponse(req,result));
  45 + case constants.METHOD.POST:
  46 + db.db(database).collection(collection).insertOne(query, function(err, result) {
  47 + var response = checkResponse(result,err,funStats);
  48 + delete response.resultData;
  49 + resolve(response);
54 50 });
55 51 break;
56 52 case "PUT":
57   - db.db(database).collection(collection).find(query, { projection: { _id: 0 } }).toArray(function(err, result) {
58   - db.close();
  53 + // db.db(database).collection(collection).find(query, { projection: { _id: 0 } }).toArray(function(err, result) {
  54 + // db.close();
59 55  
60   - if (err) {
61   - console.log(err)
62   - resolve(checkResponse(req,{err:err}));
63   - }else
64   - resolve(checkResponse(req,result));
65   - });
  56 + // if (err) {
  57 + // console.log(err)
  58 + // resolve(checkResponse(req,{err:err}));
  59 + // }else
  60 + // resolve(checkResponse(req,result));
  61 + // });
66 62 break;
67 63 case "DELETE":
68   - db.db(database).collection(collection).find(query, { projection: { _id: 0 } }).toArray(function(err, result) {
69   - db.close();
  64 + // db.db(database).collection(collection).find(query, { projection: { _id: 0 } }).toArray(function(err, result) {
  65 + // db.close();
70 66  
71   - if (err) {
72   - console.log(err)
73   - resolve(checkResponse(req,{err:err}));
74   - }else
75   - resolve(checkResponse(req,result));
76   - });
  67 + // if (err) {
  68 + // console.log(err)
  69 + // resolve(checkResponse(req,{err:err}));
  70 + // }else
  71 + // resolve(checkResponse(req,result));
  72 + // });
77 73 break;
78 74  
79 75 }
80   -
81   -
  76 + db.close();
82 77 });
83 78 });
84 79  
85 80 }
86 81  
87   -function checkResponse(req,response)
88   -{
89   -
90   -
91   - if(response.err)
92   - {
93   - logger.logSqlResult({id : "session", reqId : req.id}, err.errmsg);
94   - var returnData = {
95   - resultCode : "50001",
96   - message : response.err.errmsg
97   - };
98   - }else
  82 +function checkResponse(result,err,funStats)
  83 +{
  84 +
  85 + funStats.detailSqlResult(result, err);
  86 + if(err)
99 87 {
100   - logger.logSqlResult({id : "session", reqId : req.id}, response);
101   - var returnData = {
102   - resultCode : "20000",
103   - resultDescription : "Success",
104   - resultData : response
105   - };
  88 + var returnData = constants.RESPONSECONN.MESSAGE.DBERROR;
  89 + funStats.addErrorSummary(returnData);
  90 + }
  91 + else
  92 + {
  93 + var returnData = constants.RESPONSECONN.MESSAGE.SUCCESS;
  94 + returnData.resultData = result;
  95 + funStats.addSuccessSummary(returnData);
106 96 }
107 97  
108 98 return returnData
... ...
utils/passport-func.js
... ... @@ -1,71 +0,0 @@
1   -const passport = require('passport');
2   -const LocalStrategy = require('passport-local').Strategy;
3   -const SamlStrategy = require('passport-saml').Strategy;
4   -const conf = require('utils/config');
5   -
6   -const passportFunctionLocal = function (username, password, done) {
7   - console.log('checking username and password...');
8   - if (username === 'admin' && password === 'passw0rd') {
9   - const user = {
10   - id: 1,
11   - username: username
12   - };
13   - console.log('checking username and password... Passed');
14   - return done(null, user);
15   - } else {
16   - console.log('checking username and password... Failed');
17   - return done(null, false, {message: 'Incorrect credentials'});
18   - }
19   -};
20   -
21   -const passportFunctionSaml = function(profile, done) {
22   - return done(null,
23   - {
24   - userName: profile.userName,
25   - email: profile.email,
26   - firstName: profile.firstName,
27   - lastName: profile.lastName,
28   - fullName: profile.fullName
29   - });
30   -};
31   -
32   -module.exports = function() {
33   -
34   - passport.serializeUser(function(user, done) {
35   - console.log('serialize');
36   - done(null, user);
37   - });
38   -
39   - passport.deserializeUser(function(user, done) {
40   - console.log('deserialize');
41   - done(null, user);
42   - });
43   -
44   - let PassportStrategy, passportConfig, passportFunction;
45   - switch(conf.get('passport.strategy')) {
46   - case "local":
47   - PassportStrategy = LocalStrategy;
48   - passportConfig = conf.get('passport.configStrategy.local');
49   - passportFunction = passportFunctionLocal;
50   - break;
51   - case "saml":
52   - PassportStrategy = SamlStrategy;
53   - passportConfig = conf.get('passport.configStrategy.saml');
54   - passportFunction = passportFunctionSaml;
55   - break;
56   - default:
57   - PassportStrategy = null;
58   - break;
59   - }
60   -
61   - if (PassportStrategy) {
62   - console.log('setup passport strategy');
63   - console.log(conf.get('passport.strategy'));
64   - console.log(passportConfig);
65   - console.log(passportFunction);
66   - console.log(PassportStrategy);
67   - passport.use(new PassportStrategy(passportConfig, passportFunction));
68   - }
69   -
70   - return passport;
71   -};
72 0 \ No newline at end of file
utils/request-logger.js
... ... @@ -1,67 +0,0 @@
1   -const winston = require('winston');
2   -const fs = require('fs');
3   -const moment = require('moment');
4   -
5   -let logDir = 'logs'; // directory path you want to set
6   -if ( !fs.existsSync( logDir ) ) {
7   - // Create the directory if it does not exist
8   - fs.mkdirSync( logDir );
9   -}
10   -
11   -function RequestLogger() {
12   - this.fileTransport = new winston.transports.File({
13   - timestamp: function() {
14   - return moment().format('YYYY-MM-DDTHH:mm:ss.SSS');
15   - },
16   - json: false,
17   - filename: 'logs/app.log',
18   - maxsize: 10240000,
19   - maxFiles: 99,
20   - tailable: true
21   - });
22   -
23   - this.logger = winston.createLogger({
24   - transports: [this.fileTransport]
25   - });
26   -
27   - this.logPrefix = function(session) {
28   - let userId = '';
29   - let sessionId = session.id || '';
30   - let reqId = session.reqId || '';
31   - let msg = `phoenix-partner - :: ## ${userId} - ${sessionId} - ${reqId} ## `;
32   - return msg;
33   - };
34   -}
35   -
36   -RequestLogger.prototype.logRequest = function(reqMethod, reqUrl, session, data, header) {
37   - header = JSON.stringify(header);
38   - data = JSON.stringify(data);
39   - let msg = this.logPrefix(session) + `BE Send HTTP ${reqMethod} ${reqUrl} request-header: ${header} request-body: ${data}`;
40   - this.logger.info(msg);
41   -};
42   -
43   -RequestLogger.prototype.logResponse = function(reqMethod, reqUrl, session, data, header) {
44   - header = JSON.stringify(header);
45   - data = JSON.stringify(data);
46   - let msg = this.logPrefix(session) + `BE Receive HTTP ${reqMethod} ${reqUrl} response-header: ${header} response-body: ${data}`;
47   - this.logger.info(msg);
48   -};
49   -
50   -RequestLogger.prototype.logSqlQuery = function(session, data) {
51   - data = JSON.stringify(data);
52   - let msg = this.logPrefix(session) + `BE Send SQL Query: ${data}`;
53   - this.logger.info(msg);
54   -};
55   -
56   -RequestLogger.prototype.logSqlResult = function(session, data) {
57   - data = JSON.stringify(data);
58   - let msg = this.logPrefix(session) + `BE Receive SQL Result: ${data}`;
59   - this.logger.info(msg);
60   -};
61   -
62   -RequestLogger.prototype.debug = function(msg) {
63   - msg = this.logPrefix(session) + ' ' + msg;
64   - this.logger.debug(msg);
65   -};
66   -
67   -module.exports = new RequestLogger();
68 0 \ No newline at end of file
utils/send-response.js
1   -const ValidationError = require('utils/errors').ValidationError;
2   -const UnirestError = require('utils/errors').UnirestError;
3 1  
4 2 let sendResponse = {};
5 3  
... ... @@ -13,26 +11,26 @@ sendResponse.missingOrInvalidResponse = (param) =&gt; {
13 11 };
14 12  
15 13  
16   -sendResponse.handleError = function(error) {
17   - console.log('catch ' + error);
18   - let errResponse = {};
19   - if (error instanceof ValidationError) {
20   - errResponse = {
21   - code: 403,
22   - object: this.missingOrInvalidResponse(error.instance[0].message)
23   - };
24   - } else if (error instanceof UnirestError) {
25   - errResponse = {
26   - code: 500,
27   - object: error.instance
28   - };
29   - } else {
30   - errResponse = {
31   - code: 500,
32   - object: { message: "System Error" }
33   - };
34   - }
35   - return errResponse;
36   -};
  14 +// sendResponse.handleError = function(error) {
  15 +// console.log('catch ' + error);
  16 +// let errResponse = {};
  17 +// if (error instanceof ValidationError) {
  18 +// errResponse = {
  19 +// code: 403,
  20 +// object: this.missingOrInvalidResponse(error.instance[0].message)
  21 +// };
  22 +// } else if (error instanceof UnirestError) {
  23 +// errResponse = {
  24 +// code: 500,
  25 +// object: error.instance
  26 +// };
  27 +// } else {
  28 +// errResponse = {
  29 +// code: 500,
  30 +// object: { message: "System Error" }
  31 +// };
  32 +// }
  33 +// return errResponse;
  34 +// };
37 35  
38 36 module.exports = sendResponse;
... ...
utils/stats.js 0 โ†’ 100644
... ... @@ -0,0 +1,41 @@
  1 +var config = require('./config');
  2 +var log = require('./log.js');
  3 +var constants = require('./constants.js');
  4 +
  5 +var nodeName = config.get("appName");
  6 +var stat = [];
  7 +
  8 +
  9 +//client and Node
  10 +stat.receiveRequest = function (method,cmd,from){
  11 + writeStats(nodeName+" receive "+method+" "+cmd+" request from "+(from?from:"Client"));
  12 +};
  13 +
  14 +stat.sendResponse = function (method,cmd,to){
  15 + writeStats(nodeName+" send "+method+" "+cmd+" response to "+(to?to:"Client"));
  16 +};
  17 +
  18 +//node and mongo
  19 +stat.sendQuery = function (cmd,to){
  20 + writeStats(nodeName+" send QUERY "+cmd+" request to "+(to?to:"MongoDB"));
  21 +};
  22 +
  23 +stat.receiveQuery = function (cmd,from){
  24 + writeStats(nodeName+" receive QUERY "+cmd+" response from "+(from?from:"MongoDB"));
  25 +};
  26 +
  27 +//unknow
  28 +stat.receiveUnknow = function(message){
  29 + writeStats(nodeName+" Receive "+message+" "+constants.REQUEST);
  30 +};
  31 +
  32 +stat.sendUnknow = function(message){
  33 + writeStats(nodeName+" Send "+message);
  34 +};
  35 +
  36 +function writeStats(string) {
  37 + log.log(string);
  38 + log.stat(string);
  39 +}
  40 +
  41 +module.exports = stat;
0 42 \ No newline at end of file
... ...
utils/utils.js
... ... @@ -59,8 +59,13 @@ utils.getUpdateFilter = function(obj)
59 59  
60 60 utils.getQueryFilter = async function(data)
61 61 {
62   - var filter = parseFilter(data);
63   - return getQuery(filter);
  62 + if(data)
  63 + {
  64 + var filter = parseFilter(data);
  65 + return getQuery(filter);
  66 + }else
  67 + return {};
  68 +
64 69 }
65 70  
66 71 getQuery = async function(data,query){
... ... @@ -178,4 +183,17 @@ function findValueInBracket(data)
178 183  
179 184 }
180 185  
  186 +utils.undefinedToNull = function(data){
  187 + if(!data){
  188 + data = 'null';
  189 + } else if(data.includes('undefined')){
  190 + data = data.replace(/undefined/g,'null');
  191 + } else {
  192 + data = data;
  193 + }
  194 +
  195 + return data;
  196 +}
  197 +
  198 +
181 199 module.exports = utils;
182 200 \ No newline at end of file
... ...
utils/validator.js
... ... @@ -1,11 +0,0 @@
1   -const indicative = require('indicative');
2   -const ValidationError = require('utils/errors').ValidationError;
3   -
4   -
5   -module.exports = function(data, rules) {
6   - return indicative.validate(data, rules)
7   - .catch((err) => {
8   - return Promise.reject(new ValidationError(err));
9   - }
10   - )
11   -};
12 0 \ No newline at end of file
utils/winston-express-middleware/index.js
... ... @@ -1,305 +0,0 @@
1   -// Copyright (c) 2012-2014 Heapsource.com and Contributors - http://www.heapsource.com
2   -//
3   -// Permission is hereby granted, free of charge, to any person obtaining a copy
4   -// of this software and associated documentation files (the "Software"), to deal
5   -// in the Software without restriction, including without limitation the rights
6   -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7   -// copies of the Software, and to permit persons to whom the Software is
8   -// furnished to do so, subject to the following conditions:
9   -//
10   -// The above copyright notice and this permission notice shall be included in
11   -// all copies or substantial portions of the Software.
12   -//
13   -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14   -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15   -// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
16   -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17   -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18   -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19   -// THE SOFTWARE.
20   -//
21   -var winston = require('winston');
22   -var util = require('util');
23   -var chalk = require('chalk');
24   -
25   -//Allow this file to get an exclusive copy of underscore so it can change the template settings without affecting others
26   -delete require.cache[require.resolve('lodash')];
27   -var _ = require('lodash');
28   -delete require.cache[require.resolve('lodash')];
29   -
30   -/**
31   - * A default list of properties in the request object that are allowed to be logged.
32   - * These properties will be safely included in the meta of the log.
33   - * 'body' is not included in this list because it can contains passwords and stuff that are sensitive for logging.
34   - * TODO: Include 'body' and get the defaultRequestFilter to filter the inner properties like 'password' or 'password_confirmation', etc. Pull requests anyone?
35   - * @type {Array}
36   - */
37   -var requestWhitelist = ['url', 'headers', 'method', 'httpVersion', 'originalUrl', 'query'];
38   -
39   -/**
40   - * A default list of properties in the request body that are allowed to be logged.
41   - * This will normally be empty here, since it should be done at the route level.
42   - * @type {Array}
43   - */
44   -var bodyWhitelist = [];
45   -
46   -/**
47   - * A default list of properties in the request body that are not allowed to be logged.
48   - * @type {Array}
49   - */
50   -var bodyBlacklist = [];
51   -
52   -/**
53   - * A default list of properties in the response object that are allowed to be logged.
54   - * These properties will be safely included in the meta of the log.
55   - * @type {Array}
56   - */
57   -var responseWhitelist = ['statusCode'];
58   -
59   -/**
60   - * A list of request routes that will be skipped instead of being logged. This would be useful if routes for health checks or pings would otherwise pollute
61   - * your log files.
62   - * @type {Array}
63   - */
64   -var ignoredRoutes = [];
65   -
66   -/**
67   - * A default function to filter the properties of the req object.
68   - * @param req
69   - * @param propName
70   - * @return {*}
71   - */
72   -var defaultRequestFilter = function (req, propName) {
73   - return _.result(req, propName);
74   -};
75   -
76   -/**
77   - * A default function to filter the properties of the res object.
78   - * @param res
79   - * @param propName
80   - * @return {*}
81   - */
82   -var defaultResponseFilter = function (res, propName) {
83   - return _.result(res, propName);
84   -};
85   -
86   -/**
87   - * A default function to decide whether skip logging of particular request. Doesn't skip anything (i.e. log all requests).
88   - * @return always false
89   - */
90   -var defaultSkip = function() {
91   - return false;
92   -};
93   -
94   -function filterObject(originalObj, whiteList, initialFilter) {
95   - var obj = {};
96   - var fieldsSet = false;
97   -
98   - [].concat(whiteList).forEach(function (propName) {
99   - var value = initialFilter(originalObj, propName);
100   -
101   - if(typeof (value) !== 'undefined') {
102   - _.set(obj, propName, value);
103   - fieldsSet = true;
104   - };
105   - });
106   -
107   - return fieldsSet ? obj : undefined;
108   -}
109   -
110   -//
111   -// ### function errorLogger(options)
112   -// #### @options {Object} options to initialize the middleware.
113   -//
114   -
115   -
116   -function errorLogger(options) {
117   -
118   - ensureValidOptions(options);
119   -
120   - options.requestFilter = options.requestFilter || defaultRequestFilter;
121   - options.responseFilter = options.responseFilter || defaultResponseFilter;
122   - options.winstonInstance = options.winstonInstance || (new winston.Logger ({ transports: options.transports }));
123   -
124   - return function (err, req, res, next) {
125   -
126   - // Let winston gather all the error data.
127   - var exceptionMeta = winston.exception.getAllInfo(err);
128   - exceptionMeta.req = filterObject(req, requestWhitelist, options.requestFilter);
129   - var end = res.end;
130   - res.end = function(chunk, encoding) {
131   - res.end = end;
132   - res.end(chunk, encoding);
133   -
134   - exceptionMeta.res = filterObject(res, responseWhitelist, options.responseFilter);
135   - // This is fire and forget, we don't want logging to hold up the request so don't wait for the callback
136   - options.winstonInstance.log('error', 'middlewareError', exceptionMeta);
137   - }
138   -
139   - next(err);
140   - };
141   -}
142   -
143   -//
144   -// ### function logger(options)
145   -// #### @options {Object} options to initialize the middleware.
146   -//
147   -
148   -
149   -function logger(options) {
150   -
151   - ensureValidOptions(options);
152   - ensureValidLoggerOptions(options);
153   -
154   - options.requestFilter = options.requestFilter || defaultRequestFilter;
155   - options.responseFilter = options.responseFilter || defaultResponseFilter;
156   - options.winstonInstance = options.winstonInstance || (new winston.Logger ({ transports: options.transports }));
157   - options.level = options.level || "info";
158   - options.statusLevels = options.statusLevels || false;
159   - options.msg = options.msg || "HTTP {{req.method}} {{req.url}}";
160   - options.colorStatus = options.colorStatus || false;
161   - options.expressFormat = options.expressFormat || false;
162   - options.ignoreRoute = options.ignoreRoute || function () { return false; };
163   - options.skip = options.skip || defaultSkip;
164   -
165   - // Using mustache style templating
166   - var template = _.template(options.msg, null, {
167   - interpolate: /\{\{(.+?)\}\}/g
168   - });
169   -
170   - return function (req, res, next) {
171   - var currentUrl = req.originalUrl ||ย req.url;
172   - if (currentUrl && _.contains(ignoredRoutes, currentUrl)) return next();
173   -
174   - req._startTime = (new Date);
175   -
176   - req._routeWhitelists = {
177   - req: [],
178   - res: [],
179   - body: []
180   - };
181   -
182   - req._routeBlacklists = {
183   - body: []
184   - };
185   -
186   - // try to log request first
187   - if(options.expressFormat) {
188   - var msg = chalk.grey(req.method + " " + req.url || req.url)
189   - + " " + chalk[statusColor](res.statusCode)
190   - + " " + chalk.grey(res.responseTime+"ms");
191   - } else {
192   - console.log(req.body);
193   - var msg = template({req: req, res: res});
194   - }
195   - if (!options.skip(req, res) && !options.ignoreRoute(req, res)) {
196   - var reqMsg = msg + "Request from FE - header: " + JSON.stringify(req.headers) + " body: " + JSON.stringify(req.body);
197   - options.winstonInstance.log(options.level, reqMsg);
198   - }
199   -
200   - // Manage to get information from the response too, just like Connect.logger does:
201   - var end = res.end;
202   - res.end = function(chunk, encoding) {
203   - res.responseTime = (new Date) - req._startTime;
204   -
205   - res.end = end;
206   - res.end(chunk, encoding);
207   -
208   - req.url = req.originalUrl ||ย req.url;
209   -
210   - if (options.statusLevels) {
211   - if (res.statusCode >= 100) { options.level = "info"; }
212   - if (res.statusCode >= 400) { options.level = "warn"; }
213   - if (res.statusCode >= 500) { options.level = "error"; }
214   - };
215   -
216   - if (options.colorStatus || options.expressFormat) {
217   - // Palette from https://github.com/expressjs/morgan/blob/master/index.js#L205
218   - var statusColor = 'green';
219   - if (res.statusCode >= 500) statusColor = 'red';
220   - else if (res.statusCode >= 400) statusColor = 'yellow';
221   - else if (res.statusCode >= 300) statusColor = 'cyan';
222   - var coloredStatusCode = chalk[statusColor](res.statusCode);
223   - }
224   -
225   - var meta = {};
226   -
227   - if(options.meta !== false) {
228   - var bodyWhitelist, blacklist;
229   -
230   - requestWhitelist = requestWhitelist.concat(req._routeWhitelists.req || []);
231   - responseWhitelist = responseWhitelist.concat(req._routeWhitelists.res || []);
232   -
233   - meta.req = filterObject(req, requestWhitelist, options.requestFilter);
234   - meta.res = filterObject(res, responseWhitelist, options.responseFilter);
235   -
236   - if (_.contains(responseWhitelist, 'body')) {
237   - if (chunk) {
238   - var isJson = (res._headers && res._headers['content-type']
239   - && res._headers['content-type'].indexOf('json') >= 0);
240   -
241   - meta.res.body = isJson ? JSON.parse(chunk) : chunk.toString();
242   - res.body = meta.res.body;
243   - }
244   - }
245   -
246   - bodyWhitelist = req._routeWhitelists.body || [];
247   - blacklist = _.union(bodyBlacklist, (req._routeBlacklists.body || []));
248   -
249   - var filteredBody = null;
250   -
251   - if ( req.body !== undefined ) {
252   - if (blacklist.length > 0 && bodyWhitelist.length === 0) {
253   - var whitelist = _.difference(_.keys(req.body), blacklist);
254   - filteredBody = filterObject(req.body, whitelist, options.requestFilter);
255   - } else {
256   - filteredBody = filterObject(req.body, bodyWhitelist, options.requestFilter);
257   - }
258   - }
259   -
260   - if (filteredBody) meta.req.body = filteredBody;
261   -
262   - meta.responseTime = res.responseTime;
263   - }
264   -
265   - // if(options.expressFormat) {
266   - // var msg = chalk.grey(req.method + " " + req.url || req.url)
267   - // + " " + chalk[statusColor](res.statusCode)
268   - // + " " + chalk.grey(res.responseTime+"ms");
269   - // } else {
270   - // var msg = template({req: req, res: res});
271   - // }
272   - // This is fire and forget, we don't want logging to hold up the request so don't wait for the callback
273   - if (!options.skip(req, res) && !options.ignoreRoute(req, res)) {
274   - var resMsg = msg + "Response to FE - header: " + JSON.stringify(res.header()._headers) + " body: " + JSON.stringify(res.body) + ", statusCode: " + res.statusCode + ", responseTime: " + res.responseTime + "ms";
275   - options.winstonInstance.log(options.level, resMsg);
276   - //options.winstonInstance.log(options.level, msg, JSON.stringify(meta));
277   - }
278   - };
279   -
280   - next();
281   - };
282   -}
283   -
284   -function ensureValidOptions(options) {
285   - if(!options) throw new Error("options are required by express-winston middleware");
286   - if(!((options.transports && (options.transports.length > 0)) || options.winstonInstance))
287   - throw new Error("transports or a winstonInstance are required by express-winston middleware");
288   -}
289   -
290   -function ensureValidLoggerOptions(options) {
291   - if (options.ignoreRoute && !_.isFunction(options.ignoreRoute)) {
292   - throw new Error("`ignoreRoute` express-winston option should be a function");
293   - }
294   -}
295   -
296   -module.exports.errorLogger = errorLogger;
297   -module.exports.logger = logger;
298   -module.exports.requestWhitelist = requestWhitelist;
299   -module.exports.bodyWhitelist = bodyWhitelist;
300   -module.exports.bodyBlacklist = bodyBlacklist;
301   -module.exports.responseWhitelist = responseWhitelist;
302   -module.exports.defaultRequestFilter = defaultRequestFilter;
303   -module.exports.defaultResponseFilter = defaultResponseFilter;
304   -module.exports.defaultSkip = defaultSkip;
305   -module.exports.ignoredRoutes = ignoredRoutes;