@nocobase/database 0.7.0-alpha.31 → 0.7.0-alpha.34

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.
Files changed (37) hide show
  1. package/esm/operators/index.js +1 -1
  2. package/esm/operators/index.js.map +1 -1
  3. package/esm/operators/notIn.d.ts +10 -0
  4. package/esm/operators/notIn.js +12 -0
  5. package/esm/operators/notIn.js.map +1 -0
  6. package/esm/options-parser.js +1 -1
  7. package/esm/options-parser.js.map +1 -1
  8. package/esm/relation-repository/multiple-relation-repository.js +3 -3
  9. package/esm/relation-repository/multiple-relation-repository.js.map +1 -1
  10. package/esm/relation-repository/relation-repository.d.ts +1 -1
  11. package/esm/relation-repository/relation-repository.js +7 -5
  12. package/esm/relation-repository/relation-repository.js.map +1 -1
  13. package/esm/repository.d.ts +1 -1
  14. package/esm/repository.js.map +1 -1
  15. package/lib/operators/index.js +1 -1
  16. package/lib/operators/index.js.map +1 -1
  17. package/lib/operators/notIn.d.ts +10 -0
  18. package/lib/operators/notIn.js +14 -0
  19. package/lib/operators/notIn.js.map +1 -0
  20. package/lib/options-parser.js +1 -1
  21. package/lib/options-parser.js.map +1 -1
  22. package/lib/relation-repository/multiple-relation-repository.js +3 -3
  23. package/lib/relation-repository/multiple-relation-repository.js.map +1 -1
  24. package/lib/relation-repository/relation-repository.d.ts +1 -1
  25. package/lib/relation-repository/relation-repository.js +7 -5
  26. package/lib/relation-repository/relation-repository.js.map +1 -1
  27. package/lib/repository.d.ts +1 -1
  28. package/lib/repository.js.map +1 -1
  29. package/package.json +3 -3
  30. package/src/__tests__/operator/notIn.test.ts +33 -0
  31. package/src/__tests__/option-parser.test.ts +20 -0
  32. package/src/operators/index.ts +1 -0
  33. package/src/operators/notIn.ts +12 -0
  34. package/src/options-parser.ts +1 -1
  35. package/src/relation-repository/multiple-relation-repository.ts +6 -3
  36. package/src/relation-repository/relation-repository.ts +11 -6
  37. package/src/repository.ts +1 -1
