From 451e3bcdcf6dad536949d04e453926298b0cead2 Mon Sep 17 00:00:00 2001 From: zakariaelas Date: Wed, 22 Sep 2021 15:44:52 +0100 Subject: [PATCH] further adjustments based on seb's feedback --- .../medusa-interfaces/src/search-service.js | 9 +++ .../src/loaders/index.js | 55 +------------------ .../src/services/meilisearch.js | 6 ++ .../src/subscribers/product-search.js | 2 +- .../src/api/routes/store/products/search.js | 2 +- packages/medusa/src/loaders/search-index.js | 48 ++++++++++++++++ packages/medusa/src/services/product.js | 3 +- packages/medusa/src/services/search.js | 7 +++ packages/medusa/src/utils/index-ns.js | 1 - 9 files changed, 74 insertions(+), 59 deletions(-) delete mode 100644 packages/medusa/src/utils/index-ns.js diff --git a/packages/medusa-interfaces/src/search-service.js b/packages/medusa-interfaces/src/search-service.js index 901dd00d3f..79f29665b4 100644 --- a/packages/medusa-interfaces/src/search-service.js +++ b/packages/medusa-interfaces/src/search-service.js @@ -88,6 +88,15 @@ 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/loaders/index.js b/packages/medusa-plugin-meilisearch/src/loaders/index.js index 190287c647..b7ba033487 100644 --- a/packages/medusa-plugin-meilisearch/src/loaders/index.js +++ b/packages/medusa-plugin-meilisearch/src/loaders/index.js @@ -1,65 +1,12 @@ -import { transformProduct } from "../utils/transform-product" - -const INDEX_NS = "medusa-commerce" - -async function loadIntoSearchEngine(container) { - const meilisearchService = container.resolve("meilisearchService") - const productService = container.resolve("productService") - - const TAKE = 20 - const totalCount = await productService.count() - let iterCount = 0, - lastSeenId = "prod" - - while (iterCount < totalCount) { - const products = await productService.list( - { id: { gt: lastSeenId } }, - { - select: [ - "id", - "title", - "subtitle", - "description", - "handle", - "is_giftcard", - "discountable", - "thumbnail", - "profile_id", - "collection_id", - "type_id", - "origin_country", - "created_at", - "updated_at", - ], - relations: ["variants", "tags", "type", "collection"], - take: TAKE, - order: { id: "ASC" }, - } - ) - - const transformedProducts = products.map(transformProduct) - - await meilisearchService.addDocuments( - `medusa-commerce_products`, - transformedProducts - ) - - iterCount += products.length - lastSeenId = products.at(-1).id - } -} - export default async (container, options) => { try { const meilisearchService = container.resolve("meilisearchService") await Promise.all( Object.entries(options.settings).map(([key, value]) => - meilisearchService.updateSettings(`${INDEX_NS}_${key}`, value) + meilisearchService.updateSettings(key, value) ) ) - - await loadIntoSearchEngine(container) } catch (err) { console.log(err) } diff --git a/packages/medusa-plugin-meilisearch/src/services/meilisearch.js b/packages/medusa-plugin-meilisearch/src/services/meilisearch.js index 8f903f13d7..f148fc320c 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 { transformProduct } from "../utils/transform-product" class MeiliSearchService extends SearchService { constructor(container, options) { @@ -41,6 +42,11 @@ class MeiliSearchService extends SearchService { updateSettings(indexName, settings) { return this.client_.index(indexName).updateSettings(settings) } + + transformProducts(products) { + if (!products) return [] + return products.map(transformProduct) + } } export default MeiliSearchService diff --git a/packages/medusa-plugin-meilisearch/src/subscribers/product-search.js b/packages/medusa-plugin-meilisearch/src/subscribers/product-search.js index 9981118926..49e452302d 100644 --- a/packages/medusa-plugin-meilisearch/src/subscribers/product-search.js +++ b/packages/medusa-plugin-meilisearch/src/subscribers/product-search.js @@ -11,7 +11,7 @@ class ProductSearchSubscriber { this.productService_ = productService - this.productIndexName = "medusa-commerce_products" + this.productIndexName = productService.constructor.IndexName this.eventBus_.subscribe("product.created", this.handleProductCreation) diff --git a/packages/medusa/src/api/routes/store/products/search.js b/packages/medusa/src/api/routes/store/products/search.js index 668e24047e..a24c63f11d 100644 --- a/packages/medusa/src/api/routes/store/products/search.js +++ b/packages/medusa/src/api/routes/store/products/search.js @@ -14,7 +14,7 @@ export default async (req, res) => { } try { - const { q, indexName, ...options } = value + const { q, ...options } = value const searchService = req.scope.resolve("searchService") diff --git a/packages/medusa/src/loaders/search-index.js b/packages/medusa/src/loaders/search-index.js index dac541fa43..220e853931 100644 --- a/packages/medusa/src/loaders/search-index.js +++ b/packages/medusa/src/loaders/search-index.js @@ -1,3 +1,49 @@ +import ProductService from "../services/product" + +async function loadProductsIntoSearchEngine(container) { + const searchService = container.resolve("searchService") + const productService = container.resolve("productService") + + const TAKE = 20 + const totalCount = await productService.count() + let iterCount = 0, + lastSeenId = "prod" + + while (iterCount < totalCount) { + const products = await productService.list( + { id: { gt: lastSeenId } }, + { + select: [ + "id", + "title", + "subtitle", + "description", + "handle", + "is_giftcard", + "discountable", + "thumbnail", + "profile_id", + "collection_id", + "type_id", + "origin_country", + "created_at", + "updated_at", + ], + relations: ["variants", "tags", "type", "collection"], + take: TAKE, + order: { id: "ASC" }, + } + ) + + const transformedBatch = searchService.transformProducts(products) + + await searchService.addDocuments(ProductService.IndexName, transformedBatch) + + iterCount += products.length + lastSeenId = products[products.length - 1].id + } +} + export default async ({ container }) => { const searchService = container.resolve("searchService") const logger = container.resolve("logger") @@ -7,4 +53,6 @@ export default async ({ container }) => { ) return } + + await loadProductsIntoSearchEngine(container) } diff --git a/packages/medusa/src/services/product.js b/packages/medusa/src/services/product.js index f631664a92..b5d0a224ca 100644 --- a/packages/medusa/src/services/product.js +++ b/packages/medusa/src/services/product.js @@ -2,14 +2,13 @@ import _ from "lodash" import { MedusaError } from "medusa-core-utils" import { BaseService } from "medusa-interfaces" import { Brackets } from "typeorm" -import { INDEX_NS } from "../utils/index-ns" /** * Provides layer to manipulate products. * @implements BaseService */ class ProductService extends BaseService { - static IndexName = `${INDEX_NS}_products` + static IndexName = `products` static Events = { UPDATED: "product.updated", CREATED: "product.created", diff --git a/packages/medusa/src/services/search.js b/packages/medusa/src/services/search.js index d6615becfd..c3e75374b3 100644 --- a/packages/medusa/src/services/search.js +++ b/packages/medusa/src/services/search.js @@ -61,6 +61,13 @@ 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 diff --git a/packages/medusa/src/utils/index-ns.js b/packages/medusa/src/utils/index-ns.js deleted file mode 100644 index caf7027dcc..0000000000 --- a/packages/medusa/src/utils/index-ns.js +++ /dev/null @@ -1 +0,0 @@ -export const INDEX_NS = `medusa-commerce`