fix(medusa): List products end points (#3829)

* fix(medusa): List products end points

* lint

* Create fast-toes-know.md
This commit is contained in:
Adrien de Peretti authored and GitHub committed 2023-04-13 21:33:08 +02:00
1 parent 1da7491faa
commit 6bb1654b61
3 files changed
+51 -22

No files matched your search

+5
View File
@@ -0,0 +1,5 @@
---
"@medusajs/medusa": patch
---
fix(medusa): List products end points
@@ -231,32 +231,42 @@ export default async (req, res) => {
const { skip, take, relations } = req.listConfig const { skip, take, relations } = req.listConfig
const [rawProducts, count] = await productService.listAndCount( const manager = req.scope.resolve("manager")
req.filterableFields,
req.listConfig const [products, count] = await manager.transaction(
) async (transactionManager) => {
const [rawProducts, count] = await productService
.withTransaction(transactionManager)
.listAndCount(req.filterableFields, req.listConfig)
let products: (Product | PricedProduct)[] = rawProducts let products: (Product | PricedProduct)[] = rawProducts
const includesPricing = ["variants", "variants.prices"].every((relation) => const includesPricing = ["variants", "variants.prices"].every(
relations?.includes(relation) (relation) => relations?.includes(relation)
) )
if (includesPricing) { if (includesPricing) {
products = await pricingService.setProductPrices(rawProducts) products = await pricingService
.withTransaction(transactionManager)
.setProductPrices(rawProducts)
} }
if (inventoryService) { if (inventoryService) {
const [salesChannelsIds] = await salesChannelService.listAndCount( const [salesChannelsIds] = await salesChannelService
{}, .withTransaction(transactionManager)
{ select: ["id"] } .listAndCount({}, { select: ["id"] })
)
products = await productVariantInventoryService.setProductAvailability( products = await productVariantInventoryService
.withTransaction(transactionManager)
.setProductAvailability(
products, products,
salesChannelsIds.map((salesChannel) => salesChannel.id) salesChannelsIds.map((salesChannel) => salesChannel.id)
) )
} }
return [products, count]
}
)
res.json({ res.json({
products, products,
count, count,
@@ -20,7 +20,6 @@ import { FeatureFlagDecorators } from "../../../../utils/feature-flag-decorators
import { optionalBooleanMapper } from "../../../../utils/validators/is-boolean" import { optionalBooleanMapper } from "../../../../utils/validators/is-boolean"
import { IsType } from "../../../../utils/validators/is-type" import { IsType } from "../../../../utils/validators/is-type"
import { cleanResponseData } from "../../../../utils/clean-response-data" import { cleanResponseData } from "../../../../utils/clean-response-data"
import { Cart, Product } from "../../../../models"
import { defaultStoreCategoryScope } from "../product-categories" import { defaultStoreCategoryScope } from "../product-categories"
/** /**
@@ -204,7 +203,7 @@ export default async (req, res) => {
filterableFields["categories"] = { filterableFields["categories"] = {
...(filterableFields.categories || {}), ...(filterableFields.categories || {}),
// Store APIs are only allowed to query active and public categories // Store APIs are only allowed to query active and public categories
...defaultStoreCategoryScope ...defaultStoreCategoryScope,
} }
if (req.publishableApiKeyScopes?.sales_channel_ids.length) { if (req.publishableApiKeyScopes?.sales_channel_ids.length) {
@@ -217,23 +216,30 @@ export default async (req, res) => {
} }
} }
const manager = req.scope.resolve("manager")
const [computedProducts, count] = await manager.transaction(
async (transactionManager) => {
const promises: Promise<any>[] = [] const promises: Promise<any>[] = []
promises.push(productService.listAndCount(filterableFields, listConfig)) promises.push(
productService
.withTransaction(transactionManager)
.listAndCount(filterableFields, listConfig)
)
if (validated.cart_id) { if (validated.cart_id) {
promises.push( promises.push(
cartService.retrieve(validated.cart_id, { cartService
.withTransaction(transactionManager)
.retrieve(validated.cart_id, {
select: ["id", "region_id"] as any, select: ["id", "region_id"] as any,
relations: ["region"], relations: ["region"],
}) })
) )
} }
const [[rawProducts, count], cart] = (await Promise.all(promises)) as [ const [[rawProducts, count], cart] = await Promise.all(promises)
[Product[], number],
Cart
]
if (validated.cart_id) { if (validated.cart_id) {
regionId = cart.region_id regionId = cart.region_id
@@ -246,19 +252,27 @@ export default async (req, res) => {
// We can run them concurrently as the new properties are assigned to the references // We can run them concurrently as the new properties are assigned to the references
// of the appropriate entity // of the appropriate entity
await Promise.all([ await Promise.all([
pricingService.setProductPrices(computedProducts, { pricingService
.withTransaction(transactionManager)
.setProductPrices(computedProducts, {
cart_id: cart_id, cart_id: cart_id,
region_id: regionId, region_id: regionId,
currency_code: currencyCode, currency_code: currencyCode,
customer_id: req.user?.customer_id, customer_id: req.user?.customer_id,
include_discount_prices: true, include_discount_prices: true,
}), }),
productVariantInventoryService.setProductAvailability( productVariantInventoryService
.withTransaction(transactionManager)
.setProductAvailability(
computedProducts, computedProducts,
filterableFields.sales_channel_id filterableFields.sales_channel_id
), ),
]) ])
return [computedProducts, count]
}
)
res.json({ res.json({
products: cleanResponseData(computedProducts, req.allowedProperties || []), products: cleanResponseData(computedProducts, req.allowedProperties || []),
count, count,