@@ -1,2 +1,2 @@
1
- export default Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, require('./association').default), require('./date').default), require('./array').default), require('./empty').default), require('./string').default), require('./ne').default);
1
+ export default Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, require('./association').default), require('./date').default), require('./array').default), require('./empty').default), require('./string').default), require('./ne').default), require('./notIn').default);
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/operators/index.ts"],"names":[],"mappings":"AAAA,uGACK,OAAO,CAAC,eAAe,CAAC,CAAC,OAAO,GAChC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,GACzB,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,GAC1B,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,GAC1B,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,GAC3B,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,EAC1B","sourcesContent":["export default {\n ...require('./association').default,\n ...require('./date').default,\n ...require('./array').default,\n ...require('./empty').default,\n ...require('./string').default,\n ...require('./ne').default,\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/operators/index.ts"],"names":[],"mappings":"AAAA,qHACK,OAAO,CAAC,eAAe,CAAC,CAAC,OAAO,GAChC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,GACzB,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,GAC1B,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,GAC1B,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,GAC3B,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,GACvB,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAC7B","sourcesContent":["export default {\n ...require('./association').default,\n ...require('./date').default,\n ...require('./array').default,\n ...require('./empty').default,\n ...require('./string').default,\n ...require('./ne').default,\n ...require('./notIn').default,\n};\n"]}
@@ -0,0 +1,10 @@
1
+ import { Op } from 'sequelize';
2
+ declare const _default: {
3
+ $notIn(val: any, ctx: any): {
4
+ [Op.or]: {
5
+ [Op.notIn]: any;
6
+ [Op.is]: any;
7
+ };
8
+ };
9
+ };
10
+ export default _default;
@@ -0,0 +1,12 @@
1
+ import { Op } from 'sequelize';
2
+ export default {
3
+ $notIn(val, ctx) {
4
+ return {
5
+ [Op.or]: {
6
+ [Op.notIn]: val,
7
+ [Op.is]: null,
8
+ },
9
+ };
10
+ },
11
+ };
12
+ //# sourceMappingURL=notIn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notIn.js","sourceRoot":"","sources":["../../src/operators/notIn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAE/B,eAAe;IACb,MAAM,CAAC,GAAG,EAAE,GAAG;QACb,OAAO;YACL,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;gBACP,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG;gBACf,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI;aACd;SACF,CAAC;IACJ,CAAC;CACF,CAAC","sourcesContent":["import { Op } from 'sequelize';\n\nexport default {\n $notIn(val, ctx) {\n return {\n [Op.or]: {\n [Op.notIn]: val,\n [Op.is]: null,\n },\n };\n },\n};\n"]}
@@ -181,7 +181,7 @@ export class OptionsParser {
181
181
  queryParams['include'].push({
182
182
  association: appendAssociation,
183
183
  });
184
- existIncludeIndex = 0;
184
+ existIncludeIndex = queryParams['include'].length - 1;
185
185
  }
186
186
  // end appends
187
187
  // without nests association
@@ -1 +1 @@
1
- {"version":3,"file":"options-parser.js","sourceRoot":"","sources":["../src/options-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { FindAttributeOptions, ModelCtor, Op } from 'sequelize';\nimport { Collection } from './collection';\nimport { Database } from './database';\nimport FilterParser from './filter-parser';\nimport { Appends, Except, FindOptions } from './repository';\n\nconst debug = require('debug')('noco-database');\n\ninterface OptionsParserContext {\n collection: Collection;\n targetKey?: string;\n}\n\nexport class OptionsParser {\n options: FindOptions;\n database: Database;\n collection: Collection;\n model: ModelCtor<any>;\n filterParser: FilterParser;\n context: OptionsParserContext;\n\n constructor(options: FindOptions, context: OptionsParserContext) {\n const { collection } = context;\n\n this.collection = collection;\n this.model = collection.model;\n this.options = options;\n this.database = collection.context.database;\n this.filterParser = new FilterParser(options?.filter, {\n collection,\n app: {\n ctx: options?.context,\n },\n });\n this.context = context;\n }\n\n isAssociation(key: string) {\n return this.model.associations[key] !== undefined;\n }\n\n isAssociationPath(path: string) {\n return this.isAssociation(path.split('.')[0]);\n }\n\n toSequelizeParams() {\n const queryParams = this.filterParser.toSequelizeParams();\n\n if (this.options?.filterByTk) {\n queryParams.where = {\n [Op.and]: [\n queryParams.where,\n {\n [this.context.targetKey || this.collection.filterTargetKey]: this.options.filterByTk,\n },\n ],\n };\n }\n\n return this.parseSort(this.parseFields(queryParams));\n }\n\n /**\n * parser sort options\n * @param filterParams\n * @protected\n */\n protected parseSort(filterParams) {\n let sort = this.options?.sort || [];\n if (typeof sort === 'string') {\n sort = sort.split(',');\n }\n const orderParams = sort.map((sortKey: string) => {\n const direction = sortKey.startsWith('-') ? 'DESC' : 'ASC';\n const sortField: Array<any> = sortKey.replace('-', '').split('.');\n\n // handle sort by association\n if (sortField.length > 1) {\n let associationModel = this.model;\n\n for (let i = 0; i < sortField.length - 1; i++) {\n const associationKey = sortField[i];\n sortField[i] = associationModel.associations[associationKey].target;\n associationModel = sortField[i];\n }\n }\n\n sortField.push(direction);\n return sortField;\n });\n\n if (orderParams.length > 0) {\n return {\n order: orderParams,\n ...filterParams,\n };\n }\n\n return filterParams;\n }\n\n protected parseFields(filterParams: any) {\n const appends = this.options?.appends || [];\n const except = [];\n\n let attributes: FindAttributeOptions = {\n include: [],\n exclude: [],\n }; // out put all fields by default\n\n if (this.options?.fields) {\n // 将fields拆分为 attributes 和 appends\n for (const field of this.options.fields) {\n if (this.isAssociationPath(field)) {\n // field is association field\n appends.push(field);\n } else {\n // field is model attribute, change attributes to array type\n if (!Array.isArray(attributes)) attributes = [];\n\n attributes.push(field);\n }\n }\n }\n\n if (this.options?.except) {\n for (const exceptKey of this.options.except) {\n if (this.isAssociationPath(exceptKey)) {\n // except association field\n except.push(exceptKey);\n } else {\n // if attributes is array form, ignore except\n if (Array.isArray(attributes)) continue;\n attributes.exclude.push(exceptKey);\n }\n }\n }\n\n return {\n attributes,\n ...this.parseExcept(except, this.parseAppends(appends, filterParams)),\n };\n }\n\n protected parseExcept(except: Except, filterParams: any) {\n if (!except) return filterParams;\n const setExcept = (queryParams: any, except: string) => {\n // split exceptKey to path form\n // posts.comments.content => ['posts', 'comments', 'content']\n // then set except on include attributes\n const exceptPath = except.split('.');\n const association = exceptPath[0];\n const lastLevel = exceptPath.length <= 2;\n\n let existIncludeIndex = queryParams['include'].findIndex((include) => include['association'] == association);\n\n if (existIncludeIndex == -1) {\n // if include not exists, ignore this except\n return;\n }\n\n if (lastLevel) {\n // if it not have exclude form\n if (Array.isArray(queryParams['include'][existIncludeIndex]['attributes'])) {\n return;\n } else {\n if (!queryParams['include'][existIncludeIndex]['attributes']['exclude']) {\n queryParams['include'][existIncludeIndex]['attributes']['exclude'] = [];\n }\n\n queryParams['include'][existIncludeIndex]['attributes']['exclude'].push(exceptPath[1]);\n }\n } else {\n setExcept(queryParams['include'][existIncludeIndex], exceptPath.filter((_, index) => index !== 0).join('.'));\n }\n };\n\n for (const exceptKey of except) {\n setExcept(filterParams, exceptKey);\n }\n\n return filterParams;\n }\n\n protected parseAppends(appends: Appends, filterParams: any) {\n if (!appends) return filterParams;\n\n /**\n * set include params\n * @param includeRoot\n * @param appends\n */\n const setInclude = (model: ModelCtor<any>, queryParams: any, append: string) => {\n const appendFields = append.split('.');\n const appendAssociation = appendFields[0];\n\n const associations = model.associations;\n\n // if append length less or equal 2\n // example:\n // appends: ['posts']\n // appends: ['posts.title']\n // All of these can be seen as last level\n let lastLevel: boolean = false;\n\n if (appendFields.length == 1) {\n lastLevel = true;\n }\n\n if (appendFields.length == 2) {\n const associationModel = associations[appendFields[0]].target;\n if (associationModel.rawAttributes[appendFields[1]]) {\n lastLevel = true;\n }\n }\n\n // find association index\n if (queryParams['include'] == undefined) {\n queryParams['include'] = [];\n }\n\n let existIncludeIndex = queryParams['include'].findIndex(\n (include) => include['association'] == appendAssociation,\n );\n\n // if association not exist, create it\n if (existIncludeIndex == -1) {\n // association not exists\n queryParams['include'].push({\n association: appendAssociation,\n });\n\n existIncludeIndex = 0;\n }\n\n // end appends\n // without nests association\n if (lastLevel) {\n // get exist association attributes\n let attributes = queryParams['include'][existIncludeIndex]['attributes'] || {\n include: [], // all fields are output by default\n };\n\n // if need set attribute\n if (appendFields.length == 2) {\n if (!Array.isArray(attributes)) {\n attributes = [];\n }\n\n const attributeName = appendFields[1];\n\n // push field to it\n attributes.push(attributeName);\n } else {\n // if attributes is empty array, change it to object\n if (Array.isArray(attributes) && attributes.length == 0) {\n attributes = {\n include: [],\n };\n }\n }\n\n // set new attributes\n queryParams['include'][existIncludeIndex] = {\n ...queryParams['include'][existIncludeIndex],\n attributes,\n };\n } else {\n setInclude(\n model.associations[queryParams['include'][existIncludeIndex].association].target,\n queryParams['include'][existIncludeIndex],\n appendFields.filter((_, index) => index !== 0).join('.'),\n );\n }\n };\n\n // handle every appends\n for (const append of appends) {\n setInclude(this.model, filterParams, append);\n }\n\n debug('filter params: %o', filterParams);\n return filterParams;\n }\n}\n"]}
1
+ {"version":3,"file":"options-parser.js","sourceRoot":"","sources":["../src/options-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { FindAttributeOptions, ModelCtor, Op } from 'sequelize';\nimport { Collection } from './collection';\nimport { Database } from './database';\nimport FilterParser from './filter-parser';\nimport { Appends, Except, FindOptions } from './repository';\n\nconst debug = require('debug')('noco-database');\n\ninterface OptionsParserContext {\n collection: Collection;\n targetKey?: string;\n}\n\nexport class OptionsParser {\n options: FindOptions;\n database: Database;\n collection: Collection;\n model: ModelCtor<any>;\n filterParser: FilterParser;\n context: OptionsParserContext;\n\n constructor(options: FindOptions, context: OptionsParserContext) {\n const { collection } = context;\n\n this.collection = collection;\n this.model = collection.model;\n this.options = options;\n this.database = collection.context.database;\n this.filterParser = new FilterParser(options?.filter, {\n collection,\n app: {\n ctx: options?.context,\n },\n });\n this.context = context;\n }\n\n isAssociation(key: string) {\n return this.model.associations[key] !== undefined;\n }\n\n isAssociationPath(path: string) {\n return this.isAssociation(path.split('.')[0]);\n }\n\n toSequelizeParams() {\n const queryParams = this.filterParser.toSequelizeParams();\n\n if (this.options?.filterByTk) {\n queryParams.where = {\n [Op.and]: [\n queryParams.where,\n {\n [this.context.targetKey || this.collection.filterTargetKey]: this.options.filterByTk,\n },\n ],\n };\n }\n\n return this.parseSort(this.parseFields(queryParams));\n }\n\n /**\n * parser sort options\n * @param filterParams\n * @protected\n */\n protected parseSort(filterParams) {\n let sort = this.options?.sort || [];\n if (typeof sort === 'string') {\n sort = sort.split(',');\n }\n const orderParams = sort.map((sortKey: string) => {\n const direction = sortKey.startsWith('-') ? 'DESC' : 'ASC';\n const sortField: Array<any> = sortKey.replace('-', '').split('.');\n\n // handle sort by association\n if (sortField.length > 1) {\n let associationModel = this.model;\n\n for (let i = 0; i < sortField.length - 1; i++) {\n const associationKey = sortField[i];\n sortField[i] = associationModel.associations[associationKey].target;\n associationModel = sortField[i];\n }\n }\n\n sortField.push(direction);\n return sortField;\n });\n\n if (orderParams.length > 0) {\n return {\n order: orderParams,\n ...filterParams,\n };\n }\n\n return filterParams;\n }\n\n protected parseFields(filterParams: any) {\n const appends = this.options?.appends || [];\n const except = [];\n\n let attributes: FindAttributeOptions = {\n include: [],\n exclude: [],\n }; // out put all fields by default\n\n if (this.options?.fields) {\n // 将fields拆分为 attributes 和 appends\n for (const field of this.options.fields) {\n if (this.isAssociationPath(field)) {\n // field is association field\n appends.push(field);\n } else {\n // field is model attribute, change attributes to array type\n if (!Array.isArray(attributes)) attributes = [];\n\n attributes.push(field);\n }\n }\n }\n\n if (this.options?.except) {\n for (const exceptKey of this.options.except) {\n if (this.isAssociationPath(exceptKey)) {\n // except association field\n except.push(exceptKey);\n } else {\n // if attributes is array form, ignore except\n if (Array.isArray(attributes)) continue;\n attributes.exclude.push(exceptKey);\n }\n }\n }\n\n return {\n attributes,\n ...this.parseExcept(except, this.parseAppends(appends, filterParams)),\n };\n }\n\n protected parseExcept(except: Except, filterParams: any) {\n if (!except) return filterParams;\n const setExcept = (queryParams: any, except: string) => {\n // split exceptKey to path form\n // posts.comments.content => ['posts', 'comments', 'content']\n // then set except on include attributes\n const exceptPath = except.split('.');\n const association = exceptPath[0];\n const lastLevel = exceptPath.length <= 2;\n\n let existIncludeIndex = queryParams['include'].findIndex((include) => include['association'] == association);\n\n if (existIncludeIndex == -1) {\n // if include not exists, ignore this except\n return;\n }\n\n if (lastLevel) {\n // if it not have exclude form\n if (Array.isArray(queryParams['include'][existIncludeIndex]['attributes'])) {\n return;\n } else {\n if (!queryParams['include'][existIncludeIndex]['attributes']['exclude']) {\n queryParams['include'][existIncludeIndex]['attributes']['exclude'] = [];\n }\n\n queryParams['include'][existIncludeIndex]['attributes']['exclude'].push(exceptPath[1]);\n }\n } else {\n setExcept(queryParams['include'][existIncludeIndex], exceptPath.filter((_, index) => index !== 0).join('.'));\n }\n };\n\n for (const exceptKey of except) {\n setExcept(filterParams, exceptKey);\n }\n\n return filterParams;\n }\n\n protected parseAppends(appends: Appends, filterParams: any) {\n if (!appends) return filterParams;\n\n /**\n * set include params\n * @param includeRoot\n * @param appends\n */\n const setInclude = (model: ModelCtor<any>, queryParams: any, append: string) => {\n const appendFields = append.split('.');\n const appendAssociation = appendFields[0];\n\n const associations = model.associations;\n\n // if append length less or equal 2\n // example:\n // appends: ['posts']\n // appends: ['posts.title']\n // All of these can be seen as last level\n let lastLevel: boolean = false;\n\n if (appendFields.length == 1) {\n lastLevel = true;\n }\n\n if (appendFields.length == 2) {\n const associationModel = associations[appendFields[0]].target;\n if (associationModel.rawAttributes[appendFields[1]]) {\n lastLevel = true;\n }\n }\n\n // find association index\n if (queryParams['include'] == undefined) {\n queryParams['include'] = [];\n }\n\n let existIncludeIndex = queryParams['include'].findIndex(\n (include) => include['association'] == appendAssociation,\n );\n\n // if association not exist, create it\n if (existIncludeIndex == -1) {\n // association not exists\n queryParams['include'].push({\n association: appendAssociation,\n });\n\n existIncludeIndex = queryParams['include'].length - 1;\n }\n\n // end appends\n // without nests association\n if (lastLevel) {\n // get exist association attributes\n let attributes = queryParams['include'][existIncludeIndex]['attributes'] || {\n include: [], // all fields are output by default\n };\n\n // if need set attribute\n if (appendFields.length == 2) {\n if (!Array.isArray(attributes)) {\n attributes = [];\n }\n\n const attributeName = appendFields[1];\n\n // push field to it\n attributes.push(attributeName);\n } else {\n // if attributes is empty array, change it to object\n if (Array.isArray(attributes) && attributes.length == 0) {\n attributes = {\n include: [],\n };\n }\n }\n\n // set new attributes\n queryParams['include'][existIncludeIndex] = {\n ...queryParams['include'][existIncludeIndex],\n attributes,\n };\n } else {\n setInclude(\n model.associations[queryParams['include'][existIncludeIndex].association].target,\n queryParams['include'][existIncludeIndex],\n appendFields.filter((_, index) => index !== 0).join('.'),\n );\n }\n };\n\n // handle every appends\n for (const append of appends) {\n setInclude(this.model, filterParams, append);\n }\n\n debug('filter params: %o', filterParams);\n return filterParams;\n }\n}\n"]}
@@ -97,14 +97,14 @@ export class MultipleRelationRepository extends RelationRepository {
97
97
  const guard = UpdateGuard.fromOptions(this.targetModel, options);
98
98
  const values = guard.sanitize(options.values);
99
99
  const queryOptions = this.buildQueryOptions(options);
100
- const instances = yield this.find(queryOptions);
100
+ const instances = yield this.find(Object.assign(Object.assign({}, queryOptions), { transaction }));
101
101
  for (const instance of instances) {
102
102
  yield updateModelByValues(instance, values, Object.assign(Object.assign({}, options), { sanitized: true, sourceModel: this.sourceInstance, transaction }));
103
103
  }
104
104
  for (const instance of instances) {
105
105
  if (options.hooks !== false) {
106
- yield this.db.emitAsync(`${this.targetCollection.name}.afterUpdateWithAssociations`, instance, options);
107
- yield this.db.emitAsync(`${this.targetCollection.name}.afterSaveWithAssociations`, instance, options);
106
+ yield this.db.emitAsync(`${this.targetCollection.name}.afterUpdateWithAssociations`, instance, Object.assign(Object.assign({}, options), { transaction }));
107
+ yield this.db.emitAsync(`${this.targetCollection.name}.afterSaveWithAssociations`, instance, Object.assign(Object.assign({}, options), { transaction }));
108
108
  }
109
109
  }
110
110
  return instances;
@@ -1 +1 @@
1
- {"version":3,"file":"multiple-relation-repository.js","sourceRoot":"","sources":["../../src/relation-repository/multiple-relation-repository.ts"],"names":[],"mappings":"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","sourcesContent":["import { omit } from 'lodash';\nimport { MultiAssociationAccessors, Op, Sequelize, Transaction } from 'sequelize';\nimport {\n CommonFindOptions,\n CountOptions,\n DestroyOptions,\n Filter,\n FilterByTk,\n FindOptions,\n TargetKey,\n TK,\n TransactionAble,\n UpdateOptions\n} from '../repository';\nimport { updateModelByValues } from '../update-associations';\nimport { UpdateGuard } from '../update-guard';\nimport { RelationRepository, transaction } from './relation-repository';\n\nexport interface FindAndCountOptions extends CommonFindOptions {}\n\nexport interface FindOneOptions extends CommonFindOptions, FilterByTk {}\n\nexport interface AssociatedOptions extends TransactionAble {\n tk?: TK;\n}\n\nexport abstract class MultipleRelationRepository extends RelationRepository {\n extendFindOptions(findOptions) {\n return findOptions;\n }\n\n async find(options?: FindOptions): Promise<any> {\n const transaction = await this.getTransaction(options);\n\n const findOptions = {\n ...this.extendFindOptions(\n this.buildQueryOptions({\n ...options,\n }),\n ),\n subQuery: false,\n };\n\n const getAccessor = this.accessors().get;\n const sourceModel = await this.getSourceModel(transaction);\n\n if (findOptions.include && findOptions.include.length > 0) {\n const ids = (\n await sourceModel[getAccessor]({\n ...findOptions,\n includeIgnoreAttributes: false,\n attributes: [this.targetKey()],\n group: `${this.targetModel.name}.${this.targetKey()}`,\n transaction,\n })\n ).map((row) => row.get(this.targetKey()));\n\n return await sourceModel[getAccessor]({\n ...omit(findOptions, ['limit', 'offset']),\n where: {\n [this.targetKey()]: {\n [Op.in]: ids,\n },\n },\n transaction,\n });\n }\n\n return await sourceModel[getAccessor]({\n ...findOptions,\n transaction,\n });\n }\n\n async findAndCount(options?: FindAndCountOptions): Promise<[any[], number]> {\n const transaction = await this.getTransaction(options, false);\n return [\n await this.find({\n ...options,\n transaction,\n }),\n await this.count({\n ...options,\n transaction,\n }),\n ];\n }\n\n async count(options?: CountOptions) {\n const transaction = await this.getTransaction(options);\n\n const sourceModel = await this.getSourceModel(transaction);\n const queryOptions = this.buildQueryOptions(options);\n\n const count = await sourceModel[this.accessors().get]({\n where: queryOptions.where,\n include: queryOptions.include,\n includeIgnoreAttributes: false,\n attributes: [\n [\n Sequelize.fn(\n 'COUNT',\n Sequelize.fn('DISTINCT', Sequelize.col(`${this.targetModel.name}.${this.targetKey()}`)),\n ),\n 'count',\n ],\n ],\n raw: true,\n plain: true,\n transaction,\n });\n\n return parseInt(count.count);\n }\n\n async findOne(options?: FindOneOptions): Promise<any> {\n const transaction = await this.getTransaction(options, false);\n const rows = await this.find({ ...options, limit: 1, transaction });\n return rows.length == 1 ? rows[0] : null;\n }\n\n @transaction((args, transaction) => {\n return {\n tk: args[0],\n transaction,\n };\n })\n async remove(options: TargetKey | TargetKey[] | AssociatedOptions): Promise<void> {\n const transaction = await this.getTransaction(options);\n let handleKeys = options['tk'];\n\n if (!Array.isArray(handleKeys)) {\n handleKeys = [handleKeys];\n }\n\n const sourceModel = await this.getSourceModel(transaction);\n await sourceModel[this.accessors().removeMultiple](handleKeys, {\n transaction,\n });\n return;\n }\n\n @transaction()\n async update(options?: UpdateOptions): Promise<any> {\n const transaction = await this.getTransaction(options);\n\n const guard = UpdateGuard.fromOptions(this.targetModel, options);\n\n const values = guard.sanitize(options.values);\n\n const queryOptions = this.buildQueryOptions(options as any);\n\n const instances = await this.find(queryOptions);\n\n for (const instance of instances) {\n await updateModelByValues(instance, values, {\n ...options,\n sanitized: true,\n sourceModel: this.sourceInstance,\n transaction,\n });\n }\n\n for (const instance of instances) {\n if (options.hooks !== false) {\n await this.db.emitAsync(`${this.targetCollection.name}.afterUpdateWithAssociations`, instance, options);\n await this.db.emitAsync(`${this.targetCollection.name}.afterSaveWithAssociations`, instance, options);\n }\n }\n\n return instances;\n }\n\n async destroy(options?: TK | DestroyOptions): Promise<Boolean> {\n return false;\n }\n\n protected async destroyByFilter(filter: Filter, transaction?: Transaction) {\n const instances = await this.find({\n filter: filter,\n transaction,\n });\n\n return await this.destroy({\n filterByTk: instances.map((instance) => instance.get(this.targetCollection.filterTargetKey)),\n transaction,\n });\n }\n\n protected filterHasInclude(filter: Filter, options?: any) {\n const filterResult = this.parseFilter(filter, options);\n return filterResult.include && filterResult.include.length > 0;\n }\n\n protected accessors() {\n return <MultiAssociationAccessors>super.accessors();\n }\n}\n"]}
1
+ {"version":3,"file":"multiple-relation-repository.js","sourceRoot":"","sources":["../../src/relation-repository/multiple-relation-repository.ts"],"names":[],"mappings":"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","sourcesContent":["import { omit } from 'lodash';\nimport { MultiAssociationAccessors, Op, Sequelize, Transaction } from 'sequelize';\nimport {\n CommonFindOptions,\n CountOptions,\n DestroyOptions,\n Filter,\n FilterByTk,\n FindOptions,\n TargetKey,\n TK,\n TransactionAble,\n UpdateOptions\n} from '../repository';\nimport { updateModelByValues } from '../update-associations';\nimport { UpdateGuard } from '../update-guard';\nimport { RelationRepository, transaction } from './relation-repository';\n\nexport interface FindAndCountOptions extends CommonFindOptions {}\n\nexport interface FindOneOptions extends CommonFindOptions, FilterByTk {}\n\nexport interface AssociatedOptions extends TransactionAble {\n tk?: TK;\n}\n\nexport abstract class MultipleRelationRepository extends RelationRepository {\n extendFindOptions(findOptions) {\n return findOptions;\n }\n\n async find(options?: FindOptions): Promise<any> {\n const transaction = await this.getTransaction(options);\n\n const findOptions = {\n ...this.extendFindOptions(\n this.buildQueryOptions({\n ...options,\n }),\n ),\n subQuery: false,\n };\n\n const getAccessor = this.accessors().get;\n const sourceModel = await this.getSourceModel(transaction);\n\n if (findOptions.include && findOptions.include.length > 0) {\n const ids = (\n await sourceModel[getAccessor]({\n ...findOptions,\n includeIgnoreAttributes: false,\n attributes: [this.targetKey()],\n group: `${this.targetModel.name}.${this.targetKey()}`,\n transaction,\n })\n ).map((row) => row.get(this.targetKey()));\n\n return await sourceModel[getAccessor]({\n ...omit(findOptions, ['limit', 'offset']),\n where: {\n [this.targetKey()]: {\n [Op.in]: ids,\n },\n },\n transaction,\n });\n }\n\n return await sourceModel[getAccessor]({\n ...findOptions,\n transaction,\n });\n }\n\n async findAndCount(options?: FindAndCountOptions): Promise<[any[], number]> {\n const transaction = await this.getTransaction(options, false);\n return [\n await this.find({\n ...options,\n transaction,\n }),\n await this.count({\n ...options,\n transaction,\n }),\n ];\n }\n\n async count(options?: CountOptions) {\n const transaction = await this.getTransaction(options);\n\n const sourceModel = await this.getSourceModel(transaction);\n const queryOptions = this.buildQueryOptions(options);\n\n const count = await sourceModel[this.accessors().get]({\n where: queryOptions.where,\n include: queryOptions.include,\n includeIgnoreAttributes: false,\n attributes: [\n [\n Sequelize.fn(\n 'COUNT',\n Sequelize.fn('DISTINCT', Sequelize.col(`${this.targetModel.name}.${this.targetKey()}`)),\n ),\n 'count',\n ],\n ],\n raw: true,\n plain: true,\n transaction,\n });\n\n return parseInt(count.count);\n }\n\n async findOne(options?: FindOneOptions): Promise<any> {\n const transaction = await this.getTransaction(options, false);\n const rows = await this.find({ ...options, limit: 1, transaction });\n return rows.length == 1 ? rows[0] : null;\n }\n\n @transaction((args, transaction) => {\n return {\n tk: args[0],\n transaction,\n };\n })\n async remove(options: TargetKey | TargetKey[] | AssociatedOptions): Promise<void> {\n const transaction = await this.getTransaction(options);\n let handleKeys = options['tk'];\n\n if (!Array.isArray(handleKeys)) {\n handleKeys = [handleKeys];\n }\n\n const sourceModel = await this.getSourceModel(transaction);\n await sourceModel[this.accessors().removeMultiple](handleKeys, {\n transaction,\n });\n return;\n }\n\n @transaction()\n async update(options?: UpdateOptions): Promise<any> {\n const transaction = await this.getTransaction(options);\n\n const guard = UpdateGuard.fromOptions(this.targetModel, options);\n\n const values = guard.sanitize(options.values);\n\n const queryOptions = this.buildQueryOptions(options as any);\n\n const instances = await this.find({\n ...queryOptions,\n transaction,\n });\n\n for (const instance of instances) {\n await updateModelByValues(instance, values, {\n ...options,\n sanitized: true,\n sourceModel: this.sourceInstance,\n transaction,\n });\n }\n\n for (const instance of instances) {\n if (options.hooks !== false) {\n await this.db.emitAsync(`${this.targetCollection.name}.afterUpdateWithAssociations`, instance, {...options, transaction});\n await this.db.emitAsync(`${this.targetCollection.name}.afterSaveWithAssociations`, instance, {...options, transaction});\n }\n }\n\n return instances;\n }\n\n async destroy(options?: TK | DestroyOptions): Promise<Boolean> {\n return false;\n }\n\n protected async destroyByFilter(filter: Filter, transaction?: Transaction) {\n const instances = await this.find({\n filter: filter,\n transaction,\n });\n\n return await this.destroy({\n filterByTk: instances.map((instance) => instance.get(this.targetCollection.filterTargetKey)),\n transaction,\n });\n }\n\n protected filterHasInclude(filter: Filter, options?: any) {\n const filterResult = this.parseFilter(filter, options);\n return filterResult.include && filterResult.include.length > 0;\n }\n\n protected accessors() {\n return <MultiAssociationAccessors>super.accessors();\n }\n}\n"]}
@@ -19,7 +19,7 @@ export declare abstract class RelationRepository {
19
19
  targetKey(): any;
20
20
  protected accessors(): import("sequelize").SingleAssociationAccessors | import("sequelize").MultiAssociationAccessors;
21
21
  create(options?: CreateOptions): Promise<any>;
22
- getSourceModel(transaction?: any): Promise<Model<any, any>>;
22
+ getSourceModel(transaction?: Transaction): Promise<Model<any, any>>;
23
23
  protected buildQueryOptions(options: FindOptions): any;
24
24
  protected parseFilter(filter: Filter, options?: any): {
25
25
  where?: undefined;
@@ -38,13 +38,14 @@ export class RelationRepository {
38
38
  const createAccessor = this.accessors().create;
39
39
  const guard = UpdateGuard.fromOptions(this.targetModel, options);
40
40
  const values = options.values;
41
- const sourceModel = yield this.getSourceModel();
42
- const instance = yield sourceModel[createAccessor](guard.sanitize(options.values), options);
43
- yield updateAssociations(instance, values, options);
41
+ const transaction = yield this.getTransaction(options);
42
+ const sourceModel = yield this.getSourceModel(transaction);
43
+ const instance = yield sourceModel[createAccessor](guard.sanitize(options.values), Object.assign(Object.assign({}, options), { transaction }));
44
+ yield updateAssociations(instance, values, Object.assign(Object.assign({}, options), { transaction }));
44
45
  if (options.hooks !== false) {
45
- yield this.db.emitAsync(`${this.targetCollection.name}.afterCreateWithAssociations`, instance, options);
46
+ yield this.db.emitAsync(`${this.targetCollection.name}.afterCreateWithAssociations`, instance, Object.assign(Object.assign({}, options), { transaction }));
46
47
  const eventName = `${this.targetCollection.name}.afterSaveWithAssociations`;
47
- yield this.db.emitAsync(eventName, instance, options);
48
+ yield this.db.emitAsync(eventName, instance, Object.assign(Object.assign({}, options), { transaction }));
48
49
  }
49
50
  return instance;
50
51
  });
@@ -56,6 +57,7 @@ export class RelationRepository {
56
57
  where: {
57
58
  [this.associationField.sourceKey]: this.sourceKeyValue,
58
59
  },
60
+ transaction,
59
61
  });
60
62
  }
61
63
  return this.sourceInstance;
@@ -1 +1 @@
1
- {"version":3,"file":"relation-repository.js","sourceRoot":"","sources":["../../src/relation-repository/relation-repository.ts"],"names":[],"mappings":"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","sourcesContent":["import lodash from 'lodash';\nimport { Association, BelongsTo, BelongsToMany, HasMany, HasOne, ModelCtor, Transaction } from 'sequelize';\nimport { Collection } from '../collection';\nimport Database from '../database';\nimport { RelationField } from '../fields/relation-field';\nimport FilterParser from '../filter-parser';\nimport { Model } from '../model';\nimport { OptionsParser } from '../options-parser';\nimport { CreateOptions, Filter, FindOptions } from '../repository';\nimport { transactionWrapperBuilder } from '../transaction-decorator';\nimport { updateAssociations } from '../update-associations';\nimport { UpdateGuard } from '../update-guard';\n\nexport const transaction = transactionWrapperBuilder(function () {\n return this.sourceCollection.model.sequelize.transaction();\n});\n\nexport abstract class RelationRepository {\n sourceCollection: Collection;\n association: Association;\n targetModel: ModelCtor<any>;\n targetCollection: Collection;\n associationName: string;\n associationField: RelationField;\n sourceKeyValue: string | number;\n sourceInstance: Model;\n db: Database;\n\n constructor(sourceCollection: Collection, association: string, sourceKeyValue: string | number) {\n this.db = sourceCollection.context.database;\n\n this.sourceCollection = sourceCollection;\n this.sourceKeyValue = sourceKeyValue;\n this.associationName = association;\n this.association = this.sourceCollection.model.associations[association];\n\n this.associationField = this.sourceCollection.getField(association);\n\n this.targetModel = this.association.target;\n this.targetCollection = this.sourceCollection.context.database.modelCollection.get(this.targetModel);\n }\n\n targetKey() {\n return this.associationField.targetKey;\n }\n\n protected accessors() {\n return (<BelongsTo | HasOne | HasMany | BelongsToMany>this.association).accessors;\n }\n\n async create(options?: CreateOptions): Promise<any> {\n const createAccessor = this.accessors().create;\n\n const guard = UpdateGuard.fromOptions(this.targetModel, options);\n const values = options.values;\n\n const sourceModel = await this.getSourceModel();\n\n const instance = await sourceModel[createAccessor](guard.sanitize(options.values), options);\n\n await updateAssociations(instance, values, options);\n\n if (options.hooks !== false) {\n await this.db.emitAsync(`${this.targetCollection.name}.afterCreateWithAssociations`, instance, options);\n const eventName = `${this.targetCollection.name}.afterSaveWithAssociations`;\n await this.db.emitAsync(eventName, instance, options);\n }\n\n return instance;\n }\n\n async getSourceModel(transaction?: any) {\n if (!this.sourceInstance) {\n this.sourceInstance = await this.sourceCollection.model.findOne({\n where: {\n [this.associationField.sourceKey]: this.sourceKeyValue,\n },\n });\n }\n\n return this.sourceInstance;\n }\n\n protected buildQueryOptions(options: FindOptions) {\n const parser = new OptionsParser(options, {\n collection: this.targetCollection,\n targetKey: this.targetKey(),\n });\n const params = parser.toSequelizeParams();\n return { ...options, ...params };\n }\n\n protected parseFilter(filter: Filter, options?: any) {\n const parser = new FilterParser(filter, {\n collection: this.targetCollection,\n app: {\n ctx: options?.context,\n },\n });\n return parser.toSequelizeParams();\n }\n\n protected async getTransaction(options: any, autoGen = false): Promise<Transaction | null> {\n if (lodash.isPlainObject(options) && options.transaction) {\n return options.transaction;\n }\n\n if (autoGen) {\n return await this.sourceCollection.model.sequelize.transaction();\n }\n\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"relation-repository.js","sourceRoot":"","sources":["../../src/relation-repository/relation-repository.ts"],"names":[],"mappings":"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","sourcesContent":["import lodash from 'lodash';\nimport { Association, BelongsTo, BelongsToMany, HasMany, HasOne, ModelCtor, Transaction } from 'sequelize';\nimport { Collection } from '../collection';\nimport Database from '../database';\nimport { RelationField } from '../fields/relation-field';\nimport FilterParser from '../filter-parser';\nimport { Model } from '../model';\nimport { OptionsParser } from '../options-parser';\nimport { CreateOptions, Filter, FindOptions } from '../repository';\nimport { transactionWrapperBuilder } from '../transaction-decorator';\nimport { updateAssociations } from '../update-associations';\nimport { UpdateGuard } from '../update-guard';\n\nexport const transaction = transactionWrapperBuilder(function () {\n return this.sourceCollection.model.sequelize.transaction();\n});\n\nexport abstract class RelationRepository {\n sourceCollection: Collection;\n association: Association;\n targetModel: ModelCtor<any>;\n targetCollection: Collection;\n associationName: string;\n associationField: RelationField;\n sourceKeyValue: string | number;\n sourceInstance: Model;\n db: Database;\n\n constructor(sourceCollection: Collection, association: string, sourceKeyValue: string | number) {\n this.db = sourceCollection.context.database;\n\n this.sourceCollection = sourceCollection;\n this.sourceKeyValue = sourceKeyValue;\n this.associationName = association;\n this.association = this.sourceCollection.model.associations[association];\n\n this.associationField = this.sourceCollection.getField(association);\n\n this.targetModel = this.association.target;\n this.targetCollection = this.sourceCollection.context.database.modelCollection.get(this.targetModel);\n }\n\n targetKey() {\n return this.associationField.targetKey;\n }\n\n protected accessors() {\n return (<BelongsTo | HasOne | HasMany | BelongsToMany>this.association).accessors;\n }\n\n async create(options?: CreateOptions): Promise<any> {\n const createAccessor = this.accessors().create;\n\n const guard = UpdateGuard.fromOptions(this.targetModel, options);\n const values = options.values;\n const transaction = await this.getTransaction(options);\n\n const sourceModel = await this.getSourceModel(transaction);\n\n const instance = await sourceModel[createAccessor](guard.sanitize(options.values), { ...options, transaction });\n\n await updateAssociations(instance, values, { ...options, transaction });\n\n if (options.hooks !== false) {\n await this.db.emitAsync(`${this.targetCollection.name}.afterCreateWithAssociations`, instance, {\n ...options,\n transaction,\n });\n const eventName = `${this.targetCollection.name}.afterSaveWithAssociations`;\n await this.db.emitAsync(eventName, instance, { ...options, transaction });\n }\n\n return instance;\n }\n\n async getSourceModel(transaction?: Transaction) {\n if (!this.sourceInstance) {\n this.sourceInstance = await this.sourceCollection.model.findOne({\n where: {\n [this.associationField.sourceKey]: this.sourceKeyValue,\n },\n transaction,\n });\n }\n\n return this.sourceInstance;\n }\n\n protected buildQueryOptions(options: FindOptions) {\n const parser = new OptionsParser(options, {\n collection: this.targetCollection,\n targetKey: this.targetKey(),\n });\n const params = parser.toSequelizeParams();\n return { ...options, ...params };\n }\n\n protected parseFilter(filter: Filter, options?: any) {\n const parser = new FilterParser(filter, {\n collection: this.targetCollection,\n app: {\n ctx: options?.context,\n },\n });\n return parser.toSequelizeParams();\n }\n\n protected async getTransaction(options: any, autoGen = false): Promise<Transaction | null> {\n if (lodash.isPlainObject(options) && options.transaction) {\n return options.transaction;\n }\n\n if (autoGen) {\n return await this.sourceCollection.model.sequelize.transaction();\n }\n\n return null;\n }\n}\n"]}
@@ -38,7 +38,7 @@ export interface FilterByTk {
38
38
  }
39
39
  export interface FindOptions extends SequelizeFindOptions, CommonFindOptions, FilterByTk {
40
40
  }
41
- export interface CommonFindOptions {
41
+ export interface CommonFindOptions extends TransactionAble {
42
42
  filter?: Filter;
43
43
  fields?: Fields;
44
44
  appends?: Appends;
@@ -1 +1 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"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","sourcesContent":["import lodash, { omit } from 'lodash';\nimport {\n Association,\n BulkCreateOptions,\n CreateOptions as SequelizeCreateOptions,\n DestroyOptions as SequelizeDestroyOptions,\n FindAndCountOptions as SequelizeAndCountOptions,\n FindOptions as SequelizeFindOptions,\n ModelCtor,\n Op,\n Transaction,\n UpdateOptions as SequelizeUpdateOptions\n} from 'sequelize';\nimport { Collection } from './collection';\nimport { Database } from './database';\nimport { RelationField } from './fields';\nimport FilterParser from './filter-parser';\nimport { Model } from './model';\nimport { OptionsParser } from './options-parser';\nimport { BelongsToManyRepository } from './relation-repository/belongs-to-many-repository';\nimport { BelongsToRepository } from './relation-repository/belongs-to-repository';\nimport { HasManyRepository } from './relation-repository/hasmany-repository';\nimport { HasOneRepository } from './relation-repository/hasone-repository';\nimport { RelationRepository } from './relation-repository/relation-repository';\nimport { transactionWrapperBuilder } from './transaction-decorator';\nimport { updateAssociations, updateModelByValues } from './update-associations';\nimport { UpdateGuard } from './update-guard';\n\nconst debug = require('debug')('noco-database');\n\nexport interface IRepository {}\n\ninterface CreateManyOptions extends BulkCreateOptions {\n records: Values[];\n}\n\nexport interface TransactionAble {\n transaction?: Transaction;\n}\n\nexport interface FilterAble {\n filter: Filter;\n}\n\nexport type TargetKey = string | number;\nexport type TK = TargetKey | TargetKey[];\n\nexport type Filter = any;\nexport type Appends = string[];\nexport type Except = string[];\nexport type Fields = string[];\nexport type Sort = string[] | string;\n\nexport type WhiteList = string[];\nexport type BlackList = string[];\nexport type AssociationKeysToBeUpdate = string[];\n\nexport type Values = any;\n\nexport interface CountOptions extends Omit<SequelizeCreateOptions, 'distinct' | 'where' | 'include'>, TransactionAble {\n fields?: Fields;\n filter?: Filter;\n}\n\nexport interface FilterByTk {\n filterByTk?: TargetKey;\n}\n\nexport interface FindOptions extends SequelizeFindOptions, CommonFindOptions, FilterByTk {}\n\nexport interface CommonFindOptions {\n filter?: Filter;\n fields?: Fields;\n appends?: Appends;\n except?: Except;\n sort?: Sort;\n context?: any;\n}\n\ninterface FindOneOptions extends FindOptions, CommonFindOptions {}\n\nexport interface DestroyOptions extends SequelizeDestroyOptions {\n filter?: Filter;\n filterByTk?: TargetKey | TargetKey[];\n truncate?: boolean;\n context?: any;\n}\n\ninterface FindAndCountOptions extends Omit<SequelizeAndCountOptions, 'where' | 'include' | 'order'> {\n // 数据过滤\n filter?: Filter;\n // 输出结果显示哪些字段\n fields?: Fields;\n // 输出结果不显示哪些字段\n except?: Except;\n // 附加字段,用于控制关系字段的输出\n appends?: Appends;\n // 排序,字段前面加上 “-” 表示降序\n sort?: Sort;\n}\n\nexport interface CreateOptions extends SequelizeCreateOptions {\n values?: Values;\n whitelist?: WhiteList;\n blacklist?: BlackList;\n updateAssociationValues?: AssociationKeysToBeUpdate;\n context?: any;\n}\n\nexport interface UpdateOptions extends Omit<SequelizeUpdateOptions, 'where'> {\n values: Values;\n filter?: Filter;\n filterByTk?: TargetKey;\n whitelist?: WhiteList;\n blacklist?: BlackList;\n updateAssociationValues?: AssociationKeysToBeUpdate;\n context?: any;\n}\n\ninterface RelatedQueryOptions {\n database: Database;\n field: RelationField;\n source: {\n idOrInstance: any;\n collection: Collection;\n };\n target: {\n association: Association & {\n accessors: any;\n };\n collection: Collection;\n };\n}\n\nconst transaction = transactionWrapperBuilder(function () {\n return (<Repository>this).collection.model.sequelize.transaction();\n});\n\nclass RelationRepositoryBuilder<R extends RelationRepository> {\n collection: Collection;\n associationName: string;\n association: Association;\n\n builderMap = {\n HasOne: HasOneRepository,\n BelongsTo: BelongsToRepository,\n BelongsToMany: BelongsToManyRepository,\n HasMany: HasManyRepository,\n };\n\n constructor(collection: Collection, associationName: string) {\n this.collection = collection;\n this.associationName = associationName;\n this.association = this.collection.model.associations[this.associationName];\n }\n\n protected builder() {\n return this.builderMap;\n }\n\n of(id: string | number): R {\n const klass = this.builder()[this.association.associationType];\n return new klass(this.collection, this.associationName, id);\n }\n}\n\nexport class Repository<TModelAttributes extends {} = any, TCreationAttributes extends {} = TModelAttributes>\n implements IRepository\n{\n database: Database;\n collection: Collection;\n model: ModelCtor<Model>;\n\n constructor(collection: Collection) {\n this.database = collection.context.database;\n this.collection = collection;\n this.model = collection.model;\n }\n\n /**\n * return count by filter\n */\n async count(countOptions?: CountOptions): Promise<number> {\n let options = countOptions ? lodash.clone(countOptions) : {};\n\n const transaction = await this.getTransaction(options);\n\n if (countOptions?.filter) {\n options = {\n ...options,\n ...this.parseFilter(countOptions.filter, countOptions),\n };\n }\n\n const count = await this.collection.model.count({\n ...options,\n distinct: true,\n transaction,\n });\n\n return count;\n }\n\n /**\n * find\n * @param options\n */\n async find(options?: FindOptions) {\n const model = this.collection.model;\n const transaction = await this.getTransaction(options);\n\n const opts = {\n subQuery: false,\n ...this.buildQueryOptions(options),\n };\n\n if (opts.include && opts.include.length > 0) {\n // @ts-ignore\n const primaryKeyField = model.primaryKeyField || model.primaryKeyAttribute;\n\n const ids = (\n await model.findAll({\n ...opts,\n includeIgnoreAttributes: false,\n attributes: [primaryKeyField],\n group: `${model.name}.${primaryKeyField}`,\n transaction,\n })\n ).map((row) => row.get(primaryKeyField));\n\n const where = {\n [primaryKeyField]: {\n [Op.in]: ids,\n },\n };\n\n return await model.findAll({\n ...omit(opts, ['limit', 'offset']),\n where,\n transaction,\n });\n }\n\n return await model.findAll({\n ...opts,\n transaction,\n });\n }\n\n /**\n * find and count\n * @param options\n */\n async findAndCount(options?: FindAndCountOptions): Promise<[Model[], number]> {\n const transaction = await this.getTransaction(options);\n options = {\n ...options,\n transaction,\n };\n\n return [await this.find(options), await this.count(options)];\n }\n\n /**\n * Find By Id\n *\n */\n findById(id: string | number) {\n return this.collection.model.findByPk(id);\n }\n\n /**\n * Find one record from database\n *\n * @param options\n */\n async findOne(options?: FindOneOptions) {\n const transaction = await this.getTransaction(options);\n\n const rows = await this.find({ ...options, limit: 1, transaction });\n return rows.length == 1 ? rows[0] : null;\n }\n\n /**\n * Save instance to database\n *\n * @param values\n * @param options\n */\n @transaction()\n async create<M extends Model>(options: CreateOptions): Promise<M> {\n const transaction = await this.getTransaction(options);\n\n const guard = UpdateGuard.fromOptions(this.model, { ...options, action: 'create' });\n const values = guard.sanitize(options.values || {});\n\n const instance = await this.model.create<any>(values, {\n ...options,\n transaction,\n });\n\n if (!instance) {\n return;\n }\n\n await updateAssociations(instance, values, {\n ...options,\n transaction,\n });\n\n if (options.hooks !== false) {\n await this.database.emitAsync(`${this.collection.name}.afterCreateWithAssociations`, instance, options);\n await this.database.emitAsync(`${this.collection.name}.afterSaveWithAssociations`, instance, options);\n }\n\n return instance;\n }\n\n /**\n * Save Many instances to database\n *\n * @param records\n * @param options\n */\n @transaction()\n async createMany(options: CreateManyOptions) {\n const transaction = await this.getTransaction(options);\n const { records } = options;\n const instances = [];\n for (const values of records) {\n const instance = await this.create({ values, transaction });\n instances.push(instance);\n }\n return instances;\n }\n\n /**\n * Update model value\n *\n * @param values\n * @param options\n */\n @transaction()\n async update(options: UpdateOptions) {\n const transaction = await this.getTransaction(options);\n const guard = UpdateGuard.fromOptions(this.model, options);\n\n const values = guard.sanitize(options.values);\n\n const queryOptions = this.buildQueryOptions(options);\n\n const instances = await this.find({\n ...queryOptions,\n transaction,\n });\n\n for (const instance of instances) {\n await updateModelByValues(instance, values, {\n ...options,\n sanitized: true,\n transaction,\n });\n }\n\n if (options.hooks !== false) {\n for (const instance of instances) {\n await this.database.emitAsync(`${this.collection.name}.afterUpdateWithAssociations`, instance, options);\n await this.database.emitAsync(`${this.collection.name}.afterSaveWithAssociations`, instance, options);\n }\n }\n\n return instances;\n }\n\n @transaction((args, transaction) => {\n return {\n filterByTk: args[0],\n transaction,\n };\n })\n async destroy(options?: TargetKey | TargetKey[] | DestroyOptions) {\n const transaction = await this.getTransaction(options);\n\n const modelFilterKey = this.collection.filterTargetKey;\n\n options = <DestroyOptions>options;\n\n if (options['individualHooks'] === undefined) {\n options['individualHooks'] = true;\n }\n\n const filterByTk: TargetKey[] | undefined =\n options.filterByTk && !lodash.isArray(options.filterByTk)\n ? [options.filterByTk]\n : (options.filterByTk as TargetKey[] | undefined);\n\n if (filterByTk && !options.filter) {\n return await this.model.destroy({\n ...options,\n where: {\n [modelFilterKey]: {\n [Op.in]: filterByTk,\n },\n },\n transaction,\n });\n }\n\n if (options.filter) {\n let pks = (\n await this.find({\n filter: options.filter,\n transaction,\n })\n ).map((instance) => instance.get(modelFilterKey) as TargetKey);\n\n if (filterByTk) {\n pks = lodash.intersection(\n pks.map((i) => `${i}`),\n filterByTk.map((i) => `${i}`),\n );\n }\n\n return await this.destroy({\n ...lodash.omit(options, 'filter'),\n filterByTk: pks,\n transaction,\n });\n }\n\n if (options.truncate) {\n return await this.model.destroy({\n ...options,\n truncate: true,\n transaction,\n });\n }\n }\n\n /**\n * @param association target association\n */\n relation<R extends RelationRepository>(association: string): RelationRepositoryBuilder<R> {\n return new RelationRepositoryBuilder<R>(this.collection, association);\n }\n\n protected buildQueryOptions(options: any) {\n const parser = new OptionsParser(options, {\n collection: this.collection,\n });\n\n const params = parser.toSequelizeParams();\n debug('sequelize query params %o', params);\n return { where: {}, ...options, ...params };\n }\n\n protected parseFilter(filter: Filter, options?: any) {\n const parser = new FilterParser(filter, {\n collection: this.collection,\n app: {\n ctx: options?.context,\n },\n });\n return parser.toSequelizeParams();\n }\n\n protected async getTransaction(options: any, autoGen = false) {\n if (lodash.isPlainObject(options) && options.transaction) {\n return options.transaction;\n }\n\n if (autoGen) {\n return await this.model.sequelize.transaction();\n }\n\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"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","sourcesContent":["import lodash, { omit } from 'lodash';\nimport {\n Association,\n BulkCreateOptions,\n CreateOptions as SequelizeCreateOptions,\n DestroyOptions as SequelizeDestroyOptions,\n FindAndCountOptions as SequelizeAndCountOptions,\n FindOptions as SequelizeFindOptions,\n ModelCtor,\n Op,\n Transaction,\n UpdateOptions as SequelizeUpdateOptions\n} from 'sequelize';\nimport { Collection } from './collection';\nimport { Database } from './database';\nimport { RelationField } from './fields';\nimport FilterParser from './filter-parser';\nimport { Model } from './model';\nimport { OptionsParser } from './options-parser';\nimport { BelongsToManyRepository } from './relation-repository/belongs-to-many-repository';\nimport { BelongsToRepository } from './relation-repository/belongs-to-repository';\nimport { HasManyRepository } from './relation-repository/hasmany-repository';\nimport { HasOneRepository } from './relation-repository/hasone-repository';\nimport { RelationRepository } from './relation-repository/relation-repository';\nimport { transactionWrapperBuilder } from './transaction-decorator';\nimport { updateAssociations, updateModelByValues } from './update-associations';\nimport { UpdateGuard } from './update-guard';\n\nconst debug = require('debug')('noco-database');\n\nexport interface IRepository {}\n\ninterface CreateManyOptions extends BulkCreateOptions {\n records: Values[];\n}\n\nexport interface TransactionAble {\n transaction?: Transaction;\n}\n\nexport interface FilterAble {\n filter: Filter;\n}\n\nexport type TargetKey = string | number;\nexport type TK = TargetKey | TargetKey[];\n\nexport type Filter = any;\nexport type Appends = string[];\nexport type Except = string[];\nexport type Fields = string[];\nexport type Sort = string[] | string;\n\nexport type WhiteList = string[];\nexport type BlackList = string[];\nexport type AssociationKeysToBeUpdate = string[];\n\nexport type Values = any;\n\nexport interface CountOptions extends Omit<SequelizeCreateOptions, 'distinct' | 'where' | 'include'>, TransactionAble {\n fields?: Fields;\n filter?: Filter;\n}\n\nexport interface FilterByTk {\n filterByTk?: TargetKey;\n}\n\nexport interface FindOptions extends SequelizeFindOptions, CommonFindOptions, FilterByTk {}\n\nexport interface CommonFindOptions extends TransactionAble {\n filter?: Filter;\n fields?: Fields;\n appends?: Appends;\n except?: Except;\n sort?: Sort;\n context?: any;\n}\n\ninterface FindOneOptions extends FindOptions, CommonFindOptions {}\n\nexport interface DestroyOptions extends SequelizeDestroyOptions {\n filter?: Filter;\n filterByTk?: TargetKey | TargetKey[];\n truncate?: boolean;\n context?: any;\n}\n\ninterface FindAndCountOptions extends Omit<SequelizeAndCountOptions, 'where' | 'include' | 'order'> {\n // 数据过滤\n filter?: Filter;\n // 输出结果显示哪些字段\n fields?: Fields;\n // 输出结果不显示哪些字段\n except?: Except;\n // 附加字段,用于控制关系字段的输出\n appends?: Appends;\n // 排序,字段前面加上 “-” 表示降序\n sort?: Sort;\n}\n\nexport interface CreateOptions extends SequelizeCreateOptions {\n values?: Values;\n whitelist?: WhiteList;\n blacklist?: BlackList;\n updateAssociationValues?: AssociationKeysToBeUpdate;\n context?: any;\n}\n\nexport interface UpdateOptions extends Omit<SequelizeUpdateOptions, 'where'> {\n values: Values;\n filter?: Filter;\n filterByTk?: TargetKey;\n whitelist?: WhiteList;\n blacklist?: BlackList;\n updateAssociationValues?: AssociationKeysToBeUpdate;\n context?: any;\n}\n\ninterface RelatedQueryOptions {\n database: Database;\n field: RelationField;\n source: {\n idOrInstance: any;\n collection: Collection;\n };\n target: {\n association: Association & {\n accessors: any;\n };\n collection: Collection;\n };\n}\n\nconst transaction = transactionWrapperBuilder(function () {\n return (<Repository>this).collection.model.sequelize.transaction();\n});\n\nclass RelationRepositoryBuilder<R extends RelationRepository> {\n collection: Collection;\n associationName: string;\n association: Association;\n\n builderMap = {\n HasOne: HasOneRepository,\n BelongsTo: BelongsToRepository,\n BelongsToMany: BelongsToManyRepository,\n HasMany: HasManyRepository,\n };\n\n constructor(collection: Collection, associationName: string) {\n this.collection = collection;\n this.associationName = associationName;\n this.association = this.collection.model.associations[this.associationName];\n }\n\n protected builder() {\n return this.builderMap;\n }\n\n of(id: string | number): R {\n const klass = this.builder()[this.association.associationType];\n return new klass(this.collection, this.associationName, id);\n }\n}\n\nexport class Repository<TModelAttributes extends {} = any, TCreationAttributes extends {} = TModelAttributes>\n implements IRepository\n{\n database: Database;\n collection: Collection;\n model: ModelCtor<Model>;\n\n constructor(collection: Collection) {\n this.database = collection.context.database;\n this.collection = collection;\n this.model = collection.model;\n }\n\n /**\n * return count by filter\n */\n async count(countOptions?: CountOptions): Promise<number> {\n let options = countOptions ? lodash.clone(countOptions) : {};\n\n const transaction = await this.getTransaction(options);\n\n if (countOptions?.filter) {\n options = {\n ...options,\n ...this.parseFilter(countOptions.filter, countOptions),\n };\n }\n\n const count = await this.collection.model.count({\n ...options,\n distinct: true,\n transaction,\n });\n\n return count;\n }\n\n /**\n * find\n * @param options\n */\n async find(options?: FindOptions) {\n const model = this.collection.model;\n const transaction = await this.getTransaction(options);\n\n const opts = {\n subQuery: false,\n ...this.buildQueryOptions(options),\n };\n\n if (opts.include && opts.include.length > 0) {\n // @ts-ignore\n const primaryKeyField = model.primaryKeyField || model.primaryKeyAttribute;\n\n const ids = (\n await model.findAll({\n ...opts,\n includeIgnoreAttributes: false,\n attributes: [primaryKeyField],\n group: `${model.name}.${primaryKeyField}`,\n transaction,\n })\n ).map((row) => row.get(primaryKeyField));\n\n const where = {\n [primaryKeyField]: {\n [Op.in]: ids,\n },\n };\n\n return await model.findAll({\n ...omit(opts, ['limit', 'offset']),\n where,\n transaction,\n });\n }\n\n return await model.findAll({\n ...opts,\n transaction,\n });\n }\n\n /**\n * find and count\n * @param options\n */\n async findAndCount(options?: FindAndCountOptions): Promise<[Model[], number]> {\n const transaction = await this.getTransaction(options);\n options = {\n ...options,\n transaction,\n };\n\n return [await this.find(options), await this.count(options)];\n }\n\n /**\n * Find By Id\n *\n */\n findById(id: string | number) {\n return this.collection.model.findByPk(id);\n }\n\n /**\n * Find one record from database\n *\n * @param options\n */\n async findOne(options?: FindOneOptions) {\n const transaction = await this.getTransaction(options);\n\n const rows = await this.find({ ...options, limit: 1, transaction });\n return rows.length == 1 ? rows[0] : null;\n }\n\n /**\n * Save instance to database\n *\n * @param values\n * @param options\n */\n @transaction()\n async create<M extends Model>(options: CreateOptions): Promise<M> {\n const transaction = await this.getTransaction(options);\n\n const guard = UpdateGuard.fromOptions(this.model, { ...options, action: 'create' });\n const values = guard.sanitize(options.values || {});\n\n const instance = await this.model.create<any>(values, {\n ...options,\n transaction,\n });\n\n if (!instance) {\n return;\n }\n\n await updateAssociations(instance, values, {\n ...options,\n transaction,\n });\n\n if (options.hooks !== false) {\n await this.database.emitAsync(`${this.collection.name}.afterCreateWithAssociations`, instance, options);\n await this.database.emitAsync(`${this.collection.name}.afterSaveWithAssociations`, instance, options);\n }\n\n return instance;\n }\n\n /**\n * Save Many instances to database\n *\n * @param records\n * @param options\n */\n @transaction()\n async createMany(options: CreateManyOptions) {\n const transaction = await this.getTransaction(options);\n const { records } = options;\n const instances = [];\n for (const values of records) {\n const instance = await this.create({ values, transaction });\n instances.push(instance);\n }\n return instances;\n }\n\n /**\n * Update model value\n *\n * @param values\n * @param options\n */\n @transaction()\n async update(options: UpdateOptions) {\n const transaction = await this.getTransaction(options);\n const guard = UpdateGuard.fromOptions(this.model, options);\n\n const values = guard.sanitize(options.values);\n\n const queryOptions = this.buildQueryOptions(options);\n\n const instances = await this.find({\n ...queryOptions,\n transaction,\n });\n\n for (const instance of instances) {\n await updateModelByValues(instance, values, {\n ...options,\n sanitized: true,\n transaction,\n });\n }\n\n if (options.hooks !== false) {\n for (const instance of instances) {\n await this.database.emitAsync(`${this.collection.name}.afterUpdateWithAssociations`, instance, options);\n await this.database.emitAsync(`${this.collection.name}.afterSaveWithAssociations`, instance, options);\n }\n }\n\n return instances;\n }\n\n @transaction((args, transaction) => {\n return {\n filterByTk: args[0],\n transaction,\n };\n })\n async destroy(options?: TargetKey | TargetKey[] | DestroyOptions) {\n const transaction = await this.getTransaction(options);\n\n const modelFilterKey = this.collection.filterTargetKey;\n\n options = <DestroyOptions>options;\n\n if (options['individualHooks'] === undefined) {\n options['individualHooks'] = true;\n }\n\n const filterByTk: TargetKey[] | undefined =\n options.filterByTk && !lodash.isArray(options.filterByTk)\n ? [options.filterByTk]\n : (options.filterByTk as TargetKey[] | undefined);\n\n if (filterByTk && !options.filter) {\n return await this.model.destroy({\n ...options,\n where: {\n [modelFilterKey]: {\n [Op.in]: filterByTk,\n },\n },\n transaction,\n });\n }\n\n if (options.filter) {\n let pks = (\n await this.find({\n filter: options.filter,\n transaction,\n })\n ).map((instance) => instance.get(modelFilterKey) as TargetKey);\n\n if (filterByTk) {\n pks = lodash.intersection(\n pks.map((i) => `${i}`),\n filterByTk.map((i) => `${i}`),\n );\n }\n\n return await this.destroy({\n ...lodash.omit(options, 'filter'),\n filterByTk: pks,\n transaction,\n });\n }\n\n if (options.truncate) {\n return await this.model.destroy({\n ...options,\n truncate: true,\n transaction,\n });\n }\n }\n\n /**\n * @param association target association\n */\n relation<R extends RelationRepository>(association: string): RelationRepositoryBuilder<R> {\n return new RelationRepositoryBuilder<R>(this.collection, association);\n }\n\n protected buildQueryOptions(options: any) {\n const parser = new OptionsParser(options, {\n collection: this.collection,\n });\n\n const params = parser.toSequelizeParams();\n debug('sequelize query params %o', params);\n return { where: {}, ...options, ...params };\n }\n\n protected parseFilter(filter: Filter, options?: any) {\n const parser = new FilterParser(filter, {\n collection: this.collection,\n app: {\n ctx: options?.context,\n },\n });\n return parser.toSequelizeParams();\n }\n\n protected async getTransaction(options: any, autoGen = false) {\n if (lodash.isPlainObject(options) && options.transaction) {\n return options.transaction;\n }\n\n if (autoGen) {\n return await this.model.sequelize.transaction();\n }\n\n return null;\n }\n}\n"]}
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, require('./association').default), require('./date').default), require('./array').default), require('./empty').default), require('./string').default), require('./ne').default);
3
+ exports.default = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, require('./association').default), require('./date').default), require('./array').default), require('./empty').default), require('./string').default), require('./ne').default), require('./notIn').default);
4
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/operators/index.ts"],"names":[],"mappings":";;AAAA,0GACK,OAAO,CAAC,eAAe,CAAC,CAAC,OAAO,GAChC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,GACzB,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,GAC1B,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,GAC1B,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,GAC3B,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,EAC1B","sourcesContent":["export default {\n ...require('./association').default,\n ...require('./date').default,\n ...require('./array').default,\n ...require('./empty').default,\n ...require('./string').default,\n ...require('./ne').default,\n};\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/operators/index.ts"],"names":[],"mappings":";;AAAA,wHACK,OAAO,CAAC,eAAe,CAAC,CAAC,OAAO,GAChC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,GACzB,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,GAC1B,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,GAC1B,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,GAC3B,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,GACvB,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAC7B","sourcesContent":["export default {\n ...require('./association').default,\n ...require('./date').default,\n ...require('./array').default,\n ...require('./empty').default,\n ...require('./string').default,\n ...require('./ne').default,\n ...require('./notIn').default,\n};\n"]}
@@ -0,0 +1,10 @@
1
+ import { Op } from 'sequelize';
2
+ declare const _default: {
3
+ $notIn(val: any, ctx: any): {
4
+ [Op.or]: {
5
+ [Op.notIn]: any;
6
+ [Op.is]: any;
7
+ };
8
+ };
9
+ };
10
+ export default _default;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const sequelize_1 = require("sequelize");
4
+ exports.default = {
5
+ $notIn(val, ctx) {
6
+ return {
7
+ [sequelize_1.Op.or]: {
8
+ [sequelize_1.Op.notIn]: val,
9
+ [sequelize_1.Op.is]: null,
10
+ },
11
+ };
12
+ },
13
+ };
14
+ //# sourceMappingURL=notIn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notIn.js","sourceRoot":"","sources":["../../src/operators/notIn.ts"],"names":[],"mappings":";;AAAA,yCAA+B;AAE/B,kBAAe;IACb,MAAM,CAAC,GAAG,EAAE,GAAG;QACb,OAAO;YACL,CAAC,cAAE,CAAC,EAAE,CAAC,EAAE;gBACP,CAAC,cAAE,CAAC,KAAK,CAAC,EAAE,GAAG;gBACf,CAAC,cAAE,CAAC,EAAE,CAAC,EAAE,IAAI;aACd;SACF,CAAC;IACJ,CAAC;CACF,CAAC","sourcesContent":["import { Op } from 'sequelize';\n\nexport default {\n $notIn(val, ctx) {\n return {\n [Op.or]: {\n [Op.notIn]: val,\n [Op.is]: null,\n },\n };\n },\n};\n"]}
@@ -187,7 +187,7 @@ class OptionsParser {
187
187
  queryParams['include'].push({
188
188
  association: appendAssociation,
189
189
  });
190
- existIncludeIndex = 0;
190
+ existIncludeIndex = queryParams['include'].length - 1;
191
191
  }
