diff --git a/packages/core/src/service/services/collection.service.ts b/packages/core/src/service/services/collection.service.ts index f791285996..285be2d025 100644 --- a/packages/core/src/service/services/collection.service.ts +++ b/packages/core/src/service/services/collection.service.ts @@ -44,7 +44,7 @@ import { AssetService } from './asset.service'; import { ChannelService } from './channel.service'; import { FacetValueService } from './facet-value.service'; -type ApplyCollectionFiltersJobData = { ctx: SerializedRequestContext; collectionIds: ID[] }; +type ApplyCollectionFiltersJobData = { ctx: SerializedRequestContext; collectionIds: ID[]; applyToChangedVariantsOnly?: boolean; }; @Injectable() export class CollectionService implements OnModuleInit { @@ -64,7 +64,8 @@ export class CollectionService implements OnModuleInit { private slugValidator: SlugValidator, private configArgService: ConfigArgService, private customFieldRelationService: CustomFieldRelationService, - ) {} + ) { + } async onModuleInit() { const productEvents$ = this.eventBus.ofType(ProductEvent); @@ -99,7 +100,7 @@ export class CollectionService implements OnModuleInit { } completed++; if (collection) { - const affectedVariantIds = await this.applyCollectionFiltersInternal(collection); + const affectedVariantIds = await this.applyCollectionFiltersInternal(collection, job.data.applyToChangedVariantsOnly); job.setProgress(Math.ceil((completed / job.data.collectionIds.length) * 100)); this.eventBus.publish( new CollectionModificationEvent(ctx, collection, affectedVariantIds), @@ -362,7 +363,11 @@ export class CollectionService implements OnModuleInit { await this.applyFiltersQueue.add({ ctx: ctx.serialize(), collectionIds: [collection.id], + applyToChangedVariantsOnly: false, }); + } else { + const affectedVariantIds = await this.getCollectionProductVariantIds(collection); + this.eventBus.publish(new CollectionModificationEvent(ctx, collection, affectedVariantIds)); } return assertFound(this.findOne(ctx, collection.id)); } @@ -430,8 +435,13 @@ export class CollectionService implements OnModuleInit { /** * Applies the CollectionFilters + * + * If applyToChangedVariantsOnly (default: true) is true, than apply collection job will process only changed variants + * If applyToChangedVariantsOnly (default: true) is false, than apply collection job will process all variants + * This param is used when we update collection and collection filters are changed to update all + * variants (because other attributes of collection can be changed https://github.com/vendure-ecommerce/vendure/issues/1015) */ - private async applyCollectionFiltersInternal(collection: Collection): Promise { + private async applyCollectionFiltersInternal(collection: Collection, applyToChangedVariantsOnly = true): Promise { const ancestorFilters = await this.getAncestors(collection.id).then(ancestors => ancestors.reduce( (filters, c) => [...filters, ...(c.filters || [])], @@ -460,11 +470,19 @@ export class CollectionService implements OnModuleInit { } const preIdsSet = new Set(preIds); const postIdsSet = new Set(postIds); - const difference = [ - ...preIds.filter(id => !postIdsSet.has(id)), - ...postIds.filter(id => !preIdsSet.has(id)), - ]; - return difference; + + if (applyToChangedVariantsOnly) { + return [ + ...preIds.filter(id => !postIdsSet.has(id)), + ...postIds.filter(id => !preIdsSet.has(id)), + ]; + } else { + return [ + ...preIds.filter(id => !postIdsSet.has(id)), + ...postIds, + ]; + } + } /**