@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.
- package/esm/operators/index.js +1 -1
- package/esm/operators/index.js.map +1 -1
- package/esm/operators/notIn.d.ts +10 -0
- package/esm/operators/notIn.js +12 -0
- package/esm/operators/notIn.js.map +1 -0
- package/esm/options-parser.js +1 -1
- package/esm/options-parser.js.map +1 -1
- package/esm/relation-repository/multiple-relation-repository.js +3 -3
- package/esm/relation-repository/multiple-relation-repository.js.map +1 -1
- package/esm/relation-repository/relation-repository.d.ts +1 -1
- package/esm/relation-repository/relation-repository.js +7 -5
- package/esm/relation-repository/relation-repository.js.map +1 -1
- package/esm/repository.d.ts +1 -1
- package/esm/repository.js.map +1 -1
- package/lib/operators/index.js +1 -1
- package/lib/operators/index.js.map +1 -1
- package/lib/operators/notIn.d.ts +10 -0
- package/lib/operators/notIn.js +14 -0
- package/lib/operators/notIn.js.map +1 -0
- package/lib/options-parser.js +1 -1
- package/lib/options-parser.js.map +1 -1
- package/lib/relation-repository/multiple-relation-repository.js +3 -3
- package/lib/relation-repository/multiple-relation-repository.js.map +1 -1
- package/lib/relation-repository/relation-repository.d.ts +1 -1
- package/lib/relation-repository/relation-repository.js +7 -5
- package/lib/relation-repository/relation-repository.js.map +1 -1
- package/lib/repository.d.ts +1 -1
- package/lib/repository.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/operator/notIn.test.ts +33 -0
- package/src/__tests__/option-parser.test.ts +20 -0
- package/src/operators/index.ts +1 -0
- package/src/operators/notIn.ts +12 -0
- package/src/options-parser.ts +1 -1
- package/src/relation-repository/multiple-relation-repository.ts +6 -3
- package/src/relation-repository/relation-repository.ts +11 -6
- package/src/repository.ts +1 -1
package/esm/operators/index.js
CHANGED
|
@@ -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,
|
|
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 @@
|
|
|
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"]}
|
package/esm/options-parser.js
CHANGED
|
@@ -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?:
|
|
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
|
|
42
|
-
const
|
|
43
|
-
yield
|
|
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":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAK5B,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,CAAC,MAAM,WAAW,GAAG,yBAAyB,CAAC;IACnD,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEH,MAAM,OAAgB,kBAAkB;IAWtC,YAAY,gBAA4B,EAAE,WAAmB,EAAE,cAA+B;QAC5F,IAAI,CAAC,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC;QAE5C,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAEzE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAEpE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAC3C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACvG,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;IACzC,CAAC;IAES,SAAS;QACjB,OAAsD,IAAI,CAAC,WAAY,CAAC,SAAS,CAAC;IACpF,CAAC;IAEK,MAAM,CAAC,OAAuB;;YAClC,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC;YAE/C,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACjE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
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"]}
|
package/esm/repository.d.ts
CHANGED
|
@@ -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;
|
package/esm/repository.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../src/repository.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,OAAO,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAQL,EAAE,EAGH,MAAM,WAAW,CAAC;AAInB,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kDAAkD,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAE3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC;AA0GhD,MAAM,WAAW,GAAG,yBAAyB,CAAC;IAC5C,OAAoB,IAAK,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;AACrE,CAAC,CAAC,CAAC;AAEH,MAAM,yBAAyB;IAY7B,YAAY,UAAsB,EAAE,eAAuB;QAP3D,eAAU,GAAG;YACX,MAAM,EAAE,gBAAgB;YACxB,SAAS,EAAE,mBAAmB;YAC9B,aAAa,EAAE,uBAAuB;YACtC,OAAO,EAAE,iBAAiB;SAC3B,CAAC;QAGA,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC9E,CAAC;IAES,OAAO;QACf,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,EAAE,CAAC,EAAmB;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;QAC/D,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;CACF;AAED,MAAM,OAAO,UAAU;IAOrB,YAAY,UAAsB;QAChC,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC5C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;IAChC,CAAC;IAED;;OAEG;IACG,KAAK,CAAC,YAA2B;;YACrC,IAAI,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAE7D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAEvD,IAAI,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,EAAE;gBACxB,OAAO,mCACF,OAAO,GACP,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,CACvD,CAAC;aACH;YAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,iCAC1C,OAAO,KACV,QAAQ,EAAE,IAAI,EACd,WAAW,IACX,CAAC;YAEH,OAAO,KAAK,CAAC;QACf,CAAC;KAAA;IAED;;;OAGG;IACG,IAAI,CAAC,OAAqB;;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YACpC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAEvD,MAAM,IAAI,mBACR,QAAQ,EAAE,KAAK,IACZ,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CACnC,CAAC;YAEF,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC3C,aAAa;gBACb,MAAM,eAAe,GAAG,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,mBAAmB,CAAC;gBAE3E,MAAM,GAAG,GAAG,CACV,MAAM,KAAK,CAAC,OAAO,iCACd,IAAI,KACP,uBAAuB,EAAE,KAAK,EAC9B,UAAU,EAAE,CAAC,eAAe,CAAC,EAC7B,KAAK,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,eAAe,EAAE,EACzC,WAAW,IACX,CACH,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;gBAEzC,MAAM,KAAK,GAAG;oBACZ,CAAC,eAAe,CAAC,EAAE;wBACjB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG;qBACb;iBACF,CAAC;gBAEF,OAAO,MAAM,KAAK,CAAC,OAAO,iCACrB,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,KAClC,KAAK;oBACL,WAAW,IACX,CAAC;aACJ;YAED,OAAO,MAAM,KAAK,CAAC,OAAO,iCACrB,IAAI,KACP,WAAW,IACX,CAAC;QACL,CAAC;KAAA;IAED;;;OAGG;IACG,YAAY,CAAC,OAA6B;;YAC9C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YACvD,OAAO,mCACF,OAAO,KACV,WAAW,GACZ,CAAC;YAEF,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/D,CAAC;KAAA;IAED;;;OAGG;IACH,QAAQ,CAAC,EAAmB;QAC1B,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACG,OAAO,CAAC,OAAwB;;YACpC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAEvD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,iCAAM,OAAO,KAAE,KAAK,EAAE,CAAC,EAAE,WAAW,IAAG,CAAC;YACpE,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3C,CAAC;KAAA;IAED;;;;;OAKG;IAEG,MAAM,CAAkB,OAAsB;;YAClD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAEvD,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,kCAAO,OAAO,KAAE,MAAM,EAAE,QAAQ,IAAG,CAAC;YACpF,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YAEpD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAM,MAAM,kCAC/C,OAAO,KACV,WAAW,IACX,CAAC;YAEH,IAAI,CAAC,QAAQ,EAAE;gBACb,OAAO;aACR;YAED,MAAM,kBAAkB,CAAC,QAAQ,EAAE,MAAM,kCACpC,OAAO,KACV,WAAW,IACX,CAAC;YAEH,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE;gBAC3B,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,8BAA8B,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACxG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,4BAA4B,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;aACvG;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;KAAA;IAED;;;;;OAKG;IAEG,UAAU,CAAC,OAA0B;;YACzC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YACvD,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;YAC5B,MAAM,SAAS,GAAG,EAAE,CAAC;YACrB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;gBAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC5D,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;aAC1B;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;KAAA;IAED;;;;;OAKG;IAEG,MAAM,CAAC,OAAsB;;YACjC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAE3D,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAE9C,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAErD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,iCAC5B,YAAY,KACf,WAAW,IACX,CAAC;YAEH,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;gBAChC,MAAM,mBAAmB,CAAC,QAAQ,EAAE,MAAM,kCACrC,OAAO,KACV,SAAS,EAAE,IAAI,EACf,WAAW,IACX,CAAC;aACJ;YAED,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE;gBAC3B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;oBAChC,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,8BAA8B,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;oBACxG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,4BAA4B,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;iBACvG;aACF;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;KAAA;IAQK,OAAO,CAAC,OAAkD;;YAC9D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAEvD,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;YAEvD,OAAO,GAAmB,OAAO,CAAC;YAElC,IAAI,OAAO,CAAC,iBAAiB,CAAC,KAAK,SAAS,EAAE;gBAC5C,OAAO,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;aACnC;YAED,MAAM,UAAU,GACd,OAAO,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;gBACvD,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;gBACtB,CAAC,CAAE,OAAO,CAAC,UAAsC,CAAC;YAEtD,IAAI,UAAU,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;gBACjC,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,iCAC1B,OAAO,KACV,KAAK,EAAE;wBACL,CAAC,cAAc,CAAC,EAAE;4BAChB,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,UAAU;yBACpB;qBACF,EACD,WAAW,IACX,CAAC;aACJ;YAED,IAAI,OAAO,CAAC,MAAM,EAAE;gBAClB,IAAI,GAAG,GAAG,CACR,MAAM,IAAI,CAAC,IAAI,CAAC;oBACd,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,WAAW;iBACZ,CAAC,CACH,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAc,CAAC,CAAC;gBAE/D,IAAI,UAAU,EAAE;oBACd,GAAG,GAAG,MAAM,CAAC,YAAY,CACvB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EACtB,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAC9B,CAAC;iBACH;gBAED,OAAO,MAAM,IAAI,CAAC,OAAO,iCACpB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,KACjC,UAAU,EAAE,GAAG,EACf,WAAW,IACX,CAAC;aACJ;YAED,IAAI,OAAO,CAAC,QAAQ,EAAE;gBACpB,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,iCAC1B,OAAO,KACV,QAAQ,EAAE,IAAI,EACd,WAAW,IACX,CAAC;aACJ;QACH,CAAC;KAAA;IAED;;OAEG;IACH,QAAQ,CAA+B,WAAmB;QACxD,OAAO,IAAI,yBAAyB,CAAI,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IACxE,CAAC;IAES,iBAAiB,CAAC,OAAY;QACtC,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,EAAE;YACxC,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC1C,KAAK,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAC;QAC3C,qCAAS,KAAK,EAAE,EAAE,IAAK,OAAO,GAAK,MAAM,EAAG;IAC9C,CAAC;IAES,WAAW,CAAC,MAAc,EAAE,OAAa;QACjD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE;YACtC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,GAAG,EAAE;gBACH,GAAG,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO;aACtB;SACF,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,iBAAiB,EAAE,CAAC;IACpC,CAAC;IAEe,cAAc,CAAC,OAAY,EAAE,OAAO,GAAG,KAAK;;YAC1D,IAAI,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,WAAW,EAAE;gBACxD,OAAO,OAAO,CAAC,WAAW,CAAC;aAC5B;YAED,IAAI,OAAO,EAAE;gBACX,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;aACjD;YAED,OAAO,IAAI,CAAC;QACd,CAAC;KAAA;CACF;AA3LC;IADC,WAAW,EAAE;wCA2Bb;AASD;IADC,WAAW,EAAE;4CAUb;AASD;IADC,WAAW,EAAE;wCA8Bb;AAQD;IANC,WAAW,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE;QACjC,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;YACnB,WAAW;SACZ,CAAC;IACJ,CAAC,CAAC;yCA0DD","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/lib/operators/index.js
CHANGED
|
@@ -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,
|
|
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,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"]}
|
package/lib/options-parser.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options-parser.js","sourceRoot":"","sources":["../src/options-parser.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAgE;AAGhE,oEAA2C;AAG3C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,CAAC;AAOhD,MAAa,aAAa;IAQxB,YAAY,OAAoB,EAAE,OAA6B;QAC7D,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAE/B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC5C,IAAI,CAAC,YAAY,GAAG,IAAI,uBAAY,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,EAAE;YACpD,UAAU;YACV,GAAG,EAAE;gBACH,GAAG,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO;aACtB;SACF,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,aAAa,CAAC,GAAW;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;IACpD,CAAC;IAED,iBAAiB,CAAC,IAAY;QAC5B,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,iBAAiB;;QACf,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,iBAAiB,EAAE,CAAC;QAE1D,IAAI,MAAA,IAAI,CAAC,OAAO,0CAAE,UAAU,EAAE;YAC5B,WAAW,CAAC,KAAK,GAAG;gBAClB,CAAC,cAAE,CAAC,GAAG,CAAC,EAAE;oBACR,WAAW,CAAC,KAAK;oBACjB;wBACE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;qBACrF;iBACF;aACF,CAAC;SACH;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC;IACvD,CAAC;IAED;;;;OAIG;IACO,SAAS,CAAC,YAAY;;QAC9B,IAAI,IAAI,GAAG,CAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,IAAI,KAAI,EAAE,CAAC;QACpC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;YAC5B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;SACxB;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAe,EAAE,EAAE;YAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;YAC3D,MAAM,SAAS,GAAe,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAElE,6BAA6B;YAC7B,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;gBACxB,IAAI,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC;gBAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBAC7C,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;oBACpC,SAAS,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC;oBACpE,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;iBACjC;aACF;YAED,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,uBACE,KAAK,EAAE,WAAW,IACf,YAAY,EACf;SACH;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAES,WAAW,CAAC,YAAiB;;QACrC,MAAM,OAAO,GAAG,CAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,OAAO,KAAI,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,EAAE,CAAC;QAElB,IAAI,UAAU,GAAyB;YACrC,OAAO,EAAE,EAAE;YACX,OAAO,EAAE,EAAE;SACZ,CAAC,CAAC,gCAAgC;QAEnC,IAAI,MAAA,IAAI,CAAC,OAAO,0CAAE,MAAM,EAAE;YACxB,kCAAkC;YAClC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;gBACvC,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE;oBACjC,6BAA6B;oBAC7B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;iBACrB;qBAAM;oBACL,4DAA4D;oBAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;wBAAE,UAAU,GAAG,EAAE,CAAC;oBAEhD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;iBACxB;aACF;SACF;QAED,IAAI,MAAA,IAAI,CAAC,OAAO,0CAAE,MAAM,EAAE;YACxB,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;gBAC3C,IAAI,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE;oBACrC,2BAA2B;oBAC3B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;iBACxB;qBAAM;oBACL,6CAA6C;oBAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;wBAAE,SAAS;oBACxC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;iBACpC;aACF;SACF;QAED,uBACE,UAAU,IACP,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,EACrE;IACJ,CAAC;IAES,WAAW,CAAC,MAAc,EAAE,YAAiB;QACrD,IAAI,CAAC,MAAM;YAAE,OAAO,YAAY,CAAC;QACjC,MAAM,SAAS,GAAG,CAAC,WAAgB,EAAE,MAAc,EAAE,EAAE;YACrD,+BAA+B;YAC/B,6DAA6D;YAC7D,wCAAwC;YACxC,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC;YAEzC,IAAI,iBAAiB,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,CAAC;YAE7G,IAAI,iBAAiB,IAAI,CAAC,CAAC,EAAE;gBAC3B,4CAA4C;gBAC5C,OAAO;aACR;YAED,IAAI,SAAS,EAAE;gBACb,8BAA8B;gBAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE;oBAC1E,OAAO;iBACR;qBAAM;oBACL,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,EAAE;wBACvE,WAAW,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;qBACzE;oBAED,WAAW,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;iBACxF;aACF;iBAAM;gBACL,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;aAC9G;QACH,CAAC,CAAC;QAEF,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE;YAC9B,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;SACpC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAES,YAAY,CAAC,OAAgB,EAAE,YAAiB;QACxD,IAAI,CAAC,OAAO;YAAE,OAAO,YAAY,CAAC;QAElC;;;;WAIG;QACH,MAAM,UAAU,GAAG,CAAC,KAAqB,EAAE,WAAgB,EAAE,MAAc,EAAE,EAAE;YAC7E,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvC,MAAM,iBAAiB,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAE1C,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC;YAExC,mCAAmC;YACnC,WAAW;YACX,sBAAsB;YACtB,4BAA4B;YAC5B,0CAA0C;YAC1C,IAAI,SAAS,GAAY,KAAK,CAAC;YAE/B,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE;gBAC5B,SAAS,GAAG,IAAI,CAAC;aAClB;YAED,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE;gBAC5B,MAAM,gBAAgB,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC9D,IAAI,gBAAgB,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE;oBACnD,SAAS,GAAG,IAAI,CAAC;iBAClB;aACF;YAED,yBAAyB;YACzB,IAAI,WAAW,CAAC,SAAS,CAAC,IAAI,SAAS,EAAE;gBACvC,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;aAC7B;YAED,IAAI,iBAAiB,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,SAAS,CACtD,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,iBAAiB,CACzD,CAAC;YAEF,sCAAsC;YACtC,IAAI,iBAAiB,IAAI,CAAC,CAAC,EAAE;gBAC3B,yBAAyB;gBACzB,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;oBAC1B,WAAW,EAAE,iBAAiB;iBAC/B,CAAC,CAAC;gBAEH,iBAAiB,GAAG,CAAC,CAAC;aACvB;YAED,cAAc;YACd,4BAA4B;YAC5B,IAAI,SAAS,EAAE;gBACb,mCAAmC;gBACnC,IAAI,UAAU,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,CAAC,YAAY,CAAC,IAAI;oBAC1E,OAAO,EAAE,EAAE,EAAE,mCAAmC;iBACjD,CAAC;gBAEF,wBAAwB;gBACxB,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE;oBAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;wBAC9B,UAAU,GAAG,EAAE,CAAC;qBACjB;oBAED,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;oBAEtC,mBAAmB;oBACnB,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;iBAChC;qBAAM;oBACL,oDAAoD;oBACpD,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE;wBACvD,UAAU,GAAG;4BACX,OAAO,EAAE,EAAE;yBACZ,CAAC;qBACH;iBACF;gBAED,qBAAqB;gBACrB,WAAW,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,mCACpC,WAAW,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,KAC5C,UAAU,GACX,CAAC;aACH;iBAAM;gBACL,UAAU,CACR,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,EAChF,WAAW,CAAC,SAAS,CAAC,CAAC,iBAAiB,CAAC,EACzC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CACzD,CAAC;aACH;QACH,CAAC,CAAC;QAEF,uBAAuB;QACvB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC5B,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;SAC9C;QAED,KAAK,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAAC;QACzC,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AA/QD,sCA+QC","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":";;;;;;;;;;;;;;;;;;AAAA,mCAA8B;AAC9B,yCAAkF;AAalF,gEAA6D;AAC7D,kDAA8C;AAC9C,+DAAwE;AAUxE,MAAsB,0BAA2B,SAAQ,wCAAkB;IACzE,iBAAiB,CAAC,WAAW;QAC3B,OAAO,WAAW,CAAC;IACrB,CAAC;IAEK,IAAI,CAAC,OAAqB;;YAC9B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAEvD,MAAM,WAAW,mCACZ,IAAI,CAAC,iBAAiB,CACvB,IAAI,CAAC,iBAAiB,mBACjB,OAAO,EACV,CACH,KACD,QAAQ,EAAE,KAAK,GAChB,CAAC;YAEF,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC;YACzC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAE3D,IAAI,WAAW,CAAC,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACzD,MAAM,GAAG,GAAG,CACV,MAAM,WAAW,CAAC,WAAW,CAAC,iCACzB,WAAW,KACd,uBAAuB,EAAE,KAAK,EAC9B,UAAU,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAC9B,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,EACrD,WAAW,IACX,CACH,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;gBAE1C,OAAO,MAAM,WAAW,CAAC,WAAW,CAAC,iCAChC,IAAA,aAAI,EAAC,WAAW,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,KACzC,KAAK,EAAE;wBACL,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE;4BAClB,CAAC,cAAE,CAAC,EAAE,CAAC,EAAE,GAAG;yBACb;qBACF,EACD,WAAW,IACX,CAAC;aACJ;YAED,OAAO,MAAM,WAAW,CAAC,WAAW,CAAC,iCAChC,WAAW,KACd,WAAW,IACX,CAAC;QACL,CAAC;KAAA;IAEK,YAAY,CAAC,OAA6B;;YAC9C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC9D,OAAO;gBACL,MAAM,IAAI,CAAC,IAAI,iCACV,OAAO,KACV,WAAW,IACX;gBACF,MAAM,IAAI,CAAC,KAAK,iCACX,OAAO,KACV,WAAW,IACX;aACH,CAAC;QACJ,CAAC;KAAA;IAEK,KAAK,CAAC,OAAsB;;YAChC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAEvD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAErD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC;gBACpD,KAAK,EAAE,YAAY,CAAC,KAAK;gBACzB,OAAO,EAAE,YAAY,CAAC,OAAO;gBAC7B,uBAAuB,EAAE,KAAK;gBAC9B,UAAU,EAAE;oBACV;wBACE,qBAAS,CAAC,EAAE,CACV,OAAO,EACP,qBAAS,CAAC,EAAE,CAAC,UAAU,EAAE,qBAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CACxF;wBACD,OAAO;qBACR;iBACF;gBACD,GAAG,EAAE,IAAI;gBACT,KAAK,EAAE,IAAI;gBACX,WAAW;aACZ,CAAC,CAAC;YAEH,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;KAAA;IAEK,OAAO,CAAC,OAAwB;;YACpC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,iCAAM,OAAO,KAAE,KAAK,EAAE,CAAC,EAAE,WAAW,IAAG,CAAC;YACpE,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3C,CAAC;KAAA;IAQK,MAAM,CAAC,OAAoD;;YAC/D,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YACvD,IAAI,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAE/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;gBAC9B,UAAU,GAAG,CAAC,UAAU,CAAC,CAAC;aAC3B;YAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;YAC3D,MAAM,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,cAAc,CAAC,CAAC,UAAU,EAAE;gBAC7D,WAAW;aACZ,CAAC,CAAC;YACH,OAAO;QACT,CAAC;KAAA;IAGK,MAAM,CAAC,OAAuB;;YAClC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAEvD,MAAM,KAAK,GAAG,0BAAW,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YAEjE,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAE9C,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAc,CAAC,CAAC;YAE5D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,iCAC5B,YAAY,KACf,WAAW,IACX,CAAC;YAEH,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;gBAChC,MAAM,IAAA,yCAAmB,EAAC,QAAQ,EAAE,MAAM,kCACrC,OAAO,KACV,SAAS,EAAE,IAAI,EACf,WAAW,EAAE,IAAI,CAAC,cAAc,EAChC,WAAW,IACX,CAAC;aACJ;YAED,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;gBAChC,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,EAAE;oBAC3B,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,8BAA8B,EAAE,QAAQ,kCAAM,OAAO,KAAE,WAAW,IAAE,CAAC;oBAC1H,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,4BAA4B,EAAE,QAAQ,kCAAM,OAAO,KAAE,WAAW,IAAE,CAAC;iBACzH;aACF;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;KAAA;IAEK,OAAO,CAAC,OAA6B;;YACzC,OAAO,KAAK,CAAC;QACf,CAAC;KAAA;IAEe,eAAe,CAAC,MAAc,EAAE,WAAyB;;YACvE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;gBAChC,MAAM,EAAE,MAAM;gBACd,WAAW;aACZ,CAAC,CAAC;YAEH,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;gBACxB,UAAU,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;gBAC5F,WAAW;aACZ,CAAC,CAAC;QACL,CAAC;KAAA;IAES,gBAAgB,CAAC,MAAc,EAAE,OAAa;QACtD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACvD,OAAO,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACjE,CAAC;IAES,SAAS;QACjB,OAAkC,KAAK,CAAC,SAAS,EAAE,CAAC;IACtD,CAAC;CACF;AAzEC;IANC,IAAA,iCAAW,EAAC,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE;QACjC,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;YACX,WAAW;SACZ,CAAC;IACJ,CAAC,CAAC;wDAcD;AAGD;IADC,IAAA,iCAAW,GAAE;wDAgCb;AApJH,gEA8KC","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?:
|
|
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
|
|
48
|
-
const
|
|
49
|
-
yield (
|
|
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":";;;;;;;;;;;;;;;AAAA,oDAA4B;AAK5B,qEAA4C;AAE5C,sDAAkD;AAElD,oEAAqE;AACrE,gEAA4D;AAC5D,kDAA8C;AAEjC,QAAA,WAAW,GAAG,IAAA,iDAAyB,EAAC;IACnD,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEH,MAAsB,kBAAkB;IAWtC,YAAY,gBAA4B,EAAE,WAAmB,EAAE,cAA+B;QAC5F,IAAI,CAAC,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC;QAE5C,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC;QACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAEzE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAEpE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAC3C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACvG,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC;IACzC,CAAC;IAES,SAAS;QACjB,OAAsD,IAAI,CAAC,WAAY,CAAC,SAAS,CAAC;IACpF,CAAC;IAEK,MAAM,CAAC,OAAuB;;YAClC,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC;YAE/C,MAAM,KAAK,GAAG,0BAAW,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACjE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;
|
|
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"]}
|
package/lib/repository.d.ts
CHANGED
|
@@ -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;
|
package/lib/repository.js.map
CHANGED
|
@@ -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.
|
|
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.
|
|
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": "
|
|
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
|
});
|
package/src/operators/index.ts
CHANGED
package/src/options-parser.ts
CHANGED
|
@@ -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(
|
|
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,
|
|
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?:
|
|
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;
|