192
192
  // end appends
193
193
  // without nests association
@@ -1 +1 @@
1
- {"version":3,"file":"options-parser.js","sourceRoot":"","sources":["../src/options-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { FindAttributeOptions, ModelCtor, Op } from 'sequelize';\nimport { Collection } from './collection';\nimport { Database } from './database';\nimport FilterParser from './filter-parser';\nimport { Appends, Except, FindOptions } from './repository';\n\nconst debug = require('debug')('noco-database');\n\ninterface OptionsParserContext {\n collection: Collection;\n targetKey?: string;\n}\n\nexport class OptionsParser {\n options: FindOptions;\n database: Database;\n collection: Collection;\n model: ModelCtor<any>;\n filterParser: FilterParser;\n context: OptionsParserContext;\n\n constructor(options: FindOptions, context: OptionsParserContext) {\n const { collection } = context;\n\n this.collection = collection;\n this.model = collection.model;\n this.options = options;\n this.database = collection.context.database;\n this.filterParser = new FilterParser(options?.filter, {\n collection,\n app: {\n ctx: options?.context,\n },\n });\n this.context = context;\n }\n\n isAssociation(key: string) {\n return this.model.associations[key] !== undefined;\n }\n\n isAssociationPath(path: string) {\n return this.isAssociation(path.split('.')[0]);\n }\n\n toSequelizeParams() {\n const queryParams = this.filterParser.toSequelizeParams();\n\n if (this.options?.filterByTk) {\n queryParams.where = {\n [Op.and]: [\n queryParams.where,\n {\n [this.context.targetKey || this.collection.filterTargetKey]: this.options.filterByTk,\n },\n ],\n };\n }\n\n return this.parseSort(this.parseFields(queryParams));\n }\n\n /**\n * parser sort options\n * @param filterParams\n * @protected\n */\n protected parseSort(filterParams) {\n let sort = this.options?.sort || [];\n if (typeof sort === 'string') {\n sort = sort.split(',');\n }\n const orderParams = sort.map((sortKey: string) => {\n const direction = sortKey.startsWith('-') ? 'DESC' : 'ASC';\n const sortField: Array<any> = sortKey.replace('-', '').split('.');\n\n // handle sort by association\n if (sortField.length > 1) {\n let associationModel = this.model;\n\n for (let i = 0; i < sortField.length - 1; i++) {\n const associationKey = sortField[i];\n sortField[i] = associationModel.associations[associationKey].target;\n associationModel = sortField[i];\n }\n }\n\n sortField.push(direction);\n return sortField;\n });\n\n if (orderParams.length > 0) {\n return {\n order: orderParams,\n ...filterParams,\n };\n }\n\n return filterParams;\n }\n\n protected parseFields(filterParams: any) {\n const appends = this.options?.appends || [];\n const except = [];\n\n let attributes: FindAttributeOptions = {\n include: [],\n exclude: [],\n }; // out put all fields by default\n\n if (this.options?.fields) {\n // 将fields拆分为 attributes 和 appends\n for (const field of this.options.fields) {\n if (this.isAssociationPath(field)) {\n // field is association field\n appends.push(field);\n } else {\n // field is model attribute, change attributes to array type\n if (!Array.isArray(attributes)) attributes = [];\n\n attributes.push(field);\n }\n }\n }\n\n if (this.options?.except) {\n for (const exceptKey of this.options.except) {\n if (this.isAssociationPath(exceptKey)) {\n // except association field\n except.push(exceptKey);\n } else {\n // if attributes is array form, ignore except\n if (Array.isArray(attributes)) continue;\n attributes.exclude.push(exceptKey);\n }\n }\n }\n\n return {\n attributes,\n ...this.parseExcept(except, this.parseAppends(appends, filterParams)),\n };\n }\n\n protected parseExcept(except: Except, filterParams: any) {\n if (!except) return filterParams;\n const setExcept = (queryParams: any, except: string) => {\n // split exceptKey to path form\n // posts.comments.content => ['posts', 'comments', 'content']\n // then set except on include attributes\n const exceptPath = except.split('.');\n const association = exceptPath[0];\n const lastLevel = exceptPath.length <= 2;\n\n let existIncludeIndex = queryParams['include'].findIndex((include) => include['association'] == association);\n\n if (existIncludeIndex == -1) {\n // if include not exists, ignore this except\n return;\n }\n\n if (lastLevel) {\n // if it not have exclude form\n if (Array.isArray(queryParams['include'][existIncludeIndex]['attributes'])) {\n return;\n } else {\n if (!queryParams['include'][existIncludeIndex]['attributes']['exclude']) {\n queryParams['include'][existIncludeIndex]['attributes']['exclude'] = [];\n }\n\n queryParams['include'][existIncludeIndex]['attributes']['exclude'].push(exceptPath[1]);\n }\n } else {\n setExcept(queryParams['include'][existIncludeIndex], exceptPath.filter((_, index) => index !== 0).join('.'));\n }\n };\n\n for (const exceptKey of except) {\n setExcept(filterParams, exceptKey);\n }\n\n return filterParams;\n }\n\n protected parseAppends(appends: Appends, filterParams: any) {\n if (!appends) return filterParams;\n\n /**\n * set include params\n * @param includeRoot\n * @param appends\n */\n const setInclude = (model: ModelCtor<any>, queryParams: any, append: string) => {\n const appendFields = append.split('.');\n const appendAssociation = appendFields[0];\n\n const associations = model.associations;\n\n // if append length less or equal 2\n // example:\n // appends: ['posts']\n // appends: ['posts.title']\n // All of these can be seen as last level\n let lastLevel: boolean = false;\n\n if (appendFields.length == 1) {\n lastLevel = true;\n }\n\n if (appendFields.length == 2) {\n const associationModel = associations[appendFields[0]].target;\n if (associationModel.rawAttributes[appendFields[1]]) {\n lastLevel = true;\n }\n }\n\n // find association index\n if (queryParams['include'] == undefined) {\n queryParams['include'] = [];\n }\n\n let existIncludeIndex = queryParams['include'].findIndex(\n (include) => include['association'] == appendAssociation,\n );\n\n // if association not exist, create it\n if (existIncludeIndex == -1) {\n // association not exists\n queryParams['include'].push({\n association: appendAssociation,\n });\n\n existIncludeIndex = 0;\n }\n\n // end appends\n // without nests association\n if (lastLevel) {\n // get exist association attributes\n let attributes = queryParams['include'][existIncludeIndex]['attributes'] || {\n include: [], // all fields are output by default\n };\n\n // if need set attribute\n if (appendFields.length == 2) {\n if (!Array.isArray(attributes)) {\n attributes = [];\n }\n\n const attributeName = appendFields[1];\n\n // push field to it\n attributes.push(attributeName);\n } else {\n // if attributes is empty array, change it to object\n if (Array.isArray(attributes) && attributes.length == 0) {\n attributes = {\n include: [],\n };\n }\n }\n\n // set new attributes\n queryParams['include'][existIncludeIndex] = {\n ...queryParams['include'][existIncludeIndex],\n attributes,\n };\n } else {\n setInclude(\n model.associations[queryParams['include'][existIncludeIndex].association].target,\n queryParams['include'][existIncludeIndex],\n appendFields.filter((_, index) => index !== 0).join('.'),\n );\n }\n };\n\n // handle every appends\n for (const append of appends) {\n setInclude(this.model, filterParams, append);\n }\n\n debug('filter params: %o', filterParams);\n return filterParams;\n }\n}\n"]}
1
+ {"version":3,"file":"options-parser.js","sourceRoot":"","sources":["../src/options-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { FindAttributeOptions, ModelCtor, Op } from 'sequelize';\nimport { Collection } from './collection';\nimport { Database } from './database';\nimport FilterParser from './filter-parser';\nimport { Appends, Except, FindOptions } from './repository';\n\nconst debug = require('debug')('noco-database');\n\ninterface OptionsParserContext {\n collection: Collection;\n targetKey?: string;\n}\n\nexport class OptionsParser {\n options: FindOptions;\n database: Database;\n collection: Collection;\n model: ModelCtor<any>;\n filterParser: FilterParser;\n context: OptionsParserContext;\n\n constructor(options: FindOptions, context: OptionsParserContext) {\n const { collection } = context;\n\n this.collection = collection;\n this.model = collection.model;\n this.options = options;\n this.database = collection.context.database;\n this.filterParser = new FilterParser(options?.filter, {\n collection,\n app: {\n ctx: options?.context,\n },\n });\n this.context = context;\n }\n\n isAssociation(key: string) {\n return this.model.associations[key] !== undefined;\n }\n\n isAssociationPath(path: string) {\n return this.isAssociation(path.split('.')[0]);\n }\n\n toSequelizeParams() {\n const queryParams = this.filterParser.toSequelizeParams();\n\n if (this.options?.filterByTk) {\n queryParams.where = {\n [Op.and]: [\n queryParams.where,\n {\n [this.context.targetKey || this.collection.filterTargetKey]: this.options.filterByTk,\n },\n ],\n };\n }\n\n return this.parseSort(this.parseFields(queryParams));\n }\n\n /**\n * parser sort options\n * @param filterParams\n * @protected\n */\n protected parseSort(filterParams) {\n let sort = this.options?.sort || [];\n if (typeof sort === 'string') {\n sort = sort.split(',');\n }\n const orderParams = sort.map((sortKey: string) => {\n const direction = sortKey.startsWith('-') ? 'DESC' : 'ASC';\n const sortField: Array<any> = sortKey.replace('-', '').split('.');\n\n // handle sort by association\n if (sortField.length > 1) {\n let associationModel = this.model;\n\n for (let i = 0; i < sortField.length - 1; i++) {\n const associationKey = sortField[i];\n sortField[i] = associationModel.associations[associationKey].target;\n associationModel = sortField[i];\n }\n }\n\n sortField.push(direction);\n return sortField;\n });\n\n if (orderParams.length > 0) {\n return {\n order: orderParams,\n ...filterParams,\n };\n }\n\n return filterParams;\n }\n\n protected parseFields(filterParams: any) {\n const appends = this.options?.appends || [];\n const except = [];\n\n let attributes: FindAttributeOptions = {\n include: [],\n exclude: [],\n }; // out put all fields by default\n\n if (this.options?.fields) {\n // 将fields拆分为 attributes 和 appends\n for (const field of this.options.fields) {\n if (this.isAssociationPath(field)) {\n // field is association field\n appends.push(field);\n } else {\n // field is model attribute, change attributes to array type\n if (!Array.isArray(attributes)) attributes = [];\n\n attributes.push(field);\n }\n }\n }\n\n if (this.options?.except) {\n for (const exceptKey of this.options.except) {\n if (this.isAssociationPath(exceptKey)) {\n // except association field\n except.push(exceptKey);\n } else {\n // if attributes is array form, ignore except\n if (Array.isArray(attributes)) continue;\n attributes.exclude.push(exceptKey);\n }\n }\n }\n\n return {\n attributes,\n ...this.parseExcept(except, this.parseAppends(appends, filterParams)),\n };\n }\n\n protected parseExcept(except: Except, filterParams: any) {\n if (!except) return filterParams;\n const setExcept = (queryParams: any, except: string) => {\n // split exceptKey to path form\n // posts.comments.content => ['posts', 'comments', 'content']\n // then set except on include attributes\n const exceptPath = except.split('.');\n const association = exceptPath[0];\n const lastLevel = exceptPath.length <= 2;\n\n let existIncludeIndex = queryParams['include'].findIndex((include) => include['association'] == association);\n\n if (existIncludeIndex == -1) {\n // if include not exists, ignore this except\n return;\n }\n\n if (lastLevel) {\n // if it not have exclude form\n if (Array.isArray(queryParams['include'][existIncludeIndex]['attributes'])) {\n return;\n } else {\n if (!queryParams['include'][existIncludeIndex]['attributes']['exclude']) {\n queryParams['include'][existIncludeIndex]['attributes']['exclude'] = [];\n }\n\n queryParams['include'][existIncludeIndex]['attributes']['exclude'].push(exceptPath[1]);\n }\n } else {\n setExcept(queryParams['include'][existIncludeIndex], exceptPath.filter((_, index) => index !== 0).join('.'));\n }\n };\n\n for (const exceptKey of except) {\n setExcept(filterParams, exceptKey);\n }\n\n return filterParams;\n }\n\n protected parseAppends(appends: Appends, filterParams: any) {\n if (!appends) return filterParams;\n\n /**\n * set include params\n * @param includeRoot\n * @param appends\n */\n const setInclude = (model: ModelCtor<any>, queryParams: any, append: string) => {\n const appendFields = append.split('.');\n const appendAssociation = appendFields[0];\n\n const associations = model.associations;\n\n // if append length less or equal 2\n // example:\n // appends: ['posts']\n // appends: ['posts.title']\n // All of these can be seen as last level\n let lastLevel: boolean = false;\n\n if (appendFields.length == 1) {\n lastLevel = true;\n }\n\n if (appendFields.length == 2) {\n const associationModel = associations[appendFields[0]].target;\n if (associationModel.rawAttributes[appendFields[1]]) {\n lastLevel = true;\n }\n }\n\n // find association index\n if (queryParams['include'] == undefined) {\n queryParams['include'] = [];\n }\n\n let existIncludeIndex = queryParams['include'].findIndex(\n (include) => include['association'] == appendAssociation,\n );\n\n // if association not exist, create it\n if (existIncludeIndex == -1) {\n // association not exists\n queryParams['include'].push({\n association: appendAssociation,\n });\n\n existIncludeIndex = queryParams['include'].length - 1;\n }\n\n // end appends\n // without nests association\n if (lastLevel) {\n // get exist association attributes\n let attributes = queryParams['include'][existIncludeIndex]['attributes'] || {\n include: [], // all fields are output by default\n };\n\n // if need set attribute\n if (appendFields.length == 2) {\n if (!Array.isArray(attributes)) {\n attributes = [];\n }\n\n const attributeName = appendFields[1];\n\n // push field to it\n attributes.push(attributeName);\n } else {\n // if attributes is empty array, change it to object\n if (Array.isArray(attributes) && attributes.length == 0) {\n attributes = {\n include: [],\n };\n }\n }\n\n // set new attributes\n queryParams['include'][existIncludeIndex] = {\n ...queryParams['include'][existIncludeIndex],\n attributes,\n };\n } else {\n setInclude(\n model.associations[queryParams['include'][existIncludeIndex].association].target,\n queryParams['include'][existIncludeIndex],\n appendFields.filter((_, index) => index !== 0).join('.'),\n );\n }\n };\n\n // handle every appends\n for (const append of appends) {\n setInclude(this.model, filterParams, append);\n }\n\n debug('filter params: %o', filterParams);\n return filterParams;\n }\n}\n"]}
@@ -100,14 +100,14 @@ class MultipleRelationRepository extends relation_repository_1.RelationRepositor
100
100
  const guard = update_guard_1.UpdateGuard.fromOptions(this.targetModel, options);
