@bee.js/node 0.0.29 → 0.0.33

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,315 +1,315 @@
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 string.replace(/[\0\x08\x09\x1a\n\r"'\\\%]/g, function (char) {
6
- 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;
27
- }
28
- });
29
- }
30
-
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 || []
36
- }
37
- }
38
-
39
- const quote = function(word, type = this.configs.databases.default.type) {
40
- let escape;
41
-
42
- switch (type) {
43
- case 'mysql':
44
- escape = '``'
45
- break;
46
- case 'mssql':
47
- escape = '[]'
48
- break;
49
- default:
50
- escape = type + type
51
- break;
52
- }
53
-
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
- }
125
-
126
- if(callsWhere.length)
127
- SQL += `WHERE ${callsWhere.join(' AND ')}`
128
-
129
- return SQL
130
- }
131
-
132
- module.exports = {
133
-
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 insertValues = []
191
-
192
- data = data[0] ? data : [data]
193
-
194
- Object
195
- .keys(data)
196
- .map((key) => {
197
- for(let field in model.schema) {
198
-
199
- field = {...model.schema[field], name: field}
200
-
201
- if(field.dbControl) continue
202
- if(!field.ai && onlyFields.length && !onlyFields.includes(field.name)) continue
203
-
204
- let value = data[key][field.name]
205
- let type = model.schema[field.name].type
206
-
207
- if(statement == "INSERT" && field.ai)
208
- switch(type) {
209
- case "guid":
210
- case "uuid":
211
- value = beeTools.guid().toString()
212
- result.insertBin = beeTools.guidToBin(value)
213
- result.insertUUID = value
214
- break
215
- }
216
-
217
- if(value === undefined) continue
218
-
219
- switch(type) {
220
- case "guid":
221
- case "uuid":
222
- value = `UUID_TO_BIN('${value}')` //TODO mssql
223
- break
224
- case "binary":
225
- value = value
226
- break
227
- case "date":
228
- case "datetime":
229
- case "time":
230
- case "timestamp":
231
- value = value || "null"
232
- break
233
- default:
234
- value = q(value,"''")
235
- }
236
-
237
- if(field.onInput)
238
- value = field.onInput + '(' + value + ')'
239
-
240
- if(statement === 'INSERT') {
241
- if(key == 0)
242
- fields.push(q(field.name))
243
-
244
- values.push(value)
245
- } else {
246
- values.push(q(field.name) + '=' + value)
247
- }
248
- }
249
- if(statement === 'INSERT') {
250
- insertValues.push(values.join(","))
251
- values = []
252
- }
253
- });
254
-
255
- let SQL = statement === 'INSERT'
256
- ? `INSERT INTO ${model.table} (${fields.join(",")}) VALUES (${insertValues.join("),(")})`
257
- : `UPDATE ${model.table} SET ${values.join(',')}`
258
-
259
- return {result: result, SQL: SQL}
260
- },
261
-
262
- save: (model, key = null) => { //TODO, tirar daqui.
263
- var fields = Object.keys(model.schema)
264
- var body = []
265
-
266
- //key = 1 //test
267
-
268
- for (let i = 0; i <= req.body.length-1; i++) {
269
- var values = []
270
-
271
- for(field of fields) {
272
- let out = model.schema[field].out || a
273
- let value = (req.body[i] || req.body)[out]
274
-
275
- //TODO inserir validacoes
276
-
277
- value = ["guid","binary"].includes(model.schema[field].type)
278
- ? value
279
- : q(value,"''")
280
-
281
- values.push({field:field, out: out, value: value})
282
- }
283
- body.push(values)
284
- }
285
-
286
- if (key!==null) {
287
- body = body[0].filter((a)=>a.value).map((a)=> a = a.field + `=${a.value}` ).join()
288
- db.query(`UPDATE ${model.table} SET ${body} WHERE ${model.fieldKey} = ${key}`)
289
- }else{
290
- body = body.map((a)=> a.map((a)=>`${a.value}`)).join("),(")
291
- db.query(`INSERT INTO ${model.table} (${Object.keys(model.schema)}) VALUES(${body})`)
292
- }
293
- },
294
-
295
- sqlUpdate: (model, keys) => { //TODO
296
- return db.query(`UPDATE ${model.table} SET TODO WHERE ${table.fieldKey} = (${key})`)
297
- },
298
-
299
- sqlDelete: (model, keys) => { //TODO
300
- return db.query(`DELETE FROM ${model.table} WHERE ${table.fieldKey} = (${key})`)
301
- },
302
-
303
- forceData(data, req = {}) {
304
- // TODO coocar funcao para pegar apenas campos do middlaware marcados para INSERT e UPDATE.
305
- // Se nao campos do tipo IDUser_Profile poderá ser forçado pelo middleware invés do post form.
306
-
307
- return Object.assign({}, data, req.token || {}, req.middleware || {})
308
- },
309
-
310
- formatOut(data, model) { //TODO
311
- if(!model) return data
312
-
313
- return data
314
- }
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 string.replace(/[\0\x08\x09\x1a\n\r"'\\\%]/g, function (char) {
6
+ 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;
27
+ }
28
+ });
29
+ }
30
+
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 || []
36
+ }
37
+ }
38
+
39
+ const quote = function(word, type = this.configs.databases.default.type) {
40
+ let escape;
41
+
42
+ switch (type) {
43
+ case 'mysql':
44
+ escape = '``'
45
+ break;
46
+ case 'mssql':
47
+ escape = '[]'
48
+ break;
49
+ default:
50
+ escape = type + type
51
+ break;
52
+ }
53
+
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
+ }
125
+
126
+ if(callsWhere.length)
127
+ SQL += `WHERE ${callsWhere.join(' AND ')}`
128
+
129
+ return SQL
130
+ }
131
+
132
+ module.exports = {
133
+
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 insertValues = []
191
+
192
+ data = data[0] ? data : [data]
193
+
194
+ Object
195
+ .keys(data)
196
+ .map((key) => {
197
+ for(let field in model.schema) {
198
+
199
+ field = {...model.schema[field], name: field}
200
+
201
+ if(field.dbControl) continue
202
+ if(!field.ai && onlyFields.length && !onlyFields.includes(field.name)) continue
203
+
204
+ let value = data[key][field.name]
205
+ let type = model.schema[field.name].type
206
+
207
+ if(statement == "INSERT" && field.ai)
208
+ switch(type) {
209
+ case "guid":
210
+ case "uuid":
211
+ value = beeTools.guid().toString()
212
+ result.insertBin = beeTools.guidToBin(value)
213
+ result.insertUUID = value
214
+ break
215
+ }
216
+
217
+ if(value === undefined) continue
218
+
219
+ switch(type) {
220
+ case "guid":
221
+ case "uuid":
222
+ value = `UUID_TO_BIN('${value}')` //TODO mssql
223
+ break
224
+ case "binary":
225
+ value = value
226
+ break
227
+ case "date":
228
+ case "datetime":
229
+ case "time":
230
+ case "timestamp":
231
+ value = value ? q(value,"''") : "null"
232
+ break
233
+ default:
234
+ value = q(value,"''")
235
+ }
236
+
237
+ if(field.onInput)
238
+ value = field.onInput + '(' + value + ')'
239
+
240
+ if(statement === 'INSERT') {
241
+ if(key == 0)
242
+ fields.push(q(field.name))
243
+
244
+ values.push(value)
245
+ } else {
246
+ values.push(q(field.name) + '=' + value)
247
+ }
248
+ }
249
+ if(statement === 'INSERT') {
250
+ insertValues.push(values.join(","))
251
+ values = []
252
+ }
253
+ });
254
+
255
+ let SQL = statement === 'INSERT'
256
+ ? `INSERT INTO ${model.table} (${fields.join(",")}) VALUES (${insertValues.join("),(")})`
257
+ : `UPDATE ${model.table} SET ${values.join(',')}`
258
+
259
+ return {result: result, SQL: SQL}
260
+ },
261
+
262
+ save: (model, key = null) => { //TODO, tirar daqui.
263
+ var fields = Object.keys(model.schema)
264
+ var body = []
265
+
266
+ //key = 1 //test
267
+
268
+ for (let i = 0; i <= req.body.length-1; i++) {
269
+ var values = []
270
+
271
+ for(field of fields) {
272
+ let out = model.schema[field].out || a
273
+ let value = (req.body[i] || req.body)[out]
274
+
275
+ //TODO inserir validacoes
276
+
277
+ value = ["guid","binary"].includes(model.schema[field].type)
278
+ ? value
279
+ : q(value,"''")
280
+
281
+ values.push({field:field, out: out, value: value})
282
+ }
283
+ body.push(values)
284
+ }
285
+
286
+ if (key!==null) {
287
+ body = body[0].filter((a)=>a.value).map((a)=> a = a.field + `=${a.value}` ).join()
288
+ db.query(`UPDATE ${model.table} SET ${body} WHERE ${model.fieldKey} = ${key}`)
289
+ }else{
290
+ body = body.map((a)=> a.map((a)=>`${a.value}`)).join("),(")
291
+ db.query(`INSERT INTO ${model.table} (${Object.keys(model.schema)}) VALUES(${body})`)
292
+ }
293
+ },
294
+
295
+ sqlUpdate: (model, keys) => { //TODO
296
+ return db.query(`UPDATE ${model.table} SET TODO WHERE ${table.fieldKey} = (${key})`)
297
+ },
298
+
299
+ sqlDelete: (model, keys) => { //TODO
300
+ return db.query(`DELETE FROM ${model.table} WHERE ${table.fieldKey} = (${key})`)
301
+ },
302
+
303
+ forceData(data, req = {}) {
304
+ // TODO coocar funcao para pegar apenas campos do middlaware marcados para INSERT e UPDATE.
305
+ // Se nao campos do tipo IDUser_Profile poderá ser forçado pelo middleware invés do post form.
306
+
307
+ return Object.assign({}, data, req.token || {}, req.middleware || {})
308
+ },
309
+
310
+ formatOut(data, model) { //TODO
311
+ if(!model) return data
312
+
313
+ return data
314
+ }
315
315
  }
@@ -1,5 +1,5 @@
1
- const route = require('./route')
2
-
3
- module.exports = function(req, res, next) {
4
- return route(req, res, next, true)
1
+ const route = require('./route')
2
+
3
+ module.exports = function(req, res, next) {
4
+ return route(req, res, next, true)
5
5
  }