Chore/rm main entity concept (#7709)

**What**
Update the `MedusaService` class, factory and types to remove the concept of main modules. The idea being that all method will be explicitly named and suffixes to represent the object you are trying to manipulate.
This pr also includes various fixes in different modules

Co-authored-by: Stevche Radevski <4820812+sradevski@users.noreply.github.com>
Co-authored-by: Oli Juhl <59018053+olivermrbl@users.noreply.github.com>
This commit is contained in:
Adrien de Peretti
2024-06-19 13:02:16 +00:00
committed by GitHub
co-authored by Stevche Radevski Oli Juhl
parent 2895ccfba8
commit 48963f55ef
533 changed files with 6469 additions and 9769 deletions
@@ -17,7 +17,7 @@ type Service = IProductModuleService & {
moduleIntegrationTestRunner<Service>({
moduleName: Modules.PRODUCT,
testSuite: ({ MikroOrmWrapper, service: moduleService }) => {
testSuite: ({ service: moduleService }) => {
describe("Product category Service", () => {
let service: ProductCategoryService
@@ -53,7 +53,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
productCategories = []
for (const entry of productCategoriesData) {
productCategories.push(await service.createCategories(entry))
productCategories.push(await service.createProductCategories(entry))
}
productCategoryOne = productCategories[0]
productCategoryTwo = productCategories[1]
@@ -65,7 +65,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("listCategories", () => {
it("should return categories queried by ID", async () => {
const results = await service.listCategories({
const results = await service.listProductCategories({
id: productCategoryOne.id,
})
@@ -77,7 +77,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return categories based on the options and filter parameter", async () => {
let results = await service.listCategories(
let results = await service.listProductCategories(
{
id: productCategoryOne.id,
},
@@ -92,7 +92,10 @@ moduleIntegrationTestRunner<IProductModuleService>({
}),
])
results = await service.listCategories({}, { take: 1, skip: 1 })
results = await service.listProductCategories(
{},
{ take: 1, skip: 1 }
)
expect(results).toEqual([
expect.objectContaining({
@@ -102,7 +105,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return only requested fields and relations for categories", async () => {
const results = await service.listCategories(
const results = await service.listProductCategories(
{
id: productCategoryOne.id,
},
@@ -129,7 +132,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("listAndCountCategories", () => {
it("should return categories and count queried by ID", async () => {
const results = await service.listAndCountCategories({
const results = await service.listAndCountProductCategories({
id: productCategoryOne.id,
})
@@ -142,7 +145,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return categories and count based on the options and filter parameter", async () => {
let results = await service.listAndCountCategories(
let results = await service.listAndCountProductCategories(
{
id: productCategoryOne.id,
},
@@ -158,11 +161,11 @@ moduleIntegrationTestRunner<IProductModuleService>({
}),
])
results = await service.listAndCountCategories({}, { take: 1 })
results = await service.listAndCountProductCategories({}, { take: 1 })
expect(results[1]).toEqual(2)
results = await service.listAndCountCategories(
results = await service.listAndCountProductCategories(
{},
{ take: 1, skip: 1 }
)
@@ -176,7 +179,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return only requested fields and relations for categories", async () => {
const results = await service.listAndCountCategories(
const results = await service.listAndCountProductCategories(
{
id: productCategoryOne.id,
},
@@ -204,9 +207,12 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("retrieveCategory", () => {
it("should return the requested category", async () => {
const result = await service.retrieveCategory(productCategoryOne.id, {
select: ["id", "name"],
})
const result = await service.retrieveProductCategory(
productCategoryOne.id,
{
select: ["id", "name"],
}
)
expect(result).toEqual(
expect.objectContaining({
@@ -217,10 +223,13 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return requested attributes when requested through config", async () => {
const result = await service.retrieveCategory(productCategoryOne.id, {
select: ["id", "name", "products.title"],
relations: ["products"],
})
const result = await service.retrieveProductCategory(
productCategoryOne.id,
{
select: ["id", "name", "products.title"],
relations: ["products"],
}
)
expect(result).toEqual(
expect.objectContaining({
@@ -240,7 +249,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
let error
try {
await service.retrieveCategory("does-not-exist")
await service.retrieveProductCategory("does-not-exist")
} catch (e) {
error = e
}
@@ -253,12 +262,12 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("createCategory", () => {
it("should create a category successfully", async () => {
await service.createCategories({
await service.createProductCategories({
name: "New Category",
parent_category_id: productCategoryOne.id,
})
const [productCategory] = await service.listCategories(
const [productCategory] = await service.listProductCategories(
{
name: "New Category",
},
@@ -278,7 +287,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
it("should emit events through event bus", async () => {
const eventBusSpy = jest.spyOn(MockEventBusService.prototype, "emit")
const category = await service.createCategories({
const category = await service.createProductCategories({
name: "New Category",
parent_category_id: productCategoryOne.id,
})
@@ -293,18 +302,18 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should append rank from an existing category depending on parent", async () => {
await service.createCategories({
await service.createProductCategories({
name: "New Category",
parent_category_id: productCategoryOne.id,
rank: 0,
})
await service.createCategories({
await service.createProductCategories({
name: "New Category 2",
parent_category_id: productCategoryOne.id,
})
const [productCategoryNew] = await service.listCategories(
const [productCategoryNew] = await service.listProductCategories(
{
name: "New Category 2",
},
@@ -320,19 +329,20 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
)
await service.createCategories({
await service.createProductCategories({
name: "New Category 2.1",
parent_category_id: productCategoryNew.id,
})
const [productCategoryWithParent] = await service.listCategories(
{
name: "New Category 2.1",
},
{
select: ["name", "rank", "parent_category_id"],
}
)
const [productCategoryWithParent] =
await service.listProductCategories(
{
name: "New Category 2.1",
},
{
select: ["name", "rank", "parent_category_id"],
}
)
expect(productCategoryWithParent).toEqual(
expect.objectContaining({
@@ -356,7 +366,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
beforeEach(async () => {
categories = []
for (const entry of productCategoriesRankData) {
categories.push(await service.createCategories(entry))
categories.push(await service.createProductCategories(entry))
}
productCategoryZero = categories[0]
@@ -371,7 +381,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
const eventBusSpy = jest.spyOn(MockEventBusService.prototype, "emit")
eventBusSpy.mockClear()
await service.updateCategories(productCategoryZero.id, {
await service.updateProductCategories(productCategoryZero.id, {
name: "New Category",
})
@@ -385,11 +395,11 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should update the name of the category successfully", async () => {
await service.updateCategories(productCategoryZero.id, {
await service.updateProductCategories(productCategoryZero.id, {
name: "New Category",
})
const productCategory = await service.retrieveCategory(
const productCategory = await service.retrieveProductCategory(
productCategoryZero.id,
{
select: ["name"],
@@ -403,7 +413,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
let error
try {
await service.updateCategories("does-not-exist", {
await service.updateProductCategories("does-not-exist", {
name: "New Category",
})
} catch (e) {
@@ -416,11 +426,11 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should reorder rank successfully in the same parent", async () => {
await service.updateCategories(productCategoryTwo.id, {
await service.updateProductCategories(productCategoryTwo.id, {
rank: 0,
})
const productCategories = await service.listCategories(
const productCategories = await service.listProductCategories(
{
parent_category_id: null,
},
@@ -448,12 +458,12 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should reorder rank successfully when changing parent", async () => {
await service.updateCategories(productCategoryTwo.id, {
await service.updateProductCategories(productCategoryTwo.id, {
rank: 0,
parent_category_id: productCategoryZero.id,
})
const productCategories = await service.listCategories(
const productCategories = await service.listProductCategories(
{
parent_category_id: productCategoryZero.id,
},
@@ -485,12 +495,12 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should reorder rank successfully when changing parent and in first position", async () => {
await service.updateCategories(productCategoryTwo.id, {
await service.updateProductCategories(productCategoryTwo.id, {
rank: 0,
parent_category_id: productCategoryZero.id,
})
const productCategories = await service.listCategories(
const productCategories = await service.listProductCategories(
{
parent_category_id: productCategoryZero.id,
},
@@ -531,7 +541,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
beforeEach(async () => {
categories = []
for (const entry of productCategoriesRankData) {
categories.push(await service.createCategories(entry))
categories.push(await service.createProductCategories(entry))
}
productCategoryZero = categories[0]
@@ -544,7 +554,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
const eventBusSpy = jest.spyOn(MockEventBusService.prototype, "emit")
eventBusSpy.mockClear()
await service.deleteCategories([productCategoryOne.id])
await service.deleteProductCategories([productCategoryOne.id])
expect(eventBusSpy).toHaveBeenCalledTimes(1)
expect(eventBusSpy).toHaveBeenCalledWith([
@@ -559,7 +569,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
let error
try {
await service.deleteCategories(["does-not-exist"])
await service.deleteProductCategories(["does-not-exist"])
} catch (e) {
error = e
}
@@ -573,7 +583,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
let error
try {
await service.deleteCategories([productCategoryZero.id])
await service.deleteProductCategories([productCategoryZero.id])
} catch (e) {
error = e
}
@@ -584,9 +594,9 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should reorder siblings rank successfully on deleting", async () => {
await service.deleteCategories([productCategoryOne.id])
await service.deleteProductCategories([productCategoryOne.id])
const productCategories = await service.listCategories(
const productCategories = await service.listProductCategories(
{
parent_category_id: null,
},
@@ -66,7 +66,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("listCollections", () => {
it("should return collections queried by ID", async () => {
const results = await service.listCollections({
const results = await service.listProductCollections({
id: productCollectionOne.id,
})
@@ -78,7 +78,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return collections based on the options and filter parameter", async () => {
let results = await service.listCollections(
let results = await service.listProductCollections(
{
id: productCollectionOne.id,
},
@@ -93,7 +93,10 @@ moduleIntegrationTestRunner<IProductModuleService>({
}),
])
results = await service.listCollections({}, { take: 1, skip: 1 })
results = await service.listProductCollections(
{},
{ take: 1, skip: 1 }
)
expect(results).toEqual([
expect.objectContaining({
@@ -103,7 +106,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return only requested fields and relations for collections", async () => {
const results = await service.listCollections(
const results = await service.listProductCollections(
{
id: productCollectionOne.id,
},
@@ -130,7 +133,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("listAndCountCollections", () => {
it("should return collections and count queried by ID", async () => {
const results = await service.listAndCountCollections({
const results = await service.listAndCountProductCollections({
id: productCollectionOne.id,
})
@@ -143,7 +146,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return collections and count based on the options and filter parameter", async () => {
let results = await service.listAndCountCollections(
let results = await service.listAndCountProductCollections(
{
id: productCollectionOne.id,
},
@@ -159,11 +162,14 @@ moduleIntegrationTestRunner<IProductModuleService>({
}),
])
results = await service.listAndCountCollections({}, { take: 1 })
results = await service.listAndCountProductCollections(
{},
{ take: 1 }
)
expect(results[1]).toEqual(2)
results = await service.listAndCountCollections(
results = await service.listAndCountProductCollections(
{},
{ take: 1, skip: 1 }
)
@@ -177,7 +183,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return only requested fields and relations for collections", async () => {
const results = await service.listAndCountCollections(
const results = await service.listAndCountProductCollections(
{
id: productCollectionOne.id,
},
@@ -205,7 +211,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("retrieveCollection", () => {
it("should return the requested collection", async () => {
const result = await service.retrieveCollection(
const result = await service.retrieveProductCollection(
productCollectionOne.id
)
@@ -218,7 +224,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return requested attributes when requested through config", async () => {
const result = await service.retrieveCollection(
const result = await service.retrieveProductCollection(
productCollectionOne.id,
{
select: ["id", "title", "products.title"],
@@ -244,7 +250,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
let error
try {
await service.retrieveCollection("does-not-exist")
await service.retrieveProductCollection("does-not-exist")
} catch (e) {
error = e
}
@@ -259,9 +265,9 @@ moduleIntegrationTestRunner<IProductModuleService>({
const collectionId = "test-1"
it("should delete the product collection given an ID successfully", async () => {
await service.deleteCollections([collectionId])
await service.deleteProductCollections([collectionId])
const collections = await service.listCollections({
const collections = await service.listProductCollections({
id: collectionId,
})
@@ -270,7 +276,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
it("should emit events through event bus", async () => {
const eventBusSpy = jest.spyOn(MockEventBusService.prototype, "emit")
await service.deleteCollections([collectionId])
await service.deleteProductCollections([collectionId])
expect(eventBusSpy).toHaveBeenCalledTimes(1)
expect(eventBusSpy).toHaveBeenCalledWith([
@@ -288,7 +294,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
it("should emit events through event bus", async () => {
const eventBusSpy = jest.spyOn(MockEventBusService.prototype, "emit")
await service.upsertCollections([
await service.upsertProductCollections([
{
id: collectionId,
title: "New Collection",
@@ -305,14 +311,14 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should update the value of the collection successfully", async () => {
await service.upsertCollections([
await service.upsertProductCollections([
{
id: collectionId,
title: "New Collection",
},
])
const productCollection = await service.retrieveCollection(
const productCollection = await service.retrieveProductCollection(
collectionId
)
@@ -320,14 +326,14 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should add products to a collection successfully", async () => {
await service.upsertCollections([
await service.upsertProductCollections([
{
id: collectionId,
product_ids: [productOne.id, productTwo.id],
},
])
const productCollection = await service.retrieveCollection(
const productCollection = await service.retrieveProductCollection(
collectionId,
{
select: ["products.id"],
@@ -354,7 +360,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
let error
try {
await service.updateCollections("does-not-exist", {
await service.updateProductCollections("does-not-exist", {
title: "New Collection",
})
} catch (e) {
@@ -367,7 +373,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should dissociate existing products when new products are synced", async () => {
await service.upsertCollections([
await service.upsertProductCollections([
{
id: collectionId,
product_ids: [productOne.id, productTwo.id],
@@ -377,14 +383,14 @@ moduleIntegrationTestRunner<IProductModuleService>({
/**
* Another upsert should remove the first productOne
*/
await service.upsertCollections([
await service.upsertProductCollections([
{
id: collectionId,
product_ids: [productTwo.id],
},
])
const productCollection = await service.retrieveCollection(
const productCollection = await service.retrieveProductCollection(
collectionId,
{
select: ["products.id"],
@@ -405,7 +411,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should dissociate all existing products", async () => {
await service.upsertCollections([
await service.upsertProductCollections([
{
id: collectionId,
product_ids: [productOne.id, productTwo.id],
@@ -415,14 +421,14 @@ moduleIntegrationTestRunner<IProductModuleService>({
/**
* Another upsert should remove the first productOne
*/
await service.upsertCollections([
await service.upsertProductCollections([
{
id: collectionId,
product_ids: [],
},
])
const productCollection = await service.retrieveCollection(
const productCollection = await service.retrieveProductCollection(
collectionId,
{
select: ["products.id"],
@@ -436,13 +442,13 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("createCollections", () => {
it("should create a collection successfully", async () => {
const res = await service.createCollections([
const res = await service.createProductCollections([
{
title: "New Collection",
},
])
const [productCollection] = await service.listCollections({
const [productCollection] = await service.listProductCollections({
title: "New Collection",
})
@@ -450,7 +456,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should create collection with products successfully", async () => {
await service.createCollections([
await service.createProductCollections([
{
title: "New Collection with products",
handle: "new-collection-with-products",
@@ -458,7 +464,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
},
])
const [productCollection] = await service.listCollections(
const [productCollection] = await service.listProductCollections(
{
handle: "new-collection-with-products",
},
@@ -487,7 +493,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
it("should emit events through event bus", async () => {
const eventBusSpy = jest.spyOn(MockEventBusService.prototype, "emit")
const collections = await service.createCollections([
const collections = await service.createProductCollections([
{ title: "New Collection" },
])
@@ -46,7 +46,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("listOptions", () => {
it("should return options and count queried by ID", async () => {
const options = await service.listOptions({
const options = await service.listProductOptions({
id: optionOne.id,
})
@@ -58,7 +58,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return options and count based on the options and filter parameter", async () => {
let options = await service.listOptions(
let options = await service.listProductOptions(
{
id: optionOne.id,
},
@@ -73,7 +73,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
}),
])
options = await service.listOptions({}, { take: 1, skip: 1 })
options = await service.listProductOptions({}, { take: 1, skip: 1 })
expect(options).toEqual([
expect.objectContaining({
@@ -83,7 +83,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return only requested fields and relations for options", async () => {
const options = await service.listOptions(
const options = await service.listProductOptions(
{
id: optionOne.id,
},
@@ -111,7 +111,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("listAndCountOptions", () => {
it("should return options and count queried by ID", async () => {
const [options, count] = await service.listAndCountOptions({
const [options, count] = await service.listAndCountProductOptions({
id: optionOne.id,
})
@@ -124,7 +124,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return options and count based on the options and filter parameter", async () => {
let [options, count] = await service.listAndCountOptions(
let [options, count] = await service.listAndCountProductOptions(
{
id: optionOne.id,
},
@@ -139,10 +139,13 @@ moduleIntegrationTestRunner<IProductModuleService>({
id: optionOne.id,
}),
])
;[options, count] = await service.listAndCountOptions({}, { take: 1 })
;[options, count] = await service.listAndCountProductOptions(
{},
{ take: 1 }
)
expect(count).toEqual(2)
;[options, count] = await service.listAndCountOptions(
;[options, count] = await service.listAndCountProductOptions(
{},
{ take: 1, skip: 1 }
)
@@ -156,7 +159,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return only requested fields and relations for options", async () => {
const [options, count] = await service.listAndCountOptions(
const [options, count] = await service.listAndCountProductOptions(
{
id: optionOne.id,
},
@@ -185,7 +188,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("retrieveOption", () => {
it("should return the requested option", async () => {
const option = await service.retrieveOption(optionOne.id)
const option = await service.retrieveProductOption(optionOne.id)
expect(option).toEqual(
expect.objectContaining({
@@ -195,7 +198,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return requested attributes when requested through config", async () => {
const option = await service.retrieveOption(optionOne.id, {
const option = await service.retrieveProductOption(optionOne.id, {
select: ["id", "product.title"],
relations: ["product"],
})
@@ -219,7 +222,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
let error
try {
await service.retrieveOption("does-not-exist")
await service.retrieveProductOption("does-not-exist")
} catch (e) {
error = e
}
@@ -234,9 +237,9 @@ moduleIntegrationTestRunner<IProductModuleService>({
const optionId = "option-1"
it("should delete the product option given an ID successfully", async () => {
await service.deleteOptions([optionId])
await service.deleteProductOptions([optionId])
const options = await service.listOptions({
const options = await service.listProductOptions({
id: optionId,
})
@@ -248,14 +251,14 @@ moduleIntegrationTestRunner<IProductModuleService>({
const optionId = "option-1"
it("should update the title of the option successfully", async () => {
await service.upsertOptions([
await service.upsertProductOptions([
{
id: optionId,
title: "new test",
},
])
const productOption = await service.retrieveOption(optionId)
const productOption = await service.retrieveProductOption(optionId)
expect(productOption.title).toEqual("new test")
})
@@ -264,7 +267,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
let error
try {
await service.updateOptions("does-not-exist", {})
await service.updateProductOptions("does-not-exist", {})
} catch (e) {
error = e
}
@@ -277,7 +280,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("createOptions", () => {
it("should create a option successfully", async () => {
const res = await service.createOptions([
const res = await service.createProductOptions([
{
title: "test",
values: [],
@@ -285,7 +288,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
},
])
const [productOption] = await service.listOptions(
const [productOption] = await service.listProductOptions(
{
title: "test",
},
@@ -64,7 +64,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("listTags", () => {
it("should return tags and count queried by ID", async () => {
const tags = await service.listTags({
const tags = await service.listProductTags({
id: tagOne.id,
})
@@ -76,7 +76,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return tags and count based on the options and filter parameter", async () => {
let tags = await service.listTags(
let tags = await service.listProductTags(
{
id: tagOne.id,
},
@@ -91,7 +91,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
}),
])
tags = await service.listTags({}, { take: 1, skip: 1 })
tags = await service.listProductTags({}, { take: 1, skip: 1 })
expect(tags).toEqual([
expect.objectContaining({
@@ -101,7 +101,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return only requested fields and relations for tags", async () => {
const tags = await service.listTags(
const tags = await service.listProductTags(
{
id: tagOne.id,
},
@@ -130,7 +130,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("listAndCountTags", () => {
it("should return tags and count queried by ID", async () => {
const [tags, count] = await service.listAndCountTags({
const [tags, count] = await service.listAndCountProductTags({
id: tagOne.id,
})
@@ -143,7 +143,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return tags and count based on the options and filter parameter", async () => {
let [tags, count] = await service.listAndCountTags(
let [tags, count] = await service.listAndCountProductTags(
{
id: tagOne.id,
},
@@ -158,10 +158,13 @@ moduleIntegrationTestRunner<IProductModuleService>({
id: tagOne.id,
}),
])
;[tags, count] = await service.listAndCountTags({}, { take: 1 })
;[tags, count] = await service.listAndCountProductTags(
{},
{ take: 1 }
)
expect(count).toEqual(2)
;[tags, count] = await service.listAndCountTags(
;[tags, count] = await service.listAndCountProductTags(
{},
{ take: 1, skip: 1 }
)
@@ -175,7 +178,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return only requested fields and relations for tags", async () => {
const [tags, count] = await service.listAndCountTags(
const [tags, count] = await service.listAndCountProductTags(
{
id: tagOne.id,
},
@@ -205,7 +208,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("retrieveTag", () => {
it("should return the requested tag", async () => {
const tag = await service.retrieveTag(tagOne.id)
const tag = await service.retrieveProductTag(tagOne.id)
expect(tag).toEqual(
expect.objectContaining({
@@ -215,7 +218,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return requested attributes when requested through config", async () => {
const tag = await service.retrieveTag(tagOne.id, {
const tag = await service.retrieveProductTag(tagOne.id, {
select: ["id", "value", "products.title"],
relations: ["products"],
})
@@ -237,7 +240,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
let error
try {
await service.retrieveTag("does-not-exist")
await service.retrieveProductTag("does-not-exist")
} catch (e) {
error = e
}
@@ -252,9 +255,9 @@ moduleIntegrationTestRunner<IProductModuleService>({
const tagId = "tag-1"
it("should delete the product tag given an ID successfully", async () => {
await service.deleteTags([tagId])
await service.deleteProductTags([tagId])
const tags = await service.listTags({
const tags = await service.listProductTags({
id: tagId,
})
@@ -266,11 +269,11 @@ moduleIntegrationTestRunner<IProductModuleService>({
const tagId = "tag-1"
it("should update the value of the tag successfully", async () => {
await service.updateTags(tagId, {
await service.updateProductTags(tagId, {
value: "UK",
})
const productTag = await service.retrieveTag(tagId)
const productTag = await service.retrieveProductTag(tagId)
expect(productTag.value).toEqual("UK")
@@ -289,7 +292,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
let error
try {
await service.updateTags("does-not-exist", {
await service.updateProductTags("does-not-exist", {
value: "UK",
})
} catch (e) {
@@ -304,13 +307,13 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("createTags", () => {
it("should create a tag successfully", async () => {
await service.createTags([
await service.createProductTags([
{
value: "UK",
},
])
const productTag = await service.listTags({
const productTag = await service.listProductTags({
value: "UK",
})
@@ -330,13 +333,13 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("upsertTags", () => {
it("should upsert tags successfully", async () => {
await service.createTags([
await service.createProductTags([
{
value: "UK",
},
])
let productTags = await service.listTags({
let productTags = await service.listProductTags({
value: "UK",
})
@@ -352,9 +355,9 @@ moduleIntegrationTestRunner<IProductModuleService>({
jest.clearAllMocks()
await service.upsertTags(tagsData)
await service.upsertProductTags(tagsData)
productTags = await service.listTags()
productTags = await service.listProductTags()
expect(productTags).toEqual(
expect.arrayContaining([
@@ -30,7 +30,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("listTypes", () => {
it("should return types and count queried by ID", async () => {
const types = await service.listTypes({
const types = await service.listProductTypes({
id: typeOne.id,
})
@@ -42,7 +42,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return types and count based on the options and filter parameter", async () => {
let types = await service.listTypes(
let types = await service.listProductTypes(
{
id: typeOne.id,
},
@@ -57,7 +57,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
}),
])
types = await service.listTypes({}, { take: 1, skip: 1 })
types = await service.listProductTypes({}, { take: 1, skip: 1 })
expect(types).toEqual([
expect.objectContaining({
@@ -67,7 +67,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return only requested fields for types", async () => {
const types = await service.listTypes(
const types = await service.listProductTypes(
{
id: typeOne.id,
},
@@ -88,7 +88,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("listAndCountTypes", () => {
it("should return types and count queried by ID", async () => {
const [types, count] = await service.listAndCountTypes({
const [types, count] = await service.listAndCountProductTypes({
id: typeOne.id,
})
@@ -101,7 +101,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return types and count based on the options and filter parameter", async () => {
let [types, count] = await service.listAndCountTypes(
let [types, count] = await service.listAndCountProductTypes(
{
id: typeOne.id,
},
@@ -116,10 +116,13 @@ moduleIntegrationTestRunner<IProductModuleService>({
id: typeOne.id,
}),
])
;[types, count] = await service.listAndCountTypes({}, { take: 1 })
;[types, count] = await service.listAndCountProductTypes(
{},
{ take: 1 }
)
expect(count).toEqual(2)
;[types, count] = await service.listAndCountTypes(
;[types, count] = await service.listAndCountProductTypes(
{},
{ take: 1, skip: 1 }
)
@@ -133,7 +136,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return only requested fields for types", async () => {
const [types, count] = await service.listAndCountTypes(
const [types, count] = await service.listAndCountProductTypes(
{
id: typeOne.id,
},
@@ -155,7 +158,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("retrieveType", () => {
it("should return the requested type", async () => {
const type = await service.retrieveType(typeOne.id)
const type = await service.retrieveProductType(typeOne.id)
expect(type).toEqual(
expect.objectContaining({
@@ -165,7 +168,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return requested attributes when requested through config", async () => {
const type = await service.retrieveType(typeOne.id, {
const type = await service.retrieveProductType(typeOne.id, {
select: ["id", "value"],
})
@@ -179,7 +182,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
let error
try {
await service.retrieveType("does-not-exist")
await service.retrieveProductType("does-not-exist")
} catch (e) {
error = e
}
@@ -194,9 +197,9 @@ moduleIntegrationTestRunner<IProductModuleService>({
const typeId = "type-1"
it("should delete the product type given an ID successfully", async () => {
await service.deleteTypes([typeId])
await service.deleteProductTypes([typeId])
const types = await service.listTypes({
const types = await service.listProductTypes({
id: typeId,
})
@@ -208,11 +211,11 @@ moduleIntegrationTestRunner<IProductModuleService>({
const typeId = "type-1"
it("should update the value of the type successfully", async () => {
await service.updateTypes(typeId, {
await service.updateProductTypes(typeId, {
value: "UK",
})
const productType = await service.retrieveType(typeId)
const productType = await service.retrieveProductType(typeId)
expect(productType.value).toEqual("UK")
})
@@ -221,7 +224,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
let error
try {
await service.updateTypes("does-not-exist", {
await service.updateProductTypes("does-not-exist", {
value: "UK",
})
} catch (e) {
@@ -236,13 +239,13 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("createTypes", () => {
it("should create a type successfully", async () => {
const res = await service.createTypes([
const res = await service.createProductTypes([
{
value: "UK",
},
])
const productType = await service.listTypes({
const productType = await service.listProductTypes({
value: "UK",
})
@@ -40,7 +40,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
let productTwo: ProductDTO
beforeEach(async () => {
productOne = await service.create({
productOne = await service.createProducts({
id: "product-1",
title: "product 1",
status: ProductStatus.PUBLISHED,
@@ -56,20 +56,20 @@ moduleIntegrationTestRunner<IProductModuleService>({
],
} as CreateProductDTO)
productTwo = await service.create({
productTwo = await service.createProducts({
id: "product-2",
title: "product 2",
status: ProductStatus.PUBLISHED,
} as CreateProductDTO)
variantOne = await service.createVariants({
variantOne = await service.createProductVariants({
id: "test-1",
title: "variant 1",
product_id: productOne.id,
options: { size: "large" },
} as CreateProductVariantDTO)
variantTwo = await service.createVariants({
variantTwo = await service.createProductVariants({
id: "test-2",
title: "variant",
product_id: productTwo.id,
@@ -80,7 +80,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("listAndCountVariants", () => {
it("should return variants and count queried by ID", async () => {
const results = await service.listAndCountVariants({
const results = await service.listAndCountProductVariants({
id: variantOne.id,
})
@@ -93,7 +93,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return variants and count based on the options and filter parameter", async () => {
let results = await service.listAndCountVariants(
let results = await service.listAndCountProductVariants(
{
id: variantOne.id,
},
@@ -109,11 +109,14 @@ moduleIntegrationTestRunner<IProductModuleService>({
}),
])
results = await service.listAndCountVariants({}, { take: 1 })
results = await service.listAndCountProductVariants({}, { take: 1 })
expect(results[1]).toEqual(2)
results = await service.listAndCountVariants({}, { take: 1, skip: 1 })
results = await service.listAndCountProductVariants(
{},
{ take: 1, skip: 1 }
)
expect(results[1]).toEqual(2)
expect(results[0]).toEqual([
@@ -124,7 +127,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return only requested fields and relations for variants", async () => {
const results = await service.listAndCountVariants(
const results = await service.listAndCountProductVariants(
{
id: variantOne.id,
},
@@ -151,7 +154,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("retrieveVariant", () => {
it("should return the requested variant", async () => {
const result = await service.retrieveVariant(variantOne.id)
const result = await service.retrieveProductVariant(variantOne.id)
expect(result).toEqual(
expect.objectContaining({
@@ -162,7 +165,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return requested attributes when requested through config", async () => {
const result = await service.retrieveVariant(variantOne.id, {
const result = await service.retrieveProductVariant(variantOne.id, {
select: ["id", "title", "product.title"] as any,
relations: ["product"],
})
@@ -183,7 +186,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
let error
try {
await service.retrieveVariant("does-not-exist")
await service.retrieveProductVariant("does-not-exist")
} catch (e) {
error = e
}
@@ -196,14 +199,16 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("updateVariants", () => {
it("should update the title of the variant successfully", async () => {
await service.upsertVariants([
await service.upsertProductVariants([
{
id: variantOne.id,
title: "new test",
},
])
const productVariant = await service.retrieveVariant(variantOne.id)
const productVariant = await service.retrieveProductVariant(
variantOne.id
)
expect(productVariant.title).toEqual("new test")
expect(eventBusEmitSpy.mock.calls[0][0]).toHaveLength(1)
@@ -218,16 +223,19 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should upsert the options of a variant successfully", async () => {
await service.upsertVariants([
await service.upsertProductVariants([
{
id: variantOne.id,
options: { size: "small" },
},
])
const productVariant = await service.retrieveVariant(variantOne.id, {
relations: ["options"],
})
const productVariant = await service.retrieveProductVariant(
variantOne.id,
{
relations: ["options"],
}
)
expect(productVariant.options).toEqual(
expect.arrayContaining([
expect.objectContaining({
@@ -248,13 +256,16 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should do a partial update on the options of a variant successfully", async () => {
await service.updateVariants(variantOne.id, {
await service.updateProductVariants(variantOne.id, {
options: { size: "small", color: "red" },
})
const productVariant = await service.retrieveVariant(variantOne.id, {
relations: ["options"],
})
const productVariant = await service.retrieveProductVariant(
variantOne.id,
{
relations: ["options"],
}
)
expect(productVariant.options).toEqual(
expect.arrayContaining([
@@ -272,7 +283,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
let error
try {
await service.updateVariants("does-not-exist", {})
await service.updateProductVariants("does-not-exist", {})
} catch (e) {
error = e
}
@@ -293,7 +304,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
options: { size: "small" },
}
const variant = await service.createVariants(data)
const variant = await service.createProductVariants(data)
expect(variant).toEqual(
expect.objectContaining({
@@ -321,15 +332,15 @@ moduleIntegrationTestRunner<IProductModuleService>({
describe("softDelete variant", () => {
it("should soft delete a variant and its relations", async () => {
const beforeDeletedVariants = await service.listVariants(
const beforeDeletedVariants = await service.listProductVariants(
{ id: variantOne.id },
{
relations: ["options"],
}
)
await service.softDeleteVariants([variantOne.id])
const deletedVariants = await service.listVariants(
await service.softDeleteProductVariants([variantOne.id])
const deletedVariants = await service.listProductVariants(
{ id: variantOne.id },
{
relations: ["options"],
@@ -102,13 +102,13 @@ moduleIntegrationTestRunner<IProductModuleService>({
const categories: ProductCategoryDTO[] = []
for (const entry of productCategoriesData) {
categories.push(await service.createCategories(entry))
categories.push(await service.createProductCategories(entry))
}
productCategoryOne = categories[0]
productCategoryTwo = categories[1]
productOne = service.create({
productOne = service.createProducts({
id: "product-1",
title: "product 1",
status: ProductStatus.PUBLISHED,
@@ -120,7 +120,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
],
})
productTwo = service.create({
productTwo = service.createProducts({
id: "product-2",
title: "product 2",
status: ProductStatus.PUBLISHED,
@@ -166,7 +166,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
const variantTitle = data.variants[0].title
const productBefore = (await service.retrieve(productOne.id, {
const productBefore = (await service.retrieveProduct(productOne.id, {
relations: [
"images",
"variants",
@@ -187,10 +187,10 @@ moduleIntegrationTestRunner<IProductModuleService>({
productBefore.images = data.images
productBefore.thumbnail = data.thumbnail
productBefore.tags = data.tags
const updatedProducts = await service.upsert([productBefore])
const updatedProducts = await service.upsertProducts([productBefore])
expect(updatedProducts).toHaveLength(1)
const product = await service.retrieve(productBefore.id, {
const product = await service.retrieveProduct(productBefore.id, {
relations: [
"images",
"variants",
@@ -279,7 +279,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
title: "updated title",
}
await service.upsert([updateData])
await service.upsertProducts([updateData])
expect(eventBusSpy).toHaveBeenCalledTimes(1)
expect(eventBusSpy).toHaveBeenCalledWith([
@@ -302,9 +302,9 @@ moduleIntegrationTestRunner<IProductModuleService>({
type_id: productTypeOne.id,
}
await service.upsert([updateData])
await service.upsertProducts([updateData])
const product = await service.retrieve(updateData.id, {
const product = await service.retrieveProduct(updateData.id, {
relations: ["categories", "collection", "type"],
})
@@ -332,9 +332,9 @@ moduleIntegrationTestRunner<IProductModuleService>({
type_id: productTypeOne.id,
}
await service.upsert([updateData])
await service.upsertProducts([updateData])
let product = await service.retrieve(updateData.id, {
let product = await service.retrieveProduct(updateData.id, {
relations: ["type"],
})
@@ -366,9 +366,9 @@ moduleIntegrationTestRunner<IProductModuleService>({
tags: [newTagData],
}
await service.upsert([updateData])
await service.upsertProducts([updateData])
const product = await service.retrieve(updateData.id, {
const product = await service.retrieveProduct(updateData.id, {
relations: ["categories", "collection", "tags", "type"],
})
@@ -405,9 +405,9 @@ moduleIntegrationTestRunner<IProductModuleService>({
tags: [],
}
await service.upsert([updateData])
await service.upsertProducts([updateData])
const product = await service.retrieve(updateData.id, {
const product = await service.retrieveProduct(updateData.id, {
relations: ["categories", "collection", "tags"],
})
@@ -425,7 +425,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
it("should throw an error when product ID does not exist", async () => {
let error
try {
await service.update("does-not-exist", { title: "test" })
await service.updateProducts("does-not-exist", { title: "test" })
} catch (e) {
error = e.message
}
@@ -448,9 +448,9 @@ moduleIntegrationTestRunner<IProductModuleService>({
],
}
await service.upsert([updateData])
await service.upsertProducts([updateData])
const product = await service.retrieve(updateData.id, {
const product = await service.retrieveProduct(updateData.id, {
relations: ["variants"],
})
@@ -473,7 +473,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should do a partial update on the options of a variant successfully", async () => {
await service.update(productTwo.id, {
await service.updateProducts(productTwo.id, {
variants: [
{
id: "variant-3",
@@ -482,7 +482,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
],
})
const fetchedProduct = await service.retrieve(productTwo.id, {
const fetchedProduct = await service.retrieveProduct(productTwo.id, {
relations: ["variants", "variants.options"],
})
@@ -513,8 +513,8 @@ moduleIntegrationTestRunner<IProductModuleService>({
],
}
await service.upsert([updateData])
const retrieved = await service.retrieve(updateData.id, {
await service.upsertProducts([updateData])
const retrieved = await service.retrieveProduct(updateData.id, {
relations: ["variants"],
})
@@ -542,9 +542,9 @@ moduleIntegrationTestRunner<IProductModuleService>({
thumbnail: images[0].url,
})
const productsCreated = await service.create([data])
const productsCreated = await service.createProducts([data])
const products = await service.list(
const products = await service.listProducts(
{ id: productsCreated[0].id },
{
relations: [
@@ -628,7 +628,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
thumbnail: images[0].url,
})
const products = await service.create([data])
const products = await service.createProducts([data])
expect(eventBusSpy).toHaveBeenCalledTimes(1)
expect(eventBusSpy).toHaveBeenCalledWith([
{
@@ -647,11 +647,11 @@ moduleIntegrationTestRunner<IProductModuleService>({
thumbnail: images[0].url,
})
const products = await service.create([data])
const products = await service.createProducts([data])
await service.softDelete([products[0].id])
await service.softDeleteProducts([products[0].id])
const deletedProducts = await service.list(
const deletedProducts = await service.listProducts(
{ id: products[0].id },
{
relations: [
@@ -698,11 +698,11 @@ moduleIntegrationTestRunner<IProductModuleService>({
thumbnail: images[0].url,
})
const products = await service.create([data])
const products = await service.createProducts([data])
await service.softDelete([products[0].id])
await service.softDeleteProducts([products[0].id])
const softDeleted = await service.list({
const softDeleted = await service.listProducts({
deleted_at: { $gt: "01-01-2022" },
})
@@ -716,9 +716,9 @@ moduleIntegrationTestRunner<IProductModuleService>({
thumbnail: images[0].url,
})
const products = await service.create([data])
const products = await service.createProducts([data])
await service.softDelete([products[0].id])
await service.softDeleteProducts([products[0].id])
expect(eventBusSpy).toHaveBeenCalledWith([
{
@@ -738,16 +738,18 @@ moduleIntegrationTestRunner<IProductModuleService>({
thumbnail: images[0].url,
})
const products = await service.create([data])
const products = await service.createProducts([data])
let retrievedProducts = await service.list({ id: products[0].id })
let retrievedProducts = await service.listProducts({
id: products[0].id,
})
expect(retrievedProducts).toHaveLength(1)
expect(retrievedProducts[0].deleted_at).toBeNull()
await service.softDelete([products[0].id])
await service.softDeleteProducts([products[0].id])
retrievedProducts = await service.list(
retrievedProducts = await service.listProducts(
{ id: products[0].id },
{
withDeleted: true,
@@ -757,9 +759,9 @@ moduleIntegrationTestRunner<IProductModuleService>({
expect(retrievedProducts).toHaveLength(1)
expect(retrievedProducts[0].deleted_at).not.toBeNull()
await service.restore([products[0].id])
await service.restoreProducts([products[0].id])
const deletedProducts = await service.list(
const deletedProducts = await service.listProducts(
{ id: products[0].id },
{
relations: [
@@ -820,11 +822,11 @@ moduleIntegrationTestRunner<IProductModuleService>({
tags: [],
})
await service.create([productOneData, productTwoData])
await service.createProducts([productOneData, productTwoData])
})
it("should return a list of products scoped by collection id", async () => {
const productsWithCollectionOne = await service.list(
const productsWithCollectionOne = await service.listProducts(
{ collection_id: productCollectionOne.id },
{
relations: ["collection"],
@@ -843,7 +845,7 @@ moduleIntegrationTestRunner<IProductModuleService>({
})
it("should return empty array when querying for a collection that doesnt exist", async () => {
const products = await service.list(
const products = await service.listProducts(
{
categories: { id: ["collection-doesnt-exist-id"] },
},
+1 -4
View File
@@ -7,11 +7,8 @@
"files": [
"dist"
],
"bin": {
"medusa-product-seed": "dist/scripts/bin/run-seed.js"
},
"engines": {
"node": ">=16"
"node": ">=20"
},
"repository": {
"type": "git",
+5 -5
View File
@@ -1,7 +1,7 @@
import { moduleDefinition } from "./module-definition"
import { ModuleExports } from "@medusajs/types"
import { ProductModuleService } from "@services"
const moduleDefinition: ModuleExports = {
service: ProductModuleService,
}
export default moduleDefinition
export * from "./models"
export * from "./services"
export * from "./types"
+10 -46
View File
@@ -1,44 +1,12 @@
import { Modules } from "@medusajs/modules-sdk"
import { ModuleJoinerConfig } from "@medusajs/types"
import { MapToConfig } from "@medusajs/utils"
import {
Product,
ProductCategory,
ProductCollection,
ProductOption,
ProductTag,
ProductType,
ProductVariant,
} from "@models"
import ProductImage from "./models/product-image"
buildEntitiesNameToLinkableKeysMap,
defineJoinerConfig,
MapToConfig,
} from "@medusajs/utils"
export const LinkableKeys = {
product_id: Product.name,
product_handle: Product.name,
variant_id: ProductVariant.name,
variant_sku: ProductVariant.name,
product_option_id: ProductOption.name,
product_type_id: ProductType.name,
product_category_id: ProductCategory.name,
product_collection_id: ProductCollection.name,
product_tag_id: ProductTag.name,
product_image_id: ProductImage.name,
}
const entityLinkableKeysMap: MapToConfig = {}
Object.entries(LinkableKeys).forEach(([key, value]) => {
entityLinkableKeysMap[value] ??= []
entityLinkableKeysMap[value].push({
mapTo: key,
valueFrom: key.split("_").pop()!,
})
})
export const entityNameToLinkableKeysMap: MapToConfig = entityLinkableKeysMap
export const joinerConfig: ModuleJoinerConfig = {
serviceName: Modules.PRODUCT,
primaryKeys: ["id", "handle"],
linkableKeys: LinkableKeys,
export const joinerConfig = defineJoinerConfig(Modules.PRODUCT, {
// This module provides more alias than the default config builder
alias: [
{
name: ["product", "products"],
@@ -50,50 +18,46 @@ export const joinerConfig: ModuleJoinerConfig = {
name: ["product_variant", "product_variants", "variant", "variants"],
args: {
entity: "ProductVariant",
methodSuffix: "Variants",
},
},
{
name: ["product_option", "product_options"],
args: {
entity: "ProductOption",
methodSuffix: "Options",
},
},
{
name: ["product_type", "product_types"],
args: {
entity: "ProductType",
methodSuffix: "Types",
},
},
{
name: ["product_image", "product_images"],
args: {
entity: "ProductImage",
methodSuffix: "Images",
},
},
{
name: ["product_tag", "product_tags"],
args: {
entity: "ProductTag",
methodSuffix: "Tags",
},
},
{
name: ["product_collection", "product_collections"],
args: {
entity: "ProductCollection",
methodSuffix: "Collections",
},
},
{
name: ["product_category", "product_categories"],
args: {
entity: "ProductCategory",
methodSuffix: "Categories",
},
},
],
}
})
export const entityNameToLinkableKeysMap: MapToConfig =
buildEntitiesNameToLinkableKeysMap(joinerConfig.linkableKeys)
@@ -1,8 +0,0 @@
import { ModuleExports } from "@medusajs/types"
import { ProductModuleService } from "@services"
const service = ProductModuleService
export const moduleDefinition: ModuleExports = {
service,
}
@@ -1,37 +0,0 @@
#!/usr/bin/env node
import { ModulesSdkUtils } from "@medusajs/utils"
import { Modules } from "@medusajs/modules-sdk"
import * as ProductModels from "@models"
import {
createProductCategories,
createProducts,
createProductVariants,
} from "../seed-utils"
import { EOL } from "os"
const args = process.argv
const path = args.pop() as string
export default (async () => {
const { config } = await import("dotenv")
config()
if (!path) {
throw new Error(
`filePath is required.${EOL}Example: medusa-product-seed <filePath>`
)
}
const run = ModulesSdkUtils.buildSeedScript({
moduleName: Modules.PRODUCT,
models: ProductModels,
pathToMigrations: __dirname + "/../../migrations",
seedHandler: async ({ manager, data }) => {
const { productCategoriesData, productsData, variantsData } = data
await createProductCategories(manager, productCategoriesData)
await createProducts(manager, productsData)
await createProductVariants(manager, variantsData)
},
})
await run({ path })
})()
@@ -1,54 +0,0 @@
import { SqlEntityManager } from "@mikro-orm/postgresql"
import { Product, ProductCategory, ProductVariant } from "@models"
export async function createProductCategories(
manager: SqlEntityManager,
categoriesData: any[]
): Promise<ProductCategory[]> {
const categories: ProductCategory[] = []
for (let categoryData of categoriesData) {
let categoryDataClone = { ...categoryData }
let parentCategory: ProductCategory | null = null
const parentCategoryId = categoryDataClone.parent_category_id as string
delete categoryDataClone.parent_category_id
if (parentCategoryId) {
parentCategory = await manager.findOne(ProductCategory, parentCategoryId)
}
const category = manager.create(ProductCategory, {
...categoryDataClone,
parent_category: parentCategory,
})
categories.push(category)
}
await manager.persistAndFlush(categories)
return categories
}
export async function createProducts(manager: SqlEntityManager, data: any[]) {
const products: any[] = data.map((productData) => {
return manager.create(Product, productData)
})
await manager.persistAndFlush(products)
return products
}
export async function createProductVariants(
manager: SqlEntityManager,
data: any[]
) {
const variants: any[] = data.map((variantsData) => {
return manager.create(ProductVariant, variantsData)
})
await manager.persistAndFlush(variants)
return variants
}
@@ -8,7 +8,7 @@ import {
ProductTypes,
} from "@medusajs/types"
import {
Image,
Image as ProductImage,
Product,
ProductCategory,
ProductCollection,
@@ -31,15 +31,13 @@ import {
kebabCase,
MedusaContext,
MedusaError,
ModulesSdkUtils,
MedusaService,
ProductStatus,
promiseAll,
removeUndefined,
toHandle,
} from "@medusajs/utils"
import {
ProductCategoryEventData,
ProductCategoryEvents,
ProductCollectionEventData,
ProductCollectionEvents,
ProductEventData,
@@ -69,81 +67,53 @@ type InjectedDependencies = {
eventBusModuleService?: IEventBusModuleService
}
const generateMethodForModels = {
ProductCategory: { singular: "Category", plural: "Categories" },
ProductCollection: { singular: "Collection", plural: "Collections" },
ProductOption: { singular: "Option", plural: "Options" },
ProductTag: { singular: "Tag", plural: "Tags" },
ProductType: { singular: "Type", plural: "Types" },
ProductVariant: { singular: "Variant", plural: "Variants" },
}
export default class ProductModuleService<
TProduct extends Product = Product,
TProductVariant extends ProductVariant = ProductVariant,
TProductTag extends ProductTag = ProductTag,
TProductCollection extends ProductCollection = ProductCollection,
TProductCategory extends ProductCategory = ProductCategory,
TProductImage extends Image = Image,
TProductType extends ProductType = ProductType,
TProductOption extends ProductOption = ProductOption,
TProductOptionValue extends ProductOptionValue = ProductOptionValue
>
extends ModulesSdkUtils.MedusaService<
ProductTypes.ProductDTO,
{
ProductCategory: {
dto: ProductTypes.ProductCategoryDTO
singular: "Category"
plural: "Categories"
}
ProductCollection: {
dto: ProductTypes.ProductCollectionDTO
singular: "Collection"
plural: "Collections"
}
ProductOption: {
dto: ProductTypes.ProductOptionDTO
singular: "Option"
plural: "Options"
}
ProductTag: {
dto: ProductTypes.ProductTagDTO
singular: "Tag"
plural: "Tags"
}
ProductType: {
dto: ProductTypes.ProductTypeDTO
singular: "Type"
plural: "Types"
}
ProductVariant: {
dto: ProductTypes.ProductVariantDTO
singular: "Variant"
plural: "Variants"
}
export default class ProductModuleService
extends MedusaService<{
Product: {
dto: ProductTypes.ProductDTO
}
>(Product, generateMethodForModels, entityNameToLinkableKeysMap)
ProductCategory: {
dto: ProductTypes.ProductCategoryDTO
}
ProductCollection: {
dto: ProductTypes.ProductCollectionDTO
}
ProductOption: {
dto: ProductTypes.ProductOptionDTO
}
ProductTag: {
dto: ProductTypes.ProductTagDTO
}
ProductType: {
dto: ProductTypes.ProductTypeDTO
}
ProductVariant: {
dto: ProductTypes.ProductVariantDTO
}
}>(
{
Product,
ProductCategory,
ProductCollection,
ProductOption,
ProductTag,
ProductType,
ProductVariant,
},
entityNameToLinkableKeysMap
)
implements ProductTypes.IProductModuleService
{
protected baseRepository_: DAL.RepositoryService
protected readonly productService_: ProductService<TProduct>
// eslint-disable-next-line max-len
protected readonly productVariantService_: ModulesSdkTypes.IMedusaInternalService<TProductVariant>
// eslint-disable-next-line max-len
protected readonly productCategoryService_: ProductCategoryService<TProductCategory>
// eslint-disable-next-line max-len
protected readonly productTagService_: ModulesSdkTypes.IMedusaInternalService<TProductTag>
// eslint-disable-next-line max-len
protected readonly productCollectionService_: ModulesSdkTypes.IMedusaInternalService<TProductCollection>
// eslint-disable-next-line max-len
protected readonly productImageService_: ModulesSdkTypes.IMedusaInternalService<TProductImage>
// eslint-disable-next-line max-len
protected readonly productTypeService_: ModulesSdkTypes.IMedusaInternalService<TProductType>
// eslint-disable-next-line max-len
protected readonly productOptionService_: ModulesSdkTypes.IMedusaInternalService<TProductOption>
// eslint-disable-next-line max-len
protected readonly productOptionValueService_: ModulesSdkTypes.IMedusaInternalService<TProductOptionValue>
protected readonly productService_: ProductService<Product>
protected readonly productVariantService_: ModulesSdkTypes.IMedusaInternalService<ProductVariant>
protected readonly productCategoryService_: ProductCategoryService<ProductCategory>
protected readonly productTagService_: ModulesSdkTypes.IMedusaInternalService<ProductTag>
protected readonly productCollectionService_: ModulesSdkTypes.IMedusaInternalService<ProductCollection>
protected readonly productImageService_: ModulesSdkTypes.IMedusaInternalService<ProductImage>
protected readonly productTypeService_: ModulesSdkTypes.IMedusaInternalService<ProductType>
protected readonly productOptionService_: ModulesSdkTypes.IMedusaInternalService<ProductOption>
protected readonly productOptionValueService_: ModulesSdkTypes.IMedusaInternalService<ProductOptionValue>
protected readonly eventBusModuleService_?: IEventBusModuleService
constructor(
@@ -185,18 +155,18 @@ export default class ProductModuleService<
// TODO: Add options validation, among other things
// @ts-ignore
createVariants(
createProductVariants(
data: ProductTypes.CreateProductVariantDTO[],
sharedContext?: Context
): Promise<ProductTypes.ProductVariantDTO[]>
createVariants(
createProductVariants(
data: ProductTypes.CreateProductVariantDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductVariantDTO>
@InjectManager("baseRepository_")
@EmitEvents()
async createVariants(
async createProductVariants(
data:
| ProductTypes.CreateProductVariantDTO[]
| ProductTypes.CreateProductVariantDTO,
@@ -254,18 +224,18 @@ export default class ProductModuleService<
return createdVariants
}
async upsertVariants(
async upsertProductVariants(
data: ProductTypes.UpsertProductVariantDTO[],
sharedContext?: Context
): Promise<ProductTypes.ProductVariantDTO[]>
async upsertVariants(
async upsertProductVariants(
data: ProductTypes.UpsertProductVariantDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductVariantDTO>
@InjectTransactionManager("baseRepository_")
@EmitEvents()
async upsertVariants(
async upsertProductVariants(
data:
| ProductTypes.UpsertProductVariantDTO[]
| ProductTypes.UpsertProductVariantDTO,
@@ -300,12 +270,12 @@ export default class ProductModuleService<
}
// @ts-ignore
updateVariants(
updateProductVariants(
id: string,
data: ProductTypes.UpdateProductVariantDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductVariantDTO>
updateVariants(
updateProductVariants(
selector: ProductTypes.FilterableProductVariantProps,
data: ProductTypes.UpdateProductVariantDTO,
sharedContext?: Context
@@ -313,7 +283,7 @@ export default class ProductModuleService<
@InjectManager("baseRepository_")
@EmitEvents()
async updateVariants(
async updateProductVariants(
idOrSelector: string | ProductTypes.FilterableProductVariantProps,
data: ProductTypes.UpdateProductVariantDTO,
@MedusaContext() sharedContext: Context = {}
@@ -349,7 +319,7 @@ export default class ProductModuleService<
protected async updateVariants_(
data: UpdateProductVariantInput[],
@MedusaContext() sharedContext: Context = {}
): Promise<TProductVariant[]> {
): Promise<ProductVariant[]> {
// Validation step
const variantIdsToUpdate = data.map(({ id }) => id)
const variants = await this.productVariantService_.list(
@@ -415,18 +385,18 @@ export default class ProductModuleService<
}
// @ts-ignore
createTags(
createProductTags(
data: ProductTypes.CreateProductTagDTO[],
sharedContext?: Context
): Promise<ProductTypes.ProductTagDTO[]>
createTags(
createProductTags(
data: ProductTypes.CreateProductTagDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductTagDTO>
@InjectManager("baseRepository_")
@EmitEvents()
async createTags(
async createProductTags(
data: ProductTypes.CreateProductTagDTO[] | ProductTypes.CreateProductTagDTO,
@MedusaContext() sharedContext: Context = {}
): Promise<ProductTypes.ProductTagDTO[] | ProductTypes.ProductTagDTO> {
@@ -446,18 +416,18 @@ export default class ProductModuleService<
return Array.isArray(data) ? createdTags : createdTags[0]
}
async upsertTags(
async upsertProductTags(
data: ProductTypes.UpsertProductTagDTO[],
sharedContext?: Context
): Promise<ProductTypes.ProductTagDTO[]>
async upsertTags(
async upsertProductTags(
data: ProductTypes.UpsertProductTagDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductTagDTO>
@InjectTransactionManager("baseRepository_")
@EmitEvents()
async upsertTags(
async upsertProductTags(
data: ProductTypes.UpsertProductTagDTO[] | ProductTypes.UpsertProductTagDTO,
@MedusaContext() sharedContext: Context = {}
): Promise<ProductTypes.ProductTagDTO[] | ProductTypes.ProductTagDTO> {
@@ -494,12 +464,12 @@ export default class ProductModuleService<
}
// @ts-ignore
updateTags(
updateProductTags(
id: string,
data: ProductTypes.UpdateProductTagDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductTagDTO>
updateTags(
updateProductTags(
selector: ProductTypes.FilterableProductTagProps,
data: ProductTypes.UpdateProductTagDTO,
sharedContext?: Context
@@ -507,7 +477,7 @@ export default class ProductModuleService<
@InjectManager("baseRepository_")
@EmitEvents()
async updateTags(
async updateProductTags(
idOrSelector: string | ProductTypes.FilterableProductTagProps,
data: ProductTypes.UpdateProductTagDTO,
@MedusaContext() sharedContext: Context = {}
@@ -548,17 +518,17 @@ export default class ProductModuleService<
}
// @ts-ignore
createTypes(
createProductTypes(
data: ProductTypes.CreateProductTypeDTO[],
sharedContext?: Context
): Promise<ProductTypes.ProductTypeDTO[]>
createTypes(
createProductTypes(
data: ProductTypes.CreateProductTypeDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductTypeDTO>
@InjectManager("baseRepository_")
async createTypes(
async createProductTypes(
data:
| ProductTypes.CreateProductTypeDTO[]
| ProductTypes.CreateProductTypeDTO,
@@ -575,17 +545,17 @@ export default class ProductModuleService<
return Array.isArray(data) ? createdTypes : createdTypes[0]
}
async upsertTypes(
async upsertProductTypes(
data: ProductTypes.UpsertProductTypeDTO[],
sharedContext?: Context
): Promise<ProductTypes.ProductTypeDTO[]>
async upsertTypes(
async upsertProductTypes(
data: ProductTypes.UpsertProductTypeDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductTypeDTO>
@InjectTransactionManager("baseRepository_")
async upsertTypes(
async upsertProductTypes(
data:
| ProductTypes.UpsertProductTypeDTO[]
| ProductTypes.UpsertProductTypeDTO,
@@ -616,19 +586,19 @@ export default class ProductModuleService<
}
// @ts-ignore
updateTypes(
updateProductTypes(
id: string,
data: ProductTypes.UpdateProductTypeDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductTypeDTO>
updateTypes(
updateProductTypes(
selector: ProductTypes.FilterableProductTypeProps,
data: ProductTypes.UpdateProductTypeDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductTypeDTO[]>
@InjectManager("baseRepository_")
async updateTypes(
async updateProductTypes(
idOrSelector: string | ProductTypes.FilterableProductTypeProps,
data: ProductTypes.UpdateProductTypeDTO,
@MedusaContext() sharedContext: Context = {}
@@ -664,17 +634,17 @@ export default class ProductModuleService<
}
// @ts-ignore
createOptions(
createProductOptions(
data: ProductTypes.CreateProductOptionDTO[],
sharedContext?: Context
): Promise<ProductTypes.ProductOptionDTO[]>
createOptions(
createProductOptions(
data: ProductTypes.CreateProductOptionDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductOptionDTO>
@InjectManager("baseRepository_")
async createOptions(
async createProductOptions(
data:
| ProductTypes.CreateProductOptionDTO[]
| ProductTypes.CreateProductOptionDTO,
@@ -718,17 +688,17 @@ export default class ProductModuleService<
)
}
async upsertOptions(
async upsertProductOptions(
data: ProductTypes.UpsertProductOptionDTO[],
sharedContext?: Context
): Promise<ProductTypes.ProductOptionDTO[]>
async upsertOptions(
async upsertProductOptions(
data: ProductTypes.UpsertProductOptionDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductOptionDTO>
@InjectTransactionManager("baseRepository_")
async upsertOptions(
async upsertProductOptions(
data:
| ProductTypes.UpsertProductOptionDTO[]
| ProductTypes.UpsertProductOptionDTO,
@@ -761,19 +731,19 @@ export default class ProductModuleService<
}
// @ts-ignore
updateOptions(
updateProductOptions(
id: string,
data: ProductTypes.UpdateProductOptionDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductOptionDTO>
updateOptions(
updateProductOptions(
selector: ProductTypes.FilterableProductOptionProps,
data: ProductTypes.UpdateProductOptionDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductOptionDTO[]>
@InjectManager("baseRepository_")
async updateOptions(
async updateProductOptions(
idOrSelector: string | ProductTypes.FilterableProductOptionProps,
data: ProductTypes.UpdateProductOptionDTO,
@MedusaContext() sharedContext: Context = {}
@@ -878,17 +848,17 @@ export default class ProductModuleService<
}
// @ts-ignore
createCollections(
createProductCollections(
data: ProductTypes.CreateProductCollectionDTO[],
sharedContext?: Context
): Promise<ProductTypes.ProductCollectionDTO[]>
createCollections(
createProductCollections(
data: ProductTypes.CreateProductCollectionDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductCollectionDTO>
@InjectManager("baseRepository_")
async createCollections(
async createProductCollections(
data:
| ProductTypes.CreateProductCollectionDTO[]
| ProductTypes.CreateProductCollectionDTO,
@@ -918,7 +888,7 @@ export default class ProductModuleService<
async createCollections_(
data: ProductTypes.CreateProductCollectionDTO[],
@MedusaContext() sharedContext: Context = {}
): Promise<TProductCollection[]> {
): Promise<ProductCollection[]> {
const normalizedInput = data.map(
ProductModuleService.normalizeCreateProductCollectionInput
)
@@ -935,16 +905,16 @@ export default class ProductModuleService<
return productCollections
}
async upsertCollections(
async upsertProductCollections(
data: ProductTypes.UpsertProductCollectionDTO[],
sharedContext?: Context
): Promise<ProductTypes.ProductCollectionDTO[]>
async upsertCollections(
async upsertProductCollections(
data: ProductTypes.UpsertProductCollectionDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductCollectionDTO>
@InjectTransactionManager("baseRepository_")
async upsertCollections(
async upsertProductCollections(
data:
| ProductTypes.UpsertProductCollectionDTO[]
| ProductTypes.UpsertProductCollectionDTO,
@@ -998,19 +968,19 @@ export default class ProductModuleService<
}
// @ts-ignore
updateCollections(
updateProductCollections(
id: string,
data: ProductTypes.UpdateProductCollectionDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductCollectionDTO>
updateCollections(
updateProductCollections(
selector: ProductTypes.FilterableProductCollectionProps,
data: ProductTypes.UpdateProductCollectionDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductCollectionDTO[]>
@InjectManager("baseRepository_")
async updateCollections(
async updateProductCollections(
idOrSelector: string | ProductTypes.FilterableProductCollectionProps,
data: ProductTypes.UpdateProductCollectionDTO,
@MedusaContext() sharedContext: Context = {}
@@ -1061,7 +1031,7 @@ export default class ProductModuleService<
protected async updateCollections_(
data: UpdateCollectionInput[],
@MedusaContext() sharedContext: Context = {}
): Promise<TProductCollection[]> {
): Promise<ProductCollection[]> {
const normalizedInput = data.map(
ProductModuleService.normalizeUpdateProductCollectionInput
) as UpdateCollectionInput[]
@@ -1075,7 +1045,7 @@ export default class ProductModuleService<
sharedContext
)
const collections: TProductCollection[] = []
const collections: ProductCollection[] = []
const updateSelectorAndData = updatedCollections.flatMap(
(collectionData) => {
@@ -1114,7 +1084,7 @@ export default class ProductModuleService<
collections.push({
...collectionData,
products: productsToUpdate ?? [],
})
} as ProductCollection)
return result
}
@@ -1125,18 +1095,18 @@ export default class ProductModuleService<
}
// @ts-ignore
createCategories(
createProductCategories(
data: ProductTypes.CreateProductCategoryDTO[],
sharedContext?: Context
): Promise<ProductTypes.ProductCategoryDTO[]>
createCategories(
createProductCategories(
data: ProductTypes.CreateProductCategoryDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductCategoryDTO>
@InjectManager("baseRepository_")
@EmitEvents()
async createCategories(
async createProductCategories(
data:
| ProductTypes.CreateProductCategoryDTO[]
| ProductTypes.CreateProductCategoryDTO,
@@ -1163,18 +1133,18 @@ export default class ProductModuleService<
return Array.isArray(data) ? createdCategories : createdCategories[0]
}
async upsertCategories(
async upsertProductCategories(
data: ProductTypes.UpsertProductCategoryDTO[],
sharedContext?: Context
): Promise<ProductTypes.ProductCategoryDTO[]>
async upsertCategories(
async upsertProductCategories(
data: ProductTypes.UpsertProductCategoryDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductCategoryDTO>
@InjectTransactionManager("baseRepository_")
@EmitEvents()
async upsertCategories(
async upsertProductCategories(
data:
| ProductTypes.UpsertProductCategoryDTO[]
| ProductTypes.UpsertProductCategoryDTO,
@@ -1229,12 +1199,12 @@ export default class ProductModuleService<
}
// @ts-ignore
updateCategories(
updateProductCategories(
id: string,
data: ProductTypes.UpdateProductCategoryDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductCategoryDTO>
updateCategories(
updateProductCategories(
selector: ProductTypes.FilterableProductTypeProps,
data: ProductTypes.UpdateProductCategoryDTO,
sharedContext?: Context
@@ -1242,7 +1212,7 @@ export default class ProductModuleService<
@InjectManager("baseRepository_")
@EmitEvents()
async updateCategories(
async updateProductCategories(
idOrSelector: string | ProductTypes.FilterableProductTypeProps,
data: ProductTypes.UpdateProductCategoryDTO,
@MedusaContext() sharedContext: Context = {}
@@ -1288,22 +1258,23 @@ export default class ProductModuleService<
return isString(idOrSelector) ? updatedCategories[0] : updatedCategories
}
create(
//@ts-expect-error
createProducts(
data: ProductTypes.CreateProductDTO[],
sharedContext?: Context
): Promise<ProductTypes.ProductDTO[]>
create(
createProducts(
data: ProductTypes.CreateProductDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductDTO>
@InjectManager("baseRepository_")
async create(
async createProducts(
data: ProductTypes.CreateProductDTO[] | ProductTypes.CreateProductDTO,
@MedusaContext() sharedContext: Context = {}
): Promise<ProductTypes.ProductDTO[] | ProductTypes.ProductDTO> {
const input = Array.isArray(data) ? data : [data]
const products = await this.create_(input, sharedContext)
const products = await this.createProducts_(input, sharedContext)
const createdProducts = await this.baseRepository_.serialize<
ProductTypes.ProductDTO[]
@@ -1319,16 +1290,17 @@ export default class ProductModuleService<
return Array.isArray(data) ? createdProducts : createdProducts[0]
}
async upsert(
async upsertProducts(
data: ProductTypes.UpsertProductDTO[],
sharedContext?: Context
): Promise<ProductTypes.ProductDTO[]>
async upsert(
async upsertProducts(
data: ProductTypes.UpsertProductDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductDTO>
@InjectTransactionManager("baseRepository_")
async upsert(
async upsertProducts(
data: ProductTypes.UpsertProductDTO[] | ProductTypes.UpsertProductDTO,
@MedusaContext() sharedContext: Context = {}
): Promise<ProductTypes.ProductDTO[] | ProductTypes.ProductDTO> {
@@ -1344,10 +1316,10 @@ export default class ProductModuleService<
let updated: Product[] = []
if (forCreate.length) {
created = await this.create_(forCreate, sharedContext)
created = await this.createProducts_(forCreate, sharedContext)
}
if (forUpdate.length) {
updated = await this.update_(forUpdate, sharedContext)
updated = await this.updateProducts_(forUpdate, sharedContext)
}
const result = [...created, ...updated]
@@ -1376,19 +1348,20 @@ export default class ProductModuleService<
return Array.isArray(data) ? allProducts : allProducts[0]
}
update(
// @ts-expect-error
updateProducts(
id: string,
data: ProductTypes.UpdateProductDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductDTO>
update(
updateProducts(
selector: ProductTypes.FilterableProductProps,
data: ProductTypes.UpdateProductDTO,
sharedContext?: Context
): Promise<ProductTypes.ProductDTO[]>
@InjectManager("baseRepository_")
async update(
async updateProducts(
idOrSelector: string | ProductTypes.FilterableProductProps,
data: ProductTypes.UpdateProductDTO,
@MedusaContext() sharedContext: Context = {}
@@ -1412,7 +1385,7 @@ export default class ProductModuleService<
}))
}
const products = await this.update_(normalizedInput, sharedContext)
const products = await this.updateProducts_(normalizedInput, sharedContext)
const updatedProducts = await this.baseRepository_.serialize<
ProductTypes.ProductDTO[]
@@ -1429,10 +1402,10 @@ export default class ProductModuleService<
}
@InjectTransactionManager("baseRepository_")
protected async create_(
protected async createProducts_(
data: ProductTypes.CreateProductDTO[],
@MedusaContext() sharedContext: Context = {}
): Promise<TProduct[]> {
): Promise<Product[]> {
const normalizedInput = await promiseAll(
data.map(async (d) => {
const normalized = await this.normalizeCreateProductInput(
@@ -1495,10 +1468,10 @@ export default class ProductModuleService<
}
@InjectTransactionManager("baseRepository_")
protected async update_(
protected async updateProducts_(
data: UpdateProductInput[],
@MedusaContext() sharedContext: Context = {}
): Promise<TProduct[]> {
): Promise<Product[]> {
const normalizedInput = await promiseAll(
data.map(async (d) => {
const normalized = await this.normalizeUpdateProductInput(