101
101
  const values = guard.sanitize(options.values);
102
102
  const queryOptions = this.buildQueryOptions(options);
103
- const instances = yield this.find(queryOptions);
103
+ const instances = yield this.find(Object.assign(Object.assign({}, queryOptions), { transaction }));
104
104
  for (const instance of instances) {
105
105
  yield (0, update_associations_1.updateModelByValues)(instance, values, Object.assign(Object.assign({}, options), { sanitized: true, sourceModel: this.sourceInstance, transaction }));
106
106
  }
107
107
  for (const instance of instances) {
108
108
  if (options.hooks !== false) {
109
- yield this.db.emitAsync(`${this.targetCollection.name}.afterUpdateWithAssociations`, instance, options);
110
- yield this.db.emitAsync(`${this.targetCollection.name}.afterSaveWithAssociations`, instance, options);
109
+ yield this.db.emitAsync(`${this.targetCollection.name}.afterUpdateWithAssociations`, instance, Object.assign(Object.assign({}, options), { transaction }));
110
+ yield this.db.emitAsync(`${this.targetCollection.name}.afterSaveWithAssociations`, instance, Object.assign(Object.assign({}, options), { transaction }));
111
111
  }
112
112
  }
113
113
  return instances;
@@ -1 +1 @@
1
- {"version":3,"file":"multiple-relation-repository.js","sourceRoot":"","sources":["../../src/relation-repository/multiple-relation-repository.ts"],"names":[],"mappings":"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","sourcesContent":["import { omit } from 'lodash';\nimport { MultiAssociationAccessors, Op, Sequelize, Transaction } from 'sequelize';\nimport {\n CommonFindOptions,\n CountOptions,\n DestroyOptions,\n Filter,\n FilterByTk,\n FindOptions,\n TargetKey,\n TK,\n TransactionAble,\n UpdateOptions\n} from '../repository';\nimport { updateModelByValues } from '../update-associations';\nimport { UpdateGuard } from '../update-guard';\nimport { RelationRepository, transaction } from './relation-repository';\n\nexport interface FindAndCountOptions extends CommonFindOptions {}\n\nexport interface FindOneOptions extends CommonFindOptions, FilterByTk {}\n\nexport interface AssociatedOptions extends TransactionAble {\n tk?: TK;\n}\n\nexport abstract class MultipleRelationRepository extends RelationRepository {\n extendFindOptions(findOptions) {\n return findOptions;\n }\n\n async find(options?: FindOptions): Promise<any> {\n const transaction = await this.getTransaction(options);\n\n const findOptions = {\n ...this.extendFindOptions(\n this.buildQueryOptions({\n ...options,\n }),\n ),\n subQuery: false,\n };\n\n const getAccessor = this.accessors().get;\n const sourceModel = await this.getSourceModel(transaction);\n\n if (findOptions.include && findOptions.include.length > 0) {\n const ids = (\n await sourceModel[getAccessor]({\n ...findOptions,\n includeIgnoreAttributes: false,\n attributes: [this.targetKey()],\n group: `${this.targetModel.name}.${this.targetKey()}`,\n transaction,\n })\n ).map((row) => row.get(this.targetKey()));\n\n return await sourceModel[getAccessor]({\n ...omit(findOptions, ['limit', 'offset']),\n where: {\n [this.targetKey()]: {\n [Op.in]: ids,\n },\n },\n transaction,\n });\n }\n\n return await sourceModel[getAccessor]({\n ...findOptions,\n transaction,\n });\n }\n\n async findAndCount(options?: FindAndCountOptions): Promise<[any[], number]> {\n const transaction = await this.getTransaction(options, false);\n return [\n await this.find({\n ...options,\n transaction,\n }),\n await this.count({\n ...options,\n transaction,\n }),\n ];\n }\n\n async count(options?: CountOptions) {\n const transaction = await this.getTransaction(options);\n\n const sourceModel = await this.getSourceModel(transaction);\n const queryOptions = this.buildQueryOptions(options);\n\n const count = await sourceModel[this.accessors().get]({\n where: queryOptions.where,\n include: queryOptions.include,\n includeIgnoreAttributes: false,\n attributes: [\n [\n Sequelize.fn(\n 'COUNT',\n Sequelize.fn('DISTINCT', Sequelize.col(`${this.targetModel.name}.${this.targetKey()}`)),\n ),\n 'count',\n ],\n ],\n raw: true,\n plain: true,\n transaction,\n });\n\n return parseInt(count.count);\n }\n\n async findOne(options?: FindOneOptions): Promise<any> {\n const transaction = await this.getTransaction(options, false);\n const rows = await this.find({ ...options, limit: 1, transaction });\n return rows.length == 1 ? rows[0] : null;\n }\n\n @transaction((args, transaction) => {\n return {\n tk: args[0],\n transaction,\n };\n })\n async remove(options: TargetKey | TargetKey[] | AssociatedOptions): Promise<void> {\n const transaction = await this.getTransaction(options);\n let handleKeys = options['tk'];\n\n if (!Array.isArray(handleKeys)) {\n handleKeys = [handleKeys];\n }\n\n const sourceModel = await this.getSourceModel(transaction);\n await sourceModel[this.accessors().removeMultiple](handleKeys, {\n transaction,\n });\n return;\n }\n\n @transaction()\n async update(options?: UpdateOptions): Promise<any> {\n const transaction = await this.getTransaction(options);\n\n const guard = UpdateGuard.fromOptions(this.targetModel, options);\n\n const values = guard.sanitize(options.values);\n\n const queryOptions = this.buildQueryOptions(options as any);\n\n const instances = await this.find(queryOptions);\n\n for (const instance of instances) {\n await updateModelByValues(instance, values, {\n ...options,\n sanitized: true,\n sourceModel: this.sourceInstance,\n transaction,\n });\n }\n\n for (const instance of instances) {\n if (options.hooks !== false) {\n await this.db.emitAsync(`${this.targetCollection.name}.afterUpdateWithAssociations`, instance, options);\n await this.db.emitAsync(`${this.targetCollection.name}.afterSaveWithAssociations`, instance, options);\n }\n }\n\n return instances;\n }\n\n async destroy(options?: TK | DestroyOptions): Promise<Boolean> {\n return false;\n }\n\n protected async destroyByFilter(filter: Filter, transaction?: Transaction) {\n const instances = await this.find({\n filter: filter,\n transaction,\n });\n\n return await this.destroy({\n filterByTk: instances.map((instance) => instance.get(this.targetCollection.filterTargetKey)),\n transaction,\n });\n }\n\n protected filterHasInclude(filter: Filter, options?: any) {\n const filterResult = this.parseFilter(filter, options);\n return filterResult.include && filterResult.include.length > 0;\n }\n\n protected accessors() {\n return <MultiAssociationAccessors>super.accessors();\n }\n}\n"]}
1
+ {"version":3,"file":"multiple-relation-repository.js","sourceRoot":"","sources":["../../src/relation-repository/multiple-relation-repository.ts"],"names":[],"mappings":"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","sourcesContent":["import { omit } from 'lodash';\nimport { MultiAssociationAccessors, Op, Sequelize, Transaction } from 'sequelize';\nimport {\n CommonFindOptions,\n CountOptions,\n DestroyOptions,\n Filter,\n FilterByTk,\n FindOptions,\n TargetKey,\n TK,\n TransactionAble,\n UpdateOptions\n} from '../repository';\nimport { updateModelByValues } from '../update-associations';\nimport { UpdateGuard } from '../update-guard';\nimport { RelationRepository, transaction } from './relation-repository';\n\nexport interface FindAndCountOptions extends CommonFindOptions {}\n\nexport interface FindOneOptions extends CommonFindOptions, FilterByTk {}\n\nexport interface AssociatedOptions extends TransactionAble {\n tk?: TK;\n}\n\nexport abstract class MultipleRelationRepository extends RelationRepository {\n extendFindOptions(findOptions) {\n return findOptions;\n }\n\n async find(options?: FindOptions): Promise<any> {\n const transaction = await this.getTransaction(options);\n\n const findOptions = {\n ...this.extendFindOptions(\n this.buildQueryOptions({\n ...options,\n }),\n ),\n subQuery: false,\n };\n\n const getAccessor = this.accessors().get;\n const sourceModel = await this.getSourceModel(transaction);\n\n if (findOptions.include && findOptions.include.length > 0) {\n const ids = (\n await sourceModel[getAccessor]({\n ...findOptions,\n includeIgnoreAttributes: false,\n attributes: [this.targetKey()],\n group: `${this.targetModel.name}.${this.targetKey()}`,\n transaction,\n })\n ).map((row) => row.get(this.targetKey()));\n\n return await sourceModel[getAccessor]({\n ...omit(findOptions, ['limit', 'offset']),\n where: {\n [this.targetKey()]: {\n [Op.in]: ids,\n },\n },\n transaction,\n });\n }\n\n return await sourceModel[getAccessor]({\n ...findOptions,\n transaction,\n });\n }\n\n async findAndCount(options?: FindAndCountOptions): Promise<[any[], number]> {\n const transaction = await this.getTransaction(options, false);\n return [\n await this.find({\n ...options,\n transaction,\n }),\n await this.count({\n ...options,\n transaction,\n }),\n ];\n }\n\n async count(options?: CountOptions) {\n const transaction = await this.getTransaction(options);\n\n const sourceModel = await this.getSourceModel(transaction);\n const queryOptions = this.buildQueryOptions(options);\n\n const count = await sourceModel[this.accessors().get]({\n where: queryOptions.where,\n include: queryOptions.include,\n includeIgnoreAttributes: false,\n attributes: [\n [\n Sequelize.fn(\n 'COUNT',\n Sequelize.fn('DISTINCT', Sequelize.col(`${this.targetModel.name}.${this.targetKey()}`)),\n ),\n 'count',\n ],\n ],\n raw: true,\n plain: true,\n transaction,\n });\n\n return parseInt(count.count);\n }\n\n async findOne(options?: FindOneOptions): Promise<any> {\n const transaction = await this.getTransaction(options, false);\n const rows = await this.find({ ...options, limit: 1, transaction });\n return rows.length == 1 ? rows[0] : null;\n }\n\n @transaction((args, transaction) => {\n return {\n tk: args[0],\n transaction,\n };\n })\n async remove(options: TargetKey | TargetKey[] | AssociatedOptions): Promise<void> {\n const transaction = await this.getTransaction(options);\n let handleKeys = options['tk'];\n\n if (!Array.isArray(handleKeys)) {\n handleKeys = [handleKeys];\n }\n\n const sourceModel = await this.getSourceModel(transaction);\n await sourceModel[this.accessors().removeMultiple](handleKeys, {\n transaction,\n });\n return;\n }\n\n @transaction()\n async update(options?: UpdateOptions): Promise<any> {\n const transaction = await this.getTransaction(options);\n\n const guard = UpdateGuard.fromOptions(this.targetModel, options);\n\n const values = guard.sanitize(options.values);\n\n const queryOptions = this.buildQueryOptions(options as any);\n\n const instances = await this.find({\n ...queryOptions,\n transaction,\n });\n\n for (const instance of instances) {\n await updateModelByValues(instance, values, {\n ...options,\n sanitized: true,\n sourceModel: this.sourceInstance,\n transaction,\n });\n }\n\n for (const instance of instances) {\n if (options.hooks !== false) {\n await this.db.emitAsync(`${this.targetCollection.name}.afterUpdateWithAssociations`, instance, {...options, transaction});\n await this.db.emitAsync(`${this.targetCollection.name}.afterSaveWithAssociations`, instance, {...options, transaction});\n }\n }\n\n return instances;\n }\n\n async destroy(options?: TK | DestroyOptions): Promise<Boolean> {\n return false;\n }\n\n protected async destroyByFilter(filter: Filter, transaction?: Transaction) {\n const instances = await this.find({\n filter: filter,\n transaction,\n });\n\n return await this.destroy({\n filterByTk: instances.map((instance) => instance.get(this.targetCollection.filterTargetKey)),\n transaction,\n });\n }\n\n protected filterHasInclude(filter: Filter, options?: any) {\n const filterResult = this.parseFilter(filter, options);\n return filterResult.include && filterResult.include.length > 0;\n }\n\n protected accessors() {\n return <MultiAssociationAccessors>super.accessors();\n }\n}\n"]}
@@ -19,7 +19,7 @@ export declare abstract class RelationRepository {
19
19
  targetKey(): any;
20
20
  protected accessors(): import("sequelize").SingleAssociationAccessors | import("sequelize").MultiAssociationAccessors;
21
21
  create(options?: CreateOptions): Promise<any>;
22
- getSourceModel(transaction?: any): Promise<Model<any, any>>;
22
+ getSourceModel(transaction?: Transaction): Promise<Model<any, any>>;
23
23
  protected buildQueryOptions(options: FindOptions): any;
24
24
  protected parseFilter(filter: Filter, options?: any): {
25
25
  where?: undefined;
@@ -44,13 +44,14 @@ class RelationRepository {
44
44
  const createAccessor = this.accessors().create;
45
45
  const guard = update_guard_1.UpdateGuard.fromOptions(this.targetModel, options);
46
46
  const values = options.values;
47
- const sourceModel = yield this.getSourceModel();
48
- const instance = yield sourceModel[createAccessor](guard.sanitize(options.values), options);
49
- yield (0, update_associations_1.updateAssociations)(instance, values, options);
47
+ const transaction = yield this.getTransaction(options);
48
+ const sourceModel = yield this.getSourceModel(transaction);
49
+ const instance = yield sourceModel[createAccessor](guard.sanitize(options.values), Object.assign(Object.assign({}, options), { transaction }));
50
+ yield (0, update_associations_1.updateAssociations)(instance, values, Object.assign(Object.assign({}, options), { transaction }));
50
51
  if (options.hooks !== false) {
51
- yield this.db.emitAsync(`${this.targetCollection.name}.afterCreateWithAssociations`, instance, options);
52
+ yield this.db.emitAsync(`${this.targetCollection.name}.afterCreateWithAssociations`, instance, Object.assign(Object.assign({}, options), { transaction }));
52
53
  const eventName = `${this.targetCollection.name}.afterSaveWithAssociations`;
53
- yield this.db.emitAsync(eventName, instance, options);
54
+ yield this.db.emitAsync(eventName, instance, Object.assign(Object.assign({}, options), { transaction }));
54
55
  }
55
56
  return instance;
56
57
  });
@@ -62,6 +63,7 @@ class RelationRepository {
62
63
  where: {
63
64
  [this.associationField.sourceKey]: this.sourceKeyValue,
64
65
  },
66
+ transaction,
65
67
  });
