From 24eecd2922e0c3425f2d43549b3227c756820387 Mon Sep 17 00:00:00 2001 From: zakariaelas Date: Fri, 24 Sep 2021 11:34:14 +0100 Subject: [PATCH] fix: use type to choose transformer before adding or replacing documents --- packages/medusa-core-utils/src/index.js | 1 + .../medusa-interfaces/src/search-service.js | 15 +++-------- .../src/services/meilisearch.js | 20 ++++++++++++--- .../src/subscribers/product-search.js | 25 ++++++++++++------- packages/medusa/src/loaders/search-index.js | 9 ++++--- packages/medusa/src/services/search.js | 11 ++------ 6 files changed, 45 insertions(+), 36 deletions(-) diff --git a/packages/medusa-core-utils/src/index.js b/packages/medusa-core-utils/src/index.js index c12fd278ef..84ab4ee0d2 100644 --- a/packages/medusa-core-utils/src/index.js +++ b/packages/medusa-core-utils/src/index.js @@ -1,6 +1,7 @@ export { countries } from "./countries" export { isoCountryLookup } from "./countries" export { transformIdableFields } from "./transform-idable-fields" +export { indexTypes } from "./index-types" export { default as Validator } from "./validator" export { default as MedusaError } from "./errors" export { default as getConfigFile } from "./get-config-file" diff --git a/packages/medusa-interfaces/src/search-service.js b/packages/medusa-interfaces/src/search-service.js index 79f29665b4..7ea04fd945 100644 --- a/packages/medusa-interfaces/src/search-service.js +++ b/packages/medusa-interfaces/src/search-service.js @@ -32,9 +32,10 @@ class SearchService extends BaseService { * Used to index documents by the search engine provider * @param indexName {string} - the index name * @param documents {Array.} - documents array to be indexed + * @param type {Array.} - type of documents to be added (e.g: products, regions, orders, etc) * @return {Promise<{object}>} - returns response from search engine provider */ - addDocuments(indexName, documents) { + addDocuments(indexName, documents, type) { throw Error("addDocuments must be overridden by a child class") } @@ -42,9 +43,10 @@ class SearchService extends BaseService { * Used to replace documents * @param indexName {string} - the index name. * @param documents {Object} - array of document objects that will replace existing documents + * @param type {Array.} - type of documents to be replaced (e.g: products, regions, orders, etc) * @return {Promise<{object}>} - returns response from search engine provider */ - replaceDocuments(indexName, documents) { + replaceDocuments(indexName, documents, type) { throw Error("updateDocument must be overridden by a child class") } @@ -88,15 +90,6 @@ class SearchService extends BaseService { updateSettings(indexName, settings) { throw Error("updateSettings must be overridden by a child class") } - - /** - * Used to perform transformations (if any) on products before indexation - * @param products {Array.} - the list of products - * @return {Array.} - returns the transformed products - */ - transformProducts(products) { - throw Error("transformProducts must be overridden by a child class") - } } export default SearchService diff --git a/packages/medusa-plugin-meilisearch/src/services/meilisearch.js b/packages/medusa-plugin-meilisearch/src/services/meilisearch.js index f148fc320c..4025f512f4 100644 --- a/packages/medusa-plugin-meilisearch/src/services/meilisearch.js +++ b/packages/medusa-plugin-meilisearch/src/services/meilisearch.js @@ -1,5 +1,6 @@ import { SearchService } from "medusa-interfaces" import { MeiliSearch } from "meilisearch" +import { indexTypes } from "medusa-core-utils" import { transformProduct } from "../utils/transform-product" class MeiliSearchService extends SearchService { @@ -19,12 +20,14 @@ class MeiliSearchService extends SearchService { return this.client_.index(indexName) } - addDocuments(indexName, documents) { - return this.client_.index(indexName).addDocuments(documents) + addDocuments(indexName, documents, type) { + const transformedDocuments = this.getTransformedDocuments(type, documents) + return this.client_.index(indexName).addDocuments(transformedDocuments) } - replaceDocuments(indexName, documents) { - return this.client_.index(indexName).addDocuments(documents) + replaceDocuments(indexName, documents, type) { + const transformedDocuments = this.getTransformedDocuments(type, documents) + return this.client_.index(indexName).addDocuments(transformedDocuments) } deleteDocument(indexName, document_id) { @@ -43,6 +46,15 @@ class MeiliSearchService extends SearchService { return this.client_.index(indexName).updateSettings(settings) } + getTransformedDocuments(type, documents) { + switch (type) { + case indexTypes.products: + return this.transformProducts(documents) + default: + return documents + } + } + transformProducts(products) { if (!products) return [] return products.map(transformProduct) diff --git a/packages/medusa-plugin-meilisearch/src/subscribers/product-search.js b/packages/medusa-plugin-meilisearch/src/subscribers/product-search.js index e60f846697..bcfdfbf55e 100644 --- a/packages/medusa-plugin-meilisearch/src/subscribers/product-search.js +++ b/packages/medusa-plugin-meilisearch/src/subscribers/product-search.js @@ -1,3 +1,4 @@ +import { indexTypes } from "medusa-core-utils" import { transformProduct } from "../utils/transform-product" class ProductSearchSubscriber { @@ -37,9 +38,11 @@ class ProductSearchSubscriber { handleProductCreation = async (data) => { const product = await this.retrieveProduct_(data.id) - await this.meilisearchService_.addDocuments(this.productIndexName, [ - product, - ]) + await this.meilisearchService_.addDocuments( + this.productIndexName, + [product], + indexTypes.products + ) } retrieveProduct_ = async (product_id) => { @@ -76,9 +79,11 @@ class ProductSearchSubscriber { handleProductUpdate = async (data) => { const product = await this.retrieveProduct_(data.id) - await this.meilisearchService_.addDocuments(this.productIndexName, [ - product, - ]) + await this.meilisearchService_.addDocuments( + this.productIndexName, + [product], + indexTypes.products + ) } handleProductDeletion = async (data) => { @@ -90,9 +95,11 @@ class ProductSearchSubscriber { handleProductVariantChange = async (data) => { const product = await this.retrieveProduct_(data.product_id) - await this.meilisearchService_.addDocuments(this.productIndexName, [ - product, - ]) + await this.meilisearchService_.addDocuments( + this.productIndexName, + [product], + indexTypes.products + ) } } diff --git a/packages/medusa/src/loaders/search-index.js b/packages/medusa/src/loaders/search-index.js index ad10cb5c98..91c660c2d0 100644 --- a/packages/medusa/src/loaders/search-index.js +++ b/packages/medusa/src/loaders/search-index.js @@ -1,4 +1,5 @@ import ProductService from "../services/product" +import { indexTypes } from "medusa-core-utils" async function loadProductsIntoSearchEngine(container) { const searchService = container.resolve("searchService") @@ -43,9 +44,11 @@ async function loadProductsIntoSearchEngine(container) { } ) - const transformedBatch = searchService.transformProducts(products) - - await searchService.addDocuments(ProductService.IndexName, transformedBatch) + await searchService.addDocuments( + ProductService.IndexName, + products, + indexTypes.products + ) iterCount += products.length lastSeenId = products[products.length - 1].id diff --git a/packages/medusa/src/services/search.js b/packages/medusa/src/services/search.js index c3e75374b3..5695ceb68a 100644 --- a/packages/medusa/src/services/search.js +++ b/packages/medusa/src/services/search.js @@ -25,13 +25,13 @@ class DefaultSearchService extends SearchService { ) } - addDocuments(indexName, documents) { + addDocuments(indexName, documents, type) { this.logger_.warn( "This is an empty method: addDocuments must be overridden by a child class" ) } - replaceDocuments(indexName, documents) { + replaceDocuments(indexName, documents, type) { this.logger_.warn( "This is an empty method: replaceDocuments must be overridden by a child class" ) @@ -61,13 +61,6 @@ class DefaultSearchService extends SearchService { "This is an empty method: updateSettings must be overridden by a child class" ) } - - transformProducts(products) { - this.logger_.warn( - "This is an empty method: transformProducts must be overridden by a child class" - ) - return products - } } export default DefaultSearchService