@bee.js/node 0.0.51 → 0.0.52

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/ORM/beeORM.js CHANGED
@@ -1,364 +1,364 @@
1
- const mysql = require("mysql2/promise"); //https://evertpot.com/executing-a-mysql-query-in-nodejs/
2
- const beeTools = require("../../tools/beeTools");
3
-
4
- const escape = function (string) {
5
- return typeof string != "string"
6
- ? string
7
- : string.replace(/[\0\x08\x09\x1a\n\r"'\\\%]/g, function (char) {
8
- switch (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;
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
- };
150
-
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
- });
180
- }
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
- }
243
-
244
- if (value === undefined) continue;
245
-
246
- switch (type) {
247
- case "guid":
248
- case "uuid":
249
- value = `UUID_TO_BIN('${value}')`; //TODO mssql
250
- break;
251
- case "binary":
252
- value = value;
253
- break;
254
- case "file":
255
- binds.push(value);
256
- value = "?";
257
- break;
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
- }
267
-
268
- if (field.onInput) value = field.onInput + "(" + value + ")";
269
-
270
- if (statement === "INSERT") {
271
- if (key == 0) fields.push(q(field.name));
272
-
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
- });
283
-
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(",")}`;
290
-
291
- return { result, SQL, binds };
292
- },
293
-
294
- save: (model, key = null) => {
295
- //TODO, tirar daqui.
296
- var fields = Object.keys(model.schema);
297
- var body = [];
298
-
299
- //key = 1 //test
300
-
301
- for (let i = 0; i <= req.body.length - 1; i++) {
302
- var values = [];
303
-
304
- for (field of fields) {
305
- let out = model.schema[field].out || a;
306
- let value = (req.body[i] || req.body)[out];
307
-
308
- //TODO inserir validacoes
309
-
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
- }
318
-
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
- );
334
- }
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
- };
1
+ const mysql = require("mysql2/promise"); //https://evertpot.com/executing-a-mysql-query-in-nodejs/
2
+ const beeTools = require("../../tools/beeTools");
3
+
4
+ const escape = function (string) {
5
+ return typeof string != "string"
6
+ ? string
7
+ : string.replace(/[\0\x08\x09\x1a\n\r"'\\\%]/g, function (char) {
8
+ switch (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;
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
+ };
150
+
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
+ });
180
+ }
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
+ }
243
+
244
+ if (value === undefined) continue;
245
+
246
+ switch (type) {
247
+ case "guid":
248
+ case "uuid":
249
+ value = `UUID_TO_BIN('${value}')`; //TODO mssql
250
+ break;
251
+ case "binary":
252
+ value = value;
253
+ break;
254
+ case "file":
255
+ binds.push(value);
256
+ value = "?";
257
+ break;
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
+ }
267
+
268
+ if (field.onInput) value = field.onInput + "(" + value + ")";
269
+
270
+ if (statement === "INSERT") {
271
+ if (key == 0) fields.push(q(field.name));
272
+
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
+ });
283
+
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(",")}`;
290
+
291
+ return { result, SQL, binds };
292
+ },
293
+
294
+ save: (model, key = null) => {
295
+ //TODO, tirar daqui.
296
+ var fields = Object.keys(model.schema);
297
+ var body = [];
298
+
299
+ //key = 1 //test
300
+
301
+ for (let i = 0; i <= req.body.length - 1; i++) {
302
+ var values = [];
303
+
304
+ for (field of fields) {
305
+ let out = model.schema[field].out || a;
306
+ let value = (req.body[i] || req.body)[out];
307
+
308
+ //TODO inserir validacoes
309
+
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
+ }
318
+
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
+ );
334
+ }
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
+ };