66
68
  }
67
69
  return this.sourceInstance;
@@ -1 +1 @@
1
- {"version":3,"file":"relation-repository.js","sourceRoot":"","sources":["../../src/relation-repository/relation-repository.ts"],"names":[],"mappings":"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","sourcesContent":["import lodash from 'lodash';\nimport { Association, BelongsTo, BelongsToMany, HasMany, HasOne, ModelCtor, Transaction } from 'sequelize';\nimport { Collection } from '../collection';\nimport Database from '../database';\nimport { RelationField } from '../fields/relation-field';\nimport FilterParser from '../filter-parser';\nimport { Model } from '../model';\nimport { OptionsParser } from '../options-parser';\nimport { CreateOptions, Filter, FindOptions } from '../repository';\nimport { transactionWrapperBuilder } from '../transaction-decorator';\nimport { updateAssociations } from '../update-associations';\nimport { UpdateGuard } from '../update-guard';\n\nexport const transaction = transactionWrapperBuilder(function () {\n return this.sourceCollection.model.sequelize.transaction();\n});\n\nexport abstract class RelationRepository {\n sourceCollection: Collection;\n association: Association;\n targetModel: ModelCtor<any>;\n targetCollection: Collection;\n associationName: string;\n associationField: RelationField;\n sourceKeyValue: string | number;\n sourceInstance: Model;\n db: Database;\n\n constructor(sourceCollection: Collection, association: string, sourceKeyValue: string | number) {\n this.db = sourceCollection.context.database;\n\n this.sourceCollection = sourceCollection;\n this.sourceKeyValue = sourceKeyValue;\n this.associationName = association;\n this.association = this.sourceCollection.model.associations[association];\n\n this.associationField = this.sourceCollection.getField(association);\n\n this.targetModel = this.association.target;\n this.targetCollection = this.sourceCollection.context.database.modelCollection.get(this.targetModel);\n }\n\n targetKey() {\n return this.associationField.targetKey;\n }\n\n protected accessors() {\n return (<BelongsTo | HasOne | HasMany | BelongsToMany>this.association).accessors;\n }\n\n async create(options?: CreateOptions): Promise<any> {\n const createAccessor = this.accessors().create;\n\n const guard = UpdateGuard.fromOptions(this.targetModel, options);\n const values = options.values;\n\n const sourceModel = await this.getSourceModel();\n\n const instance = await sourceModel[createAccessor](guard.sanitize(options.values), options);\n\n await updateAssociations(instance, values, options);\n\n if (options.hooks !== false) {\n await this.db.emitAsync(`${this.targetCollection.name}.afterCreateWithAssociations`, instance, options);\n const eventName = `${this.targetCollection.name}.afterSaveWithAssociations`;\n await this.db.emitAsync(eventName, instance, options);\n }\n\n return instance;\n }\n\n async getSourceModel(transaction?: any) {\n if (!this.sourceInstance) {\n this.sourceInstance = await this.sourceCollection.model.findOne({\n where: {\n [this.associationField.sourceKey]: this.sourceKeyValue,\n },\n });\n }\n\n return this.sourceInstance;\n }\n\n protected buildQueryOptions(options: FindOptions) {\n const parser = new OptionsParser(options, {\n collection: this.targetCollection,\n targetKey: this.targetKey(),\n });\n const params = parser.toSequelizeParams();\n return { ...options, ...params };\n }\n\n protected parseFilter(filter: Filter, options?: any) {\n const parser = new FilterParser(filter, {\n collection: this.targetCollection,\n app: {\n ctx: options?.context,\n },\n });\n return parser.toSequelizeParams();\n }\n\n protected async getTransaction(options: any, autoGen = false): Promise<Transaction | null> {\n if (lodash.isPlainObject(options) && options.transaction) {\n return options.transaction;\n }\n\n if (autoGen) {\n return await this.sourceCollection.model.sequelize.transaction();\n }\n\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"relation-repository.js","sourceRoot":"","sources":["../../src/relation-repository/relation-repository.ts"],"names":[],"mappings":"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","sourcesContent":["import lodash from 'lodash';\nimport { Association, BelongsTo, BelongsToMany, HasMany, HasOne, ModelCtor, Transaction } from 'sequelize';\nimport { Collection } from '../collection';\nimport Database from '../database';\nimport { RelationField } from '../fields/relation-field';\nimport FilterParser from '../filter-parser';\nimport { Model } from '../model';\nimport { OptionsParser } from '../options-parser';\nimport { CreateOptions, Filter, FindOptions } from '../repository';\nimport { transactionWrapperBuilder } from '../transaction-decorator';\nimport { updateAssociations } from '../update-associations';\nimport { UpdateGuard } from '../update-guard';\n\nexport const transaction = transactionWrapperBuilder(function () {\n return this.sourceCollection.model.sequelize.transaction();\n});\n\nexport abstract class RelationRepository {\n sourceCollection: Collection;\n association: Association;\n targetModel: ModelCtor<any>;\n targetCollection: Collection;\n associationName: string;\n associationField: RelationField;\n sourceKeyValue: string | number;\n sourceInstance: Model;\n db: Database;\n\n constructor(sourceCollection: Collection, association: string, sourceKeyValue: string | number) {\n this.db = sourceCollection.context.database;\n\n this.sourceCollection = sourceCollection;\n this.sourceKeyValue = sourceKeyValue;\n this.associationName = association;\n this.association = this.sourceCollection.model.associations[association];\n\n this.associationField = this.sourceCollection.getField(association);\n\n this.targetModel = this.association.target;\n this.targetCollection = this.sourceCollection.context.database.modelCollection.get(this.targetModel);\n }\n\n targetKey() {\n return this.associationField.targetKey;\n }\n\n protected accessors() {\n return (<BelongsTo | HasOne | HasMany | BelongsToMany>this.association).accessors;\n }\n\n async create(options?: CreateOptions): Promise<any> {\n const createAccessor = this.accessors().create;\n\n const guard = UpdateGuard.fromOptions(this.targetModel, options);\n const values = options.values;\n const transaction = await this.getTransaction(options);\n\n const sourceModel = await this.getSourceModel(transaction);\n\n const instance = await sourceModel[createAccessor](guard.sanitize(options.values), { ...options, transaction });\n\n await updateAssociations(instance, values, { ...options, transaction });\n\n if (options.hooks !== false) {\n await this.db.emitAsync(`${this.targetCollection.name}.afterCreateWithAssociations`, instance, {\n ...options,\n transaction,\n });\n const eventName = `${this.targetCollection.name}.afterSaveWithAssociations`;\n await this.db.emitAsync(eventName, instance, { ...options, transaction });\n }\n\n return instance;\n }\n\n async getSourceModel(transaction?: Transaction) {\n if (!this.sourceInstance) {\n this.sourceInstance = await this.sourceCollection.model.findOne({\n where: {\n [this.associationField.sourceKey]: this.sourceKeyValue,\n },\n transaction,\n });\n }\n\n return this.sourceInstance;\n }\n\n protected buildQueryOptions(options: FindOptions) {\n const parser = new OptionsParser(options, {\n collection: this.targetCollection,\n targetKey: this.targetKey(),\n });\n const params = parser.toSequelizeParams();\n return { ...options, ...params };\n }\n\n protected parseFilter(filter: Filter, options?: any) {\n const parser = new FilterParser(filter, {\n collection: this.targetCollection,\n app: {\n ctx: options?.context,\n },\n });\n return parser.toSequelizeParams();\n }\n\n protected async getTransaction(options: any, autoGen = false): Promise<Transaction | null> {\n if (lodash.isPlainObject(options) && options.transaction) {\n return options.transaction;\n }\n\n if (autoGen) {\n return await this.sourceCollection.model.sequelize.transaction();\n }\n\n return null;\n }\n}\n"]}
@@ -38,7 +38,7 @@ export interface FilterByTk {
38
38
  }
39
39
  export interface FindOptions extends SequelizeFindOptions, CommonFindOptions, FilterByTk {
40
40
  }
41
- export interface CommonFindOptions {
41
+ export interface CommonFindOptions extends TransactionAble {
42
42
  filter?: Filter;
43
43
  fields?: Fields;
44
44
  appends?: Appends;
@@ -1 +1 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"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","sourcesContent":["import lodash, { omit } from 'lodash';\nimport {\n Association,\n BulkCreateOptions,\n CreateOptions as SequelizeCreateOptions,\n DestroyOptions as SequelizeDestroyOptions,\n FindAndCountOptions as SequelizeAndCountOptions,\n FindOptions as SequelizeFindOptions,\n ModelCtor,\n Op,\n Transaction,\n UpdateOptions as SequelizeUpdateOptions\n} from 'sequelize';\nimport { Collection } from './collection';\nimport { Database } from './database';\nimport { RelationField } from './fields';\nimport FilterParser from './filter-parser';\nimport { Model } from './model';\nimport { OptionsParser } from './options-parser';\nimport { BelongsToManyRepository } from './relation-repository/belongs-to-many-repository';\nimport { BelongsToRepository } from './relation-repository/belongs-to-repository';\nimport { HasManyRepository } from './relation-repository/hasmany-repository';\nimport { HasOneRepository } from './relation-repository/hasone-repository';\nimport { RelationRepository } from './relation-repository/relation-repository';\nimport { transactionWrapperBuilder } from './transaction-decorator';\nimport { updateAssociations, updateModelByValues } from './update-associations';\nimport { UpdateGuard } from './update-guard';\n\nconst debug = require('debug')('noco-database');\n\nexport interface IRepository {}\n\ninterface CreateManyOptions extends BulkCreateOptions {\n records: Values[];\n}\n\nexport interface TransactionAble {\n transaction?: Transaction;\n}\n\nexport interface FilterAble {\n filter: Filter;\n}\n\nexport type TargetKey = string | number;\nexport type TK = TargetKey | TargetKey[];\n\nexport type Filter = any;\nexport type Appends = string[];\nexport type Except = string[];\nexport type Fields = string[];\nexport type Sort = string[] | string;\n\nexport type WhiteList = string[];\nexport type BlackList = string[];\nexport type AssociationKeysToBeUpdate = string[];\n\nexport type Values = any;\n\nexport interface CountOptions extends Omit<SequelizeCreateOptions, 'distinct' | 'where' | 'include'>, TransactionAble {\n fields?: Fields;\n filter?: Filter;\n}\n\nexport interface FilterByTk {\n filterByTk?: TargetKey;\n}\n\nexport interface FindOptions extends SequelizeFindOptions, CommonFindOptions, FilterByTk {}\n\nexport interface CommonFindOptions {\n filter?: Filter;\n fields?: Fields;\n appends?: Appends;\n except?: Except;\n sort?: Sort;\n context?: any;\n}\n\ninterface FindOneOptions extends FindOptions, CommonFindOptions {}\n\nexport interface DestroyOptions extends SequelizeDestroyOptions {\n filter?: Filter;\n filterByTk?: TargetKey | TargetKey[];\n truncate?: boolean;\n context?: any;\n}\n\ninterface FindAndCountOptions extends Omit<SequelizeAndCountOptions, 'where' | 'include' | 'order'> {\n // 数据过滤\n filter?: Filter;\n // 输出结果显示哪些字段\n fields?: Fields;\n // 输出结果不显示哪些字段\n except?: Except;\n // 附加字段,用于控制关系字段的输出\n appends?: Appends;\n // 排序,字段前面加上 “-” 表示降序\n sort?: Sort;\n}\n\nexport interface CreateOptions extends SequelizeCreateOptions {\n values?: Values;\n whitelist?: WhiteList;\n blacklist?: BlackList;\n updateAssociationValues?: AssociationKeysToBeUpdate;\n context?: any;\n}\n\nexport interface UpdateOptions extends Omit<SequelizeUpdateOptions, 'where'> {\n values: Values;\n filter?: Filter;\n filterByTk?: TargetKey;\n whitelist?: WhiteList;\n blacklist?: BlackList;\n updateAssociationValues?: AssociationKeysToBeUpdate;\n context?: any;\n}\n\ninterface RelatedQueryOptions {\n database: Database;\n field: RelationField;\n source: {\n idOrInstance: any;\n collection: Collection;\n };\n target: {\n association: Association & {\n accessors: any;\n };\n collection: Collection;\n };\n}\n\nconst transaction = transactionWrapperBuilder(function () {\n return (<Repository>this).collection.model.sequelize.transaction();\n});\n\nclass RelationRepositoryBuilder<R extends RelationRepository> {\n collection: Collection;\n associationName: string;\n association: Association;\n\n builderMap = {\n HasOne: HasOneRepository,\n BelongsTo: BelongsToRepository,\n BelongsToMany: BelongsToManyRepository,\n HasMany: HasManyRepository,\n };\n\n constructor(collection: Collection, associationName: string) {\n this.collection = collection;\n this.associationName = associationName;\n this.association = this.collection.model.associations[this.associationName];\n }\n\n protected builder() {\n return this.builderMap;\n }\n\n of(id: string | number): R {\n const klass = this.builder()[this.association.associationType];\n return new klass(this.collection, this.associationName, id);\n }\n}\n\nexport class Repository<TModelAttributes extends {} = any, TCreationAttributes extends {} = TModelAttributes>\n implements IRepository\n{\n database: Database;\n collection: Collection;\n model: ModelCtor<Model>;\n\n constructor(collection: Collection) {\n this.database = collection.context.database;\n this.collection = collection;\n this.model = collection.model;\n }\n\n /**\n * return count by filter\n */\n async count(countOptions?: CountOptions): Promise<number> {\n let options = countOptions ? lodash.clone(countOptions) : {};\n\n const transaction = await this.getTransaction(options);\n\n if (countOptions?.filter) {\n options = {\n ...options,\n ...this.parseFilter(countOptions.filter, countOptions),\n };\n }\n\n const count = await this.collection.model.count({\n ...options,\n distinct: true,\n transaction,\n });\n\n return count;\n }\n\n /**\n * find\n * @param options\n */\n async find(options?: FindOptions) {\n const model = this.collection.model;\n const transaction = await this.getTransaction(options);\n\n const opts = {\n subQuery: false,\n ...this.buildQueryOptions(options),\n };\n\n if (opts.include && opts.include.length > 0) {\n // @ts-ignore\n const primaryKeyField = model.primaryKeyField || model.primaryKeyAttribute;\n\n const ids = (\n await model.findAll({\n ...opts,\n includeIgnoreAttributes: false,\n attributes: [primaryKeyField],\n group: `${model.name}.${primaryKeyField}`,\n transaction,\n })\n ).map((row) => row.get(primaryKeyField));\n\n const where = {\n [primaryKeyField]: {\n [Op.in]: ids,\n },\n };\n\n return await model.findAll({\n ...omit(opts, ['limit', 'offset']),\n where,\n transaction,\n });\n }\n\n return await model.findAll({\n ...opts,\n transaction,\n });\n }\n\n /**\n * find and count\n * @param options\n */\n async findAndCount(options?: FindAndCountOptions): Promise<[Model[], number]> {\n const transaction = await this.getTransaction(options);\n options = {\n ...options,\n transaction,\n };\n\n return [await this.find(options), await this.count(options)];\n }\n\n /**\n * Find By Id\n *\n */\n findById(id: string | number) {\n return this.collection.model.findByPk(id);\n }\n\n /**\n * Find one record from database\n *\n * @param options\n */\n async findOne(options?: FindOneOptions) {\n const transaction = await this.getTransaction(options);\n\n const rows = await this.find({ ...options, limit: 1, transaction });\n return rows.length == 1 ? rows[0] : null;\n }\n\n /**\n * Save instance to database\n *\n * @param values\n * @param options\n */\n @transaction()\n async create<M extends Model>(options: CreateOptions): Promise<M> {\n const transaction = await this.getTransaction(options);\n\n const guard = UpdateGuard.fromOptions(this.model, { ...options, action: 'create' });\n const values = guard.sanitize(options.values || {});\n\n const instance = await this.model.create<any>(values, {\n ...options,\n transaction,\n });\n\n if (!instance) {\n return;\n }\n\n await updateAssociations(instance, values, {\n ...options,\n transaction,\n });\n\n if (options.hooks !== false) {\n await this.database.emitAsync(`${this.collection.name}.afterCreateWithAssociations`, instance, options);\n await this.database.emitAsync(`${this.collection.name}.afterSaveWithAssociations`, instance, options);\n }\n\n return instance;\n }\n\n /**\n * Save Many instances to database\n *\n * @param records\n * @param options\n */\n @transaction()\n async createMany(options: CreateManyOptions) {\n const transaction = await this.getTransaction(options);\n const { records } = options;\n const instances = [];\n for (const values of records) {\n const instance = await this.create({ values, transaction });\n instances.push(instance);\n }\n return instances;\n }\n\n /**\n * Update model value\n *\n * @param values\n * @param options\n */\n @transaction()\n async update(options: UpdateOptions) {\n const transaction = await this.getTransaction(options);\n const guard = UpdateGuard.fromOptions(this.model, options);\n\n const values = guard.sanitize(options.values);\n\n const queryOptions = this.buildQueryOptions(options);\n\n const instances = await this.find({\n ...queryOptions,\n transaction,\n });\n\n for (const instance of instances) {\n await updateModelByValues(instance, values, {\n ...options,\n sanitized: true,\n transaction,\n });\n }\n\n if (options.hooks !== false) {\n for (const instance of instances) {\n await this.database.emitAsync(`${this.collection.name}.afterUpdateWithAssociations`, instance, options);\n await this.database.emitAsync(`${this.collection.name}.afterSaveWithAssociations`, instance, options);\n }\n }\n\n return instances;\n }\n\n @transaction((args, transaction) => {\n return {\n filterByTk: args[0],\n transaction,\n };\n })\n async destroy(options?: TargetKey | TargetKey[] | DestroyOptions) {\n const transaction = await this.getTransaction(options);\n\n const modelFilterKey = this.collection.filterTargetKey;\n\n options = <DestroyOptions>options;\n\n if (options['individualHooks'] === undefined) {\n options['individualHooks'] = true;\n }\n\n const filterByTk: TargetKey[] | undefined =\n options.filterByTk && !lodash.isArray(options.filterByTk)\n ? [options.filterByTk]\n : (options.filterByTk as TargetKey[] | undefined);\n\n if (filterByTk && !options.filter) {\n return await this.model.destroy({\n ...options,\n where: {\n [modelFilterKey]: {\n [Op.in]: filterByTk,\n },\n },\n transaction,\n });\n }\n\n if (options.filter) {\n let pks = (\n await this.find({\n filter: options.filter,\n transaction,\n })\n ).map((instance) => instance.get(modelFilterKey) as TargetKey);\n\n if (filterByTk) {\n pks = lodash.intersection(\n pks.map((i) => `${i}`),\n filterByTk.map((i) => `${i}`),\n );\n }\n\n return await this.destroy({\n ...lodash.omit(options, 'filter'),\n filterByTk: pks,\n transaction,\n });\n }\n\n if (options.truncate) {\n return await this.model.destroy({\n ...options,\n truncate: true,\n transaction,\n });\n }\n }\n\n /**\n * @param association target association\n */\n relation<R extends RelationRepository>(association: string): RelationRepositoryBuilder<R> {\n return new RelationRepositoryBuilder<R>(this.collection, association);\n }\n\n protected buildQueryOptions(options: any) {\n const parser = new OptionsParser(options, {\n collection: this.collection,\n });\n\n const params = parser.toSequelizeParams();\n debug('sequelize query params %o', params);\n return { where: {}, ...options, ...params };\n }\n\n protected parseFilter(filter: Filter, options?: any) {\n const parser = new FilterParser(filter, {\n collection: this.collection,\n app: {\n ctx: options?.context,\n },\n });\n return parser.toSequelizeParams();\n }\n\n protected async getTransaction(options: any, autoGen = false) {\n if (lodash.isPlainObject(options) && options.transaction) {\n return options.transaction;\n }\n\n if (autoGen) {\n return await this.model.sequelize.transaction();\n }\n\n return null;\n }\n}\n"]}
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":"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","sourcesContent":["import lodash, { omit } from 'lodash';\nimport {\n Association,\n BulkCreateOptions,\n CreateOptions as SequelizeCreateOptions,\n DestroyOptions as SequelizeDestroyOptions,\n FindAndCountOptions as SequelizeAndCountOptions,\n FindOptions as SequelizeFindOptions,\n ModelCtor,\n Op,\n Transaction,\n UpdateOptions as SequelizeUpdateOptions\n} from 'sequelize';\nimport { Collection } from './collection';\nimport { Database } from './database';\nimport { RelationField } from './fields';\nimport FilterParser from './filter-parser';\nimport { Model } from './model';\nimport { OptionsParser } from './options-parser';\nimport { BelongsToManyRepository } from './relation-repository/belongs-to-many-repository';\nimport { BelongsToRepository } from './relation-repository/belongs-to-repository';\nimport { HasManyRepository } from './relation-repository/hasmany-repository';\nimport { HasOneRepository } from './relation-repository/hasone-repository';\nimport { RelationRepository } from './relation-repository/relation-repository';\nimport { transactionWrapperBuilder } from './transaction-decorator';\nimport { updateAssociations, updateModelByValues } from './update-associations';\nimport { UpdateGuard } from './update-guard';\n\nconst debug = require('debug')('noco-database');\n\nexport interface IRepository {}\n\ninterface CreateManyOptions extends BulkCreateOptions {\n records: Values[];\n}\n\nexport interface TransactionAble {\n transaction?: Transaction;\n}\n\nexport interface FilterAble {\n filter: Filter;\n}\n\nexport type TargetKey = string | number;\nexport type TK = TargetKey | TargetKey[];\n\nexport type Filter = any;\nexport type Appends = string[];\nexport type Except = string[];\nexport type Fields = string[];\nexport type Sort = string[] | string;\n\nexport type WhiteList = string[];\nexport type BlackList = string[];\nexport type AssociationKeysToBeUpdate = string[];\n\nexport type Values = any;\n\nexport interface CountOptions extends Omit<SequelizeCreateOptions, 'distinct' | 'where' | 'include'>, TransactionAble {\n fields?: Fields;\n filter?: Filter;\n}\n\nexport interface FilterByTk {\n filterByTk?: TargetKey;\n}\n\nexport interface FindOptions extends SequelizeFindOptions, CommonFindOptions, FilterByTk {}\n\nexport interface CommonFindOptions extends TransactionAble {\n filter?: Filter;\n fields?: Fields;\n appends?: Appends;\n except?: Except;\n sort?: Sort;\n context?: any;\n}\n\ninterface FindOneOptions extends FindOptions, CommonFindOptions {}\n\nexport interface DestroyOptions extends SequelizeDestroyOptions {\n filter?: Filter;\n filterByTk?: TargetKey | TargetKey[];\n truncate?: boolean;\n context?: any;\n}\n\ninterface FindAndCountOptions extends Omit<SequelizeAndCountOptions, 'where' | 'include' | 'order'> {\n // 数据过滤\n filter?: Filter;\n // 输出结果显示哪些字段\n fields?: Fields;\n // 输出结果不显示哪些字段\n except?: Except;\n // 附加字段,用于控制关系字段的输出\n appends?: Appends;\n // 排序,字段前面加上 “-” 表示降序\n sort?: Sort;\n}\n\nexport interface CreateOptions extends SequelizeCreateOptions {\n values?: Values;\n whitelist?: WhiteList;\n blacklist?: BlackList;\n updateAssociationValues?: AssociationKeysToBeUpdate;\n context?: any;\n}\n\nexport interface UpdateOptions extends Omit<SequelizeUpdateOptions, 'where'> {\n values: Values;\n filter?: Filter;\n filterByTk?: TargetKey;\n whitelist?: WhiteList;\n blacklist?: BlackList;\n updateAssociationValues?: AssociationKeysToBeUpdate;\n context?: any;\n}\n\ninterface RelatedQueryOptions {\n database: Database;\n field: RelationField;\n source: {\n idOrInstance: any;\n collection: Collection;\n };\n target: {\n association: Association & {\n accessors: any;\n };\n collection: Collection;\n };\n}\n\nconst transaction = transactionWrapperBuilder(function () {\n return (<Repository>this).collection.model.sequelize.transaction();\n});\n\nclass RelationRepositoryBuilder<R extends RelationRepository> {\n collection: Collection;\n associationName: string;\n association: Association;\n\n builderMap = {\n HasOne: HasOneRepository,\n BelongsTo: BelongsToRepository,\n BelongsToMany: BelongsToManyRepository,\n HasMany: HasManyRepository,\n };\n\n constructor(collection: Collection, associationName: string) {\n this.collection = collection;\n this.associationName = associationName;\n this.association = this.collection.model.associations[this.associationName];\n }\n\n protected builder() {\n return this.builderMap;\n }\n\n of(id: string | number): R {\n const klass = this.builder()[this.association.associationType];\n return new klass(this.collection, this.associationName, id);\n }\n}\n\nexport class Repository<TModelAttributes extends {} = any, TCreationAttributes extends {} = TModelAttributes>\n implements IRepository\n{\n database: Database;\n collection: Collection;\n model: ModelCtor<Model>;\n\n constructor(collection: Collection) {\n this.database = collection.context.database;\n this.collection = collection;\n this.model = collection.model;\n }\n\n /**\n * return count by filter\n */\n async count(countOptions?: CountOptions): Promise<number> {\n let options = countOptions ? lodash.clone(countOptions) : {};\n\n const transaction = await this.getTransaction(options);\n\n if (countOptions?.filter) {\n options = {\n ...options,\n ...this.parseFilter(countOptions.filter, countOptions),\n };\n }\n\n const count = await this.collection.model.count({\n ...options,\n distinct: true,\n transaction,\n });\n\n return count;\n }\n\n /**\n * find\n * @param options\n */\n async find(options?: FindOptions) {\n const model = this.collection.model;\n const transaction = await this.getTransaction(options);\n\n const opts = {\n subQuery: false,\n ...this.buildQueryOptions(options),\n };\n\n if (opts.include && opts.include.length > 0) {\n // @ts-ignore\n const primaryKeyField = model.primaryKeyField || model.primaryKeyAttribute;\n\n const ids = (\n await model.findAll({\n ...opts,\n includeIgnoreAttributes: false,\n attributes: [primaryKeyField],\n group: `${model.name}.${primaryKeyField}`,\n transaction,\n })\n ).map((row) => row.get(primaryKeyField));\n\n const where = {\n [primaryKeyField]: {\n [Op.in]: ids,\n },\n };\n\n return await model.findAll({\n ...omit(opts, ['limit', 'offset']),\n where,\n transaction,\n });\n }\n\n return await model.findAll({\n ...opts,\n transaction,\n });\n }\n\n /**\n * find and count\n * @param options\n */\n async findAndCount(options?: FindAndCountOptions): Promise<[Model[], number]> {\n const transaction = await this.getTransaction(options);\n options = {\n ...options,\n transaction,\n };\n\n return [await this.find(options), await this.count(options)];\n }\n\n /**\n * Find By Id\n *\n */\n findById(id: string | number) {\n return this.collection.model.findByPk(id);\n }\n\n /**\n * Find one record from database\n *\n * @param options\n */\n async findOne(options?: FindOneOptions) {\n const transaction = await this.getTransaction(options);\n\n const rows = await this.find({ ...options, limit: 1, transaction });\n return rows.length == 1 ? rows[0] : null;\n }\n\n /**\n * Save instance to database\n *\n * @param values\n * @param options\n */\n @transaction()\n async create<M extends Model>(options: CreateOptions): Promise<M> {\n const transaction = await this.getTransaction(options);\n\n const guard = UpdateGuard.fromOptions(this.model, { ...options, action: 'create' });\n const values = guard.sanitize(options.values || {});\n\n const instance = await this.model.create<any>(values, {\n ...options,\n transaction,\n });\n\n if (!instance) {\n return;\n }\n\n await updateAssociations(instance, values, {\n ...options,\n transaction,\n });\n\n if (options.hooks !== false) {\n await this.database.emitAsync(`${this.collection.name}.afterCreateWithAssociations`, instance, options);\n await this.database.emitAsync(`${this.collection.name}.afterSaveWithAssociations`, instance, options);\n }\n\n return instance;\n }\n\n /**\n * Save Many instances to database\n *\n * @param records\n * @param options\n */\n @transaction()\n async createMany(options: CreateManyOptions) {\n const transaction = await this.getTransaction(options);\n const { records } = options;\n const instances = [];\n for (const values of records) {\n const instance = await this.create({ values, transaction });\n instances.push(instance);\n }\n return instances;\n }\n\n /**\n * Update model value\n *\n * @param values\n * @param options\n */\n @transaction()\n async update(options: UpdateOptions) {\n const transaction = await this.getTransaction(options);\n const guard = UpdateGuard.fromOptions(this.model, options);\n\n const values = guard.sanitize(options.values);\n\n const queryOptions = this.buildQueryOptions(options);\n\n const instances = await this.find({\n ...queryOptions,\n transaction,\n });\n\n for (const instance of instances) {\n await updateModelByValues(instance, values, {\n ...options,\n sanitized: true,\n transaction,\n });\n }\n\n if (options.hooks !== false) {\n for (const instance of instances) {\n await this.database.emitAsync(`${this.collection.name}.afterUpdateWithAssociations`, instance, options);\n await this.database.emitAsync(`${this.collection.name}.afterSaveWithAssociations`, instance, options);\n }\n }\n\n return instances;\n }\n\n @transaction((args, transaction) => {\n return {\n filterByTk: args[0],\n transaction,\n };\n })\n async destroy(options?: TargetKey | TargetKey[] | DestroyOptions) {\n const transaction = await this.getTransaction(options);\n\n const modelFilterKey = this.collection.filterTargetKey;\n\n options = <DestroyOptions>options;\n\n if (options['individualHooks'] === undefined) {\n options['individualHooks'] = true;\n }\n\n const filterByTk: TargetKey[] | undefined =\n options.filterByTk && !lodash.isArray(options.filterByTk)\n ? [options.filterByTk]\n : (options.filterByTk as TargetKey[] | undefined);\n\n if (filterByTk && !options.filter) {\n return await this.model.destroy({\n ...options,\n where: {\n [modelFilterKey]: {\n [Op.in]: filterByTk,\n },\n },\n transaction,\n });\n }\n\n if (options.filter) {\n let pks = (\n await this.find({\n filter: options.filter,\n transaction,\n })\n ).map((instance) => instance.get(modelFilterKey) as TargetKey);\n\n if (filterByTk) {\n pks = lodash.intersection(\n pks.map((i) => `${i}`),\n filterByTk.map((i) => `${i}`),\n );\n }\n\n return await this.destroy({\n ...lodash.omit(options, 'filter'),\n filterByTk: pks,\n transaction,\n });\n }\n\n if (options.truncate) {\n return await this.model.destroy({\n ...options,\n truncate: true,\n transaction,\n });\n }\n }\n\n /**\n * @param association target association\n */\n relation<R extends RelationRepository>(association: string): RelationRepositoryBuilder<R> {\n return new RelationRepositoryBuilder<R>(this.collection, association);\n }\n\n protected buildQueryOptions(options: any) {\n const parser = new OptionsParser(options, {\n collection: this.collection,\n });\n\n const params = parser.toSequelizeParams();\n debug('sequelize query params %o', params);\n return { where: {}, ...options, ...params };\n }\n\n protected parseFilter(filter: Filter, options?: any) {\n const parser = new FilterParser(filter, {\n collection: this.collection,\n app: {\n ctx: options?.context,\n },\n });\n return parser.toSequelizeParams();\n }\n\n protected async getTransaction(options: any, autoGen = false) {\n if (lodash.isPlainObject(options) && options.transaction) {\n return options.transaction;\n }\n\n if (autoGen) {\n return await this.model.sequelize.transaction();\n }\n\n return null;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocobase/database",
3
- "version": "0.7.0-alpha.31",
3
+ "version": "0.7.0-alpha.34",
4
4
  "description": "",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./lib/index.d.ts",
@@ -17,7 +17,7 @@
17
17
  "build:esm": "tsc --project tsconfig.build.json --module es2015 --outDir esm"
18
18
  },
19
19
  "dependencies": {
20
- "@nocobase/utils": "0.7.0-alpha.31",
20
+ "@nocobase/utils": "0.7.0-alpha.34",
21
21
  "async-mutex": "^0.3.2",
22
22
  "deepmerge": "^4.2.2",
23
23
  "flat": "^5.0.2",
@@ -29,5 +29,5 @@
29
29
  "url": "git+https://github.com/nocobase/nocobase.git",
30
30
  "directory": "packages/database"
31
31
  },
32
- "gitHead": "109f785637762d6bd85b1b18d75a7cfdedac383e"
32
+ "gitHead": "48b2b4bc7bbc39533e461d34d7f026a4ad1a9b5c"
33
33
  }
@@ -0,0 +1,33 @@
1
+ import { mockDatabase } from '../index';
2
+ import Database from '../../database';
3
+
4
+ describe('ne operator', () => {
5
+ let db: Database;
6
+ let Test;
7
+ beforeEach(async () => {
8
+ db = mockDatabase({});
9
+
10
+ Test = db.collection({
11
+ name: 'tests',
12
+ fields: [{ type: 'string', name: 'name' }],
13
+ });
14
+
15
+ await db.sync();
16
+ });
17
+
18
+ afterEach(async () => {
19
+ await db.close();
20
+ });
21
+
22
+ it('should notIn with null', async () => {
23
+ await db.getRepository('tests').create({});
24
+
25
+ const results = await db.getRepository('tests').count({
26
+ filter: {
27
+ 'name.$notIn': ['123'],
28
+ },
29
+ });
30
+
31
+ expect(results).toEqual(1);
32
+ });
33
+ });
@@ -81,6 +81,7 @@ describe('option parser', () => {
81
81
  ],
82
82
  });
83
83
  });
