diff --git a/packages/medusa-plugin-contentful/package.json b/packages/medusa-plugin-contentful/package.json index 0a093930de..ff6a5a79eb 100644 --- a/packages/medusa-plugin-contentful/package.json +++ b/packages/medusa-plugin-contentful/package.json @@ -1,6 +1,6 @@ { "name": "medusa-plugin-contentful", - "version": "1.1.4", + "version": "1.1.4-alpha.7+739b7b3c", "description": "Contentful plugin for Medusa Commerce", "main": "index.js", "repository": { @@ -43,5 +43,5 @@ "medusa-test-utils": "^1.1.3", "redis": "^3.0.2" }, - "gitHead": "0646bd395a6056657cb0aa93c13699c4a9dbbcdd" + "gitHead": "739b7b3cc5ff31aa7a15637db2000e645c7597b1" } diff --git a/packages/medusa-plugin-contentful/src/loaders/check-types.js b/packages/medusa-plugin-contentful/src/loaders/check-types.js index 9c224621dd..de3281a388 100644 --- a/packages/medusa-plugin-contentful/src/loaders/check-types.js +++ b/packages/medusa-plugin-contentful/src/loaders/check-types.js @@ -11,6 +11,7 @@ const checkContentTypes = async (container) => { if (!product) { throw Error("Content type: `product` is missing in Contentful") } + if (!variant) { throw Error("Content type: `productVariant` is missing in Contentful") } diff --git a/packages/medusa-plugin-contentful/src/services/contentful.js b/packages/medusa-plugin-contentful/src/services/contentful.js index b0ec7ce842..da5e3bc765 100644 --- a/packages/medusa-plugin-contentful/src/services/contentful.js +++ b/packages/medusa-plugin-contentful/src/services/contentful.js @@ -96,13 +96,15 @@ class ContentfulService extends BaseService { }, }) - await asset.processForAllLocales() + const finalAsset = await asset + .processForAllLocales() + .then((ast) => ast.publish()) assets.push({ sys: { type: "Link", linkType: "Asset", - id: asset.sys.id, + id: finalAsset.sys.id, }, }) }) @@ -231,9 +233,9 @@ class ContentfulService extends BaseService { fields, }) - const ignoreIds = (await this.getIgnoreIds_("product")) || [] - ignoreIds.push(product.id) - this.redis_.set("product_ignore_ids", JSON.stringify(ignoreIds)) + // const ignoreIds = (await this.getIgnoreIds_("product")) || [] + // ignoreIds.push(product.id) + // this.redis_.set("product_ignore_ids", JSON.stringify(ignoreIds)) return result } catch (error) { throw error @@ -271,38 +273,47 @@ class ContentfulService extends BaseService { } ) - const ignoreIds = (await this.getIgnoreIds_("product_variant")) || [] - ignoreIds.push(v.id) - this.redis_.set("product_variant_ignore_ids", JSON.stringify(ignoreIds)) + // const ignoreIds = (await this.getIgnoreIds_("product_variant")) || [] + // ignoreIds.push(v.id) + // this.redis_.set("product_variant_ignore_ids", JSON.stringify(ignoreIds)) return result } catch (error) { throw error } } - async updateProductInContentful(product) { + async updateProductInContentful(data) { + const updateFields = [ + "variants", + "options", + "tags", + "title", + "tags", + "type", + "type_id", + "collection", + "collection_id", + "thumbnail", + ] + + const found = data.fields.find((f) => updateFields.includes(f)) + if (!found) { + return + } + try { - const ignoreIds = (await this.getIgnoreIds_("product")) || [] + // const ignoreIds = (await this.getIgnoreIds_("product")) || [] - if (ignoreIds.includes(product.id)) { - const newIgnoreIds = ignoreIds.filter((id) => id !== product.id) - this.redis_.set("product_ignore_ids", JSON.stringify(newIgnoreIds)) - return - } else { - ignoreIds.push(product.id) - this.redis_.set("product_ignore_ids", JSON.stringify(ignoreIds)) - } + // if (ignoreIds.includes(product.id)) { + // const newIgnoreIds = ignoreIds.filter((id) => id !== product.id) + // this.redis_.set("product_ignore_ids", JSON.stringify(newIgnoreIds)) + // return + // } else { + // ignoreIds.push(product.id) + // this.redis_.set("product_ignore_ids", JSON.stringify(ignoreIds)) + // } - const environment = await this.getContentfulEnvironment_() - // check if product exists - let productEntry = undefined - try { - productEntry = await environment.getEntry(product.id) - } catch (error) { - return this.createProductInContentful(product) - } - - const p = await this.productService_.retrieve(product.id, { + const p = await this.productService_.retrieve(data.id, { relations: [ "options", "variants", @@ -313,6 +324,15 @@ class ContentfulService extends BaseService { ], }) + const environment = await this.getContentfulEnvironment_() + // check if product exists + let productEntry = undefined + try { + productEntry = await environment.getEntry(data.id) + } catch (error) { + return this.createProductInContentful(p) + } + const variantEntries = await this.getVariantEntries_(p.variants) const variantLinks = this.getVariantLinks_(variantEntries) @@ -332,7 +352,12 @@ class ContentfulService extends BaseService { }, } - if (p.thumbnail) { + if (data.fields.includes("thumbnail") && p.thumbnail) { + let url = p.thumbnail + if (p.thumbnail.startsWith("//")) { + url = `https:${url}` + } + const thumbnailAsset = await environment.createAsset({ fields: { title: { @@ -344,8 +369,8 @@ class ContentfulService extends BaseService { file: { "en-US": { contentType: "image/xyz", - fileName: p.thumbnail, - upload: p.thumbnail, + fileName: url, + upload: url, }, }, }, @@ -412,20 +437,37 @@ class ContentfulService extends BaseService { } async updateProductVariantInContentful(variant) { - try { - const ignoreIds = (await this.getIgnoreIds_("product_variant")) || [] + const updateFields = [ + "title", + "prices", + "sku", + "material", + "weight", + "length", + "height", + "origin_country", + "options", + ] - if (ignoreIds.includes(variant.id)) { - const newIgnoreIds = ignoreIds.filter((id) => id !== variant.id) - this.redis_.set( - "product_variant_ignore_ids", - JSON.stringify(newIgnoreIds) - ) - return - } else { - ignoreIds.push(variant.id) - this.redis_.set("product_variant_ignore_ids", JSON.stringify(ignoreIds)) - } + const found = variant.fields.find((f) => updateFields.includes(f)) + if (!found) { + return + } + + try { + // const ignoreIds = (await this.getIgnoreIds_("product_variant")) || [] + + //if (ignoreIds.includes(variant.id)) { + // const newIgnoreIds = ignoreIds.filter((id) => id !== variant.id) + // this.redis_.set( + // "product_variant_ignore_ids", + // JSON.stringify(newIgnoreIds) + // ) + // return + //} else { + // ignoreIds.push(variant.id) + // this.redis_.set("product_variant_ignore_ids", JSON.stringify(ignoreIds)) + //} const environment = await this.getContentfulEnvironment_() // check if product exists @@ -476,19 +518,23 @@ class ContentfulService extends BaseService { const environment = await this.getContentfulEnvironment_() const productEntry = await environment.getEntry(productId) - const ignoreIds = (await this.getIgnoreIds_("product")) || [] - if (ignoreIds.includes(productId)) { - const newIgnoreIds = ignoreIds.filter((id) => id !== productId) - this.redis_.set("product_ignore_ids", JSON.stringify(newIgnoreIds)) - return - } else { - ignoreIds.push(productId) - this.redis_.set("product_ignore_ids", JSON.stringify(ignoreIds)) - } + const product = await this.productService_.retrieve(productId) - let update = { - title: - productEntry.fields[this.getCustomField("title", "product")]["en-US"], + //const ignoreIds = (await this.getIgnoreIds_("product")) || [] + //if (ignoreIds.includes(productId)) { + // const newIgnoreIds = ignoreIds.filter((id) => id !== productId) + // this.redis_.set("product_ignore_ids", JSON.stringify(newIgnoreIds)) + // return + //} else { + // ignoreIds.push(productId) + // this.redis_.set("product_ignore_ids", JSON.stringify(ignoreIds)) + //} + + let update = {} + const title = + productEntry.fields[this.getCustomField("title", "product")]["en-US"] + if (product.title !== title) { + update.title = title } // Get the thumbnail, if present @@ -497,15 +543,16 @@ class ContentfulService extends BaseService { productEntry.fields.thumbnail["en-US"].sys.id ) - update.thumbnail = thumb.fields.file["en-US"].url + if (thumb.fields.file["en-US"].url) { + if (!product.thumbnail.includes(thumb.fields.file["en-US"].url)) { + update.thumbnail = thumb.fields.file["en-US"].url + } + } } - const updatedProduct = await this.productService_.update( - productId, - update - ) - - return updatedProduct + if (!_.isEmpty(update)) { + await this.productService_.update(productId, update) + } } catch (error) { throw error } @@ -516,18 +563,18 @@ class ContentfulService extends BaseService { const environment = await this.getContentfulEnvironment_() const variantEntry = await environment.getEntry(variantId) - const ignoreIds = (await this.getIgnoreIds_("product_variant")) || [] - if (ignoreIds.includes(variantId)) { - const newIgnoreIds = ignoreIds.filter((id) => id !== variantId) - this.redis_.set( - "product_variant_ignore_ids", - JSON.stringify(newIgnoreIds) - ) - return - } else { - ignoreIds.push(variantId) - this.redis_.set("product_variant_ignore_ids", JSON.stringify(ignoreIds)) - } + // const ignoreIds = (await this.getIgnoreIds_("product_variant")) || [] + // if (ignoreIds.includes(variantId)) { + // const newIgnoreIds = ignoreIds.filter((id) => id !== variantId) + // this.redis_.set( + // "product_variant_ignore_ids", + // JSON.stringify(newIgnoreIds) + // ) + // return + // } else { + // ignoreIds.push(variantId) + // this.redis_.set("product_variant_ignore_ids", JSON.stringify(ignoreIds)) + // } const updatedVariant = await this.productVariantService_.update( variantId, diff --git a/packages/medusa/src/services/__tests__/product-variant.js b/packages/medusa/src/services/__tests__/product-variant.js index 77aa8f4f87..ec9418ca3e 100644 --- a/packages/medusa/src/services/__tests__/product-variant.js +++ b/packages/medusa/src/services/__tests__/product-variant.js @@ -309,7 +309,7 @@ describe("ProductVariantService", () => { "product-variant.updated", { id: IdMap.getId("ironman"), - title: "new title", + fields: ["title"], } ) @@ -333,7 +333,7 @@ describe("ProductVariantService", () => { "product-variant.updated", { id: IdMap.getId("ironman"), - title: "new title", + fields: ["title"], } ) @@ -370,10 +370,7 @@ describe("ProductVariantService", () => { "product-variant.updated", { id: IdMap.getId("ironman"), - title: "new title", - metadata: { - testing: "this", - }, + fields: ["title", "metadata"], } ) diff --git a/packages/medusa/src/services/product-variant.js b/packages/medusa/src/services/product-variant.js index 7f40d86823..42fca94c47 100644 --- a/packages/medusa/src/services/product-variant.js +++ b/packages/medusa/src/services/product-variant.js @@ -298,7 +298,10 @@ class ProductVariantService extends BaseService { const result = await variantRepo.save(variant) await this.eventBus_ .withTransaction(manager) - .emit(ProductVariantService.Events.UPDATED, result) + .emit(ProductVariantService.Events.UPDATED, { + id: result.id, + fields: Object.keys(update), + }) return result }) } diff --git a/packages/medusa/src/services/product.js b/packages/medusa/src/services/product.js index fedc1a876e..968071b890 100644 --- a/packages/medusa/src/services/product.js +++ b/packages/medusa/src/services/product.js @@ -444,6 +444,7 @@ class ProductService extends BaseService { .withTransaction(manager) .emit(ProductService.Events.UPDATED, { id: result.id, + fields: Object.keys(update), }) return result })