feat(product): price standalone products from the cover alone
build / build (push) Successful in 8m52s
build / build (push) Successful in 8m52s
Recovered work in progress from 2026-05. A product-cover can be marked standalone, and a standalone product (Journaling Booklet) prices as the cover price without the pattern/pages/ruling lookups, which do not exist for it. The remaining component lookups are now guarded so a missing relation yields null instead of calling findOne with undefined.
This commit is contained in:
@@ -108,6 +108,12 @@ export default factories.createCoreController("api::product.product", ({ strapi
|
||||
strapi.log.verbose(`Fetching variants for product ${id}`);
|
||||
|
||||
const product = await getProductDetails(id as ID);
|
||||
|
||||
// Standalone products (e.g. Journaling Booklet) have no pattern — no variants.
|
||||
if (!product.pattern?.id) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const variants = await strapi.entityService.findMany<"api::product.product", ProductVariantParams>("api::product.product", {
|
||||
...productVariantParams,
|
||||
filters: {
|
||||
@@ -146,6 +152,11 @@ export default factories.createCoreController("api::product.product", ({ strapi
|
||||
const product = await getProductDetails(id as ID);
|
||||
const { pattern, cover, ruling, pages } = product;
|
||||
|
||||
// Standalone products (e.g. Journaling Booklet) have no pattern → no variants.
|
||||
if (!pattern?.id) {
|
||||
return { allProductPattern: [], productVariants: [], patterns: [] };
|
||||
}
|
||||
|
||||
const productVariants = await strapi.entityService.findMany<"api::product.product", ProductVariantParams>("api::product.product", {
|
||||
...productVariantParams,
|
||||
filters: {
|
||||
@@ -203,6 +214,11 @@ export default factories.createCoreController("api::product.product", ({ strapi
|
||||
|
||||
const product = await getProductDetails(id as ID);
|
||||
|
||||
// Standalone products (e.g. Journaling Booklet) have no pattern → no variant groups.
|
||||
if (!product.pattern?.id) {
|
||||
return { pages: [], cover: [], ruling: [] };
|
||||
}
|
||||
|
||||
const allProductPatternVariants = await strapi.entityService.findMany<"api::product.product", ProductVariantParams>(
|
||||
"api::product.product",
|
||||
{
|
||||
@@ -335,7 +351,8 @@ export default factories.createCoreController("api::product.product", ({ strapi
|
||||
const productGroups = new Map();
|
||||
|
||||
allProductsSanitized.forEach((product) => {
|
||||
const key = `${product.cover.id}-${product.pattern.id}`;
|
||||
// Standalone products (e.g. Journaling Booklet) have no pattern — never grouped.
|
||||
const key = product.pattern?.id ? `${product.cover?.id}-${product.pattern.id}` : `standalone-${product.id}`;
|
||||
if (!productGroups.has(key) || calculateTotalProductPrice(product) < calculateTotalProductPrice(productGroups.get(key))) {
|
||||
productGroups.set(key, product);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user