Просмотр исходного кода

fix(core): Product by slug query filters on channel (#3591)

Alexander Berger 7 месяцев назад
Родитель
Сommit
357de3035d

+ 51 - 0
packages/core/e2e/product-channel.e2e-spec.ts

@@ -626,4 +626,55 @@ describe('ChannelAware Products and ProductVariants', () => {
             ]);
         });
     });
+
+    describe('querying products', () => {
+        // https://github.com/vendure-ecommerce/vendure/issues/2924
+        it('find by slug with multiple channels', async () => {
+            adminClient.setChannelToken(SECOND_CHANNEL_TOKEN);
+
+            const { createProduct: secondChannelProduct } = await adminClient.query(CreateProductDocument, {
+                input: {
+                    translations: [
+                        {
+                            languageCode: LanguageCode.en,
+                            name: 'Channel 2 Product',
+                            slug: 'unique-slug',
+                            description: 'Channel 2 product',
+                        },
+                    ],
+                },
+            });
+
+            expect(secondChannelProduct.slug).toBe('unique-slug');
+
+            adminClient.setChannelToken(THIRD_CHANNEL_TOKEN);
+
+            const { createProduct: thirdChannelProduct } = await adminClient.query(CreateProductDocument, {
+                input: {
+                    translations: [
+                        {
+                            languageCode: LanguageCode.en,
+                            name: 'Channel 3 Product',
+                            slug: 'unique-slug',
+                            description: 'Channel 3 product',
+                        },
+                    ],
+                },
+            });
+
+            expect(thirdChannelProduct.slug).toBe('unique-slug');
+
+            adminClient.setChannelToken(SECOND_CHANNEL_TOKEN);
+            const { product: result1 } = await adminClient.query(GetProductWithVariantsDocument, {
+                slug: 'unique-slug',
+            });
+            expect(result1?.name).toBe('Channel 2 Product');
+
+            adminClient.setChannelToken(THIRD_CHANNEL_TOKEN);
+            const { product: result2 } = await adminClient.query(GetProductWithVariantsDocument, {
+                slug: 'unique-slug',
+            });
+            expect(result2?.name).toBe('Channel 3 Product');
+        });
+    });
 });

+ 2 - 0
packages/core/src/service/services/product.service.ts

@@ -202,7 +202,9 @@ export class ProductService {
             .andWhere('_product_translation.slug = :slug', { slug });
 
         qb.leftJoin('product.translations', 'translation')
+            .leftJoin('product.channels', 'channel')
             .andWhere('product.deletedAt IS NULL')
+            .andWhere('channel.id = :channelId', { channelId: ctx.channelId })
             .andWhere('product.id IN (' + translationQb.getQuery() + ')')
             .setParameters(translationQb.getParameters())
             .select('product.id', 'id')