From 6e95278ce4a565f41f97b2758bcd543149bb5524 Mon Sep 17 00:00:00 2001 From: chenos Date: Tue, 25 Jan 2022 17:08:35 +0800 Subject: [PATCH] fix(database): missing context in hook --- packages/database/src/update-associations.ts | 37 ++++++++++--------- .../beforeCreateForChildrenCollection.ts | 8 +++- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/packages/database/src/update-associations.ts b/packages/database/src/update-associations.ts index 44df180c0..d6f8251ab 100644 --- a/packages/database/src/update-associations.ts +++ b/packages/database/src/update-associations.ts @@ -1,19 +1,16 @@ import { - Sequelize, - ModelCtor, - Model, - DataTypes, - Utils, Association, - HasOne, BelongsTo, BelongsToMany, HasMany, - Transactionable, + HasOne, Hookable, + Model, + ModelCtor, + Transactionable } from 'sequelize'; -import { UpdateGuard } from './update-guard'; import { TransactionAble } from './repository'; +import { UpdateGuard } from './update-guard'; function isUndefinedOrNull(value: any) { return typeof value === 'undefined' || value === null; @@ -66,6 +63,7 @@ interface UpdateOptions extends TransactionAble { interface UpdateAssociationOptions extends Transactionable, Hookable { updateAssociationValues?: string[]; sourceModel?: Model; + context?: any; } export async function updateModelByValues(instance: Model, values: UpdateValue, options?: UpdateOptions) { @@ -155,6 +153,7 @@ export async function updateAssociations(instance: Model, values: any, options: await throughModel.update(values[throughModel.name], { where, + context: options.context, transaction, }); } @@ -180,6 +179,9 @@ export async function updateAssociation( ) { const association = modelAssociationByKey(instance, key); + // @ts-ignore + console.log(key, options.context); + if (!association) { return false; } @@ -217,7 +219,7 @@ export async function updateSingleAssociation( return false; } - const { updateAssociationValues = [], transaction = await model.sequelize.transaction() } = options; + const { context, updateAssociationValues = [], transaction = await model.sequelize.transaction() } = options; const keys = getKeysByPrefix(updateAssociationValues, key); try { @@ -238,7 +240,7 @@ export async function updateSingleAssociation( } if (isStringOrNumber(value)) { - await model[setAccessor](value, { transaction }); + await model[setAccessor](value, { context, transaction }); if (!options.transaction) { await transaction.commit(); } @@ -246,7 +248,7 @@ export async function updateSingleAssociation( } if (value instanceof Model) { - await model[setAccessor](value); + await model[setAccessor](value, { context, transaction }); model.setDataValue(key, value); if (!options.transaction) { await transaction.commit(); @@ -275,7 +277,7 @@ export async function updateSingleAssociation( }); if (instance) { - await model[setAccessor](instance); + await model[setAccessor](instance, { context, transaction }); if (updateAssociationValues.includes(key)) { await instance.update(value, { ...options, transaction }); @@ -290,7 +292,7 @@ export async function updateSingleAssociation( } } - const instance = await model[createAccessor](value, { transaction }); + const instance = await model[createAccessor](value, { context, transaction }); await updateAssociations(instance, value, { ...options, transaction, updateAssociationValues: keys }); model.setDataValue(key, instance); // @ts-ignore @@ -331,7 +333,7 @@ export async function updateMultipleAssociation( return false; } - const { updateAssociationValues = [], transaction = await model.sequelize.transaction() } = options; + const { context, updateAssociationValues = [], transaction = await model.sequelize.transaction() } = options; const keys = getKeysByPrefix(updateAssociationValues, key); try { @@ -339,13 +341,13 @@ export async function updateMultipleAssociation( const createAccessor = association.accessors.create; if (isUndefinedOrNull(value)) { - await model[setAccessor](null, { transaction }); + await model[setAccessor](null, { transaction, context }); model.setDataValue(key, null); return; } if (isStringOrNumber(value)) { - await model[setAccessor](value, { transaction }); + await model[setAccessor](value, { transaction, context }); return; } @@ -371,7 +373,7 @@ export async function updateMultipleAssociation( } // associate targets in lists1 - await model[setAccessor](list1, { transaction }); + await model[setAccessor](list1, { transaction, context }); const list3 = []; for (const item of list2) { @@ -380,6 +382,7 @@ export async function updateMultipleAssociation( const through = (association).through ? (association).through.model.name : null; const accessorOptions = { + context, transaction, }; diff --git a/packages/plugin-collection-manager/src/hooks/beforeCreateForChildrenCollection.ts b/packages/plugin-collection-manager/src/hooks/beforeCreateForChildrenCollection.ts index 8dd5b4337..ada45ec5b 100644 --- a/packages/plugin-collection-manager/src/hooks/beforeCreateForChildrenCollection.ts +++ b/packages/plugin-collection-manager/src/hooks/beforeCreateForChildrenCollection.ts @@ -4,7 +4,7 @@ export function beforeCreateForChildrenCollection(db: Database) { const Collection = db.getCollection('collections'); const Field = db.getCollection('fields'); - return async (model, { transaction }) => { + return async (model, { transaction, context }) => { const parentKey = model.get('parentKey'); if (!parentKey) { return; @@ -19,7 +19,11 @@ export function beforeCreateForChildrenCollection(db: Database) { }, }); if (!collection) { - await Collection.model.create({ name: parentTarget }, { transaction }); + await Collection.repository.create({ + values: { name: parentTarget }, + transaction, + context, + }); } }; }