| 
									
										
										
										
											2017-09-18 18:20:33 +02:00
										 |  |  | const _ = require('lodash'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-01 17:39:31 +01:00
										 |  |  | module.exports = { | 
					
						
							| 
									
										
										
										
											2018-06-06 12:47:29 +02:00
										 |  |  |   find: async function (params, populate, raw = false) { | 
					
						
							| 
									
										
										
										
											2017-12-07 15:44:20 +01:00
										 |  |  |     return this.query(function(qb) { | 
					
						
							|  |  |  |       _.forEach(params.where, (where, key) => { | 
					
						
							| 
									
										
										
										
											2019-02-03 15:08:36 +03:30
										 |  |  |         if (_.isArray(where.value) && where.symbol !== 'IN' && where.symbol !== 'NOT IN') { | 
					
						
							| 
									
										
										
										
											2018-04-03 13:03:41 +02:00
										 |  |  |           for (const value in where.value) { | 
					
						
							| 
									
										
										
										
											2019-02-05 12:17:27 +01:00
										 |  |  |             qb[parseInt(value) ? 'orWhere' : 'where'](key, where.symbol, where.value[value]); | 
					
						
							| 
									
										
										
										
											2018-04-03 13:03:41 +02:00
										 |  |  |           } | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |           qb.where(key, where.symbol, where.value); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-06-18 17:23:58 +02:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2017-12-07 15:44:20 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |       if (params.sort) { | 
					
						
							| 
									
										
										
										
											2018-05-22 18:23:03 +02:00
										 |  |  |         qb.orderBy(params.sort.key, params.sort.order); | 
					
						
							| 
									
										
										
										
											2017-12-07 15:44:20 +01:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-23 18:54:17 +01:00
										 |  |  |       if (params.skip) { | 
					
						
							|  |  |  |         qb.offset(_.toNumber(params.skip)); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-12-07 15:44:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-23 18:54:17 +01:00
										 |  |  |       if (params.limit) { | 
					
						
							|  |  |  |         qb.limit(_.toNumber(params.limit)); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-12-07 15:44:20 +01:00
										 |  |  |     }).fetchAll({ | 
					
						
							| 
									
										
										
										
											2018-04-03 11:30:39 +02:00
										 |  |  |       withRelated: populate || this.associations.map(x => x.alias) | 
					
						
							| 
									
										
										
										
											2018-06-06 12:47:29 +02:00
										 |  |  |     }).then(data => raw ? data.toJSON() : data); | 
					
						
							| 
									
										
										
										
											2017-06-17 17:01:50 +02:00
										 |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-23 10:29:04 +02:00
										 |  |  |   count: async function (params = {}) { | 
					
						
							| 
									
										
										
										
											2017-09-14 16:33:56 +02:00
										 |  |  |     return await this | 
					
						
							| 
									
										
										
										
											2017-06-17 17:01:50 +02:00
										 |  |  |       .forge() | 
					
						
							| 
									
										
										
										
											2018-05-23 10:29:04 +02:00
										 |  |  |       .query(qb => { | 
					
						
							|  |  |  |         _.forEach(params.where, (where, key) => { | 
					
						
							|  |  |  |           if (_.isArray(where.value)) { | 
					
						
							|  |  |  |             for (const value in where.value) { | 
					
						
							|  |  |  |               qb[value ? 'where' : 'orWhere'](key, where.symbol, where.value[value]); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           } else { | 
					
						
							|  |  |  |             qb.where(key, where.symbol, where.value); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											2017-06-17 17:01:50 +02:00
										 |  |  |       .count(); | 
					
						
							|  |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 16:14:04 +02:00
										 |  |  |   search: async function (params, populate, raw = false) { | 
					
						
							|  |  |  |     const associations = this.associations.map(x => x.alias); | 
					
						
							|  |  |  |     const searchText = Object.keys(this._attributes) | 
					
						
							|  |  |  |       .filter(attribute => attribute !== this.primaryKey && !associations.includes(attribute)) | 
					
						
							| 
									
										
										
										
											2018-06-12 11:32:13 +02:00
										 |  |  |       .filter(attribute => ['string', 'text'].includes(this._attributes[attribute].type)); | 
					
						
							| 
									
										
										
										
											2018-06-07 16:14:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const searchNoText = Object.keys(this._attributes) | 
					
						
							|  |  |  |       .filter(attribute => attribute !== this.primaryKey && !associations.includes(attribute)) | 
					
						
							| 
									
										
										
										
											2018-06-12 11:32:13 +02:00
										 |  |  |       .filter(attribute => !['string', 'text', 'boolean', 'integer', 'decimal', 'float'].includes(this._attributes[attribute].type)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const searchInt = Object.keys(this._attributes) | 
					
						
							|  |  |  |       .filter(attribute => attribute !== this.primaryKey && !associations.includes(attribute)) | 
					
						
							|  |  |  |       .filter(attribute => ['integer', 'decimal', 'float'].includes(this._attributes[attribute].type)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const searchBool = Object.keys(this._attributes) | 
					
						
							|  |  |  |       .filter(attribute => attribute !== this.primaryKey && !associations.includes(attribute)) | 
					
						
							|  |  |  |       .filter(attribute => ['boolean'].includes(this._attributes[attribute].type)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const query = (params.search || '').replace(/[^a-zA-Z0-9.-\s]+/g, ''); | 
					
						
							| 
									
										
										
										
											2018-06-07 16:14:04 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return this.query(qb => { | 
					
						
							|  |  |  |       // Search in columns which are not text value.
 | 
					
						
							|  |  |  |       searchNoText.forEach(attribute => { | 
					
						
							| 
									
										
										
										
											2018-06-12 11:32:13 +02:00
										 |  |  |         qb.orWhereRaw(`LOWER(${attribute}) LIKE '%${_.toLower(query)}%'`); | 
					
						
							| 
									
										
										
										
											2018-06-07 17:24:09 +02:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2018-06-07 16:14:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-12 11:32:13 +02:00
										 |  |  |       if (!_.isNaN(_.toNumber(query))) { | 
					
						
							|  |  |  |         searchInt.forEach(attribute => { | 
					
						
							|  |  |  |           qb.orWhereRaw(`${attribute} = ${_.toNumber(query)}`); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (query === 'true' || query === 'false') { | 
					
						
							|  |  |  |         searchBool.forEach(attribute => { | 
					
						
							|  |  |  |           qb.orWhereRaw(`${attribute} = ${_.toNumber(query === 'true')}`); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 16:14:04 +02:00
										 |  |  |       // Search in columns with text using index.
 | 
					
						
							|  |  |  |       switch (this.client) { | 
					
						
							| 
									
										
										
										
											2018-12-29 21:35:07 +01:00
										 |  |  |         case 'mysql': | 
					
						
							|  |  |  |           qb.orWhereRaw(`MATCH(${searchText.join(',')}) AGAINST(? IN BOOLEAN MODE)`, `*${query}*`); | 
					
						
							|  |  |  |           break; | 
					
						
							| 
									
										
										
										
											2018-06-07 17:24:09 +02:00
										 |  |  |         case 'pg': { | 
					
						
							| 
									
										
										
										
											2018-06-07 17:16:19 +02:00
										 |  |  |           const searchQuery = searchText.map(attribute => | 
					
						
							|  |  |  |             _.toLower(attribute) === attribute | 
					
						
							|  |  |  |               ? `to_tsvector(${attribute})` | 
					
						
							|  |  |  |               : `to_tsvector('${attribute}')` | 
					
						
							|  |  |  |           ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-12 11:32:13 +02:00
										 |  |  |           qb.orWhereRaw(`${searchQuery.join(' || ')} @@ to_tsquery(?)`, query); | 
					
						
							| 
									
										
										
										
											2018-06-07 17:24:09 +02:00
										 |  |  |           break; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-12-29 21:35:07 +01:00
										 |  |  |         case 'sqlite3': | 
					
						
							| 
									
										
										
										
											2019-01-03 22:52:39 +01:00
										 |  |  |           searchText.map(attribute => { | 
					
						
							|  |  |  |             qb.orWhere(`${attribute}`, 'LIKE', `%${query}%`); | 
					
						
							| 
									
										
										
										
											2018-12-29 21:35:07 +01:00
										 |  |  |           }); | 
					
						
							| 
									
										
										
										
											2018-06-07 16:14:04 +02:00
										 |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (params.sort) { | 
					
						
							|  |  |  |         qb.orderBy(params.sort.key, params.sort.order); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (params.skip) { | 
					
						
							|  |  |  |         qb.offset(_.toNumber(params.skip)); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (params.limit) { | 
					
						
							|  |  |  |         qb.limit(_.toNumber(params.limit)); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }).fetchAll({ | 
					
						
							|  |  |  |       width: populate || associations | 
					
						
							|  |  |  |     }).then(data => raw ? data.toJSON() : data); | 
					
						
							| 
									
										
										
										
											2018-06-07 14:35:09 +02:00
										 |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   countSearch: async function (params = {}) { | 
					
						
							| 
									
										
										
										
											2018-06-07 17:24:09 +02:00
										 |  |  |     const associations = this.associations.map(x => x.alias); | 
					
						
							|  |  |  |     const searchText = Object.keys(this._attributes) | 
					
						
							|  |  |  |       .filter(attribute => attribute !== this.primaryKey && !associations.includes(attribute)) | 
					
						
							| 
									
										
										
										
											2018-06-12 11:32:13 +02:00
										 |  |  |       .filter(attribute => ['string', 'text'].includes(this._attributes[attribute].type)); | 
					
						
							| 
									
										
										
										
											2018-06-07 17:24:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const searchNoText = Object.keys(this._attributes) | 
					
						
							|  |  |  |       .filter(attribute => attribute !== this.primaryKey && !associations.includes(attribute)) | 
					
						
							| 
									
										
										
										
											2018-06-12 11:32:13 +02:00
										 |  |  |       .filter(attribute => !['string', 'text', 'boolean', 'integer', 'decimal', 'float'].includes(this._attributes[attribute].type)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const searchInt = Object.keys(this._attributes) | 
					
						
							|  |  |  |       .filter(attribute => attribute !== this.primaryKey && !associations.includes(attribute)) | 
					
						
							|  |  |  |       .filter(attribute => ['integer', 'decimal', 'float'].includes(this._attributes[attribute].type)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const searchBool = Object.keys(this._attributes) | 
					
						
							|  |  |  |       .filter(attribute => attribute !== this.primaryKey && !associations.includes(attribute)) | 
					
						
							|  |  |  |       .filter(attribute => ['boolean'].includes(this._attributes[attribute].type)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const query = (params.search || '').replace(/[^a-zA-Z0-9.-\s]+/g, ''); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 17:24:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return this.query(qb => { | 
					
						
							|  |  |  |       // Search in columns which are not text value.
 | 
					
						
							|  |  |  |       searchNoText.forEach(attribute => { | 
					
						
							| 
									
										
										
										
											2018-06-12 11:32:13 +02:00
										 |  |  |         qb.orWhereRaw(`LOWER(${attribute}) LIKE '%${_.toLower(query)}%'`); | 
					
						
							| 
									
										
										
										
											2018-06-07 17:24:09 +02:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-12 11:32:13 +02:00
										 |  |  |       if (!_.isNaN(_.toNumber(query))) { | 
					
						
							|  |  |  |         searchInt.forEach(attribute => { | 
					
						
							|  |  |  |           qb.orWhereRaw(`${attribute} = ${_.toNumber(query)}`); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (query === 'true' || query === 'false') { | 
					
						
							|  |  |  |         searchBool.forEach(attribute => { | 
					
						
							|  |  |  |           qb.orWhereRaw(`${attribute} = ${_.toNumber(query === 'true')}`); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 17:24:09 +02:00
										 |  |  |       // Search in columns with text using index.
 | 
					
						
							|  |  |  |       switch (this.client) { | 
					
						
							|  |  |  |         case 'pg': { | 
					
						
							|  |  |  |           const searchQuery = searchText.map(attribute => | 
					
						
							|  |  |  |             _.toLower(attribute) === attribute | 
					
						
							|  |  |  |               ? `to_tsvector(${attribute})` | 
					
						
							|  |  |  |               : `to_tsvector('${attribute}')` | 
					
						
							|  |  |  |           ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-12 11:32:13 +02:00
										 |  |  |           qb.orWhereRaw(`${searchQuery.join(' || ')} @@ to_tsquery(?)`, query); | 
					
						
							| 
									
										
										
										
											2018-06-07 17:24:09 +02:00
										 |  |  |           break; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-12-29 21:35:07 +01:00
										 |  |  |         case 'mysql': | 
					
						
							| 
									
										
										
										
											2018-06-12 11:32:13 +02:00
										 |  |  |           qb.orWhereRaw(`MATCH(${searchText.join(',')}) AGAINST(? IN BOOLEAN MODE)`, `*${query}*`); | 
					
						
							| 
									
										
										
										
											2018-06-07 17:24:09 +02:00
										 |  |  |           break; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }).count(); | 
					
						
							| 
									
										
										
										
											2018-06-07 14:35:09 +02:00
										 |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-30 16:32:48 +02:00
										 |  |  |   findOne: async function (params, populate) { | 
					
						
							| 
									
										
										
										
											2017-09-14 18:47:10 +02:00
										 |  |  |     const record = await this | 
					
						
							| 
									
										
										
										
											2017-09-14 16:33:56 +02:00
										 |  |  |       .forge({ | 
					
						
							|  |  |  |         [this.primaryKey]: params[this.primaryKey] | 
					
						
							|  |  |  |       }) | 
					
						
							| 
									
										
										
										
											2017-09-14 18:47:10 +02:00
										 |  |  |       .fetch({ | 
					
						
							| 
									
										
										
										
											2018-04-11 12:53:07 +02:00
										 |  |  |         withRelated: populate || this.associations.map(x => x.alias) | 
					
						
							| 
									
										
										
										
											2017-09-14 18:47:10 +02:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-01 12:46:20 +01:00
										 |  |  |     const data = _.get(record, 'toJSON()', record); | 
					
						
							| 
									
										
										
										
											2018-04-11 12:53:07 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // Retrieve data manually.
 | 
					
						
							|  |  |  |     if (_.isEmpty(populate)) { | 
					
						
							|  |  |  |       const arrayOfPromises = this.associations | 
					
						
							|  |  |  |         .filter(association => ['manyMorphToOne', 'manyMorphToMany'].includes(association.nature)) | 
					
						
							| 
									
										
										
										
											2018-04-30 16:32:48 +02:00
										 |  |  |         .map(association => { // eslint-disable-line no-unused-vars
 | 
					
						
							| 
									
										
										
										
											2018-04-11 12:53:07 +02:00
										 |  |  |           return this.morph.forge() | 
					
						
							|  |  |  |             .where({ | 
					
						
							|  |  |  |               [`${this.collectionName}_id`]: params[this.primaryKey] | 
					
						
							|  |  |  |             }) | 
					
						
							| 
									
										
										
										
											2018-04-30 16:32:48 +02:00
										 |  |  |             .fetchAll(); | 
					
						
							| 
									
										
										
										
											2018-04-11 12:53:07 +02:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       const related = await Promise.all(arrayOfPromises); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       related.forEach((value, index) => { | 
					
						
							|  |  |  |         data[this.associations[index].alias] = value ? value.toJSON() : value; | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return data; | 
					
						
							| 
									
										
										
										
											2017-06-17 17:01:50 +02:00
										 |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-14 16:33:56 +02:00
										 |  |  |   create: async function (params) { | 
					
						
							| 
									
										
										
										
											2018-03-01 17:39:31 +01:00
										 |  |  |     // Exclude relationships.
 | 
					
						
							|  |  |  |     const values = Object.keys(params.values).reduce((acc, current) => { | 
					
						
							|  |  |  |       if (this._attributes[current] && this._attributes[current].type) { | 
					
						
							| 
									
										
										
										
											2017-09-19 11:17:04 +02:00
										 |  |  |         acc[current] = params.values[current]; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       return acc; | 
					
						
							| 
									
										
										
										
											2018-03-01 17:39:31 +01:00
										 |  |  |     }, {}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-26 14:10:17 +02:00
										 |  |  |     const request = await this | 
					
						
							| 
									
										
										
										
											2018-03-01 17:39:31 +01:00
										 |  |  |       .forge(values) | 
					
						
							| 
									
										
										
										
											2018-01-23 18:54:17 +01:00
										 |  |  |       .save() | 
					
						
							| 
									
										
										
										
											2018-03-01 17:39:31 +01:00
										 |  |  |       .catch((err) => { | 
					
						
							| 
									
										
										
										
											2018-04-30 16:32:48 +02:00
										 |  |  |         if (err.detail) { | 
					
						
							| 
									
										
										
										
											2018-03-01 17:39:31 +01:00
										 |  |  |           const field = _.last(_.words(err.detail.split('=')[0])); | 
					
						
							|  |  |  |           err = { message: `This ${field} is already taken`, field }; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-12-06 15:58:20 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-01 17:39:31 +01:00
										 |  |  |         throw err; | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2017-09-19 11:17:04 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-26 14:10:17 +02:00
										 |  |  |     const entry = request.toJSON ? request.toJSON() : request; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-02 15:39:12 +02:00
										 |  |  |     const relations = this.associations.reduce((acc, association) => { | 
					
						
							|  |  |  |       acc[association.alias] = params.values[association.alias]; | 
					
						
							|  |  |  |       return acc; | 
					
						
							|  |  |  |     }, {}); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-19 11:17:04 +02:00
										 |  |  |     return module.exports.update.call(this, { | 
					
						
							|  |  |  |       [this.primaryKey]: entry[this.primaryKey], | 
					
						
							| 
									
										
										
										
											2018-04-25 12:23:53 +02:00
										 |  |  |       values: _.assign({ | 
					
						
							| 
									
										
										
										
											2017-09-19 11:17:04 +02:00
										 |  |  |         id: entry[this.primaryKey] | 
					
						
							| 
									
										
										
										
											2018-05-02 15:39:12 +02:00
										 |  |  |       }, relations) | 
					
						
							| 
									
										
										
										
											2017-09-19 11:17:04 +02:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2017-06-17 17:01:50 +02:00
										 |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-14 16:33:56 +02:00
										 |  |  |   update: async function (params) { | 
					
						
							| 
									
										
										
										
											2018-05-09 16:57:16 +02:00
										 |  |  |     // Call the business logic located in the hook.
 | 
					
						
							|  |  |  |     // This function updates no-relational and relational data.
 | 
					
						
							|  |  |  |     return this.updateRelations(params); | 
					
						
							| 
									
										
										
										
											2017-06-17 17:01:50 +02:00
										 |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-14 16:33:56 +02:00
										 |  |  |   delete: async function (params) { | 
					
						
							| 
									
										
										
										
											2017-09-19 11:17:04 +02:00
										 |  |  |     return await this | 
					
						
							| 
									
										
										
										
											2017-09-14 16:33:56 +02:00
										 |  |  |       .forge({ | 
					
						
							| 
									
										
										
										
											2017-09-20 18:15:06 +02:00
										 |  |  |         [this.primaryKey]: params.id | 
					
						
							| 
									
										
										
										
											2017-09-14 16:33:56 +02:00
										 |  |  |       }) | 
					
						
							| 
									
										
										
										
											2017-06-17 17:01:50 +02:00
										 |  |  |       .destroy(); | 
					
						
							| 
									
										
										
										
											2018-06-06 12:47:29 +02:00
										 |  |  |   }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   deleteMany: async function (params) { | 
					
						
							|  |  |  |     return await this | 
					
						
							|  |  |  |       .query(function(qb) { | 
					
						
							|  |  |  |         return qb.whereIn('id', params.id); | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |       .destroy(); | 
					
						
							| 
									
										
										
										
											2017-06-17 17:01:50 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-08-29 19:34:34 +02:00
										 |  |  | }; |