84
+
84
85
  test('with sort option', () => {
85
86
  let options: any = {
86
87
  sort: ['id'],
@@ -182,4 +183,23 @@ describe('option parser', () => {
182
183
 
183
184
  expect(params['include'][0]['attributes']['exclude']).toContain('id');
184
185
  });
186
+
187
+ test('option parser with multiple association', () => {
188
+ // fields with association field
189
+ const options = {
190
+ appends: ['user', 'comments.id', 'tags.id'],
191
+ };
192
+
193
+ const parser = new OptionsParser(options, {
194
+ collection: Post,
195
+ });
196
+
197
+ const params = parser.toSequelizeParams();
198
+ expect(params.include.length).toBe(3);
199
+ expect(params.include[0].association).toBe('user');
200
+ expect(params.include[1].association).toBe('comments');
201
+ expect(params.include[1].attributes).toEqual(['id']);
202
+ expect(params.include[2].association).toBe('tags');
203
+ expect(params.include[2].attributes).toEqual(['id']);
204
+ });
185
205
  });
@@ -5,4 +5,5 @@ export default {
5
5
  ...require('./empty').default,
6
6
  ...require('./string').default,
7
7
  ...require('./ne').default,
8
+ ...require('./notIn').default,
8
9
  };
@@ -0,0 +1,12 @@
1
+ import { Op } from 'sequelize';
2
+
3
+ export default {
4
+ $notIn(val, ctx) {
5
+ return {
6
+ [Op.or]: {
7
+ [Op.notIn]: val,
8
+ [Op.is]: null,
9
+ },
10
+ };
11
+ },
12
+ };
@@ -230,7 +230,7 @@ export class OptionsParser {
230
230
  association: appendAssociation,
231
231
  });
