@bee.js/node 0.0.36 → 0.0.40

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/beehive.js CHANGED
@@ -1,483 +1,485 @@
1
- const log = require('./lib/beeHive/log')
2
- const headers = require('./lib/beeHive/headers')
3
- const beeORM = require('./lib/ORM/beeORM')
4
- const beeDBA = require('./lib/DBA/beeDBA')
5
- const beeJWT = require('./lib/JWT/beeJWT')
6
- const beeTools = require('./tools/beeTools')
7
-
8
- module.exports = function hive(req = {}, res = {}, model = null) {
9
-
10
- model = model && typeof(model)==="string"
11
- ? global.configs.models[model]
12
- : model
13
-
14
- let script = [{ main: true, model: model, ids: [], select: [], where: [], binds: [], orderBy: [], limit: [], fields: [] }]
15
- let data = res.data || {}
16
- let counters = res.counters || {}
17
- let inserts = res.inserts || []
18
- let debug = res.debug || []
19
- let error = res.error || false
20
- let errorCode = res.errorCode || 0
21
- let mainContainer = null
22
- let models = global.models
23
- let relWhere = {}
24
-
25
- const dbExec = async function(SQL, binds = [], params = {}) {
26
-
27
- let result = []
28
-
29
- try {
30
- if(global.configs.debug)
31
- console.log(SQL)
32
-
33
- global.beeDBPool = global.beeDBPool || beeORM.createPool(global.configs)
34
- result = await global.beeDBPool.query(SQL, binds)
35
-
36
- } catch(e) {
37
- log("####### DB ERROR:")
38
- log(e)
39
- error = e
40
- errorCode = 502
41
- } finally {
42
- if(global.configs.debug) debug.push(SQL)
43
- if(global.configs.debug && binds) debug.push(binds)
44
-
45
- if(params.container) {
46
- data[params.container] = result[0]
47
-
48
- if(counters)
49
- counters[params.container] = (result[0] || []).length
50
- }
51
-
52
- return result[0]
53
- }
54
- }
55
-
56
- return Object.assign(
57
- {},
58
- res, {
59
- data,
60
- counters,
61
- inserts,
62
- debug,
63
- error,
64
- errorCode,
65
- script,
66
- models,
67
- beeDBA,
68
- token: beeJWT,
69
- configs: this.config,
70
- headers,
71
- dbExec,
72
-
73
- dbEngine: async function() {
74
-
75
- error = !script[0].model
76
- ? `MODEL NOT FOUND` // TODO refazer
77
- : error
78
-
79
- if(error) return this
80
-
81
- let sqlSelect = beeORM.sqlSelect
82
- let q = beeORM.quote
83
- let relTables = []
84
- let relIds = []
85
- let relNow = null
86
- let relPrev = null
87
- let relJoin = {}
88
- let parentTable = null
89
- let i = -1
90
-
91
- for(let _script of script) {
92
- i++
93
-
94
- let model = _script.model
95
- let binds = _script.binds || []
96
- let modelName = model.name || model.table
97
- data[modelName] = null
98
-
99
- if(i === 0) {
100
- mainContainer = modelName
101
- ids = model.ids
102
- } else {
103
- ids = relTables.filter((a) => a.table == model.table)[0]//['idsFromFieldB']
104
- ids = ids ? ids.idsFromFieldB : []
105
-
106
- parentTable = script[i-1].model.table
107
-
108
- // rels
109
- for(let _relField in model.relations) {
110
- let array = model.relations[_relField].split('.')
111
- let _parentTable = array[0]
112
- let _parentField = array[1].split(' ')[0]
113
-
114
- binds = binds.length
115
- ? binds
116
- : script[0].binds
117
-
118
- if(_parentTable !== parentTable) continue
119
-
120
- relJoin[_parentTable] = !relJoin[_parentTable]
121
- ? `INNER JOIN ${q(_parentTable)} ON ${q(_parentTable)}.${_parentField} = ${models[modelName].table}.${_relField} `
122
- : relJoin[_parentTable] + `AND ${q(_parentTable)}.${_parentField} = ${models[modelName].table}.${_relField} `
123
-
124
- }
125
- }
126
-
127
- let fields = script[0]['fields'].concat((req.onlyFields||{})[model.table] || [])
128
-
129
- let SQL = sqlSelect(
130
- model,
131
- ids,
132
- {
133
- select: script[0]['select'],
134
- where: script[0]['where'],
135
- orderBy: script[0]['orderBy'],
136
- limit: script[0]['limit'],
137
- joins: '',
138
- fields,
139
- middlewareParams: req.middleware,
140
- },
141
- );
142
-
143
- if(i > 0)
144
- for(let ii = i-1; ii>=0; ii--)
145
- SQL[2] += relJoin[script[ii].model.table]
146
-
147
- relWhere[model.table] = SQL[3]
148
-
149
- await dbExec(SQL.join('').trim()+';', binds, {container: modelName})
150
-
151
- continue
152
- }
153
-
154
- return
155
- },
156
-
157
- relations: function(rels, _default = '') {
158
- rels = rels || _default
159
-
160
- if(!rels) return this
161
-
162
- rels = rels.split('.')
163
-
164
- for(let model of rels)
165
- if(models[model])
166
- script.push( { model: models[model], relation: true } )
167
- else
168
- (error = `RELATION ${model} NOT FOUND`) && (errorCode = 500)
169
-
170
- return this
171
- },
172
-
173
- select: function(model, ids) {
174
-
175
- model = (typeof(model)==="string") ? models[model] : model
176
-
177
- script.push( { model: model, ids: ids } )
178
-
179
- return this
180
- },
181
-
182
- get: async function() {
183
-
184
- await this.dbEngine()
185
-
186
- return this
187
- },
188
-
189
- find: async function(...values) {
190
- if(values.length)
191
- (model.indexes.keys || Object.keys(model.schema)[0])
192
- .split(",")
193
- .map((pk, i) => {
194
- console.log(pk)
195
- script[0].where.push(`${pk.trim()} = ?`)
196
- script[0].binds.push(values[i])
197
- })
198
-
199
- await this.dbEngine()
200
-
201
- data[mainContainer] = data[mainContainer][0]
202
-
203
- return this
204
- },
205
-
206
- first: async function() { //TODO auditar
207
-
208
- await this.dbEngine()
209
-
210
- if((mainContainer && data[mainContainer]))
211
- data[mainContainer] = data[mainContainer][0]
212
-
213
-
214
- return this
215
- },
216
-
217
- last: async function() {
218
-
219
- await this.dbEngine()
220
-
221
- data[mainContainer] = data[mainContainer][data[mainContainer].length-1]
222
-
223
- return this
224
- },
225
-
226
- where: function(where, binds) {
227
-
228
- script[0]['where'].push(where)
229
-
230
- if(binds)
231
- script[0]['binds'] = script[0]['binds'].concat(binds)
232
-
233
- return this
234
- },
235
-
236
- whereIf: function(condition, where, binds) {
237
- if(condition)
238
- script[0]['where'].push(where)
239
-
240
- if(condition && binds)
241
- script[0]['binds'].push(typeof(binds) === "function" ? binds() : binds)
242
-
243
- return this
244
- },
245
-
246
- whereIn: function(field, array = []) {
247
- array = array
248
- .map(row => {
249
- let val = row[field]
250
-
251
- switch (model.schema[field].type) {
252
- case "char":
253
- case "varchar":
254
- case "text":
255
- case "string":
256
- return `'${val}'`
257
- case "guid":
258
- case "uuid":
259
- return val ? beeTools.guidToBin(val) : null
260
- default:
261
- return val
262
- }
263
- })
264
- .join(",")
265
-
266
- script[0]['where'].push(`${model.table}.${field} IN(${array})`)
267
-
268
- return this
269
- },
270
-
271
- binds: function(...params) {
272
-
273
- params.map(bind=> script[0]['binds'].push(bind))
274
-
275
- return this
276
- },
277
-
278
- orderBy: function(...fields) {
279
-
280
- script[0]['orderBy'].push(fields.join(', '))
281
-
282
- return this
283
- },
284
-
285
- limit: function(...params) {
286
-
287
- script[0]['limit'].push(params.join(","))
288
-
289
- return this
290
- },
291
-
292
- fields: function(...fields) {
293
-
294
- script[0]['fields'] = fields
295
-
296
- return this
297
- },
298
-
299
- fieldsIf: function(condition, fields) {
300
-
301
- if(condition)
302
- script[0]['fields'] = fields
303
-
304
- return this
305
- },
306
-
307
- search: function(string = "", fields = [], relevance = [1, 2, 3, 4, 5]) {
308
- if(!string) return this
309
-
310
- let where = []
311
- let orderBy = []
312
- let words = string.split(" ")
313
- fields = beeORM.parseArray(fields)
314
- fields = fields.length ? fields : Object.keys(model.schema)
315
-
316
-
317
- fields
318
- .map((field)=> {
319
-
320
- orderBy.push(`WHEN ${field} = '${string}' THEN ${relevance[0]} WHEN ${field} LIKE '${string}%' THEN ${relevance[1]} WHEN ${field} LIKE '%${string}%' THEN ${relevance[2]} WHEN ${field} LIKE '%${string.replace(/ /g, "%")}%' THEN ${relevance[3]}`)
321
-
322
- words
323
- .map((word, i)=> {
324
-
325
- where.push(`${field} LIKE '%${word}%'`)
326
-
327
- if(words.length > 1)
328
- orderBy.push(`WHEN ${field} = '${word}' THEN ${(relevance[4] * (i+1))} WHEN ${field} LIKE '${word}%' THEN ${(relevance[4] * (i+1)) + relevance[1]} WHEN ${field} LIKE '%${word}%' THEN ${(relevance[4] * (i+1)) + relevance[2]}`)
329
- })
330
- })
331
-
332
- script[0]['where'].push(`(${where.join(' OR ')})`)
333
- script[0]['orderBy'].unshift(`CASE ${orderBy.join(' ')} ELSE ${100000} END ASC`)
334
-
335
- return this
336
- },
337
-
338
- insert: async function(_data, params = {}) {
339
-
340
- //data = beeORM.forceData(data, req)
341
-
342
- if(model.relations && params.relations)
343
- await Promise
344
- .all(
345
- Object
346
- .keys(model.relations)
347
- .map(async field => {
348
- let where = []
349
- let array = model.relations[field].split(" ")[0].split(".")
350
- let parentTable = array[0]
351
- let parentField = array[1]
352
- let parentRels = global.configs.models[parentTable].relations
353
-
354
- Object
355
- .keys(parentRels)
356
- .map(fieldRel => where.push(`${fieldRel} = '${params.relations[parentTable][fieldRel]}'`))
357
-
358
- let SQL = `SELECT ${parentField} FROM ${parentTable} WHERE ${where.join(" AND ")}`
359
-
360
- SQL = await dbExec(SQL)
361
-
362
- Array.isArray(_data)
363
- ? _data.map(a => a[parentField] = SQL[0][parentField])
364
- : _data[parentField] = SQL[0][parentField]
365
- })
366
- )
367
-
368
- let onlyFields = script[0].fields.concat((req.onlyFields||{})[model.table] || [])
369
- let sql = beeORM.sqlInsertUpdate(model, _data, onlyFields, 'INSERT')
370
-
371
- _data = await dbExec(sql.SQL)
372
-
373
- inserts.push({..._data, model: model.table})
374
- this.insertId = _data.insertId
375
-
376
- return {...this, result: {...sql.result,..._data}}
377
- },
378
-
379
- update: async function(data, ids = []) { // TODO criar auditoria
380
-
381
- data = beeORM.forceData(data, req)
382
-
383
- let onlyFields = script[0].fields.concat((req.onlyFields||{})[model.table] || [])
384
- let sql = beeORM.sqlInsertUpdate(model, data, onlyFields, 'UPDATE')
385
-
386
- sql.SQL += beeORM.modelSqlWhere(model, ids, req.middleware)
387
- sql.SQL += script[0]['where'].length
388
- ? (!ids.length ? ' WHERE ' : ' AND ') + script[0]['where'].join(" AND ")
389
- : ''
390
-
391
- data = await dbExec(sql.SQL, script[0]['binds'])
392
-
393
- return {...this, result: {...sql.result, ...data}}
394
- },
395
-
396
- delete: async function(ids) {
397
-
398
- const q = beeORM.quote
399
-
400
- ids = ids && typeof(ids) !== 'object'
401
- ? ids.toString().split(',')
402
- : ids
403
-
404
- SQL = 'DELETE FROM ' + q(model.table)
405
- SQL += beeORM.modelSqlWhere(model, ids, req.middleware)
406
- SQL += script[0]['where'].length
407
- ? (!ids.length ? ' WHERE ' : ' AND ') + script[0]['where'].join(" AND ")
408
- : ''
409
-
410
- data = await dbExec(SQL)
411
-
412
- return this
413
- },
414
-
415
- table: async function(table, where) {
416
-
417
- const q = beeORM.quote
418
-
419
- SQL = 'SELECT * FROM ' + q(table)
420
- SQL += where ? ` WHERE ${where};` : ''
421
-
422
- let result = await dbExec(SQL)
423
-
424
- data[table] = result
425
- counters[table] = result.length
426
- mainContainer = table;
427
-
428
- return this
429
- },
430
-
431
- query: async function(SQL, binds = [], container = 'query') {
432
-
433
- let result = await dbExec(SQL, binds, {container: container})
434
-
435
- counters[container] = (result) ? result.length : 0
436
-
437
- return this
438
- },
439
-
440
- response: function(sendData = data, action = null, status) {
441
-
442
- let out = {data: sendData, counters, action, error}
443
-
444
- if(inserts.length)
445
- out.inserts = inserts
446
-
447
- if(global.configs.debug)
448
- out.debug = debug
449
-
450
- if(status)
451
- res.status(status).send(out)
452
- else
453
- switch(req.method) {
454
- case 'DELETE' :
455
- res.status(action ? errorCode || 200 : 204).json(out)
456
- break
457
- case 'POST':
458
- res.status(errorCode || 201).json(out)
459
- break
460
- case 'PUT':
461
- res.status(errorCode || 200).json(out) // TODO deletar props irrelevantes no output
462
- break
463
- default:
464
- res.status(errorCode || 200).json(out)
465
- }
466
- },
467
-
468
- responseError: function(error, errorCode) {
469
-
470
- let out = {error: {message: error || 'an error has occurred'}}
471
-
472
- if(global.configs.debug)
473
- out.debug = debug
474
-
475
- res.status(errorCode || 500).send(out)
476
- },
477
-
478
- ifNull(param) {
479
- return !this.data ? param : this
480
- },
481
- }
482
- )
1
+ const log = require('./lib/beeHive/log')
2
+ const headers = require('./lib/beeHive/headers')
3
+ const beeORM = require('./lib/ORM/beeORM')
4
+ const beeDBA = require('./lib/DBA/beeDBA')
5
+ const beeJWT = require('./lib/JWT/beeJWT')
6
+ const beeTools = require('./tools/beeTools')
7
+
8
+ module.exports = function hive(req = {}, res = {}, model = null) {
9
+
10
+ model = model && typeof(model)==="string"
11
+ ? global.configs.models[model]
12
+ : model
13
+
14
+ let script = [{ main: true, model: model, ids: [], select: [], where: [], binds: [], orderBy: [], limit: [], fields: [] }]
15
+ let data = res.data || {}
16
+ let counters = res.counters || {}
17
+ let inserts = res.inserts || []
18
+ let debug = res.debug || []
19
+ let error = res.error || false
20
+ let errorCode = res.errorCode || 0
21
+ let mainContainer = null
22
+ let models = global.models
23
+ let relWhere = {}
24
+
25
+ const dbExec = async function(SQL, binds = [], params = {}) {
26
+
27
+ let result = []
28
+
29
+ try {
30
+ if(global.configs.debug)
31
+ console.log(`
32
+ ${SQL}
33
+ `)
34
+
35
+ global.beeDBPool = global.beeDBPool || beeORM.createPool(global.configs)
36
+ result = await global.beeDBPool.query(SQL, binds)
37
+
38
+ } catch(e) {
39
+ log("####### DB ERROR:")
40
+ log(e)
41
+ error = e
42
+ errorCode = 502
43
+ } finally {
44
+ if(global.configs.debug) debug.push(SQL)
45
+ if(global.configs.debug && binds) debug.push(binds)
46
+
47
+ if(params.container) {
48
+ data[params.container] = result[0]
49
+
50
+ if(counters)
51
+ counters[params.container] = (result[0] || []).length
52
+ }
53
+
54
+ return result[0]
55
+ }
56
+ }
57
+
58
+ return Object.assign(
59
+ {},
60
+ res, {
61
+ data,
62
+ counters,
63
+ inserts,
64
+ debug,
65
+ error,
66
+ errorCode,
67
+ script,
68
+ models,
69
+ beeDBA,
70
+ token: beeJWT,
71
+ configs: this.config,
72
+ headers,
73
+ dbExec,
74
+
75
+ dbEngine: async function() {
76
+
77
+ error = !script[0].model
78
+ ? `MODEL NOT FOUND` // TODO refazer
79
+ : error
80
+
81
+ if(error) return this
82
+
83
+ let sqlSelect = beeORM.sqlSelect
84
+ let q = beeORM.quote
85
+ let relTables = []
86
+ let relIds = []
87
+ let relNow = null
88
+ let relPrev = null
89
+ let relJoin = {}
90
+ let parentTable = null
91
+ let i = -1
92
+
93
+ for(let _script of script) {
94
+ i++
95
+
96
+ let model = _script.model
97
+ let binds = _script.binds || []
98
+ let modelName = model.name || model.table
99
+ data[modelName] = null
100
+
101
+ if(i === 0) {
102
+ mainContainer = modelName
103
+ ids = model.ids
104
+ } else {
105
+ ids = relTables.filter((a) => a.table == model.table)[0]//['idsFromFieldB']
106
+ ids = ids ? ids.idsFromFieldB : []
107
+
108
+ parentTable = script[i-1].model.table
109
+
110
+ // rels
111
+ for(let _relField in model.relations) {
112
+ let array = model.relations[_relField].split('.')
113
+ let _parentTable = array[0]
114
+ let _parentField = array[1].split(' ')[0]
115
+
116
+ binds = binds.length
117
+ ? binds
118
+ : script[0].binds
119
+
120
+ if(_parentTable !== parentTable) continue
121
+
122
+ relJoin[_parentTable] = !relJoin[_parentTable]
123
+ ? `INNER JOIN ${q(_parentTable)} ON ${q(_parentTable)}.${_parentField} = ${models[modelName].table}.${_relField} `
124
+ : relJoin[_parentTable] + `AND ${q(_parentTable)}.${_parentField} = ${models[modelName].table}.${_relField} `
125
+
126
+ }
127
+ }
128
+
129
+ let fields = script[0]['fields'].concat((req.onlyFields||{})[model.table] || [])
130
+
131
+ let SQL = sqlSelect(
132
+ model,
133
+ ids,
134
+ {
135
+ select: script[0]['select'],
136
+ where: script[0]['where'],
137
+ orderBy: script[0]['orderBy'],
138
+ limit: script[0]['limit'],
139
+ joins: '',
140
+ fields,
141
+ middlewareParams: req.middleware,
142
+ },
143
+ );
144
+
145
+ if(i > 0)
146
+ for(let ii = i-1; ii>=0; ii--)
147
+ SQL[2] += relJoin[script[ii].model.table]
148
+
149
+ relWhere[model.table] = SQL[3]
150
+
151
+ await dbExec(SQL.join('').trim()+';', binds, {container: modelName})
152
+
153
+ continue
154
+ }
155
+
156
+ return
157
+ },
158
+
159
+ relations: function(rels, _default = '') {
160
+ rels = rels || _default
161
+
162
+ if(!rels) return this
163
+
164
+ rels = rels.split('.')
165
+
166
+ for(let model of rels)
167
+ if(models[model])
168
+ script.push( { model: models[model], relation: true } )
169
+ else
170
+ (error = `RELATION ${model} NOT FOUND`) && (errorCode = 500)
171
+
172
+ return this
173
+ },
174
+
175
+ select: function(model, ids) {
176
+
177
+ model = (typeof(model)==="string") ? models[model] : model
178
+
179
+ script.push( { model: model, ids: ids } )
180
+
181
+ return this
182
+ },
183
+
184
+ get: async function() {
185
+
186
+ await this.dbEngine()
187
+
188
+ return this
189
+ },
190
+
191
+ find: async function(...values) {
192
+ if(values.length)
193
+ (model.indexes.keys || Object.keys(model.schema)[0])
194
+ .split(",")
195
+ .map((pk, i) => {
196
+ console.log(pk)
197
+ script[0].where.push(`${pk.trim()} = ?`)
198
+ script[0].binds.push(values[i])
199
+ })
200
+
201
+ await this.dbEngine()
202
+
203
+ data[mainContainer] = data[mainContainer][0]
204
+
205
+ return this
206
+ },
207
+
208
+ first: async function() { //TODO auditar
209
+
210
+ await this.dbEngine()
211
+
212
+ if((mainContainer && data[mainContainer]))
213
+ data[mainContainer] = data[mainContainer][0]
214
+
215
+
216
+ return this
217
+ },
218
+
219
+ last: async function() {
220
+
221
+ await this.dbEngine()
222
+
223
+ data[mainContainer] = data[mainContainer][data[mainContainer].length-1]
224
+
225
+ return this
226
+ },
227
+
228
+ where: function(where, binds) {
229
+
230
+ script[0]['where'].push(where)
231
+
232
+ if(binds)
233
+ script[0]['binds'] = script[0]['binds'].concat(binds)
234
+
235
+ return this
236
+ },
237
+
238
+ whereIf: function(condition, where, binds) {
239
+ if(condition)
240
+ script[0]['where'].push(where)
241
+
242
+ if(condition && binds)
243
+ script[0]['binds'].push(typeof(binds) === "function" ? binds() : binds)
244
+
245
+ return this
246
+ },
247
+
248
+ whereIn: function(field, array = []) {
249
+ array = array
250
+ .map(row => {
251
+ let val = row[field]
252
+
253
+ switch (model.schema[field].type) {
254
+ case "char":
255
+ case "varchar":
256
+ case "text":
257
+ case "string":
258
+ return `'${val}'`
259
+ case "guid":
260
+ case "uuid":
261
+ return val ? beeTools.guidToBin(val) : null
262
+ default:
263
+ return val
264
+ }
265
+ })
266
+ .join(",")
267
+
268
+ script[0]['where'].push(`${model.table}.${field} IN(${array})`)
269
+
270
+ return this
271
+ },
272
+
273
+ binds: function(...params) {
274
+
275
+ params.map(bind=> script[0]['binds'].push(bind))
276
+
277
+ return this
278
+ },
279
+
280
+ orderBy: function(...fields) {
281
+
282
+ script[0]['orderBy'].push(fields.join(', '))
283
+
284
+ return this
285
+ },
286
+
287
+ limit: function(...params) {
288
+
289
+ script[0]['limit'].push(params.join(","))
290
+
291
+ return this
292
+ },
293
+
294
+ fields: function(...fields) {
295
+
296
+ script[0]['fields'] = fields
297
+
298
+ return this
299
+ },
300
+
301
+ fieldsIf: function(condition, fields) {
302
+
303
+ if(condition)
304
+ script[0]['fields'] = fields
305
+
306
+ return this
307
+ },
308
+
309
+ search: function(string = "", fields = [], relevance = [1, 2, 3, 4, 5]) {
310
+ if(!string) return this
311
+
312
+ let where = []
313
+ let orderBy = []
314
+ let words = string.split(" ")
315
+ fields = beeORM.parseArray(fields)
316
+ fields = fields.length ? fields : Object.keys(model.schema)
317
+
318
+
319
+ fields
320
+ .map((field)=> {
321
+
322
+ orderBy.push(`WHEN ${field} = '${string}' THEN ${relevance[0]} WHEN ${field} LIKE '${string}%' THEN ${relevance[1]} WHEN ${field} LIKE '%${string}%' THEN ${relevance[2]} WHEN ${field} LIKE '%${string.replace(/ /g, "%")}%' THEN ${relevance[3]}`)
323
+
324
+ words
325
+ .map((word, i)=> {
326
+
327
+ where.push(`${field} LIKE '%${word}%'`)
328
+
329
+ if(words.length > 1)
330
+ orderBy.push(`WHEN ${field} = '${word}' THEN ${(relevance[4] * (i+1))} WHEN ${field} LIKE '${word}%' THEN ${(relevance[4] * (i+1)) + relevance[1]} WHEN ${field} LIKE '%${word}%' THEN ${(relevance[4] * (i+1)) + relevance[2]}`)
331
+ })
332
+ })
333
+
334
+ script[0]['where'].push(`(${where.join(' OR ')})`)
335
+ script[0]['orderBy'].unshift(`CASE ${orderBy.join(' ')} ELSE ${100000} END ASC`)
336
+
337
+ return this
338
+ },
339
+
340
+ insert: async function(_data, params = {}) {
341
+
342
+ //data = beeORM.forceData(data, req)
343
+
344
+ if(model.relations && params.relations)
345
+ await Promise
346
+ .all(
347
+ Object
348
+ .keys(model.relations)
349
+ .map(async field => {
350
+ let where = []
351
+ let array = model.relations[field].split(" ")[0].split(".")
352
+ let parentTable = array[0]
353
+ let parentField = array[1]
354
+ let parentRels = global.configs.models[parentTable].relations
355
+
356
+ Object
357
+ .keys(parentRels)
358
+ .map(fieldRel => where.push(`${fieldRel} = '${params.relations[parentTable][fieldRel]}'`))
359
+
360
+ let SQL = `SELECT ${parentField} FROM ${parentTable} WHERE ${where.join(" AND ")}`
361
+
362
+ SQL = await dbExec(SQL)
363
+
364
+ Array.isArray(_data)
365
+ ? _data.map(a => a[parentField] = SQL[0][parentField])
366
+ : _data[parentField] = SQL[0][parentField]
367
+ })
368
+ )
369
+
370
+ let onlyFields = script[0].fields.concat((req.onlyFields||{})[model.table] || [])
371
+ let sql = beeORM.sqlInsertUpdate(model, _data, onlyFields, 'INSERT')
372
+
373
+ _data = await dbExec(sql.SQL, sql.binds)
374
+
375
+ inserts.push({..._data, model: model.table})
376
+ this.insertId = _data.insertId
377
+
378
+ return {...this, result: {...sql.result,..._data}}
379
+ },
380
+
381
+ update: async function(data, ids = []) { // TODO criar auditoria
382
+
383
+ //data = beeORM.forceData(data, req)
384
+
385
+ let onlyFields = script[0].fields.concat((req.onlyFields||{})[model.table] || [])
386
+ let sql = beeORM.sqlInsertUpdate(model, data, onlyFields, 'UPDATE')
387
+
388
+ sql.SQL += beeORM.modelSqlWhere(model, ids, req.middleware)
389
+ sql.SQL += script[0]['where'].length
390
+ ? (!ids.length ? ' WHERE ' : ' AND ') + script[0]['where'].join(" AND ")
391
+ : ''
392
+
393
+ data = await dbExec(sql.SQL, script[0]['binds'])
394
+
395
+ return {...this, result: {...sql.result, ...data}}
396
+ },
397
+
398
+ delete: async function(ids) {
399
+
400
+ const q = beeORM.quote
401
+
402
+ ids = ids && typeof(ids) !== 'object'
403
+ ? ids.toString().split(',')
404
+ : ids
405
+
406
+ SQL = 'DELETE FROM ' + q(model.table)
407
+ SQL += beeORM.modelSqlWhere(model, ids, req.middleware)
408
+ SQL += script[0]['where'].length
409
+ ? (!ids.length ? ' WHERE ' : ' AND ') + script[0]['where'].join(" AND ")
410
+ : ''
411
+
412
+ data = await dbExec(SQL)
413
+
414
+ return this
415
+ },
416
+
417
+ table: async function(table, where) {
418
+
419
+ const q = beeORM.quote
420
+
421
+ SQL = 'SELECT * FROM ' + q(table)
422
+ SQL += where ? ` WHERE ${where};` : ''
423
+
424
+ let result = await dbExec(SQL)
425
+
426
+ data[table] = result
427
+ counters[table] = result.length
428
+ mainContainer = table;
429
+
430
+ return this
431
+ },
432
+
433
+ query: async function(SQL, binds = [], container = 'query') {
434
+
435
+ let result = await dbExec(SQL, binds, {container: container})
436
+
437
+ counters[container] = (result) ? result.length : 0
438
+
439
+ return this
440
+ },
441
+
442
+ response: function(sendData = data, action = null, status) {
443
+
444
+ let out = {data: sendData, counters, action, error}
445
+
446
+ if(inserts.length)
447
+ out.inserts = inserts
448
+
449
+ if(global.configs.debug)
450
+ out.debug = debug
451
+
452
+ if(status)
453
+ res.status(status).send(out)
454
+ else
455
+ switch(req.method) {
456
+ case 'DELETE' :
457
+ res.status(action ? errorCode || 200 : 204).json(out)
458
+ break
459
+ case 'POST':
460
+ res.status(errorCode || 201).json(out)
461
+ break
462
+ case 'PUT':
463
+ res.status(errorCode || 200).json(out) // TODO deletar props irrelevantes no output
464
+ break
465
+ default:
466
+ res.status(errorCode || 200).json(out)
467
+ }
468
+ },
469
+
470
+ responseError: function(error, errorCode) {
471
+
472
+ let out = {error: {message: error || 'an error has occurred'}}
473
+
474
+ if(global.configs.debug)
475
+ out.debug = debug
476
+
477
+ res.status(errorCode || 500).send(out)
478
+ },
479
+
480
+ ifNull(param) {
481
+ return !this.data ? param : this
482
+ },
483
+ }
484
+ )
483
485
  }