Commit 0b6272e09aba091c99777431b4ce6b0c65ca09b9

Authored by sumatek
1 parent e57c30ae
Exists in master

update template

app.config.json
1 { 1 {
2 "default": { 2 "default": {
3 - "appName": "Hostpital service", 3 + "appName": "Hostpital",
4 "appPort": 3000, 4 "appPort": 3000,
5 "apiUrlPrefix": "/api", 5 "apiUrlPrefix": "/api",
6 "requestTimeout": 10, 6 "requestTimeout": 10,
7 "mongoDB" : { 7 "mongoDB" : {
8 "hopitalIp" : "10.1.2.155:27017", 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
@@ -3,6 +3,10 @@ const express = require('express'); @@ -3,6 +3,10 @@ const express = require('express');
3 const app = express(); 3 const app = express();
4 const conf = require('utils/config'); 4 const conf = require('utils/config');
5 const utils = require('utils/utils'); 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 // console.log(conf.get('redis.host')); 11 // console.log(conf.get('redis.host'));
8 12
@@ -10,6 +14,8 @@ const utils = require('utils/utils'); @@ -10,6 +14,8 @@ const utils = require('utils/utils');
10 const addRequestId = require('express-request-id')(); 14 const addRequestId = require('express-request-id')();
11 app.use(addRequestId); 15 app.use(addRequestId);
12 16
  17 +
  18 +
13 // setup express-session with redis store 19 // setup express-session with redis store
14 const session = require('express-session'); 20 const session = require('express-session');
15 // const RedisStore = require('connect-redis')(session); 21 // const RedisStore = require('connect-redis')(session);
@@ -31,6 +37,46 @@ const uuidV4 = require('uuid/v4'); @@ -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 // setup json body parser 80 // setup json body parser
35 const bodyParser = require('body-parser'); 81 const bodyParser = require('body-parser');
36 app.use(bodyParser.json()); 82 app.use(bodyParser.json());
@@ -39,8 +85,8 @@ app.use(bodyParser.json()); @@ -39,8 +85,8 @@ app.use(bodyParser.json());
39 // const logger = require('utils/request-logger'); 85 // const logger = require('utils/request-logger');
40 86
41 // setup express request/response logger 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 // const log4jsLogger = log4js.getLogger('express-project'); 90 // const log4jsLogger = log4js.getLogger('express-project');
45 91
46 // const fileTransport = logger.fileTransport; 92 // const fileTransport = logger.fileTransport;
@@ -88,11 +134,17 @@ app.use(function (req, res, next) { @@ -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 req = utils.findQueryString(req); 147 req = utils.findQueryString(req);
94 -  
95 -  
96 next(); 148 next();
97 }); 149 });
98 150
@@ -111,18 +163,40 @@ app.use(apiUrlPrefix+'/preference', preference); @@ -111,18 +163,40 @@ app.use(apiUrlPrefix+'/preference', preference);
111 // let apiLogin = require('./controllers/login/login')(passport); 163 // let apiLogin = require('./controllers/login/login')(passport);
112 // app.use('/', apiLogin); 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 // handle not found 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 // // handle errors 201 // // handle errors
128 // app.use(function (err, req, res, next) { 202 // app.use(function (err, req, res, next) {
config/log4js_config.json
@@ -1,18 +0,0 @@ @@ -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 \ No newline at end of file 0 \ No newline at end of file
controllers/preference/index.js
@@ -2,33 +2,56 @@ let express = require('express'); @@ -2,33 +2,56 @@ let express = require('express');
2 let router = express.Router(); 2 let router = express.Router();
3 let connection = require("../../utils/mongoDB") 3 let connection = require("../../utils/mongoDB")
4 var utils = require('../../utils/utils'); 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 var query = Object.assign(req.params, req.query); 15 var query = Object.assign(req.params, req.query);
9 var filter = await utils.getQueryFilter(query.filter); 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 res.status(200).json(result); 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 res.status(200).json(result); 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 module.exports = router; 57 module.exports = router;
35 \ No newline at end of file 58 \ No newline at end of file
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 "_id": "log4js@3.0.6", 3 "_id": "log4js@3.0.6",
4 "_inBundle": false, 4 "_inBundle": false,
5 "_integrity": "sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==", 5 "_integrity": "sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==",
@@ -8,12 +8,12 @@ @@ -8,12 +8,12 @@
8 "_requested": { 8 "_requested": {
9 "type": "range", 9 "type": "range",
10 "registry": true, 10 "registry": true,
11 - "raw": "log4js@^3.0.4", 11 + "raw": "log4js@^3.0.6",
12 "name": "log4js", 12 "name": "log4js",
13 "escapedName": "log4js", 13 "escapedName": "log4js",
14 - "rawSpec": "^3.0.4", 14 + "rawSpec": "^3.0.6",
15 "saveSpec": null, 15 "saveSpec": null,
16 - "fetchSpec": "^3.0.4" 16 + "fetchSpec": "^3.0.6"
17 }, 17 },
18 "_requiredBy": [ 18 "_requiredBy": [
19 "#USER", 19 "#USER",
@@ -21,8 +21,8 @@ @@ -21,8 +21,8 @@
21 ], 21 ],
22 "_resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz", 22 "_resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz",
23 "_shasum": "e6caced94967eeeb9ce399f9f8682a4b2b28c8ff", 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 "author": { 26 "author": {
27 "name": "Gareth Jones", 27 "name": "Gareth Jones",
28 "email": "gareth.nomiddlename@gmail.com" 28 "email": "gareth.nomiddlename@gmail.com"
node_modules/log4js/types/log4js.d.ts
@@ -1,297 +0,0 @@ @@ -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,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,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,6 +18,11 @@
18 "lodash.kebabcase": "4.1.1" 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 "accepts": { 26 "accepts": {
22 "version": "1.3.5", 27 "version": "1.3.5",
23 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 28 "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
@@ -27,6 +32,17 @@ @@ -27,6 +32,17 @@
27 "negotiator": "0.6.1" 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 "align-text": { 46 "align-text": {
31 "version": "0.1.4", 47 "version": "0.1.4",
32 "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 48 "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
@@ -52,6 +68,20 @@ @@ -52,6 +68,20 @@
52 "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz", 68 "resolved": "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz",
53 "integrity": "sha1-ZBqlXft9am8KgUHEucCqULbCTdU=" 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 "array-flatten": { 85 "array-flatten": {
56 "version": "1.1.1", 86 "version": "1.1.1",
57 "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 87 "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
@@ -78,6 +108,11 @@ @@ -78,6 +108,11 @@
78 "lodash": "4.17.11" 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 "aws-sign2": { 116 "aws-sign2": {
82 "version": "0.6.0", 117 "version": "0.6.0",
83 "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", 118 "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
@@ -101,6 +136,14 @@ @@ -101,6 +136,14 @@
101 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 136 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
102 "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 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 "bcrypt-pbkdf": { 147 "bcrypt-pbkdf": {
105 "version": "1.0.2", 148 "version": "1.0.2",
106 "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 149 "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
@@ -241,6 +284,11 @@ @@ -241,6 +284,11 @@
241 "es6-object-assign": "1.1.0" 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 "circular-json": { 292 "circular-json": {
245 "version": "0.5.7", 293 "version": "0.5.7",
246 "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.7.tgz", 294 "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.7.tgz",
@@ -256,6 +304,16 @@ @@ -256,6 +304,16 @@
256 "wordwrap": "0.0.2" 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 "color": { 317 "color": {
260 "version": "3.0.0", 318 "version": "3.0.0",
261 "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", 319 "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz",
@@ -319,6 +377,18 @@ @@ -319,6 +377,18 @@
319 "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", 377 "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
320 "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" 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 "concat-map": { 392 "concat-map": {
323 "version": "0.0.1", 393 "version": "0.0.1",
324 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 394 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -363,6 +433,11 @@ @@ -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 "content-disposition": { 441 "content-disposition": {
367 "version": "0.5.2", 442 "version": "0.5.2",
368 "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 443 "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
@@ -435,6 +510,11 @@ @@ -435,6 +510,11 @@
435 "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz", 510 "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz",
436 "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=" 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 "debug": { 518 "debug": {
439 "version": "2.6.9", 519 "version": "2.6.9",
440 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 520 "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -448,11 +528,21 @@ @@ -448,11 +528,21 @@
448 "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 528 "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
449 "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 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 "delayed-stream": { 536 "delayed-stream": {
452 "version": "0.0.5", 537 "version": "0.0.5",
453 "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", 538 "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz",
454 "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=" 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 "depd": { 546 "depd": {
457 "version": "1.1.2", 547 "version": "1.1.2",
458 "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 548 "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@@ -463,6 +553,11 @@ @@ -463,6 +553,11 @@
463 "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 553 "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
464 "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 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 "diagnostics": { 561 "diagnostics": {
467 "version": "1.1.1", 562 "version": "1.1.1",
468 "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", 563 "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz",
@@ -646,6 +741,16 @@ @@ -646,6 +741,16 @@
646 "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 741 "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
647 "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 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 "fast-safe-stringify": { 754 "fast-safe-stringify": {
650 "version": "2.0.6", 755 "version": "2.0.6",
651 "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz", 756 "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.6.tgz",
@@ -715,11 +820,34 @@ @@ -715,11 +820,34 @@
715 "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 820 "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
716 "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 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 "fs.realpath": { 831 "fs.realpath": {
719 "version": "1.0.0", 832 "version": "1.0.0",
720 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 833 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
721 "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 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 "generate-function": { 851 "generate-function": {
724 "version": "2.3.1", 852 "version": "2.3.1",
725 "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", 853 "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
@@ -769,6 +897,11 @@ @@ -769,6 +897,11 @@
769 "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 897 "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
770 "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" 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 "har-validator": { 905 "har-validator": {
773 "version": "2.0.6", 906 "version": "2.0.6",
774 "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", 907 "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
@@ -793,6 +926,11 @@ @@ -793,6 +926,11 @@
793 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 926 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
794 "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 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 "hawk": { 934 "hawk": {
797 "version": "3.1.3", 935 "version": "3.1.3",
798 "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", 936 "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
@@ -851,6 +989,14 @@ @@ -851,6 +989,14 @@
851 "safer-buffer": "2.1.2" 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 "indicative": { 1000 "indicative": {
855 "version": "3.0.6", 1001 "version": "3.0.6",
856 "resolved": "https://registry.npmjs.org/indicative/-/indicative-3.0.6.tgz", 1002 "resolved": "https://registry.npmjs.org/indicative/-/indicative-3.0.6.tgz",
@@ -881,6 +1027,11 @@ @@ -881,6 +1027,11 @@
881 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1027 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
882 "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 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 "ipaddr.js": { 1035 "ipaddr.js": {
885 "version": "1.8.0", 1036 "version": "1.8.0",
886 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", 1037 "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
@@ -896,6 +1047,14 @@ @@ -896,6 +1047,14 @@
896 "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1047 "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
897 "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 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 "is-my-ip-valid": { 1058 "is-my-ip-valid": {
900 "version": "1.0.0", 1059 "version": "1.0.0",
901 "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", 1060 "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
@@ -948,6 +1107,11 @@ @@ -948,6 +1107,11 @@
948 "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1107 "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
949 "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 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 "json-stringify-safe": { 1115 "json-stringify-safe": {
952 "version": "5.0.1", 1116 "version": "5.0.1",
953 "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1117 "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
@@ -1154,6 +1318,23 @@ @@ -1154,6 +1318,23 @@
1154 "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1318 "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1155 "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 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 "mkdirp": { 1338 "mkdirp": {
1158 "version": "0.5.1", 1339 "version": "0.5.1",
1159 "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1340 "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
@@ -1228,6 +1409,18 @@ @@ -1228,6 +1409,18 @@
1228 "saslprep": "1.0.2" 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 "ms": { 1424 "ms": {
1232 "version": "2.0.0", 1425 "version": "2.0.0",
1233 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1426 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@@ -1256,11 +1449,26 @@ @@ -1256,11 +1449,26 @@
1256 "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", 1449 "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=",
1257 "optional": true 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 "negotiator": { 1462 "negotiator": {
1260 "version": "0.6.1", 1463 "version": "0.6.1",
1261 "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 1464 "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
1262 "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 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 "node-forge": { 1472 "node-forge": {
1265 "version": "0.7.6", 1473 "version": "0.7.6",
1266 "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz", 1474 "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz",
@@ -1271,11 +1479,82 @@ @@ -1271,11 +1479,82 @@
1271 "resolved": "https://registry.npmjs.org/node-json-config/-/node-json-config-0.0.4.tgz", 1479 "resolved": "https://registry.npmjs.org/node-json-config/-/node-json-config-0.0.4.tgz",
1272 "integrity": "sha1-6e+xih5l/TSMudKVGIlwjmaEheo=" 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 "oauth-sign": { 1548 "oauth-sign": {
1275 "version": "0.8.2", 1549 "version": "0.8.2",
1276 "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 1550 "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
1277 "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 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 "on-finished": { 1558 "on-finished": {
1280 "version": "2.3.0", 1559 "version": "2.3.0",
1281 "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1560 "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@@ -1302,6 +1581,25 @@ @@ -1302,6 +1581,25 @@
1302 "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz", 1581 "resolved": "https://registry.npmjs.org/one-time/-/one-time-0.0.4.tgz",
1303 "integrity": "sha1-+M33eISCb+Tf+T46nMN7HkSAdC4=" 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 "p-lazy": { 1603 "p-lazy": {
1306 "version": "1.0.0", 1604 "version": "1.0.0",
1307 "resolved": "https://registry.npmjs.org/p-lazy/-/p-lazy-1.0.0.tgz", 1605 "resolved": "https://registry.npmjs.org/p-lazy/-/p-lazy-1.0.0.tgz",
@@ -1404,6 +1702,11 @@ @@ -1404,6 +1702,11 @@
1404 "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", 1702 "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
1405 "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" 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 "pinkie": { 1710 "pinkie": {
1408 "version": "2.0.4", 1711 "version": "2.0.4",
1409 "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1712 "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
@@ -1446,6 +1749,11 @@ @@ -1446,6 +1749,11 @@
1446 "ipaddr.js": "1.8.0" 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 "punycode": { 1757 "punycode": {
1450 "version": "1.4.1", 1758 "version": "1.4.1",
1451 "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1759 "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
@@ -1482,6 +1790,24 @@ @@ -1482,6 +1790,24 @@
1482 "unpipe": "1.0.0" 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 "readable-stream": { 1811 "readable-stream": {
1486 "version": "2.3.6", 1812 "version": "2.3.6",
1487 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1813 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
@@ -1635,6 +1961,11 @@ @@ -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 "safe-buffer": { 1969 "safe-buffer": {
1639 "version": "5.1.2", 1970 "version": "5.1.2",
1640 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1971 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@@ -1701,11 +2032,21 @@ @@ -1701,11 +2032,21 @@
1701 "send": "0.16.2" 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 "setprototypeof": { 2040 "setprototypeof": {
1705 "version": "1.1.0", 2041 "version": "1.1.0",
1706 "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 2042 "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
1707 "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 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 "simple-swizzle": { 2050 "simple-swizzle": {
1710 "version": "0.2.2", 2051 "version": "0.2.2",
1711 "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 2052 "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
@@ -1736,6 +2077,139 @@ @@ -1736,6 +2077,139 @@
1736 "memory-pager": "1.1.0" 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 "sshpk": { 2213 "sshpk": {
1740 "version": "1.15.1", 2214 "version": "1.15.1",
1741 "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz", 2215 "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz",
@@ -1795,6 +2269,16 @@ @@ -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 "string_decoder": { 2282 "string_decoder": {
1799 "version": "1.1.1", 2283 "version": "1.1.1",
1800 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2284 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
@@ -1816,11 +2300,30 @@ @@ -1816,11 +2300,30 @@
1816 "ansi-regex": "2.1.1" 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 "supports-color": { 2308 "supports-color": {
1820 "version": "2.0.0", 2309 "version": "2.0.0",
1821 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 2310 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
1822 "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 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 "text-hex": { 2327 "text-hex": {
1825 "version": "1.0.0", 2328 "version": "1.0.0",
1826 "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", 2329 "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
@@ -1964,6 +2467,14 @@ @@ -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 "window-size": { 2478 "window-size": {
1968 "version": "0.1.0", 2479 "version": "0.1.0",
1969 "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 2480 "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
@@ -2074,6 +2585,11 @@ @@ -2074,6 +2585,11 @@
2074 "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 2585 "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
2075 "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 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 "yargs": { 2593 "yargs": {
2078 "version": "3.10.0", 2594 "version": "3.10.0",
2079 "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 2595 "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
@@ -12,6 +12,7 @@ @@ -12,6 +12,7 @@
12 "dependencies": { 12 "dependencies": {
13 "app-module-path": "^2.2.0", 13 "app-module-path": "^2.2.0",
14 "body-parser": "^1.18.3", 14 "body-parser": "^1.18.3",
  15 + "commonlog-kb": "^1.3.5",
15 "connect-flash": "^0.1.1", 16 "connect-flash": "^0.1.1",
16 "connect-redis": "^3.4.0", 17 "connect-redis": "^3.4.0",
17 "cookie-parser": "^1.4.3", 18 "cookie-parser": "^1.4.3",
@@ -24,6 +25,7 @@ @@ -24,6 +25,7 @@
24 "mocha": "^5.2.0", 25 "mocha": "^5.2.0",
25 "moment": "^2.22.2", 26 "moment": "^2.22.2",
26 "mongodb": "^3.1.8", 27 "mongodb": "^3.1.8",
  28 + "morgan": "^1.9.1",
27 "node-json-config": "0.0.4", 29 "node-json-config": "0.0.4",
28 "passport": "^0.4.0", 30 "passport": "^0.4.0",
29 "passport-local": "^1.0.0", 31 "passport-local": "^1.0.0",
utils/config.js
@@ -6,17 +6,17 @@ const NodeJsonConfig = require('node-json-config'); @@ -6,17 +6,17 @@ const NodeJsonConfig = require('node-json-config');
6 const conf = new NodeJsonConfig('app.config.json'); 6 const conf = new NodeJsonConfig('app.config.json');
7 7
8 let defaultConfObj = conf.get('default'); 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 let envConfObj = conf.get(nodeEnv); 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 let currentConfObj = Object.assign(defaultConfObj, envConfObj); 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 conf.put(nodeEnv, currentConfObj); 21 conf.put(nodeEnv, currentConfObj);
22 22
utils/constants.js 0 โ†’ 100644
@@ -0,0 +1,90 @@ @@ -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 \ No newline at end of file 91 \ No newline at end of file
utils/errors.js
@@ -1,16 +0,0 @@ @@ -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 \ No newline at end of file 0 \ No newline at end of file
utils/log.js 0 โ†’ 100644
@@ -0,0 +1,264 @@ @@ -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 var MongoClient = require('mongodb').MongoClient; 3 var MongoClient = require('mongodb').MongoClient;
3 var config = require('./config'); 4 var config = require('./config');
4 5
@@ -16,93 +17,82 @@ connection.reqMongo = async function (req,method, query, collection) { @@ -16,93 +17,82 @@ connection.reqMongo = async function (req,method, query, collection) {
16 17
17 18
18 function mongoReq(req,url,database,method, query, collection){ 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 return new Promise((resolve, reject) => { 31 return new Promise((resolve, reject) => {
23 MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) { 32 MongoClient.connect(url, { useNewUrlParser: true }, function(err, db) {
24 if (err) { 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 switch (method) { 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 break; 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 break; 51 break;
56 case "PUT": 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 break; 62 break;
67 case "DELETE": 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 break; 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 return returnData 98 return returnData
utils/passport-func.js
@@ -1,71 +0,0 @@ @@ -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 \ No newline at end of file 0 \ No newline at end of file
utils/request-logger.js
@@ -1,67 +0,0 @@ @@ -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 \ No newline at end of file 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 let sendResponse = {}; 2 let sendResponse = {};
5 3
@@ -13,26 +11,26 @@ sendResponse.missingOrInvalidResponse = (param) =&gt; { @@ -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 module.exports = sendResponse; 36 module.exports = sendResponse;
utils/stats.js 0 โ†’ 100644
@@ -0,0 +1,41 @@ @@ -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 \ No newline at end of file 42 \ No newline at end of file
utils/utils.js
@@ -59,8 +59,13 @@ utils.getUpdateFilter = function(obj) @@ -59,8 +59,13 @@ utils.getUpdateFilter = function(obj)
59 59
60 utils.getQueryFilter = async function(data) 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 getQuery = async function(data,query){ 71 getQuery = async function(data,query){
@@ -178,4 +183,17 @@ function findValueInBracket(data) @@ -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 module.exports = utils; 199 module.exports = utils;
182 \ No newline at end of file 200 \ No newline at end of file
utils/validator.js
@@ -1,11 +0,0 @@ @@ -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 \ No newline at end of file 0 \ No newline at end of file
utils/winston-express-middleware/index.js
@@ -1,305 +0,0 @@ @@ -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;