@bee.js/node 0.0.28 → 0.0.32

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