From eab2d22f7d22ec53c68398558ffda32d2a734983 Mon Sep 17 00:00:00 2001 From: Adrien de Peretti Date: Wed, 5 Apr 2023 12:39:28 +0200 Subject: [PATCH] chore(medusa): Migrate product tag repository (#3726) * chore(medusa): Migrate product tag repository * chore(medusa): cleanup * chore(medusa): cleanup * Create healthy-lies-eat.md * chore(medusa): naming * fix repo --- .changeset/healthy-lies-eat.md | 5 ++ packages/medusa/src/repositories/image.ts | 1 - .../medusa/src/repositories/money-amount.ts | 1 - .../medusa/src/repositories/product-tag.ts | 48 +++++++++++++------ .../medusa/src/repositories/staged-job.ts | 1 - packages/medusa/src/services/product.ts | 4 +- 6 files changed, 41 insertions(+), 19 deletions(-) create mode 100644 .changeset/healthy-lies-eat.md diff --git a/.changeset/healthy-lies-eat.md b/.changeset/healthy-lies-eat.md new file mode 100644 index 0000000000..f22dca4796 --- /dev/null +++ b/.changeset/healthy-lies-eat.md @@ -0,0 +1,5 @@ +--- +"@medusajs/medusa": patch +--- + +chore(medusa): Migrate product tag repository diff --git a/packages/medusa/src/repositories/image.ts b/packages/medusa/src/repositories/image.ts index e1393092d5..217b11470a 100644 --- a/packages/medusa/src/repositories/image.ts +++ b/packages/medusa/src/repositories/image.ts @@ -11,7 +11,6 @@ export const ImageRepository = dataSource.getRepository(Image).extend({ .into(Image) .values(data) - // TODO: remove if statement once this issue is resolved https://github.com/typeorm/typeorm/issues/9850 if (!queryBuilder.connection.driver.isReturningSqlSupported("insert")) { const rawImages = await queryBuilder.execute() return rawImages.generatedMaps.map((d) => this.create(d)) as Image[] diff --git a/packages/medusa/src/repositories/money-amount.ts b/packages/medusa/src/repositories/money-amount.ts index 65cbfcb308..3bda93dd52 100644 --- a/packages/medusa/src/repositories/money-amount.ts +++ b/packages/medusa/src/repositories/money-amount.ts @@ -34,7 +34,6 @@ export const MoneyAmountRepository = dataSource .into(MoneyAmount) .values(data) - // TODO: remove if statement once this issue is resolved https://github.com/typeorm/typeorm/issues/9850 if (!queryBuilder.connection.driver.isReturningSqlSupported("insert")) { const rawMoneyAmounts = await queryBuilder.execute() return rawMoneyAmounts.generatedMaps.map((d) => diff --git a/packages/medusa/src/repositories/product-tag.ts b/packages/medusa/src/repositories/product-tag.ts index dc32d84807..80bba9227f 100644 --- a/packages/medusa/src/repositories/product-tag.ts +++ b/packages/medusa/src/repositories/product-tag.ts @@ -2,6 +2,7 @@ import { In } from "typeorm" import { ProductTag } from "../models/product-tag" import { ExtendedFindConfig } from "../types/common" import { dataSource } from "../loaders/database" +import { QueryDeepPartialEntity } from "typeorm/query-builder/QueryPartialEntity" type UpsertTagsInput = (Partial & { value: string @@ -26,18 +27,32 @@ export type FindWithoutRelationsOptions = DefaultWithoutRelations & { export const ProductTagRepository = dataSource .getRepository(ProductTag) .extend({ - async listTagsByUsage(count = 10): Promise { - return await this.query( - ` - SELECT id, COUNT(pts.product_tag_id) as usage_count, pt.value - FROM product_tag pt - LEFT JOIN product_tags pts ON pt.id = pts.product_tag_id - GROUP BY id - ORDER BY usage_count DESC - LIMIT $1 - `, - [count] - ) + async insertBulk( + data: QueryDeepPartialEntity[] + ): Promise { + const queryBuilder = this.createQueryBuilder() + .insert() + .into(ProductTag) + .values(data) + + if (!queryBuilder.connection.driver.isReturningSqlSupported("insert")) { + const rawTags = await queryBuilder.execute() + return rawTags.generatedMaps.map((d) => this.create(d)) as ProductTag[] + } + + const rawTags = await queryBuilder.returning("*").execute() + return rawTags.generatedMaps.map((d) => this.create(d)) + }, + + async listTagsByUsage(take = 10): Promise { + const qb = this.createQueryBuilder("pt") + .select(["id", "COUNT(pts.product_tag_id) as usage_count", "value"]) + .leftJoin("product_tags", "pts", "pt.id = pts.product_tag_id") + .groupBy("id") + .orderBy("usage_count", "DESC") + .limit(take) + + return await qb.getRawMany() }, async upsertTags(tags: UpsertTagsInput): Promise { @@ -52,6 +67,7 @@ export const ProductTagRepository = dataSource ) const upsertedTags: ProductTag[] = [] + const tagsToCreate: QueryDeepPartialEntity[] = [] for (const tag of tags) { const aTag = existingTagsMap.get(tag.value) @@ -59,11 +75,15 @@ export const ProductTagRepository = dataSource upsertedTags.push(aTag) } else { const newTag = this.create(tag) - const savedTag = await this.save(newTag) - upsertedTags.push(savedTag) + tagsToCreate.push(newTag as QueryDeepPartialEntity) } } + if (tagsToCreate.length) { + const newTags = await this.insertBulk(tagsToCreate) + upsertedTags.push(...newTags) + } + return upsertedTags }, diff --git a/packages/medusa/src/repositories/staged-job.ts b/packages/medusa/src/repositories/staged-job.ts index ad3159df4a..c7e88c55e1 100644 --- a/packages/medusa/src/repositories/staged-job.ts +++ b/packages/medusa/src/repositories/staged-job.ts @@ -9,7 +9,6 @@ export const StagedJobRepository = dataSource.getRepository(StagedJob).extend({ .into(StagedJob) .values(jobToCreates) - // TODO: remove if statement once this issue is resolved https://github.com/typeorm/typeorm/issues/9850 if (!queryBuilder.connection.driver.isReturningSqlSupported("insert")) { const rawStagedJobs = await queryBuilder.execute() return rawStagedJobs.generatedMaps.map((d) => this.create(d)) diff --git a/packages/medusa/src/services/product.ts b/packages/medusa/src/services/product.ts index 9c6cae9074..9f2440d702 100644 --- a/packages/medusa/src/services/product.ts +++ b/packages/medusa/src/services/product.ts @@ -326,12 +326,12 @@ class ProductService extends TransactionBaseService { return await productTypeRepository.find({}) } - async listTagsByUsage(count = 10): Promise { + async listTagsByUsage(take = 10): Promise { const productTagRepo = this.activeManager_.withRepository( this.productTagRepository_ ) - return await productTagRepo.listTagsByUsage(count) + return await productTagRepo.listTagsByUsage(take) } /**