232
232
 
233
- existIncludeIndex = 0;
233
+ existIncludeIndex = queryParams['include'].length - 1;
234
234
  }
235
235
 
236
236
  // end appends
@@ -150,7 +150,10 @@ export abstract class MultipleRelationRepository extends RelationRepository {
150
150
 
151
151
  const queryOptions = this.buildQueryOptions(options as any);
152
152
 
153
- const instances = await this.find(queryOptions);
153
+ const instances = await this.find({
154
+ ...queryOptions,
155
+ transaction,
156
+ });
154
157
 
155
158
  for (const instance of instances) {
156
159
  await updateModelByValues(instance, values, {
@@ -163,8 +166,8 @@ export abstract class MultipleRelationRepository extends RelationRepository {
163
166
 
164
167
  for (const instance of instances) {
165
168
  if (options.hooks !== false) {
166
- await this.db.emitAsync(`${this.targetCollection.name}.afterUpdateWithAssociations`, instance, options);
167
- await this.db.emitAsync(`${this.targetCollection.name}.afterSaveWithAssociations`, instance, options);
169
+ await this.db.emitAsync(`${this.targetCollection.name}.afterUpdateWithAssociations`, instance, {...options, transaction});
170
+ await this.db.emitAsync(`${this.targetCollection.name}.afterSaveWithAssociations`, instance, {...options, transaction});
168
171
  }
169
172
  }
170
173
 
@@ -53,28 +53,33 @@ export abstract class RelationRepository {
53
53
 
54
54
  const guard = UpdateGuard.fromOptions(this.targetModel, options);
55
55
  const values = options.values;
56
+ const transaction = await this.getTransaction(options);
56
57
 
57
- const sourceModel = await this.getSourceModel();
58
+ const sourceModel = await this.getSourceModel(transaction);
58
59
 
59
- const instance = await sourceModel[createAccessor](guard.sanitize(options.values), options);
60
+ const instance = await sourceModel[createAccessor](guard.sanitize(options.values), { ...options, transaction });
60
61
 
61
- await updateAssociations(instance, values, options);
62
+ await updateAssociations(instance, values, { ...options, transaction });
62
63
 
63
64
  if (options.hooks !== false) {
64
- await this.db.emitAsync(`${this.targetCollection.name}.afterCreateWithAssociations`, instance, options);
65
+ await this.db.emitAsync(`${this.targetCollection.name}.afterCreateWithAssociations`, instance, {
66
+ ...options,
67
+ transaction,
68
+ });
65
69
  const eventName = `${this.targetCollection.name}.afterSaveWithAssociations`;
66
- await this.db.emitAsync(eventName, instance, options);
70
+ await this.db.emitAsync(eventName, instance, { ...options, transaction });
67
71
  }
68
72
 
69
73
  return instance;
70
74
  }
71
75
 
72
- async getSourceModel(transaction?: any) {
76
+ async getSourceModel(transaction?: Transaction) {
73
77
  if (!this.sourceInstance) {
74
78
  this.sourceInstance = await this.sourceCollection.model.findOne({
75
79
  where: {
76
80
  [this.associationField.sourceKey]: this.sourceKeyValue,
77
81
  },
82
+ transaction,
78
83
  });
79
84
  }
80
85
 
package/src/repository.ts CHANGED
@@ -68,7 +68,7 @@ export interface FilterByTk {
68
68
 
69
69
  export interface FindOptions extends SequelizeFindOptions, CommonFindOptions, FilterByTk {}
70
70
 
71
- export interface CommonFindOptions {
71
+ export interface CommonFindOptions extends TransactionAble {
72
72
  filter?: Filter;
73
73
  fields?: Fields;
74
74
  appends?: Appends;