From 5f76b967d9c6ae3a3f554c2d854299f5e22ee83e Mon Sep 17 00:00:00 2001 From: Adrien de Peretti Date: Fri, 22 Sep 2023 12:43:23 +0200 Subject: [PATCH] feat(medusa): Admin get product with isolated module (#5054) * feat(medusa): Admin get product with isolated module * Create pretty-dryers-prove.md * use object instead of string * fix merge * fix * fix --- .changeset/pretty-dryers-prove.md | 5 +++ .../api/routes/admin/products/get-product.ts | 34 ++++++++++++++++++- .../api/routes/store/products/get-product.ts | 4 +-- .../src/api/routes/store/products/index.ts | 2 +- .../routes/store/products/list-products.ts | 4 +-- 5 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 .changeset/pretty-dryers-prove.md diff --git a/.changeset/pretty-dryers-prove.md b/.changeset/pretty-dryers-prove.md new file mode 100644 index 0000000000..3681e7a055 --- /dev/null +++ b/.changeset/pretty-dryers-prove.md @@ -0,0 +1,5 @@ +--- +"@medusajs/medusa": patch +--- + +feat(medusa): Admin get product with isolated module diff --git a/packages/medusa/src/api/routes/admin/products/get-product.ts b/packages/medusa/src/api/routes/admin/products/get-product.ts index 70aca0d5d4..4270547e32 100644 --- a/packages/medusa/src/api/routes/admin/products/get-product.ts +++ b/packages/medusa/src/api/routes/admin/products/get-product.ts @@ -1,4 +1,6 @@ import { PricingService, ProductService } from "../../../../services" +import IsolateProductDomainFeatureFlag from "../../../../loaders/feature-flags/isolate-product-domain" +import { defaultAdminProductRemoteQueryObject } from "./index" /** * @oas [get] /admin/products/{id} @@ -56,8 +58,18 @@ export default async (req, res) => { const productService: ProductService = req.scope.resolve("productService") const pricingService: PricingService = req.scope.resolve("pricingService") + const featureFlagRouter = req.scope.resolve("featureFlagRouter") - const rawProduct = await productService.retrieve(id, req.retrieveConfig) + let rawProduct + if (featureFlagRouter.isFeatureEnabled(IsolateProductDomainFeatureFlag.key)) { + rawProduct = await getProductWithIsolatedProductModule( + req, + id, + req.retrieveConfig + ) + } else { + rawProduct = await productService.retrieve(id, req.retrieveConfig) + } // We only set prices if variants.prices are requested const shouldSetPricing = ["variants", "variants.prices"].every((relation) => @@ -72,3 +84,23 @@ export default async (req, res) => { res.json({ product }) } + +async function getProductWithIsolatedProductModule(req, id, retrieveConfig) { + // TODO: Add support for fields/expands + const remoteQuery = req.scope.resolve("remoteQuery") + + const variables = { id } + + const query = { + product: { + __args: variables, + ...defaultAdminProductRemoteQueryObject, + }, + } + + const [product] = await remoteQuery(query) + + product.profile_id = product.profile?.id + + return product +} diff --git a/packages/medusa/src/api/routes/store/products/get-product.ts b/packages/medusa/src/api/routes/store/products/get-product.ts index 35a0b10763..2f79a62ece 100644 --- a/packages/medusa/src/api/routes/store/products/get-product.ts +++ b/packages/medusa/src/api/routes/store/products/get-product.ts @@ -10,7 +10,7 @@ import { IsOptional, IsString } from "class-validator" import { PriceSelectionParams } from "../../../../types/price-selection" import { cleanResponseData } from "../../../../utils" import IsolateProductDomain from "../../../../loaders/feature-flags/isolate-product-domain" -import { defaultStoreRemoteQueryFields } from "./index" +import { defaultStoreProductRemoteQueryObject } from "./index" /** * @oas [get] /store/products/{id} @@ -170,7 +170,7 @@ async function getProductWithIsolatedProductModule(req, id: string) { const query = { product: { __args: variables, - ...defaultStoreRemoteQueryFields, + ...defaultStoreProductRemoteQueryObject, }, } diff --git a/packages/medusa/src/api/routes/store/products/index.ts b/packages/medusa/src/api/routes/store/products/index.ts index aa61cdd122..7f0fa7c62d 100644 --- a/packages/medusa/src/api/routes/store/products/index.ts +++ b/packages/medusa/src/api/routes/store/products/index.ts @@ -114,7 +114,7 @@ export const allowedStoreProductsRelations = [ /** * This is temporary. */ -export const defaultStoreRemoteQueryFields = { +export const defaultStoreProductRemoteQueryObject = { fields: defaultStoreProductsFields, images: { fields: ["id", "created_at", "updated_at", "deleted_at", "url", "metadata"], diff --git a/packages/medusa/src/api/routes/store/products/list-products.ts b/packages/medusa/src/api/routes/store/products/list-products.ts index 87b76d7fbf..8b0ac2b514 100644 --- a/packages/medusa/src/api/routes/store/products/list-products.ts +++ b/packages/medusa/src/api/routes/store/products/list-products.ts @@ -24,7 +24,7 @@ import { cleanResponseData } from "../../../../utils/clean-response-data" import { defaultStoreCategoryScope } from "../product-categories" import { optionalBooleanMapper } from "../../../../utils/validators/is-boolean" import IsolateProductDomain from "../../../../loaders/feature-flags/isolate-product-domain" -import { defaultStoreRemoteQueryFields } from "./index" +import { defaultStoreProductRemoteQueryObject } from "./index" /** * @oas [get] /store/products @@ -397,7 +397,7 @@ async function listAndCountProductWithIsolatedProductModule( const query = { product: { __args: variables, - ...defaultStoreRemoteQueryFields, + ...defaultStoreProductRemoteQueryObject, }, }