@bee.js/node 0.0.47 → 0.0.49

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/lib/DBA/beeDBA.js CHANGED
@@ -98,13 +98,12 @@ module.exports.actions = {
98
98
 
99
99
  MODEL_CREATE_CONSTRAINT: function (model, configsDB) {
100
100
  let q = beeORM.quote;
101
- let SQL = "\n\n\n\n";
101
+ let SQL = "\n\n\n";
102
102
 
103
- SQL += `/*----- Constraints for table ${q(model.table)} -----*/\n\n`;
104
- SQL += `ALTER TABLE ${q(model.table)}\n`;
103
+ SQL += `/*----- Constraints for table ${q(model.table)} -----*/\n`;
105
104
 
106
105
  for (let field in model.relations)
107
- SQL += ` ADD CONSTRAINT ${q(
106
+ SQL += `\n\n ALTER TABLE ${q(model.table)}\n ADD CONSTRAINT ${q(
108
107
  `FK_${model.relations[field].split(".")[0]}_X_${
109
108
  model.table
110
109
  }_${field}`.slice(0, 64)
package/lib/ORM/beeORM.js CHANGED
@@ -1,320 +1,364 @@
1
- const mysql = require('mysql2/promise'); //https://evertpot.com/executing-a-mysql-query-in-nodejs/
2
- const beeTools = require('../../tools/beeTools');
1
+ const mysql = require("mysql2/promise"); //https://evertpot.com/executing-a-mysql-query-in-nodejs/
2
+ const beeTools = require("../../tools/beeTools");
3
3
 
4
- const escape = function(string) {
5
- return string.replace(/[\0\x08\x09\x1a\n\r"'\\\%]/g, function (char) {
4
+ const escape = function (string) {
5
+ return !string
6
+ ? string
7
+ : string.replace(/[\0\x08\x09\x1a\n\r"'\\\%]/g, function (char) {
6
8
  switch (char) {
7
- case "\0":
8
- return "\\0";
9
- case "\x08":
10
- return "\\b";
11
- case "\x09":
12
- return "\\t";
13
- case "\x1a":
14
- return "\\z";
15
- case "\n":
16
- return "\\n";
17
- case "\r":
18
- return "\\r";
19
- case "\"":
20
- case "'":
21
- case "\\":
22
- case "%":
23
- return "\\"+char; // prepends a backslash to backslash, percent,
24
- // and double/single quotes
25
- default:
26
- return char;
9
+ case "\0":
10
+ return "\\0";
11
+ case "\x08":
12
+ return "\\b";
13
+ case "\x09":
14
+ return "\\t";
15
+ case "\x1a":
16
+ return "\\z";
17
+ case "\n":
18
+ return "\\n";
19
+ case "\r":
20
+ return "\\r";
21
+ case '"':
22
+ case "'":
23
+ case "\\":
24
+ case "%":
25
+ return "\\" + char; // prepends a backslash to backslash, percent,
26
+ // and double/single quotes
27
+ default:
28
+ return char;
27
29
  }
28
- });
29
- }
30
+ });
31
+ };
32
+
33
+ const parseArray = function (param) {
34
+ switch (typeof param) {
35
+ case "string":
36
+ return param.split(",").map((a) => a.trim());
37
+ case "object":
38
+ return Object.values(param);
39
+ default:
40
+ return param || [];
41
+ }
42
+ };
43
+
44
+ const quote = function (word, type = this.configs.databases.default.type) {
45
+ let escape;
46
+
47
+ switch (type) {
48
+ case "mysql":
49
+ escape = "``";
50
+ break;
51
+ case "mssql":
52
+ escape = "[]";
53
+ break;
54
+ default:
55
+ escape = type + type;
56
+ break;
57
+ }
58
+
59
+ return escape[0] + word + escape[1];
60
+ };
61
+
62
+ const stringBind = function (_string, params = {}) {
63
+ for (let param of Object.keys(params))
64
+ _string = _string.replace(":" + param, `'${params[param]}'`); // TODO fazer replace global (Expressao regular) quando a palavra a ser substituida for iniciada com o caractere :
65
+
66
+ return _string;
67
+ };
68
+
69
+ const modelSqlSelectFields = function (model, onlyFields = []) {
70
+ let fields = [];
71
+
72
+ model.fields
73
+ ? (fields = parseArray(model.fields))
74
+ : Object.keys(model.schema).map((field) => {
75
+ if (
76
+ model.schema[field].out === false ||
77
+ (onlyFields.length && !onlyFields.includes(field))
78
+ )
79
+ return;
80
+
81
+ switch (model.schema[field].type) {
82
+ case "uuid":
83
+ case "guid":
84
+ fields.push(`BIN_TO_UUID(${model.table}.${field}) as ${field}`);
85
+ break;
86
+ default:
87
+ fields.push(`${model.table}.${field}`);
88
+ }
89
+ });
90
+
91
+ return fields;
92
+ };
93
+
94
+ const modelSqlWhere = function (
95
+ model,
96
+ vals,
97
+ middlewareParams,
98
+ callsWhere = []
99
+ ) {
100
+ const q = quote;
101
+
102
+ let SQL = "";
103
+ let gWhere = model.globalWhere ? q(model.globalWhere, "()") : "";
104
+ let keys = parseArray(model.indexes.keys);
105
+
106
+ gWhere =
107
+ gWhere && middlewareParams ? stringBind(gWhere, middlewareParams) : "";
108
+
109
+ if (typeof vals !== "object") vals = [vals];
110
+
111
+ vals.map((val, i) =>
112
+ keys.map((k) => {
113
+ switch (
114
+ model.schema[k].type //TODO encapsule
115
+ ) {
116
+ case "guid":
117
+ case "uuid":
118
+ vals[i] = `UUID_TO_BIN('${val}')`;
119
+ break;
120
+ default:
121
+ vals[i] = `'${val}'`;
122
+ }
123
+ })
124
+ );
125
+
126
+ switch (vals.length) {
127
+ case 0:
128
+ SQL += gWhere ? ` WHERE ${gWhere}` : "";
129
+ break;
130
+ case 1:
131
+ SQL += ` WHERE ${model.table}.${keys[0]} = ${vals[0]} ${
132
+ gWhere ? "AND " + gWhere : ""
133
+ }`;
134
+ break;
135
+ default:
136
+ SQL +=
137
+ typeof vals == "object"
138
+ ? ` WHERE ${model.table}.${keys[0]} IN('${vals.join("','")}') ${
139
+ gWhere ? "AND " + gWhere : ""
140
+ }`
141
+ : ` WHERE ${model.table}.${keys[0]} IN(${vals}) ${
142
+ gWhere ? "AND " + gWhere : ""
143
+ }`;
144
+ }
145
+
146
+ if (callsWhere.length) SQL += `WHERE ${callsWhere.join(" AND ")}`;
147
+
148
+ return SQL;
149
+ };
30
150
 
31
- const parseArray = function(param) {
32
- switch(typeof(param)){
33
- case 'string': return param.split(',').map((a)=>a.trim())
34
- case 'object': return Object.values(param)
35
- default: return param || []
151
+ module.exports = {
152
+ escape,
153
+ quote,
154
+ stringBind,
155
+ parseArray,
156
+ modelSqlWhere,
157
+ modelSqlSelectFields,
158
+
159
+ createPool: function (configs) {
160
+ // TODO criar aviso de error para falta de configs.db. Criar no hive().create
161
+
162
+ // TODO pegar dinamicamnete database utilizada
163
+ let db = configs.databases.default;
164
+
165
+ switch (db.type) {
166
+ case "mssql": // TODO implementar na versao >=1.2
167
+ return false;
168
+ case "mongo": // TODO implementar na versao >=1.2
169
+ return false;
170
+ default:
171
+ return mysql.createPool({
172
+ host: db.host,
173
+ user: db.user,
174
+ password: db.pass,
175
+ database: db.name,
176
+ waitForConnections: db.waitForConnections || true,
177
+ connectionLimit: db.connectionLimit || 10,
178
+ queueLimit: db.queueLimit || 0,
179
+ });
36
180
  }
37
- }
181
+ },
182
+
183
+ sqlSelect: function (model, ids = [], params = {}) {
184
+ //console.log(ids)
185
+ let SQL = [];
186
+ let vals = Array.isArray(ids) ? ids : ids.toString().split(",");
187
+ let where = modelSqlWhere(
188
+ model,
189
+ vals,
190
+ params.middlewareParams,
191
+ params.where
192
+ );
193
+ let joins = params.joins && params.joins.length ? joins.join(" ") : "";
194
+ let order =
195
+ params.orderBy && params.orderBy.length
196
+ ? ` ORDER BY ${params.orderBy}`
197
+ : "";
198
+ let limit =
199
+ params.limit && params.limit.length ? ` LIMIT ${params.limit}` : "";
200
+ let fields = modelSqlSelectFields(model, params.fields);
201
+
202
+ SQL.push(`SELECT ${fields.join(", ")} `);
203
+ SQL.push(`FROM ${quote(model.table)} `);
204
+ SQL.push(joins);
205
+ SQL.push(where);
206
+ SQL.push(order);
207
+ SQL.push(limit);
208
+
209
+ return SQL;
210
+ },
211
+
212
+ sqlInsertUpdate(model, data, onlyFields = [], statement = "INSERT") {
213
+ const q = quote;
214
+
215
+ let result = {};
216
+ let fields = [];
217
+ let values = [];
218
+ let binds = [];
219
+ let insertValues = [];
220
+
221
+ data = data[0] ? data : [data];
222
+
223
+ Object.keys(data).map((key) => {
224
+ for (let field in model.schema) {
225
+ field = { ...model.schema[field], name: field };
226
+
227
+ if (field.dbControl) continue;
228
+ if (!field.ai && onlyFields.length && !onlyFields.includes(field.name))
229
+ continue;
230
+
231
+ let value = escape(data[key][field.name]);
232
+ let type = model.schema[field.name].type;
233
+
234
+ if (statement == "INSERT" && field.ai)
235
+ switch (type) {
236
+ case "guid":
237
+ case "uuid":
238
+ value = beeTools.guid().toString();
239
+ result.insertBin = beeTools.guidToBin(value);
240
+ result.insertUUID = value;
241
+ break;
242
+ }
38
243
 
39
- const quote = function(word, type = this.configs.databases.default.type) {
40
- let escape;
244
+ if (value === undefined) continue;
41
245
 
42
- switch (type) {
43
- case 'mysql':
44
- escape = '``'
246
+ switch (type) {
247
+ case "guid":
248
+ case "uuid":
249
+ value = `UUID_TO_BIN('${value}')`; //TODO mssql
45
250
  break;
46
- case 'mssql':
47
- escape = '[]'
251
+ case "binary":
252
+ value = value;
48
253
  break;
49
- default:
50
- escape = type + type
254
+ case "file":
255
+ binds.push(value);
256
+ value = "?";
51
257
  break;
52
- }
258
+ case "date":
259
+ case "datetime":
260
+ case "time":
261
+ case "timestamp":
262
+ value = value ? q(value, "''") : "null";
263
+ break;
264
+ default:
265
+ value = q(value, "''");
266
+ }
53
267
 
54
- return escape[0] + word + escape[1]
55
- }
56
-
57
- const stringBind = function(_string, params = {}) {
58
- for(let param of Object.keys(params))
59
- _string = _string.replace(':'+param, `'${params[param]}'`) // TODO fazer replace global (Expressao regular) quando a palavra a ser substituida for iniciada com o caractere :
60
-
61
- return _string
62
- }
63
-
64
- const modelSqlSelectFields = function(model, onlyFields = []) {
65
- let fields = []
66
-
67
- model.fields
68
- ? fields = parseArray(model.fields)
69
- : Object.keys(model.schema)
70
- .map((field)=> {
71
-
72
- if(model.schema[field].out === false || (onlyFields.length && !onlyFields.includes(field)))
73
- return;
74
-
75
- switch(model.schema[field].type) {
76
- case "uuid":
77
- case "guid":
78
- fields.push(`BIN_TO_UUID(${model.table}.${field}) as ${field}`)
79
- break
80
- default: fields.push(`${model.table}.${field}`)
81
- }
82
- })
83
-
84
- return fields
85
- }
86
-
87
- const modelSqlWhere = function(model, vals, middlewareParams, callsWhere = []) {
88
- const q = quote
89
-
90
- let SQL = ''
91
- let gWhere = model.globalWhere ? q(model.globalWhere, '()') : ''
92
- let keys = parseArray(model.indexes.keys)
93
-
94
- gWhere = gWhere && middlewareParams
95
- ? stringBind(gWhere, middlewareParams)
96
- : ''
97
-
98
- if(typeof(vals) !== 'object') vals = [vals]
99
-
100
- vals
101
- .map((val, i)=> keys
102
- .map((k)=> {
103
- switch(model.schema[k].type){ //TODO encapsule
104
- case "guid":
105
- case "uuid":
106
- vals[i] = `UUID_TO_BIN('${val}')`
107
- break
108
- default:
109
- vals[i] = `'${val}'`
110
- }
111
- })
112
- )
113
-
114
- switch(vals.length) {
115
- case 0 : SQL += gWhere
116
- ? ` WHERE ${gWhere}`
117
- : ''
118
- break
119
- case 1 : SQL += ` WHERE ${model.table}.${keys[0]} = ${vals[0]} ${gWhere ? 'AND ' + gWhere : ''}`
120
- break
121
- default: SQL += typeof(vals) == 'object'
122
- ? ` WHERE ${model.table}.${keys[0]} IN('${vals.join("','")}') ${gWhere ? 'AND ' + gWhere : ''}`
123
- : ` WHERE ${model.table}.${keys[0]} IN(${vals}) ${gWhere ? 'AND ' + gWhere : ''}`
124
- }
268
+ if (field.onInput) value = field.onInput + "(" + value + ")";
125
269
 
126
- if(callsWhere.length)
127
- SQL += `WHERE ${callsWhere.join(' AND ')}`
270
+ if (statement === "INSERT") {
271
+ if (key == 0) fields.push(q(field.name));
128
272
 
129
- return SQL
130
- }
273
+ values.push(value);
274
+ } else {
275
+ values.push(q(field.name) + "=" + value);
276
+ }
277
+ }
278
+ if (statement === "INSERT") {
279
+ insertValues.push(values.join(","));
280
+ values = [];
281
+ }
282
+ });
131
283
 
132
- module.exports = {
284
+ let SQL =
285
+ statement === "INSERT"
286
+ ? `INSERT INTO ${model.table} (${fields.join(
287
+ ","
288
+ )}) VALUES (${insertValues.join("),(")})`
289
+ : `UPDATE ${model.table} SET ${values.join(",")}`;
133
290
 
134
- escape,
135
- quote,
136
- stringBind,
137
- parseArray,
138
- modelSqlWhere,
139
- modelSqlSelectFields,
140
-
141
- createPool: function(configs) {
142
- // TODO criar aviso de error para falta de configs.db. Criar no hive().create
143
-
144
- // TODO pegar dinamicamnete database utilizada
145
- let db = configs.databases.default
146
-
147
- switch(db.type) {
148
- case 'mssql': // TODO implementar na versao >=1.2
149
- return false
150
- case 'mongo': // TODO implementar na versao >=1.2
151
- return false
152
- default:
153
- return mysql.createPool({
154
- host: db.host,
155
- user: db.user,
156
- password: db.pass,
157
- database: db.name,
158
- waitForConnections: db.waitForConnections || true,
159
- connectionLimit: db.connectionLimit || 10,
160
- queueLimit: db.queueLimit || 0
161
- });
162
- }
163
- },
164
-
165
- sqlSelect: function(model, ids = [], params = {}) { //console.log(ids)
166
- let SQL = []
167
- let vals = Array.isArray(ids) ? ids : ids.toString().split(',')
168
- let where = modelSqlWhere(model, vals, params.middlewareParams, params.where)
169
- let joins = params.joins && params.joins.length ? joins.join(' ') : ''
170
- let order = params.orderBy && params.orderBy.length ? ` ORDER BY ${params.orderBy}` : ''
171
- let limit = params.limit && params.limit.length ? ` LIMIT ${params.limit}` : ''
172
- let fields = modelSqlSelectFields(model, params.fields)
173
-
174
- SQL.push(`SELECT ${fields.join(', ')} `)
175
- SQL.push(`FROM ${quote(model.table)} `)
176
- SQL.push(joins)
177
- SQL.push(where)
178
- SQL.push(order)
179
- SQL.push(limit)
180
-
181
- return SQL
182
- },
183
-
184
- sqlInsertUpdate(model, data, onlyFields = [], statement = 'INSERT') {
185
- const q = quote
186
-
187
- let result = {}
188
- let fields = []
189
- let values = []
190
- let binds = []
191
- let insertValues = []
192
-
193
- data = data[0] ? data : [data]
194
-
195
- Object
196
- .keys(data)
197
- .map((key) => {
198
- for(let field in model.schema) {
199
-
200
- field = {...model.schema[field], name: field}
201
-
202
- if(field.dbControl) continue
203
- if(!field.ai && onlyFields.length && !onlyFields.includes(field.name)) continue
204
-
205
- let value = data[key][field.name]
206
- let type = model.schema[field.name].type
207
-
208
- if(statement == "INSERT" && field.ai)
209
- switch(type) {
210
- case "guid":
211
- case "uuid":
212
- value = beeTools.guid().toString()
213
- result.insertBin = beeTools.guidToBin(value)
214
- result.insertUUID = value
215
- break
216
- }
217
-
218
- if(value === undefined) continue
219
-
220
- switch(type) {
221
- case "guid":
222
- case "uuid":
223
- value = `UUID_TO_BIN('${value}')` //TODO mssql
224
- break
225
- case "binary":
226
- value = value
227
- break
228
- case "file":
229
- binds.push(value)
230
- value = "?"
231
- break
232
- case "date":
233
- case "datetime":
234
- case "time":
235
- case "timestamp":
236
- value = value ? q(value,"''") : "null"
237
- break
238
- default:
239
- value = q(value,"''")
240
- }
241
-
242
- if(field.onInput)
243
- value = field.onInput + '(' + value + ')'
244
-
245
- if(statement === 'INSERT') {
246
- if(key == 0)
247
- fields.push(q(field.name))
248
-
249
- values.push(value)
250
- } else {
251
- values.push(q(field.name) + '=' + value)
252
- }
253
- }
254
- if(statement === 'INSERT') {
255
- insertValues.push(values.join(","))
256
- values = []
257
- }
258
- });
291
+ return { result, SQL, binds };
292
+ },
259
293
 
260
- let SQL = statement === 'INSERT'
261
- ? `INSERT INTO ${model.table} (${fields.join(",")}) VALUES (${insertValues.join("),(")})`
262
- : `UPDATE ${model.table} SET ${values.join(',')}`
263
-
264
- return { result, SQL, binds }
265
- },
266
-
267
- save: (model, key = null) => { //TODO, tirar daqui.
268
- var fields = Object.keys(model.schema)
269
- var body = []
270
-
271
- //key = 1 //test
272
-
273
- for (let i = 0; i <= req.body.length-1; i++) {
274
- var values = []
275
-
276
- for(field of fields) {
277
- let out = model.schema[field].out || a
278
- let value = (req.body[i] || req.body)[out]
279
-
280
- //TODO inserir validacoes
281
-
282
- value = ["guid","binary"].includes(model.schema[field].type)
283
- ? value
284
- : q(value,"''")
285
-
286
- values.push({field:field, out: out, value: value})
287
- }
288
- body.push(values)
289
- }
290
-
291
- if (key!==null) {
292
- body = body[0].filter((a)=>a.value).map((a)=> a = a.field + `=${a.value}` ).join()
293
- db.query(`UPDATE ${model.table} SET ${body} WHERE ${model.fieldKey} = ${key}`)
294
- }else{
295
- body = body.map((a)=> a.map((a)=>`${a.value}`)).join("),(")
296
- db.query(`INSERT INTO ${model.table} (${Object.keys(model.schema)}) VALUES(${body})`)
297
- }
298
- },
294
+ save: (model, key = null) => {
295
+ //TODO, tirar daqui.
296
+ var fields = Object.keys(model.schema);
297
+ var body = [];
298
+
299
+ //key = 1 //test
299
300
 
300
- sqlUpdate: (model, keys) => { //TODO
301
- return db.query(`UPDATE ${model.table} SET TODO WHERE ${table.fieldKey} = (${key})`)
302
- },
303
-
304
- sqlDelete: (model, keys) => { //TODO
305
- return db.query(`DELETE FROM ${model.table} WHERE ${table.fieldKey} = (${key})`)
306
- },
301
+ for (let i = 0; i <= req.body.length - 1; i++) {
302
+ var values = [];
307
303
 
308
- forceData(data, req = {}) {
309
- // TODO coocar funcao para pegar apenas campos do middlaware marcados para INSERT e UPDATE.
310
- // Se nao campos do tipo IDUser_Profile poderá ser forçado pelo middleware invés do post form.
304
+ for (field of fields) {
305
+ let out = model.schema[field].out || a;
306
+ let value = (req.body[i] || req.body)[out];
311
307
 
312
- return Object.assign({}, data, req.token || {}, req.middleware || {})
313
- },
308
+ //TODO inserir validacoes
314
309
 
315
- formatOut(data, model) { //TODO
316
- if(!model) return data
310
+ value = ["guid", "binary"].includes(model.schema[field].type)
311
+ ? value
312
+ : q(value, "''");
313
+
314
+ values.push({ field: field, out: out, value: value });
315
+ }
316
+ body.push(values);
317
+ }
317
318
 
318
- return data
319
+ if (key !== null) {
320
+ body = body[0]
321
+ .filter((a) => a.value)
322
+ .map((a) => (a = a.field + `=${a.value}`))
323
+ .join();
324
+ db.query(
325
+ `UPDATE ${model.table} SET ${body} WHERE ${model.fieldKey} = ${key}`
326
+ );
327
+ } else {
328
+ body = body.map((a) => a.map((a) => `${a.value}`)).join("),(");
329
+ db.query(
330
+ `INSERT INTO ${model.table} (${Object.keys(
331
+ model.schema
332
+ )}) VALUES(${body})`
333
+ );
319
334
  }
320
- }
335
+ },
336
+
337
+ sqlUpdate: (model, keys) => {
338
+ //TODO
339
+ return db.query(
340
+ `UPDATE ${model.table} SET TODO WHERE ${table.fieldKey} = (${key})`
341
+ );
342
+ },
343
+
344
+ sqlDelete: (model, keys) => {
345
+ //TODO
346
+ return db.query(
347
+ `DELETE FROM ${model.table} WHERE ${table.fieldKey} = (${key})`
348
+ );
349
+ },
350
+
351
+ forceData(data, req = {}) {
352
+ // TODO coocar funcao para pegar apenas campos do middlaware marcados para INSERT e UPDATE.
353
+ // Se nao campos do tipo IDUser_Profile poderá ser forçado pelo middleware invés do post form.
354
+
355
+ return Object.assign({}, data, req.token || {}, req.middleware || {});
356
+ },
357
+
358
+ formatOut(data, model) {
359
+ //TODO
360
+ if (!model) return data;
361
+
362
+ return data;
363
+ },
364
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bee.js/node",
3
- "version": "0.0.47",
3
+ "version": "0.0.49",
4
4
  "description": "A JavaScript framework for making Node.js API´s",
5
5
  "main": "index.js",
6
6
  "scripts": {