@bee.js/node 0.0.37 → 0.0.38

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,483 @@
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(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, sql.binds)
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
+ )
483
483
  }