applay-utils 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +11 -0
- package/package.json +20 -0
- package/utils/crypto.js +34 -0
- package/utils/jwt.js +34 -0
- package/utils/mdb.js +144 -0
- package/utils/query.js +48 -0
package/index.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "applay-utils",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Utilitary tools for Applay applications",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
7
|
+
},
|
|
8
|
+
"main": "index.js",
|
|
9
|
+
"keywords": [
|
|
10
|
+
"v5",
|
|
11
|
+
"applay"
|
|
12
|
+
],
|
|
13
|
+
"author": "William Stuani",
|
|
14
|
+
"license": "ISC",
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"crypto-js": "^4.1.1",
|
|
17
|
+
"jsonwebtoken": "^8.5.1",
|
|
18
|
+
"mongodb": "^4.12.1"
|
|
19
|
+
}
|
|
20
|
+
}
|
package/utils/crypto.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
var CryptoJS = require('crypto-js');
|
|
2
|
+
var algorithm = 'aes-256-cbc';
|
|
3
|
+
var key;
|
|
4
|
+
|
|
5
|
+
var utils = {
|
|
6
|
+
'setKey': (newkey)=>{key=newkey},
|
|
7
|
+
'genIV': () => {
|
|
8
|
+
return Math.random().toString(36).substr(2, 30);
|
|
9
|
+
},
|
|
10
|
+
'encrypt': (text, iv) => {
|
|
11
|
+
if(!key) return null;
|
|
12
|
+
let base = CryptoJS.AES.encrypt(text, key, { iv: iv });
|
|
13
|
+
return base.toString();
|
|
14
|
+
},
|
|
15
|
+
'decrypt': (text, iv) => {
|
|
16
|
+
if(!key) return null;
|
|
17
|
+
let data = CryptoJS.AES.decrypt(text, key, { iv: iv }).toString(CryptoJS.enc.Utf8);
|
|
18
|
+
return data;
|
|
19
|
+
},
|
|
20
|
+
'protect': (data) => {
|
|
21
|
+
var iv = utils.genIV();
|
|
22
|
+
return { cipher: utils.encrypt(JSON.stringify(data), iv), iv: iv, protect: true, app_key: '', app_secret: '' }
|
|
23
|
+
},
|
|
24
|
+
'extract': (data) => {
|
|
25
|
+
if(!key) return null;
|
|
26
|
+
return JSON.parse(utils.decrypt(data.cipher, data.iv));
|
|
27
|
+
},
|
|
28
|
+
'envelope': (dataFull) => {
|
|
29
|
+
dataFull.data = utils.protect(dataFull.data);
|
|
30
|
+
return dataFull;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
module.exports=utils;
|
package/utils/jwt.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const jwt = require('jsonwebtoken');
|
|
2
|
+
var key;
|
|
3
|
+
var keyportal;
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var utils = {
|
|
7
|
+
'setKey': (newkey) => { key=newkey; },
|
|
8
|
+
'setKeyPortal': (newkey) => { keyportal=newkey; },
|
|
9
|
+
'auth': (req, res, next) => {
|
|
10
|
+
if(keyportal&&req.headers.keyportal==keyportal){
|
|
11
|
+
next();
|
|
12
|
+
return
|
|
13
|
+
}
|
|
14
|
+
const token = req.headers['x-access-token'];
|
|
15
|
+
if (!token) return res.status(401).json({ auth: false, message: 'Sem token definido.' });
|
|
16
|
+
if(!key) return res.status(401).json({ auth: false, message: 'Sem key definida.' });
|
|
17
|
+
jwt.verify(token, key, (err, decoded) => {
|
|
18
|
+
if (err) return res.status(401).json({ auth: false, message: 'Falha na autenticação do token.' });
|
|
19
|
+
req.userId = decoded.id.split('#')[0];
|
|
20
|
+
if (req.headers.cliente != decoded.id.split('#')[1]) {
|
|
21
|
+
return res.status(401).json({ auth: false, message: 'cliente diferente do token.' });
|
|
22
|
+
}
|
|
23
|
+
next();
|
|
24
|
+
});
|
|
25
|
+
},
|
|
26
|
+
'login': (id, time) => {
|
|
27
|
+
if(!key) return null;
|
|
28
|
+
const token = jwt.sign({ id }, key, {
|
|
29
|
+
expiresIn: time||(60 * 30) // segundos
|
|
30
|
+
});
|
|
31
|
+
return token;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
module.exports = utils;
|
package/utils/mdb.js
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
var MongoBase = require('mongodb');
|
|
2
|
+
var ObjectID = require('mongodb').ObjectID;
|
|
3
|
+
|
|
4
|
+
var MDB = {
|
|
5
|
+
status:{},
|
|
6
|
+
clients:{}
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
var connect= (alias,url,callback)=>{
|
|
10
|
+
if(MDB.status[alias]){return callback(MDB.clients[alias]);}
|
|
11
|
+
MongoBase.MongoClient.connect(url,{useUnifiedTopology: true}, (err, client)=>{
|
|
12
|
+
if(err){return console.log('ERRO MDB -- TRACKING -- ',err);}
|
|
13
|
+
MDB.status[alias]=true;
|
|
14
|
+
MDB.clients[alias]=client;
|
|
15
|
+
process.on('SIGTERM', internalStop());
|
|
16
|
+
process.on('SIGINT' , internalStop());
|
|
17
|
+
process.on('uncaughtException', internalStop());
|
|
18
|
+
callback(client)
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
var connectAsync = (alias, url) => new Promise(resolve => connect(alias,url,(client)=>resolve(client)));
|
|
23
|
+
|
|
24
|
+
var internalStop = (alias,finish)=>{
|
|
25
|
+
MDB.status[alias] = false;
|
|
26
|
+
MDB.clients[alias].close();
|
|
27
|
+
if(finish&&MDB.stopCustom){
|
|
28
|
+
MDB.stop(alias,()=>{
|
|
29
|
+
process.exit();
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
if(finish&&!MDB.stopCustom){
|
|
33
|
+
process.exit();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
var stopCustom = (customCallback)=>{
|
|
38
|
+
MDB.stopCustom=true;
|
|
39
|
+
MDB.stop = customCallback;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
var stop = (alias)=>{
|
|
43
|
+
internalStop(alias,false);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
function genOpsFull(data,tipo) {
|
|
48
|
+
var lista = [];
|
|
49
|
+
for(var x1 in data){
|
|
50
|
+
var objLista = {};
|
|
51
|
+
if(typeof data[x1] != 'object'){continue;}
|
|
52
|
+
if(tipo=='save'&&!data[x1]._id){objLista['insertOne']={document:data[x1]};}
|
|
53
|
+
if(tipo=='save'&&data[x1]._id&&data[x1]._id.length==24){
|
|
54
|
+
data[x1]._id=new ObjectID(data[x1]._id+'');
|
|
55
|
+
objLista['replaceOne']={
|
|
56
|
+
filter:{"_id" :data[x1]._id},
|
|
57
|
+
replacement:data[x1],
|
|
58
|
+
upsert:true
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if(tipo=='reg'){
|
|
62
|
+
var copyObj = Object.assign({}, data[x1]);
|
|
63
|
+
copyObj.regId=''
|
|
64
|
+
if(data[x1]._id){copyObj._reg.objId = data[x1]._id+'';}
|
|
65
|
+
delete copyObj._id;
|
|
66
|
+
objLista['insertOne']={document:copyObj};
|
|
67
|
+
}
|
|
68
|
+
lista.push(objLista);
|
|
69
|
+
}
|
|
70
|
+
return lista;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function genOps(data,tipo){
|
|
74
|
+
var lista = [];
|
|
75
|
+
var regs = [];
|
|
76
|
+
for(var x1 in data){
|
|
77
|
+
var objLista = {};
|
|
78
|
+
if(typeof data[x1] != 'object'){continue;}
|
|
79
|
+
if(tipo=='insert'&&data[x1]._id){continue;}
|
|
80
|
+
if(tipo=='replace'&&!data[x1]._id){continue;}
|
|
81
|
+
if(tipo=='insert'){objLista['insertOne']={document:data[x1]};}
|
|
82
|
+
if(tipo=='replace'){
|
|
83
|
+
data[x1]._id=new ObjectID(data[x1]._id+'');
|
|
84
|
+
objLista['replaceOne']={
|
|
85
|
+
filter:{"_id" :data[x1]._id},
|
|
86
|
+
replacement:data[x1],
|
|
87
|
+
upsert:true
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if(tipo=='regs'){
|
|
91
|
+
var copyObj = Object.assign({}, data[x1]);;
|
|
92
|
+
copyObj.regId=''
|
|
93
|
+
if(data[x1]._id){copyObj._reg.objId = data[x1]._id+'';}
|
|
94
|
+
delete copyObj._id;
|
|
95
|
+
objLista['insertOne']={document:copyObj};
|
|
96
|
+
}
|
|
97
|
+
lista.push(objLista);
|
|
98
|
+
}
|
|
99
|
+
return lista;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function build(data,model,user) {
|
|
103
|
+
var tipo = model.slice(0,3);
|
|
104
|
+
var time = new Date();
|
|
105
|
+
var letra = model.slice(3,4);
|
|
106
|
+
if(cfg.db.types.indexOf(tipo)<0){return {status:false,msg:'Tipo de Collection não definida'};}
|
|
107
|
+
if('ABCDEFGHIJKLMNOPQRSTUVWXYZ'.indexOf(letra)<0){return {status:false,msg:'Tipo de Collection não definida'};}
|
|
108
|
+
for(var x1 in data){
|
|
109
|
+
// console.log(x1,data[x1]);
|
|
110
|
+
var create = time.getTime();
|
|
111
|
+
var createtext = time.toLocaleString('pt-BR');
|
|
112
|
+
if(data[x1]._db){
|
|
113
|
+
create = data[x1]._db.create*1;
|
|
114
|
+
createtext = data[x1]._db.createtext+'';
|
|
115
|
+
}
|
|
116
|
+
data[x1]._db={
|
|
117
|
+
tipo:tipo,
|
|
118
|
+
time:time.getTime(),
|
|
119
|
+
timetext:time.toLocaleString('pt-BR').split(' ')[0],
|
|
120
|
+
create:create*1,
|
|
121
|
+
createtext:createtext+'',
|
|
122
|
+
userId:user._id+'',
|
|
123
|
+
username:user.username
|
|
124
|
+
};
|
|
125
|
+
var objId = data[x1]._reg&&data[x1]._reg.objId?data[x1]._reg.objId:'';
|
|
126
|
+
data[x1]._reg={
|
|
127
|
+
regId:time.getTime()+user._id+'',
|
|
128
|
+
collection:model,
|
|
129
|
+
objId:objId,
|
|
130
|
+
reg:'reg'+model.slice(0,1).toUpperCase()+model.slice(1)
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
return data;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
module.exports = {
|
|
137
|
+
connect:connect,
|
|
138
|
+
connectAsync:connectAsync,
|
|
139
|
+
stop:stop,
|
|
140
|
+
stopCustom:stopCustom,
|
|
141
|
+
build:build,
|
|
142
|
+
genOps:genOps,
|
|
143
|
+
genOpsFull:genOpsFull
|
|
144
|
+
};
|
package/utils/query.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
var utils = {
|
|
2
|
+
'findAsync': (db, collection, filter) => new Promise(resolve => db.collection(collection).find(filter).toArray((err, result) => resolve(result))),
|
|
3
|
+
'findLimitAsync': (db, collection, filter, limit) => new Promise(resolve => db.collection(collection).find(filter).limit(limit).toArray((err, result) => resolve(result))),
|
|
4
|
+
'distinctAsync': (db, collection, filter, campo) => new Promise(resolve => db.collection(collection).distinct(campo, filter, (err, result) => resolve(result))),
|
|
5
|
+
'findLimitSortAsync': (db, collection, filter, sort, limit) => new Promise(resolve => db.collection(collection).find(filter).sort(sort).limit(limit).toArray((err, result) => resolve(result))),
|
|
6
|
+
'findSortAsync': (db, collection, filter, sort) => new Promise(resolve => db.collection(collection).find(filter).sort(sort).toArray((err, result) => resolve(result))),
|
|
7
|
+
'findTextAsync': (db, collection, filter) => new Promise(resolve => db.collection(collection).find(filter.query).project(filter.score).sort(filter.score).limit(20).toArray((err, result) => resolve(result))),
|
|
8
|
+
'findOneAsync': (db, collection, filter) => new Promise(resolve => db.collection(collection).findOne(filter, (err, result) => resolve(result))),
|
|
9
|
+
'countAsync': (db, collection, filter) => new Promise(resolve => db.collection(collection).countDocuments(filter, (err, result) => resolve(result))),
|
|
10
|
+
'updateAsync': (db, collection, item) => new Promise(resolve => db.collection(collection).replaceOne({ _id: new mdb.ObjectID(item._id) }, item, (err, result) => { if (err) { console.log('erro', err); } return resolve(result); })),
|
|
11
|
+
'insertOne': (db, collection, item) => new Promise(resolve => db.collection(collection).insertOne(item, (err, result) => resolve(result))),
|
|
12
|
+
'insertMany': (db, collection, item) => new Promise(resolve => db.collection(collection).insertMany(item, (err, result) => resolve(result))),
|
|
13
|
+
'findLastAsync': (db, collection, filter) => new Promise(resolve => db.collection(collection).find(filter).sort({ _id: -1 }).limit(1).toArray((err, result) => resolve(result[0]))),
|
|
14
|
+
'updateSetAsync': (db, collection, itemId, itemSet) => new Promise(resolve => db.collection(collection).findOneAndUpdate(itemId, { $set: itemSet }, (err, result) => resolve(result))),
|
|
15
|
+
'updateAllAsync': (db, collection, filter, itemSet) => new Promise(resolve => db.collection(collection).updateMany(filter, itemSet, (err, result) => resolve(err || result))),
|
|
16
|
+
'saveAsync': (db, collection, dataOrItem, user) => new Promise(resolve => {
|
|
17
|
+
console.log("🚀 ~ db", db)
|
|
18
|
+
console.log("🚀 ~ collection", collection)
|
|
19
|
+
|
|
20
|
+
var data = Array.isArray(dataOrItem) ? dataOrItem : [dataOrItem];
|
|
21
|
+
console.log("🚀 ~ data", data)
|
|
22
|
+
var dataBuild = mdb.build(data, collection, user);
|
|
23
|
+
console.log("🚀 ~ dataBuild", dataBuild)
|
|
24
|
+
var listaOps = mdb.genOpsFull(dataBuild, 'save');
|
|
25
|
+
console.log("🚀 ~ listaOps", listaOps)
|
|
26
|
+
|
|
27
|
+
db.collection(collection).bulkWrite(listaOps, (err, result) => {
|
|
28
|
+
if (err) { console.log('Erro bulkwrite cad: ', err); }
|
|
29
|
+
|
|
30
|
+
var ids = result.getInsertedIds();
|
|
31
|
+
ids.forEach(e => dataBuild[e.index]._reg.objId = e._id + '');
|
|
32
|
+
|
|
33
|
+
var regsOps = mdb.genOpsFull(dataBuild, 'reg');
|
|
34
|
+
var regCollection = 'reg' + collection.slice(0, 1).toUpperCase() + collection.slice(1);
|
|
35
|
+
|
|
36
|
+
db.collection(regCollection).bulkWrite(regsOps, (err2, result2) => {
|
|
37
|
+
if (err2) { console.log('Erro bulkwrite reg: ', err2); }
|
|
38
|
+
|
|
39
|
+
var resObj = { ids: ids, regs: result2 }
|
|
40
|
+
|
|
41
|
+
resolve(resObj);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
})
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
module.exports = utils;
|