From e1d793ce375a5444a6138b350be0afd3621c6b44 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 28 Jun 2026 05:52:46 -0400 Subject: [PATCH] x --- apps/admin/src/pages/DashboardPage.tsx | 6 +- apps/backend/clear_price.ts | 21 - apps/backend/delete_products.d.ts | 2 + apps/backend/delete_products.d.ts.map | 1 + apps/backend/delete_products.js | 22 + apps/backend/delete_products.js.map | 1 + apps/backend/query.d.ts | 2 + apps/backend/query.d.ts.map | 1 + apps/backend/query.js | 8 + apps/backend/query.js.map | 1 + apps/backend/scratch_seed_product.d.ts | 2 + apps/backend/scratch_seed_product.d.ts.map | 1 + apps/backend/scratch_seed_product.js | 11 + apps/backend/scratch_seed_product.js.map | 1 + apps/backend/scratch_test.d.ts | 2 + apps/backend/scratch_test.d.ts.map | 1 + apps/backend/scratch_test.js | 17 + apps/backend/scratch_test.js.map | 1 + apps/backend/scratch_test_langs.d.ts | 2 + apps/backend/scratch_test_langs.d.ts.map | 1 + apps/backend/scratch_test_langs.js | 6 + apps/backend/scratch_test_langs.js.map | 1 + apps/backend/scratch_test_menus.d.ts | 2 + apps/backend/scratch_test_menus.d.ts.map | 1 + apps/backend/scratch_test_menus.js | 3 + apps/backend/scratch_test_menus.js.map | 1 + apps/backend/scratch_test_page.d.ts | 2 + apps/backend/scratch_test_page.d.ts.map | 1 + apps/backend/scratch_test_page.js | 15 + apps/backend/scratch_test_page.js.map | 1 + apps/backend/scratch_test_page2.d.ts | 2 + apps/backend/scratch_test_page2.d.ts.map | 1 + apps/backend/scratch_test_page2.js | 11 + apps/backend/scratch_test_page2.js.map | 1 + apps/backend/src/index.js | 12 +- apps/backend/src/index.js.map | 2 +- apps/backend/src/lib/prisma.d.ts | 12 +- apps/backend/src/lib/prisma.d.ts.map | 2 +- apps/backend/src/lib/prisma.js | 9 +- apps/backend/src/lib/prisma.js.map | 2 +- apps/backend/src/lib/productAttributes.d.ts | 20 + .../src/lib/productAttributes.d.ts.map | 1 + apps/backend/src/lib/productAttributes.js | 152 ++++ apps/backend/src/lib/productAttributes.js.map | 1 + apps/backend/src/routes/categories.d.ts | 8 + apps/backend/src/routes/categories.d.ts.map | 2 +- apps/backend/src/routes/categories.js | 68 +- apps/backend/src/routes/categories.js.map | 2 +- apps/backend/src/routes/coupons.d.ts | 4 +- apps/backend/src/routes/pages.d.ts | 21 + apps/backend/src/routes/pages.d.ts.map | 2 +- apps/backend/src/routes/pages.js | 781 +++++++----------- apps/backend/src/routes/pages.js.map | 2 +- .../src/routes/product-attributes.d.ts | 349 ++++++++ .../src/routes/product-attributes.d.ts.map | 1 + apps/backend/src/routes/product-attributes.js | 417 ++++++++++ .../src/routes/product-attributes.js.map | 1 + apps/backend/src/routes/products.d.ts | 46 +- apps/backend/src/routes/products.d.ts.map | 2 +- apps/backend/src/routes/products.js | 400 +++++++-- apps/backend/src/routes/products.js.map | 2 +- apps/backend/src/routes/products.ts | 3 - apps/backend/src/routes/promotions.d.ts | 4 +- apps/backend/tsconfig.tsbuildinfo | 2 +- apps/mcp-server/index.ts | 2 - apps/spa/src/components/ProductCard.tsx | 4 +- apps/spa/src/pages/ProductDetailPage.tsx | 2 +- .../src/components/AddToCartSection.tsx | 6 +- apps/website/src/components/ProductCard.tsx | 6 +- 69 files changed, 1892 insertions(+), 610 deletions(-) delete mode 100644 apps/backend/clear_price.ts create mode 100644 apps/backend/delete_products.d.ts create mode 100644 apps/backend/delete_products.d.ts.map create mode 100644 apps/backend/delete_products.js create mode 100644 apps/backend/delete_products.js.map create mode 100644 apps/backend/query.d.ts create mode 100644 apps/backend/query.d.ts.map create mode 100644 apps/backend/query.js create mode 100644 apps/backend/query.js.map create mode 100644 apps/backend/scratch_seed_product.d.ts create mode 100644 apps/backend/scratch_seed_product.d.ts.map create mode 100644 apps/backend/scratch_seed_product.js create mode 100644 apps/backend/scratch_seed_product.js.map create mode 100644 apps/backend/scratch_test.d.ts create mode 100644 apps/backend/scratch_test.d.ts.map create mode 100644 apps/backend/scratch_test.js create mode 100644 apps/backend/scratch_test.js.map create mode 100644 apps/backend/scratch_test_langs.d.ts create mode 100644 apps/backend/scratch_test_langs.d.ts.map create mode 100644 apps/backend/scratch_test_langs.js create mode 100644 apps/backend/scratch_test_langs.js.map create mode 100644 apps/backend/scratch_test_menus.d.ts create mode 100644 apps/backend/scratch_test_menus.d.ts.map create mode 100644 apps/backend/scratch_test_menus.js create mode 100644 apps/backend/scratch_test_menus.js.map create mode 100644 apps/backend/scratch_test_page.d.ts create mode 100644 apps/backend/scratch_test_page.d.ts.map create mode 100644 apps/backend/scratch_test_page.js create mode 100644 apps/backend/scratch_test_page.js.map create mode 100644 apps/backend/scratch_test_page2.d.ts create mode 100644 apps/backend/scratch_test_page2.d.ts.map create mode 100644 apps/backend/scratch_test_page2.js create mode 100644 apps/backend/scratch_test_page2.js.map create mode 100644 apps/backend/src/lib/productAttributes.d.ts create mode 100644 apps/backend/src/lib/productAttributes.d.ts.map create mode 100644 apps/backend/src/lib/productAttributes.js create mode 100644 apps/backend/src/lib/productAttributes.js.map create mode 100644 apps/backend/src/routes/product-attributes.d.ts create mode 100644 apps/backend/src/routes/product-attributes.d.ts.map create mode 100644 apps/backend/src/routes/product-attributes.js create mode 100644 apps/backend/src/routes/product-attributes.js.map diff --git a/apps/admin/src/pages/DashboardPage.tsx b/apps/admin/src/pages/DashboardPage.tsx index 719f734..2716e9f 100644 --- a/apps/admin/src/pages/DashboardPage.tsx +++ b/apps/admin/src/pages/DashboardPage.tsx @@ -30,7 +30,11 @@ export default function DashboardPage() { const brands = new Set(prods.map(p => p.brand.id)).size const totalProducts = prods.length - const avgPrice = prods.reduce((acc, curr) => acc + (curr.price || 0), 0) / (totalProducts || 1) + const avgPrice = prods.reduce((acc, curr) => { + const variantPrices = curr.variants?.map(v => v.price || 0) || [] + const minPrice = variantPrices.length > 0 ? Math.min(...variantPrices) : 0 + return acc + minPrice + }, 0) / (totalProducts || 1) const validOrders = Array.isArray(orders) ? orders : [] const totalOrders = validOrders.length diff --git a/apps/backend/clear_price.ts b/apps/backend/clear_price.ts deleted file mode 100644 index 277d11a..0000000 --- a/apps/backend/clear_price.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { PrismaClient } from '@prisma/client'; - -const prisma = new PrismaClient(); - -async function main() { - await prisma.product.updateMany({ - data: { - price: null, - }, - }); - console.log('Successfully set all Product prices to null'); -} - -main() - .catch((e) => { - console.error(e); - process.exit(1); - }) - .finally(async () => { - await prisma.$disconnect(); - }); diff --git a/apps/backend/delete_products.d.ts b/apps/backend/delete_products.d.ts new file mode 100644 index 0000000..4c6e97e --- /dev/null +++ b/apps/backend/delete_products.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=delete_products.d.ts.map \ No newline at end of file diff --git a/apps/backend/delete_products.d.ts.map b/apps/backend/delete_products.d.ts.map new file mode 100644 index 0000000..78b8642 --- /dev/null +++ b/apps/backend/delete_products.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"delete_products.d.ts","sourceRoot":"","sources":["delete_products.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/apps/backend/delete_products.js b/apps/backend/delete_products.js new file mode 100644 index 0000000..d4db274 --- /dev/null +++ b/apps/backend/delete_products.js @@ -0,0 +1,22 @@ +import prisma from './src/lib/prisma'; +async function main() { + console.log('Starting deletion process...'); + try { + // Delete all product variants first to avoid foreign key constraint errors + const deletedVariants = await prisma.productVariant.deleteMany({}); + console.log(`Deleted ${deletedVariants.count} ProductVariants.`); + // Delete all products + const deletedProducts = await prisma.product.deleteMany({}); + console.log(`Deleted ${deletedProducts.count} Products.`); + console.log('Deletion completed successfully.'); + } + catch (error) { + console.error('Error deleting products:', error); + process.exit(1); + } + finally { + await prisma.$disconnect(); + } +} +main(); +//# sourceMappingURL=delete_products.js.map \ No newline at end of file diff --git a/apps/backend/delete_products.js.map b/apps/backend/delete_products.js.map new file mode 100644 index 0000000..cfb0407 --- /dev/null +++ b/apps/backend/delete_products.js.map @@ -0,0 +1 @@ +{"version":3,"file":"delete_products.js","sourceRoot":"","sources":["delete_products.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,kBAAkB,CAAC;AAEtC,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAE5C,IAAI,CAAC;QACH,2EAA2E;QAC3E,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,WAAW,eAAe,CAAC,KAAK,mBAAmB,CAAC,CAAC;QAEjE,sBAAsB;QACtB,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,WAAW,eAAe,CAAC,KAAK,YAAY,CAAC,CAAC;QAE1D,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC"} \ No newline at end of file diff --git a/apps/backend/query.d.ts b/apps/backend/query.d.ts new file mode 100644 index 0000000..7eb13e5 --- /dev/null +++ b/apps/backend/query.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=query.d.ts.map \ No newline at end of file diff --git a/apps/backend/query.d.ts.map b/apps/backend/query.d.ts.map new file mode 100644 index 0000000..fe7a937 --- /dev/null +++ b/apps/backend/query.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["query.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/apps/backend/query.js b/apps/backend/query.js new file mode 100644 index 0000000..e4854cf --- /dev/null +++ b/apps/backend/query.js @@ -0,0 +1,8 @@ +import { PrismaClient } from '@prisma/client'; +const prisma = new PrismaClient(); +async function main() { + const section = await prisma.pageSection.findUnique({ where: { id: 37 } }); + console.log(JSON.stringify(section, null, 2)); +} +main().finally(() => prisma.$disconnect()); +//# sourceMappingURL=query.js.map \ No newline at end of file diff --git a/apps/backend/query.js.map b/apps/backend/query.js.map new file mode 100644 index 0000000..38fb5b1 --- /dev/null +++ b/apps/backend/query.js.map @@ -0,0 +1 @@ +{"version":3,"file":"query.js","sourceRoot":"","sources":["query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;AAClC,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AACD,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC"} \ No newline at end of file diff --git a/apps/backend/scratch_seed_product.d.ts b/apps/backend/scratch_seed_product.d.ts new file mode 100644 index 0000000..2e0f26a --- /dev/null +++ b/apps/backend/scratch_seed_product.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=scratch_seed_product.d.ts.map \ No newline at end of file diff --git a/apps/backend/scratch_seed_product.d.ts.map b/apps/backend/scratch_seed_product.d.ts.map new file mode 100644 index 0000000..b9b9384 --- /dev/null +++ b/apps/backend/scratch_seed_product.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"scratch_seed_product.d.ts","sourceRoot":"","sources":["scratch_seed_product.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/apps/backend/scratch_seed_product.js b/apps/backend/scratch_seed_product.js new file mode 100644 index 0000000..cc158f9 --- /dev/null +++ b/apps/backend/scratch_seed_product.js @@ -0,0 +1,11 @@ +import prisma from './src/lib/prisma'; +async function main() { + const brand = await prisma.productBrand.findFirst({ where: { name: 'DDC' } }); + let cat = await prisma.category.findFirst({ where: { name: 'Sprockets' } }); + if (!cat) { + cat = await prisma.category.create({ data: { name: 'Sprockets' } }); + } + console.log(JSON.stringify({ brandId: brand?.id, catId: cat.id })); +} +main().catch(console.error).finally(() => process.exit(0)); +//# sourceMappingURL=scratch_seed_product.js.map \ No newline at end of file diff --git a/apps/backend/scratch_seed_product.js.map b/apps/backend/scratch_seed_product.js.map new file mode 100644 index 0000000..3addae3 --- /dev/null +++ b/apps/backend/scratch_seed_product.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scratch_seed_product.js","sourceRoot":"","sources":["scratch_seed_product.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,KAAK,UAAU,IAAI;IACjB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC9E,IAAI,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;IAC5E,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,GAAG,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AACD,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC"} \ No newline at end of file diff --git a/apps/backend/scratch_test.d.ts b/apps/backend/scratch_test.d.ts new file mode 100644 index 0000000..ab806af --- /dev/null +++ b/apps/backend/scratch_test.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=scratch_test.d.ts.map \ No newline at end of file diff --git a/apps/backend/scratch_test.d.ts.map b/apps/backend/scratch_test.d.ts.map new file mode 100644 index 0000000..4ee0803 --- /dev/null +++ b/apps/backend/scratch_test.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"scratch_test.d.ts","sourceRoot":"","sources":["scratch_test.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/apps/backend/scratch_test.js b/apps/backend/scratch_test.js new file mode 100644 index 0000000..64304ad --- /dev/null +++ b/apps/backend/scratch_test.js @@ -0,0 +1,17 @@ +import { PrismaClient } from '@prisma/client'; +const prisma = new PrismaClient(); +prisma.product.findMany({ + include: { + category: { include: { translations: true } }, + brand: true, + translations: true, + variants: { + include: { + bomItems: { include: { rawMaterial: true } } + }, + orderBy: { price: "asc" } + }, + images: { orderBy: { order: "asc" } }, + } +}).then(console.log).catch(console.error).finally(() => prisma.$disconnect()); +//# sourceMappingURL=scratch_test.js.map \ No newline at end of file diff --git a/apps/backend/scratch_test.js.map b/apps/backend/scratch_test.js.map new file mode 100644 index 0000000..7b7dda5 --- /dev/null +++ b/apps/backend/scratch_test.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scratch_test.js","sourceRoot":"","sources":["scratch_test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;AAClC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;IACtB,OAAO,EAAE;QACP,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;QAC7C,KAAK,EAAE,IAAI;QACX,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE;YACR,OAAO,EAAE;gBACP,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;aAC7C;YACD,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;SAC1B;QACD,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;KACtC;CACF,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC"} \ No newline at end of file diff --git a/apps/backend/scratch_test_langs.d.ts b/apps/backend/scratch_test_langs.d.ts new file mode 100644 index 0000000..ee5d0c4 --- /dev/null +++ b/apps/backend/scratch_test_langs.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=scratch_test_langs.d.ts.map \ No newline at end of file diff --git a/apps/backend/scratch_test_langs.d.ts.map b/apps/backend/scratch_test_langs.d.ts.map new file mode 100644 index 0000000..41d5bc6 --- /dev/null +++ b/apps/backend/scratch_test_langs.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"scratch_test_langs.d.ts","sourceRoot":"","sources":["scratch_test_langs.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/apps/backend/scratch_test_langs.js b/apps/backend/scratch_test_langs.js new file mode 100644 index 0000000..85f9857 --- /dev/null +++ b/apps/backend/scratch_test_langs.js @@ -0,0 +1,6 @@ +import prisma from './src/lib/prisma'; +prisma.storeSettingsTranslation.findMany({ select: { langCode: true } }) + .then(x => console.log([...new Set(x.map(r => r.langCode))])) + .catch(console.error) + .finally(() => prisma.$disconnect()); +//# sourceMappingURL=scratch_test_langs.js.map \ No newline at end of file diff --git a/apps/backend/scratch_test_langs.js.map b/apps/backend/scratch_test_langs.js.map new file mode 100644 index 0000000..f0652ea --- /dev/null +++ b/apps/backend/scratch_test_langs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scratch_test_langs.js","sourceRoot":"","sources":["scratch_test_langs.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,MAAM,CAAC,wBAAwB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;KACrE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;KAC5D,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;KACpB,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC"} \ No newline at end of file diff --git a/apps/backend/scratch_test_menus.d.ts b/apps/backend/scratch_test_menus.d.ts new file mode 100644 index 0000000..97ab8c8 --- /dev/null +++ b/apps/backend/scratch_test_menus.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=scratch_test_menus.d.ts.map \ No newline at end of file diff --git a/apps/backend/scratch_test_menus.d.ts.map b/apps/backend/scratch_test_menus.d.ts.map new file mode 100644 index 0000000..efd25e1 --- /dev/null +++ b/apps/backend/scratch_test_menus.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"scratch_test_menus.d.ts","sourceRoot":"","sources":["scratch_test_menus.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/apps/backend/scratch_test_menus.js b/apps/backend/scratch_test_menus.js new file mode 100644 index 0000000..fbea58b --- /dev/null +++ b/apps/backend/scratch_test_menus.js @@ -0,0 +1,3 @@ +import prisma from './src/lib/prisma'; +prisma.menu.findMany().then(console.log).catch(console.error).finally(() => prisma.$disconnect()); +//# sourceMappingURL=scratch_test_menus.js.map \ No newline at end of file diff --git a/apps/backend/scratch_test_menus.js.map b/apps/backend/scratch_test_menus.js.map new file mode 100644 index 0000000..eae0fb5 --- /dev/null +++ b/apps/backend/scratch_test_menus.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scratch_test_menus.js","sourceRoot":"","sources":["scratch_test_menus.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC"} \ No newline at end of file diff --git a/apps/backend/scratch_test_page.d.ts b/apps/backend/scratch_test_page.d.ts new file mode 100644 index 0000000..47ca2b3 --- /dev/null +++ b/apps/backend/scratch_test_page.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=scratch_test_page.d.ts.map \ No newline at end of file diff --git a/apps/backend/scratch_test_page.d.ts.map b/apps/backend/scratch_test_page.d.ts.map new file mode 100644 index 0000000..660eb5a --- /dev/null +++ b/apps/backend/scratch_test_page.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"scratch_test_page.d.ts","sourceRoot":"","sources":["scratch_test_page.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/apps/backend/scratch_test_page.js b/apps/backend/scratch_test_page.js new file mode 100644 index 0000000..674da5a --- /dev/null +++ b/apps/backend/scratch_test_page.js @@ -0,0 +1,15 @@ +import { PrismaClient } from '@prisma/client'; +const prisma = new PrismaClient(); +prisma.page.findUnique({ + where: { slug: 'home' }, + include: { + translations: true, + sections: { + include: { + translations: true + }, + orderBy: { order: "asc" } + } + } +}).then(console.log).catch(console.error).finally(() => prisma.$disconnect()); +//# sourceMappingURL=scratch_test_page.js.map \ No newline at end of file diff --git a/apps/backend/scratch_test_page.js.map b/apps/backend/scratch_test_page.js.map new file mode 100644 index 0000000..fc6489f --- /dev/null +++ b/apps/backend/scratch_test_page.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scratch_test_page.js","sourceRoot":"","sources":["scratch_test_page.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,MAAM,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;AAClC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;IACrB,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;IACvB,OAAO,EAAE;QACP,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE;YACR,OAAO,EAAE;gBACP,YAAY,EAAE,IAAI;aACnB;YACD,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;SAC1B;KACF;CACF,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC"} \ No newline at end of file diff --git a/apps/backend/scratch_test_page2.d.ts b/apps/backend/scratch_test_page2.d.ts new file mode 100644 index 0000000..ceee494 --- /dev/null +++ b/apps/backend/scratch_test_page2.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=scratch_test_page2.d.ts.map \ No newline at end of file diff --git a/apps/backend/scratch_test_page2.d.ts.map b/apps/backend/scratch_test_page2.d.ts.map new file mode 100644 index 0000000..1e07a23 --- /dev/null +++ b/apps/backend/scratch_test_page2.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"scratch_test_page2.d.ts","sourceRoot":"","sources":["scratch_test_page2.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/apps/backend/scratch_test_page2.js b/apps/backend/scratch_test_page2.js new file mode 100644 index 0000000..bb81d0a --- /dev/null +++ b/apps/backend/scratch_test_page2.js @@ -0,0 +1,11 @@ +import prisma from './src/lib/prisma'; +prisma.page.findUnique({ + where: { slug: 'home' }, + include: { + translations: true, + sections: { + orderBy: { order: "asc" } + } + } +}).then(console.log).catch(console.error).finally(() => prisma.$disconnect()); +//# sourceMappingURL=scratch_test_page2.js.map \ No newline at end of file diff --git a/apps/backend/scratch_test_page2.js.map b/apps/backend/scratch_test_page2.js.map new file mode 100644 index 0000000..36fd56e --- /dev/null +++ b/apps/backend/scratch_test_page2.js.map @@ -0,0 +1 @@ +{"version":3,"file":"scratch_test_page2.js","sourceRoot":"","sources":["scratch_test_page2.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;IACrB,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;IACvB,OAAO,EAAE;QACP,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE;YACR,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;SAC1B;KACF;CACF,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC"} \ No newline at end of file diff --git a/apps/backend/src/index.js b/apps/backend/src/index.js index 465789d..2506f73 100644 --- a/apps/backend/src/index.js +++ b/apps/backend/src/index.js @@ -27,6 +27,7 @@ import { menusRoute } from "./routes/menus"; import { newsletterRoute } from "./routes/newsletter"; import { mediaRoute } from "./routes/media"; import { contactsRoute } from "./routes/contacts"; +import { productAttributesRoute } from "./routes/product-attributes"; const PORT = process.env.PORT ? parseInt(process.env.PORT) : 3051; const CORS_ORIGIN = process.env.CORS_ORIGIN || "http://localhost:5173"; const JWT_SECRET = process.env.JWT_SECRET || "homaroma_secret_2026_brand"; @@ -52,6 +53,15 @@ const allowLanDevOrigin = (request) => { } }; const app = new Elysia() + .onRequest(({ request }) => { + console.log(`\n➡️ [${request.method}] ${request.url}`); +}) + .onAfterHandle(({ request, set }) => { + console.log(`✅ [${request.method}] ${request.url} → ${set.status ?? 200}`); +}) + .onError(({ request, error, set }) => { + console.error(`❌ [${request.method}] ${request.url} → ${set.status ?? 500}`, error?.message ?? error); +}) .onParse(async ({ request }) => { console.log('[onParse] Incoming request URL:', request.url); if (request.url.includes('/api/line/webhook')) { @@ -114,7 +124,7 @@ const app = new Elysia() } return file; }) - .group("/api", (app) => app.use(authRoute).use(categoriesRoute).use(productsRoute).use(uploadRoute).use(ordersRoute).use(settingsRoute).use(articlesRoute).use(tiktokRoute).use(rawMaterialsRoute).use(shopeeRoute).use(tiktokOrderRoute).use(lazadaOrderRoute).use(customersRoute).use(couponsRoute).use(reviewsRoute).use(promotionsRoute).use(pagesRoute).use(paymentsRoute).use(profileRoute).use(lineRoutes).use(menusRoute).use(newsletterRoute).use(mediaRoute).use(contactsRoute)) + .group("/api", (app) => app.use(authRoute).use(categoriesRoute).use(productsRoute).use(productAttributesRoute).use(uploadRoute).use(ordersRoute).use(settingsRoute).use(articlesRoute).use(tiktokRoute).use(rawMaterialsRoute).use(shopeeRoute).use(tiktokOrderRoute).use(lazadaOrderRoute).use(customersRoute).use(couponsRoute).use(reviewsRoute).use(promotionsRoute).use(pagesRoute).use(paymentsRoute).use(profileRoute).use(lineRoutes).use(menusRoute).use(newsletterRoute).use(mediaRoute).use(contactsRoute)) .listen({ port: PORT, hostname: "0.0.0.0" }); console.log(`🌿 HomAroma API is running at http://${app.server?.hostname}:${app.server?.port}`); console.log(`📖 Swagger docs: http://${app.server?.hostname}:${app.server?.port}/swagger`); diff --git a/apps/backend/src/index.js.map b/apps/backend/src/index.js.map index f8ddfb5..334758a 100644 --- a/apps/backend/src/index.js.map +++ b/apps/backend/src/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/apps/backend/src/lib/prisma.d.ts b/apps/backend/src/lib/prisma.d.ts index 16cc61f..c60552c 100644 --- a/apps/backend/src/lib/prisma.d.ts +++ b/apps/backend/src/lib/prisma.d.ts @@ -2,6 +2,16 @@ import { PrismaClient } from "@prisma/client"; import { PrismaPg } from "@prisma/adapter-pg"; declare const prisma: PrismaClient<{ adapter: PrismaPg; -}, never, import("@prisma/client/runtime/client").DefaultArgs>; + log: ({ + emit: "stdout"; + level: "query"; + } | { + emit: "stdout"; + level: "error"; + } | { + emit: "stdout"; + level: "warn"; + })[]; +}, "query" | "warn" | "error", import("@prisma/client/runtime/client").DefaultArgs>; export default prisma; //# sourceMappingURL=prisma.d.ts.map \ No newline at end of file diff --git a/apps/backend/src/lib/prisma.d.ts.map b/apps/backend/src/lib/prisma.d.ts.map index 2d179a9..09d36be 100644 --- a/apps/backend/src/lib/prisma.d.ts.map +++ b/apps/backend/src/lib/prisma.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"prisma.d.ts","sourceRoot":"","sources":["prisma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAW9C,QAAA,MAAM,MAAM;;8DAAgC,CAAC;AAE7C,eAAe,MAAM,CAAC"} \ No newline at end of file +{"version":3,"file":"prisma.d.ts","sourceRoot":"","sources":["prisma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAW9C,QAAA,MAAM,MAAM;;;;;;;;;;;;mFAOV,CAAC;AAEH,eAAe,MAAM,CAAC"} \ No newline at end of file diff --git a/apps/backend/src/lib/prisma.js b/apps/backend/src/lib/prisma.js index 8d1e5ff..6535bc6 100644 --- a/apps/backend/src/lib/prisma.js +++ b/apps/backend/src/lib/prisma.js @@ -6,6 +6,13 @@ dotenv.config(); const connectionString = process.env.DATABASE_URL; const pool = new Pool({ connectionString }); const adapter = new PrismaPg(pool); -const prisma = new PrismaClient({ adapter }); +const prisma = new PrismaClient({ + adapter, + log: [ + { emit: 'stdout', level: 'query' }, + { emit: 'stdout', level: 'error' }, + { emit: 'stdout', level: 'warn' }, + ], +}); export default prisma; //# sourceMappingURL=prisma.js.map \ No newline at end of file diff --git a/apps/backend/src/lib/prisma.js.map b/apps/backend/src/lib/prisma.js.map index ea79c36..c7cca46 100644 --- a/apps/backend/src/lib/prisma.js.map +++ b/apps/backend/src/lib/prisma.js.map @@ -1 +1 @@ -{"version":3,"file":"prisma.js","sourceRoot":"","sources":["prisma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,YAAa,CAAC;AAEnD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAC5C,MAAM,OAAO,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;AAEnC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;AAE7C,eAAe,MAAM,CAAC"} \ No newline at end of file +{"version":3,"file":"prisma.js","sourceRoot":"","sources":["prisma.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAC1B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,YAAa,CAAC;AAEnD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAC5C,MAAM,OAAO,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;AAEnC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;IAC9B,OAAO;IACP,GAAG,EAAE;QACH,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;QAClC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;QAClC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE;KAClC;CACF,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"} \ No newline at end of file diff --git a/apps/backend/src/lib/productAttributes.d.ts b/apps/backend/src/lib/productAttributes.d.ts new file mode 100644 index 0000000..473d539 --- /dev/null +++ b/apps/backend/src/lib/productAttributes.d.ts @@ -0,0 +1,20 @@ +export declare const SUPPORTED_LANGS: readonly ["th", "en", "ja", "zh", "vi", "ko"]; +export type AttributeType = 'TEXT' | 'NUMBER' | 'BOOLEAN' | 'SELECT' | 'JSON'; +export declare function normalizeAttributeType(type: unknown): AttributeType; +export declare function resolveLocalizedText(baseValue: string | null | undefined, translations: Array<{ + langCode: string; + valueText?: string | null; +}> | undefined, lang: string): string; +export declare function resolveDefinitionLocalizedField(baseValue: string | null | undefined, translations: T[] | undefined, lang: string, field: 'label' | 'description'): string | null; +export declare function getPrimaryOptionValue(value: any): string; +export declare function getLocalizedOptionLabel(value: any, lang: string): string; +export declare function getSelectOptionDisplay(options: any, storedValue: string, lang: string): string; +export declare function validateAttributeValue(type: AttributeType, payload: Record): void; +export declare function validateSelectOption(options: any, storedValue: string): void; +export declare function localizeAttributeDefinition(definition: any, lang: string): any; +export declare function localizeProductAttribute(attribute: any, lang: string): any; +//# sourceMappingURL=productAttributes.d.ts.map \ No newline at end of file diff --git a/apps/backend/src/lib/productAttributes.d.ts.map b/apps/backend/src/lib/productAttributes.d.ts.map new file mode 100644 index 0000000..9258bce --- /dev/null +++ b/apps/backend/src/lib/productAttributes.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"productAttributes.d.ts","sourceRoot":"","sources":["productAttributes.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,+CAAQ,CAAC;AAErC,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;AAI9E,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CAMnE;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,YAAY,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,GAAG,SAAS,EAChF,IAAI,EAAE,MAAM,UAQb;AAED,wBAAgB,+BAA+B,CAAC,CAAC,SAAS;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACxH,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,YAAY,EAAE,CAAC,EAAE,GAAG,SAAS,EAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,GAAG,aAAa,iBAQ/B;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAMxD;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMxE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAS9F;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAmCvF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,QAQrE;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,OAqBxE;AAED,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,OA8BpE"} \ No newline at end of file diff --git a/apps/backend/src/lib/productAttributes.js b/apps/backend/src/lib/productAttributes.js new file mode 100644 index 0000000..c7a8164 --- /dev/null +++ b/apps/backend/src/lib/productAttributes.js @@ -0,0 +1,152 @@ +const LANGS = ['th', 'en', 'ja', 'zh', 'vi', 'ko']; +export const SUPPORTED_LANGS = LANGS; +const ATTRIBUTE_TYPES = ['TEXT', 'NUMBER', 'BOOLEAN', 'SELECT', 'JSON']; +export function normalizeAttributeType(type) { + const normalized = String(type || '').toUpperCase(); + if (!ATTRIBUTE_TYPES.includes(normalized)) { + throw new Error(`Unsupported attribute type '${type}'. Allowed types: ${ATTRIBUTE_TYPES.join(', ')}`); + } + return normalized; +} +export function resolveLocalizedText(baseValue, translations, lang) { + if (lang === 'all') + return baseValue ?? ''; + const exact = translations?.find((item) => item.langCode === lang)?.valueText; + if (exact) + return exact; + const thai = translations?.find((item) => item.langCode === 'th')?.valueText; + if (thai) + return thai; + return baseValue ?? ''; +} +export function resolveDefinitionLocalizedField(baseValue, translations, lang, field) { + if (lang === 'all') + return baseValue ?? null; + const exact = translations?.find((item) => item.langCode === lang)?.[field]; + if (exact !== undefined && exact !== null && exact !== '') + return exact; + const thai = translations?.find((item) => item.langCode === 'th')?.[field]; + if (thai !== undefined && thai !== null && thai !== '') + return thai; + return baseValue ?? null; +} +export function getPrimaryOptionValue(value) { + if (typeof value === 'string') + return value; + if (typeof value === 'object' && value !== null) { + return value.th || value.en || Object.values(value)[0] || ''; + } + return String(value ?? ''); +} +export function getLocalizedOptionLabel(value, lang) { + if (typeof value === 'string') + return value; + if (typeof value === 'object' && value !== null) { + return value[lang] || value[lang.slice(0, 2)] || value.th || value.en || Object.values(value)[0] || ''; + } + return String(value ?? ''); +} +export function getSelectOptionDisplay(options, storedValue, lang) { + if (!Array.isArray(options)) + return storedValue; + for (const option of options) { + const primary = getPrimaryOptionValue(option); + if (primary === storedValue) { + return getLocalizedOptionLabel(option, lang); + } + } + return storedValue; +} +export function validateAttributeValue(type, payload) { + const populated = [ + payload.valueText !== undefined && payload.valueText !== null && payload.valueText !== '', + payload.valueNumber !== undefined && payload.valueNumber !== null, + payload.valueBoolean !== undefined && payload.valueBoolean !== null, + payload.valueJson !== undefined && payload.valueJson !== null, + ].filter(Boolean).length; + if (populated !== 1) { + throw new Error('Exactly one of valueText, valueNumber, valueBoolean, or valueJson must be provided.'); + } + switch (type) { + case 'TEXT': + if (typeof payload.valueText !== 'string') + throw new Error('TEXT attributes require valueText as a string.'); + return; + case 'NUMBER': + if (typeof payload.valueNumber !== 'number' || Number.isNaN(payload.valueNumber)) { + throw new Error('NUMBER attributes require valueNumber as a valid number.'); + } + return; + case 'BOOLEAN': + if (typeof payload.valueBoolean !== 'boolean') { + throw new Error('BOOLEAN attributes require valueBoolean as a boolean.'); + } + return; + case 'JSON': + if (payload.valueJson === undefined || payload.valueJson === null) { + throw new Error('JSON attributes require valueJson.'); + } + return; + case 'SELECT': + if (typeof payload.valueText !== 'string') + throw new Error('SELECT attributes require valueText as the stored option key.'); + return; + } +} +export function validateSelectOption(options, storedValue) { + if (!Array.isArray(options)) { + throw new Error('SELECT attribute definition must provide options.'); + } + const allowed = options.map(getPrimaryOptionValue); + if (!allowed.includes(storedValue)) { + throw new Error(`Invalid SELECT value '${storedValue}'. Allowed values: [${allowed.join(', ')}]`); + } +} +export function localizeAttributeDefinition(definition, lang) { + if (lang === 'all') { + const label = {}; + const description = {}; + definition.translations?.forEach((translation) => { + label[translation.langCode] = translation.label; + if (translation.description) + description[translation.langCode] = translation.description; + }); + return { + ...definition, + label, + description, + }; + } + return { + ...definition, + label: resolveDefinitionLocalizedField(definition.label, definition.translations, lang, 'label') || definition.label, + description: resolveDefinitionLocalizedField(definition.description, definition.translations, lang, 'description'), + }; +} +export function localizeProductAttribute(attribute, lang) { + const localizedDefinition = localizeAttributeDefinition(attribute.attributeDefinition, lang); + const type = normalizeAttributeType(attribute.attributeDefinition.type); + const value = type === 'TEXT' + ? resolveLocalizedText(attribute.valueText, attribute.translations, lang) + : type === 'SELECT' + ? getSelectOptionDisplay(attribute.attributeDefinition.options, attribute.valueText || '', lang) + : attribute.valueBoolean ?? attribute.valueNumber ?? attribute.valueJson ?? attribute.valueText ?? null; + if (lang === 'all') { + const valueTranslations = {}; + attribute.translations?.forEach((translation) => { + valueTranslations[translation.langCode] = translation.valueText; + }); + return { + ...attribute, + attributeDefinition: localizedDefinition, + value, + valueTranslations, + }; + } + return { + ...attribute, + attributeDefinition: localizedDefinition, + value, + }; +} +//# sourceMappingURL=productAttributes.js.map \ No newline at end of file diff --git a/apps/backend/src/lib/productAttributes.js.map b/apps/backend/src/lib/productAttributes.js.map new file mode 100644 index 0000000..9d66dd2 --- /dev/null +++ b/apps/backend/src/lib/productAttributes.js.map @@ -0,0 +1 @@ +{"version":3,"file":"productAttributes.js","sourceRoot":"","sources":["productAttributes.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/apps/backend/src/routes/categories.d.ts b/apps/backend/src/routes/categories.d.ts index 9a1883f..dc16d68 100644 --- a/apps/backend/src/routes/categories.d.ts +++ b/apps/backend/src/routes/categories.d.ts @@ -94,6 +94,11 @@ export declare const categoriesRoute: Elysia<"/categories", { }; 400: { readonly message: "Invalid category ID"; + } | { + readonly message: "No valid translations provided"; + }; + 404: { + readonly message: "Category not found"; }; 422: { type: "validation"; @@ -104,6 +109,9 @@ export declare const categoriesRoute: Elysia<"/categories", { property?: string; expected?: string; }; + 500: { + readonly message: any; + }; }; }; }; diff --git a/apps/backend/src/routes/categories.d.ts.map b/apps/backend/src/routes/categories.d.ts.map index e5f2e90..8091bd4 100644 --- a/apps/backend/src/routes/categories.d.ts.map +++ b/apps/backend/src/routes/categories.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"categories.d.ts","sourceRoot":"","sources":["categories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAK,MAAM,QAAQ,CAAC;AAkBnC,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgNxB,CAAC"} \ No newline at end of file +{"version":3,"file":"categories.d.ts","sourceRoot":"","sources":["categories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAK,MAAM,QAAQ,CAAC;AAkBnC,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4NxB,CAAC"} \ No newline at end of file diff --git a/apps/backend/src/routes/categories.js b/apps/backend/src/routes/categories.js index 45d67d5..9852636 100644 --- a/apps/backend/src/routes/categories.js +++ b/apps/backend/src/routes/categories.js @@ -113,36 +113,48 @@ export const categoriesRoute = new Elysia({ prefix: "/categories" }) const id = parseInt(params.id); if (isNaN(id)) return status(400, { message: "Invalid category ID" }); - const payload = body; - const results = []; - for (const lang of LANGS) { - const name = typeof payload.name === 'string' - ? (lang === 'th' ? payload.name : null) - : payload.name?.[lang]; - if (!name) - continue; - const existing = await prisma.categoryTranslation.findUnique({ - where: { categoryId_langCode: { categoryId: id, langCode: lang } } + try { + const categoryExists = await prisma.category.findUnique({ where: { id } }); + if (!categoryExists) + return status(404, { message: "Category not found" }); + const payload = body; + const results = []; + for (const lang of LANGS) { + const name = typeof payload.name === 'string' + ? (lang === 'th' ? payload.name : null) + : payload.name?.[lang]; + if (!name) + continue; + const existing = await prisma.categoryTranslation.findUnique({ + where: { categoryId_langCode: { categoryId: id, langCode: lang } } + }); + if (existing) { + const updated = await prisma.categoryTranslation.update({ + where: { id: existing.id }, + data: { name }, + }); + results.push(updated); + } + else { + const created = await prisma.categoryTranslation.create({ + data: { categoryId: id, langCode: lang, name }, + }); + results.push(created); + } + } + if (results.length === 0) { + return status(400, { message: "No valid translations provided" }); + } + const updated = await prisma.category.findUnique({ + where: { id }, + include: { translations: true, _count: { select: { products: true } } }, }); - if (existing) { - const updated = await prisma.categoryTranslation.update({ - where: { id: existing.id }, - data: { name }, - }); - results.push(updated); - } - else { - const created = await prisma.categoryTranslation.create({ - data: { categoryId: id, langCode: lang, name }, - }); - results.push(created); - } + return { success: true, translations: results, category: updated }; + } + catch (err) { + console.error("Update category translations error:", err); + return status(500, { message: err?.message || "Failed to update translations" }); } - const updated = await prisma.category.findUnique({ - where: { id }, - include: { translations: true, _count: { select: { products: true } } }, - }); - return { success: true, translations: results, category: updated }; }) .post("/", async ({ body, status }) => { try { diff --git a/apps/backend/src/routes/categories.js.map b/apps/backend/src/routes/categories.js.map index 07eaecb..6efcc2a 100644 --- a/apps/backend/src/routes/categories.js.map +++ b/apps/backend/src/routes/categories.js.map @@ -1 +1 @@ -{"version":3,"file":"categories.js","sourceRoot":"","sources":["categories.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"categories.js","sourceRoot":"","sources":["categories.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/apps/backend/src/routes/coupons.d.ts b/apps/backend/src/routes/coupons.d.ts index 5f2b5c7..570584b 100644 --- a/apps/backend/src/routes/coupons.d.ts +++ b/apps/backend/src/routes/coupons.d.ts @@ -54,8 +54,8 @@ export declare const couponsRoute: Elysia<"/coupons", { usageLimit?: number | null; expiresAt?: string | null; type: string; - value: number; code: string; + value: number; }; params: {}; query: unknown; @@ -74,8 +74,8 @@ export declare const couponsRoute: Elysia<"/coupons", { body: { type?: string; isActive?: boolean; - value?: number; code?: string; + value?: number; minPurchase?: number; maxDiscount?: number | null; usageLimit?: number | null; diff --git a/apps/backend/src/routes/pages.d.ts b/apps/backend/src/routes/pages.d.ts index e6d7a17..fb07842 100644 --- a/apps/backend/src/routes/pages.d.ts +++ b/apps/backend/src/routes/pages.d.ts @@ -62,6 +62,26 @@ export declare const pagesRoute: Elysia<"/pages", { }; }; }; +} & { + pages: { + sections: { + ":sectionId": { + get: { + body: unknown; + params: { + sectionId: string; + } & {}; + query: unknown; + headers: unknown; + response: { + [x: string]: any; + [x: number]: any; + [x: symbol]: any; + }; + }; + }; + }; + }; } & { pages: { newsletter: { @@ -156,4 +176,5 @@ export declare const pagesRoute: Elysia<"/pages", { standaloneSchema: {}; response: {}; }, any>; +export declare function hydrateSectionPayload(section: any, lang: string): Promise; //# sourceMappingURL=pages.d.ts.map \ No newline at end of file diff --git a/apps/backend/src/routes/pages.d.ts.map b/apps/backend/src/routes/pages.d.ts.map index 28e5a50..313ba63 100644 --- a/apps/backend/src/routes/pages.d.ts.map +++ b/apps/backend/src/routes/pages.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["pages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAK,MAAM,QAAQ,CAAC;AAgKnC,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6dnB,CAAC"} \ No newline at end of file +{"version":3,"file":"pages.d.ts","sourceRoot":"","sources":["pages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAK,MAAM,QAAQ,CAAC;AA0EnC,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2cnB,CAAC;AAsKL,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,gBA+CrE"} \ No newline at end of file diff --git a/apps/backend/src/routes/pages.js b/apps/backend/src/routes/pages.js index f3e4a7e..e257896 100644 --- a/apps/backend/src/routes/pages.js +++ b/apps/backend/src/routes/pages.js @@ -1,164 +1,53 @@ import { Elysia, t } from "elysia"; import prisma from "../lib/prisma"; -import { LocalizedStringSchema, HeroSectionPayloadSchema, CategoriesSectionPayloadSchema, ProductsSectionPayloadSchema, BannerSectionPayloadSchema, TextSectionPayloadSchema, AnnouncementBarSectionPayloadSchema, NewsletterSectionPayloadSchema, EditorialTileSectionPayloadSchema, EditorialCarouselSectionPayloadSchema, HeroArticlePayloadSchema, RichTextPayloadSchema, ScentNotesBreakdownPayloadSchema, QuoteCalloutPayloadSchema, ProductCarouselPayloadSchema, AccordionSectionPayloadSchema, ContactInfoSectionPayloadSchema, ContactFormSectionPayloadSchema } from "@homaroma/types"; +import { LocalizedStringSchema, HeroSectionPayloadSchema, CategoriesSectionPayloadSchema, ProductsSectionPayloadSchema, BannerSectionPayloadSchema, TextSectionPayloadSchema, AnnouncementBarSectionPayloadSchema, NewsletterSectionPayloadSchema, EditorialTileSectionPayloadSchema, EditorialCarouselSectionPayloadSchema, HeroArticleSectionPayloadSchema, RichTextSectionPayloadSchema, ScentNotesBreakdownSectionPayloadSchema, QuoteCalloutSectionPayloadSchema, ProductCarouselSectionPayloadSchema, AccordionSectionPayloadSchema, ContactInfoSectionPayloadSchema, ContactFormSectionPayloadSchema, } from "@homaroma/types"; +import { z } from "zod"; import { adminOnly } from "../middleware/auth"; -function isLocalizedStringValue(value) { - if (typeof value === "string") - return true; - if (!value || typeof value !== "object" || Array.isArray(value)) - return false; - return Object.values(value).every((entry) => typeof entry === "string"); -} -function isLocalizedStringList(value) { - return Array.isArray(value) && value.every((entry) => isLocalizedStringValue(entry)); -} -function hasValidString(value) { - return typeof value === "string" && value.trim().length > 0; -} -function hasValidNumber(value) { - return typeof value === "number" && Number.isFinite(value); -} -function hasValidBoolean(value) { - return typeof value === "boolean"; -} -function validateHeroArticlePayload(payload) { - if (!payload || typeof payload !== "object") - return "Payload must be a JSON object"; - if (!isLocalizedStringValue(payload.title)) - return "title: Must be a localized string"; - const localizedFields = ["subtitle", "author", "category"]; - for (const field of localizedFields) { - if (payload[field] !== undefined && !isLocalizedStringValue(payload[field])) { - return `${field}: Must be a localized string`; - } - } - const stringFields = ["publishDate", "date", "imageUrl", "backgroundImageUrl", "overlayColor"]; - for (const field of stringFields) { - if (payload[field] !== undefined && !hasValidString(payload[field])) { - return `${field}: Must be a string`; - } - } - return null; -} -function validateRichTextPayload(payload) { - if (!payload || typeof payload !== "object") - return "Payload must be a JSON object"; - if (payload.title !== undefined && !isLocalizedStringValue(payload.title)) - return "title: Must be a localized string"; - if (!isLocalizedStringValue(payload.content)) - return "content: Must be a localized string"; - return null; -} -function validateScentNotesBreakdownPayload(payload) { - if (!payload || typeof payload !== "object") - return "Payload must be a JSON object"; - if (payload.title !== undefined && !isLocalizedStringValue(payload.title)) - return "title: Must be a localized string"; - if (payload.description !== undefined && !isLocalizedStringValue(payload.description)) - return "description: Must be a localized string"; - const listFields = ["topNotes", "heartNotes", "middleNotes", "baseNotes"]; - for (const field of listFields) { - const value = payload[field]; - if (value !== undefined && !(isLocalizedStringValue(value) || isLocalizedStringList(value))) { - return `${field}: Must be a localized string or localized string list`; - } - } - return null; -} -function validateQuoteCalloutPayload(payload) { - if (!payload || typeof payload !== "object") - return "Payload must be a JSON object"; - if (!isLocalizedStringValue(payload.quote)) - return "quote: Must be a localized string"; - if (payload.author !== undefined && !isLocalizedStringValue(payload.author)) - return "author: Must be a localized string"; - if (payload.role !== undefined && !isLocalizedStringValue(payload.role)) - return "role: Must be a localized string"; - return null; -} -function validateProductCarouselPayload(payload) { - if (!payload || typeof payload !== "object") - return "Payload must be a JSON object"; - if (payload.title !== undefined && !isLocalizedStringValue(payload.title)) - return "title: Must be a localized string"; - if (payload.description !== undefined && !isLocalizedStringValue(payload.description)) - return "description: Must be a localized string"; - if (payload.collectionId !== undefined && !hasValidString(payload.collectionId)) - return "collectionId: Must be a string"; - if (payload.limit !== undefined && (!hasValidNumber(payload.limit) || payload.limit <= 0)) - return "limit: Must be a positive number"; - if (payload.showPrice !== undefined && !hasValidBoolean(payload.showPrice)) - return "showPrice: Must be a boolean"; - if (payload.showAddToCart !== undefined && !hasValidBoolean(payload.showAddToCart)) - return "showAddToCart: Must be a boolean"; - return null; -} -function validateAccordionPayload(payload) { - if (!payload || typeof payload !== "object") - return "Payload must be a JSON object"; - if (payload.title !== undefined && !isLocalizedStringValue(payload.title)) - return "title: Must be a localized string"; - if (!Array.isArray(payload.categories) || payload.categories.length === 0) - return "categories: Must be a non-empty array"; - for (const [catIndex, category] of payload.categories.entries()) { - if (!category || typeof category !== "object") - return `categories.${catIndex}: Must be an object`; - if (!isLocalizedStringValue(category.name)) - return `categories.${catIndex}.name: Must be a localized string`; - if (category.icon !== undefined && !hasValidString(category.icon)) - return `categories.${catIndex}.icon: Must be a string`; - if (!Array.isArray(category.questions) || category.questions.length === 0) { - return `categories.${catIndex}.questions: Must be a non-empty array`; - } - for (const [qIndex, question] of category.questions.entries()) { - if (!question || typeof question !== "object") - return `categories.${catIndex}.questions.${qIndex}: Must be an object`; - if (!isLocalizedStringValue(question.q)) - return `categories.${catIndex}.questions.${qIndex}.q: Must be a localized string`; - if (!isLocalizedStringValue(question.a)) - return `categories.${catIndex}.questions.${qIndex}.a: Must be a localized string`; - } - } - return null; -} -function validateContactInfoPayload(payload) { - if (!payload || typeof payload !== "object") - return "Payload must be a JSON object"; - if (payload.title !== undefined && !isLocalizedStringValue(payload.title)) - return "title: Must be a localized string"; - for (const field of ["address", "email", "line", "hours"]) { - if (!isLocalizedStringValue(payload[field])) - return `${field}: Must be a localized string`; - } - return null; -} -function validateContactFormPayload(payload) { - if (!payload || typeof payload !== "object") - return "Payload must be a JSON object"; - if (payload.title !== undefined && !isLocalizedStringValue(payload.title)) - return "title: Must be a localized string"; - if (payload.subtitle !== undefined && !isLocalizedStringValue(payload.subtitle)) - return "subtitle: Must be a localized string"; - return null; -} const RESERVED_SLUGS = [ - "shop", "category", "products", "cart", "checkout", "account", "search", - "login", "admin", "wishlist", "track", "coupons", "scent-guide", - "profile", "article", "pages", "orders", "customers", - "settings", "menus", "auth", "api" + "shop", + "category", + "products", + "cart", + "checkout", + "account", + "search", + "login", + "admin", + "wishlist", + "track", + "coupons", + "scent-guide", + "profile", + "article", + "pages", + "orders", + "customers", + "settings", + "menus", + "auth", + "api", ]; /** Resolve category name — mirrors the same helper in categories.ts */ function resolveCatName(cat, lang) { - if (lang === 'all') { + if (lang === "all") { const nameObj = {}; - cat.translations?.forEach((tr) => { nameObj[tr.langCode] = tr.name; }); + cat.translations?.forEach((tr) => { + nameObj[tr.langCode] = tr.name; + }); return nameObj; } - const trans = cat.translations?.find((t) => t.langCode === lang) - || cat.translations?.find((t) => t.langCode === 'th') - || cat.translations?.[0]; + const trans = cat.translations?.find((t) => t.langCode === lang) || + cat.translations?.find((t) => t.langCode === "th") || + cat.translations?.[0]; return trans?.name ?? cat.name; } +function summarizeValidationIssues(issues) { + return issues.map((issue) => ({ + path: issue.path.join(".") || "(root)", + message: issue.message, + code: issue.code, + })); +} export const pagesRoute = new Elysia({ prefix: "/pages" }) .get("/", async ({ query }) => { const view = String(query?.view || "summary").toLowerCase(); @@ -166,9 +55,9 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) return await prisma.page.findMany({ include: { sections: { - orderBy: { order: "asc" } - } - } + orderBy: { order: "asc" }, + }, + }, }); } return await prisma.page.findMany({ @@ -178,206 +67,62 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) title: true, isPublished: true, createdAt: true, - updatedAt: true + updatedAt: true, }, - orderBy: { updatedAt: "desc" } + orderBy: { updatedAt: "desc" }, }); }) .get("/:slug", async ({ params: { slug }, query, set }) => { const includeInactive = String(query?.includeInactive || "").toLowerCase() === "true"; - const lang = query?.lang || 'th'; + const lang = query?.lang || "th"; const page = await prisma.page.findUnique({ where: { slug }, include: { sections: { where: includeInactive ? undefined : { isActive: true }, - orderBy: { order: "asc" } - } - } + orderBy: { order: "asc" }, + }, + }, }); if (!page) { set.status = 404; return { error: "Page not found" }; } - const populatedSections = await Promise.all(page.sections.map(async (section) => { - const payload = section.payload; - if (!payload) - return section; - const populatedPayload = { ...payload }; - if (section.type === 'PRODUCTS') { - let products = []; - const limit = payload.limit || 3; - const productInclude = { - category: { - include: { translations: true }, - }, - scent: true, - translations: true, - variants: { - include: { - bomItems: { include: { rawMaterial: true } } - }, - orderBy: { price: "asc" } - }, - images: { - orderBy: { order: "asc" } - } - }; - if (payload.type === 'featured') { - products = await prisma.product.findMany({ - where: { categoryId: 1 }, - include: productInclude, - take: limit - }); - } - else if (payload.type === 'scent' && payload.scentId) { - products = await prisma.product.findMany({ - where: { scentId: Number(payload.scentId) }, - include: productInclude, - take: limit - }); - } - else if (payload.type === 'custom' && Array.isArray(payload.productIds)) { - const ids = payload.productIds.map(Number); - products = await prisma.product.findMany({ - where: { id: { in: ids } }, - include: productInclude - }); - products.sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id)); - } - populatedPayload.products = products.map((p) => { - if (lang === 'all') { - const nameObj = {}; - const descObj = {}; - const detailsObj = {}; - p.translations?.forEach((t) => { - nameObj[t.langCode] = t.name; - descObj[t.langCode] = t.description; - detailsObj[t.langCode] = t.details; - }); - return { ...p, name: nameObj, description: descObj, details: detailsObj }; - } - else { - const trans = p.translations?.find((t) => t.langCode === lang) || p.translations?.find((t) => t.langCode === 'th') || p.translations?.[0]; - return { ...p, name: trans?.name || p.scent?.name || '', description: trans?.description, details: trans?.details }; - } - }); - } - else if (section.type === 'PRODUCT_CAROUSEL' && !Array.isArray(populatedPayload.products)) { - let products = []; - const limit = payload.limit || 3; - const productInclude = { - category: { - include: { translations: true }, - }, - scent: true, - translations: true, - variants: { - include: { - bomItems: { include: { rawMaterial: true } } - }, - orderBy: { price: "asc" } - }, - images: { - orderBy: { order: "asc" } - } - }; - if (payload.type === 'featured' || payload.collectionId === 'featured') { - products = await prisma.product.findMany({ - where: { categoryId: 1 }, - include: productInclude, - take: limit - }); - } - else if (payload.type === 'scent' && payload.scentId) { - products = await prisma.product.findMany({ - where: { scentId: Number(payload.scentId) }, - include: productInclude, - take: limit - }); - } - else if (Array.isArray(payload.productIds)) { - const ids = payload.productIds.map(Number); - products = await prisma.product.findMany({ - where: { id: { in: ids } }, - include: productInclude - }); - products.sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id)); - } - else { - products = await prisma.product.findMany({ - include: productInclude, - take: limit - }); - } - populatedPayload.products = products.map((p) => { - if (lang === 'all') { - const nameObj = {}; - const descObj = {}; - const detailsObj = {}; - p.translations?.forEach((t) => { - nameObj[t.langCode] = t.name; - descObj[t.langCode] = t.description; - detailsObj[t.langCode] = t.details; - }); - return { ...p, name: nameObj, description: descObj, details: detailsObj }; - } - const trans = p.translations?.find((t) => t.langCode === lang) || p.translations?.find((t) => t.langCode === 'th') || p.translations?.[0]; - return { ...p, name: trans?.name || p.scent?.name || '', description: trans?.description, details: trans?.details }; - }); - } - else if (section.type === 'CATEGORIES') { - let categories = []; - if (Array.isArray(payload.categoryIds) && payload.categoryIds.length > 0) { - const ids = payload.categoryIds.map(Number); - categories = await prisma.category.findMany({ - where: { id: { in: ids } }, - include: { - translations: true, - _count: { - select: { products: true } - } - } - }); - categories.sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id)); - } - else { - categories = await prisma.category.findMany({ - include: { - translations: true, - _count: { - select: { products: true } - } - } - }); - } - // Resolve name for each category using the lang param (supports 'all') - populatedPayload.categories = categories.map((cat) => ({ - ...cat, - name: resolveCatName(cat, lang), - })); - } - return { - ...section, - payload: populatedPayload - }; - })); + const populatedSections = await Promise.all(page.sections.map(async (section) => await hydrateSectionPayload(section, lang))); return { ...page, - sections: populatedSections + sections: populatedSections, }; }) .get("/:slug/sections", async ({ params: { slug }, set }) => { try { return await prisma.pageSection.findMany({ where: { pageId: Number(slug) }, - orderBy: { order: "asc" } + orderBy: { order: "asc" }, }); } catch (err) { set.status = 500; return { error: "Failed to fetch page sections" }; } +}) + .get("/sections/:sectionId", async ({ params: { sectionId }, query, set }) => { + const lang = query?.lang || "th"; + const hydrate = String(query?.hydrate ?? "true").toLowerCase() !== "false"; + try { + const section = await prisma.pageSection.findUnique({ + where: { id: Number(sectionId) }, + }); + if (!section) { + set.status = 404; + return { error: "Section not found" }; + } + return hydrate ? await hydrateSectionPayload(section, lang) : section; + } + catch (err) { + set.status = 500; + return { error: "Failed to fetch page section" }; + } }) .post("/newsletter", async ({ body, set }) => { try { @@ -389,7 +134,7 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) const sub = await prisma.newsletterSubscription.upsert({ where: { email }, update: {}, - create: { email } + create: { email }, }); return { success: true, data: sub }; } @@ -400,8 +145,8 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) } }, { body: t.Object({ - email: t.String() - }) + email: t.String(), + }), }) .use(adminOnly) .post("/", async ({ body, set }) => { @@ -409,7 +154,8 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) const operation = data?.id ? "update" : "create"; try { const { id, slug, title, isPublished, status, metadata } = data; - if (typeof slug === 'string' && RESERVED_SLUGS.includes(slug.toLowerCase())) { + if (typeof slug === "string" && + RESERVED_SLUGS.includes(slug.toLowerCase())) { set.status = 400; return { success: false, @@ -418,7 +164,7 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) slug, title, error: "Reserved slug cannot be used", - diagnostic: "The requested slug is reserved and cannot be used for dynamic pages." + diagnostic: "The requested slug is reserved and cannot be used for dynamic pages.", }; } if (metadata !== undefined) { @@ -430,7 +176,7 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) slug, title, error: "Unsupported field", - diagnostic: "Page metadata is not supported by the current Page model. Remove 'metadata' from the request." + diagnostic: "Page metadata is not supported by the current Page model. Remove 'metadata' from the request.", }; } if (status !== undefined) { @@ -442,7 +188,7 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) slug, title, error: "Unsupported publish field", - diagnostic: "Use 'isPublished' only. The legacy 'status' field is no longer accepted." + diagnostic: "Use 'isPublished' only. The legacy 'status' field is no longer accepted.", }; } let finalIsPublished = isPublished; @@ -451,7 +197,7 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) if (id) { const existingPage = await prisma.page.findUnique({ where: { id: Number(id) }, - select: { isPublished: true } + select: { isPublished: true }, }); if (!existingPage) { set.status = 404; @@ -462,7 +208,7 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) slug, title, error: "Page not found", - diagnostic: "The requested page ID does not exist." + diagnostic: "The requested page ID does not exist.", }; } finalIsPublished = existingPage.isPublished; @@ -476,10 +222,10 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) const page = id ? await prisma.page.update({ where: { id: Number(id) }, - data: { slug, title, isPublished: finalIsPublished } + data: { slug, title, isPublished: finalIsPublished }, }) : await prisma.page.create({ - data: { slug, title, isPublished: finalIsPublished } + data: { slug, title, isPublished: finalIsPublished }, }); return { success: true, @@ -496,7 +242,7 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) : "Page created successfully." : publishBehavior === "preserve-existing" ? "Page updated successfully. Existing publish state was preserved because isPublished was omitted." - : "Page updated successfully." + : "Page updated successfully.", }; } catch (err) { @@ -509,7 +255,9 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) slug: data?.slug, title: data?.title, error: "Failed to save page", - diagnostic: err instanceof Error ? err.message : "Unexpected error while saving page." + diagnostic: err instanceof Error + ? err.message + : "Unexpected error while saving page.", }; } }, { @@ -517,13 +265,13 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) id: t.Optional(t.Number()), slug: t.String(), title: t.String(), - isPublished: t.Optional(t.Boolean()) - }) + isPublished: t.Optional(t.Boolean()), + }), }) .delete("/:slug", async ({ params: { slug }, set }) => { try { await prisma.page.delete({ - where: { id: Number(slug) } + where: { id: Number(slug) }, }); return { success: true }; } @@ -540,31 +288,35 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) } const payload = body; const results = []; - const LANGS = ['th', 'en', 'ja', 'zh', 'vi', 'ko']; + const LANGS = ["th", "en", "ja", "zh", "vi", "ko"]; for (const lang of LANGS) { - const title = typeof payload.title === 'string' ? (lang === 'th' ? payload.title : null) : payload.title?.[lang]; + const title = typeof payload.title === "string" + ? lang === "th" + ? payload.title + : null + : payload.title?.[lang]; if (!title) continue; const existing = await prisma.pageTranslation.findUnique({ - where: { pageId_langCode: { pageId: id, langCode: lang } } + where: { pageId_langCode: { pageId: id, langCode: lang } }, }); if (existing) { const updated = await prisma.pageTranslation.update({ where: { id: existing.id }, - data: { title } + data: { title }, }); results.push(updated); } else { const created = await prisma.pageTranslation.create({ - data: { pageId: id, langCode: lang, title } + data: { pageId: id, langCode: lang, title }, }); results.push(created); } } const updated = await prisma.page.findUnique({ where: { id }, - include: { translations: true } + include: { translations: true }, }); return { success: true, translations: results, page: updated }; }) @@ -572,16 +324,20 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) try { const pageId = Number(slug); const { type, order, payload, isActive } = body; - const validationError = validateSectionPayload(type, payload); - if (validationError) { + const validationResult = validateSectionPayload(type, payload); + if (!validationResult.success) { set.status = 400; - return { error: validationError }; + return { + error: "Validation failed", + details: validationResult.issues, + validationIssues: summarizeValidationIssues(validationResult.issues || []), + }; } let finalOrder = order; if (finalOrder === undefined) { const lastSection = await prisma.pageSection.findFirst({ where: { pageId }, - orderBy: { order: "desc" } + orderBy: { order: "desc" }, }); finalOrder = lastSection ? lastSection.order + 1 : 1; } @@ -590,9 +346,9 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) pageId, type: type.toUpperCase(), order: finalOrder, - payload, - isActive: isActive !== false - } + payload: validationResult.data, + isActive: isActive !== false, + }, }); } catch (err) { @@ -605,37 +361,52 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) type: t.String(), order: t.Optional(t.Number()), payload: t.Any(), - isActive: t.Optional(t.Boolean()) - }) + isActive: t.Optional(t.Boolean()), + }), }) .put("/sections/:sectionId", async ({ params: { sectionId }, body, set }) => { try { const id = Number(sectionId); - const { type, order, payload, isActive } = body; + const { type, order, isActive, payload: explicitPayload, ...rest } = body; + console.log(`\n📦 [PUT /sections/${sectionId}] body received:`, JSON.stringify(body, null, 2)); + // MCP tools send fields flat at root level (not nested under "payload" key) + // Normalize: if no explicit payload key, use remaining root-level fields as payload + const payload = explicitPayload ?? (Object.keys(rest).length > 0 ? rest : undefined); + let finalPayload = payload; if (payload) { let validationType = type; if (!validationType) { - const existingSection = await prisma.pageSection.findUnique({ where: { id } }); + const existingSection = await prisma.pageSection.findUnique({ + where: { id }, + }); if (!existingSection) { set.status = 404; return { error: "Section not found" }; } validationType = existingSection.type; } - const validationError = validateSectionPayload(validationType, payload); - if (validationError) { + const validationResult = validateSectionPayload(validationType, payload); + if (!validationResult.success) { + console.log(`\n❌ [PUT /sections/${sectionId}] Validation FAILED:`, JSON.stringify(validationResult.issues, null, 2)); set.status = 400; - return { error: validationError }; + return { + error: "Validation failed", + details: validationResult.issues, + validationIssues: summarizeValidationIssues(validationResult.issues || []), + }; } + finalPayload = validationResult.data; + console.log(`\n✅ [PUT /sections/${sectionId}] Validation passed. finalPayload:`, JSON.stringify(finalPayload, null, 2)); } + console.log(`\n💾 [PUT /sections/${sectionId}] Prisma update with:`, JSON.stringify({ type, order, payload: finalPayload, isActive }, null, 2)); return await prisma.pageSection.update({ where: { id }, data: { type: type ? type.toUpperCase() : undefined, order, - payload, - isActive - } + payload: finalPayload, + isActive, + }, }); } catch (err) { @@ -644,12 +415,7 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) return { error: "Failed to update section" }; } }, { - body: t.Object({ - type: t.Optional(t.String()), - order: t.Optional(t.Number()), - payload: t.Optional(t.Any()), - isActive: t.Optional(t.Boolean()) - }) + body: t.Any(), }) .put("/:slug/sections/reorder", async ({ params: { slug }, body, set }) => { try { @@ -657,7 +423,7 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) const { sectionOrders } = body; await prisma.$transaction(sectionOrders.map((item) => prisma.pageSection.update({ where: { id: item.id, pageId }, - data: { order: item.order } + data: { order: item.order }, }))); return { success: true }; } @@ -670,14 +436,14 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) body: t.Object({ sectionOrders: t.Array(t.Object({ id: t.Number(), - order: t.Number() - })) - }) + order: t.Number(), + })), + }), }) .delete("/sections/:sectionId", async ({ params: { sectionId }, set }) => { try { await prisma.pageSection.delete({ - where: { id: Number(sectionId) } + where: { id: Number(sectionId) }, }); return { success: true }; } @@ -687,115 +453,204 @@ export const pagesRoute = new Elysia({ prefix: "/pages" }) } }); function validateSectionPayload(type, payload) { - if (!payload || typeof payload !== 'object') { - return "Payload must be a JSON object"; + if (!payload || typeof payload !== "object") { + return { + success: false, + issues: [ + { code: "custom", message: "Payload must be a JSON object", path: [] }, + ], + }; } + let schema; switch (type.toUpperCase()) { - case 'HERO': { - const res = HeroSectionPayloadSchema.safeParse(payload); - if (!res.success) - return res.error.issues.map((e) => `${e.path.join('.')}: ${e.message}`).join(', '); + case "HERO": + schema = HeroSectionPayloadSchema; break; - } - case 'CATEGORIES': { - const res = CategoriesSectionPayloadSchema.safeParse(payload); - if (!res.success) - return res.error.issues.map((e) => `${e.path.join('.')}: ${e.message}`).join(', '); + case "CATEGORIES": + schema = CategoriesSectionPayloadSchema; break; - } - case 'PRODUCTS': { - const res = ProductsSectionPayloadSchema.safeParse(payload); - if (!res.success) - return res.error.issues.map((e) => `${e.path.join('.')}: ${e.message}`).join(', '); + case "PRODUCTS": + schema = ProductsSectionPayloadSchema; break; - } - case 'BANNER': { - const res = BannerSectionPayloadSchema.safeParse(payload); - if (!res.success) - return res.error.issues.map((e) => `${e.path.join('.')}: ${e.message}`).join(', '); + case "BANNER": + schema = BannerSectionPayloadSchema; break; - } - case 'TEXT': { - const res = TextSectionPayloadSchema.safeParse(payload); - if (!res.success) - return res.error.issues.map((e) => `${e.path.join('.')}: ${e.message}`).join(', '); + case "TEXT": + schema = TextSectionPayloadSchema; break; - } - case 'ANNOUNCEMENT_BAR': { - const res = AnnouncementBarSectionPayloadSchema.safeParse(payload); - if (!res.success) - return res.error.issues.map((e) => `${e.path.join('.')}: ${e.message}`).join(', '); + case "ANNOUNCEMENT_BAR": + schema = AnnouncementBarSectionPayloadSchema; break; - } - case 'NEWSLETTER': { - const res = NewsletterSectionPayloadSchema.safeParse(payload); - if (!res.success) - return res.error.issues.map((e) => `${e.path.join('.')}: ${e.message}`).join(', '); + case "NEWSLETTER": + schema = NewsletterSectionPayloadSchema; break; - } - case 'EDITORIAL_TILE': { - const res = EditorialTileSectionPayloadSchema.safeParse(payload); - if (!res.success) - return res.error.issues.map((e) => `${e.path.join('.')}: ${e.message}`).join(', '); + case "EDITORIAL_TILE": + schema = EditorialTileSectionPayloadSchema; break; - } - case 'EDITORIAL_CAROUSEL': { - const res = EditorialCarouselSectionPayloadSchema.safeParse(payload); - if (!res.success) - return res.error.issues.map((e) => `${e.path.join('.')}: ${e.message}`).join(', '); + case "EDITORIAL_CAROUSEL": + schema = EditorialCarouselSectionPayloadSchema; break; - } - case 'HERO_ARTICLE': { - const error = validateHeroArticlePayload(payload); - if (error) - return error; + case "HERO_ARTICLE": + schema = HeroArticleSectionPayloadSchema; break; - } - case 'RICH_TEXT': { - const error = validateRichTextPayload(payload); - if (error) - return error; + case "RICH_TEXT": + schema = RichTextSectionPayloadSchema; break; - } - case 'SCENT_NOTES_BREAKDOWN': { - const error = validateScentNotesBreakdownPayload(payload); - if (error) - return error; + case "SCENT_NOTES_BREAKDOWN": + schema = ScentNotesBreakdownSectionPayloadSchema; break; - } - case 'QUOTE_CALLOUT': { - const error = validateQuoteCalloutPayload(payload); - if (error) - return error; + case "QUOTE_CALLOUT": + schema = QuoteCalloutSectionPayloadSchema; break; - } - case 'PRODUCT_CAROUSEL': { - const error = validateProductCarouselPayload(payload); - if (error) - return error; + case "PRODUCT_CAROUSEL": + schema = ProductCarouselSectionPayloadSchema; break; - } - case 'ACCORDION': { - const error = validateAccordionPayload(payload); - if (error) - return error; + case "ACCORDION": + schema = AccordionSectionPayloadSchema; break; - } - case 'CONTACT_INFO': { - const error = validateContactInfoPayload(payload); - if (error) - return error; + case "CONTACT_INFO": + schema = ContactInfoSectionPayloadSchema; break; - } - case 'CONTACT_FORM': { - const error = validateContactFormPayload(payload); - if (error) - return error; + case "CONTACT_FORM": + schema = ContactFormSectionPayloadSchema; break; - } default: - return `Unknown section type: ${type}`; + return { + success: false, + issues: [ + { + code: "custom", + message: `Unknown section type: ${type}`, + path: [], + }, + ], + }; } - return null; + const res = schema.safeParse(payload); + if (!res.success) { + return { success: false, issues: res.error.issues }; + } + return { success: true, data: res.data }; } -//# sourceMappingURL=pages.js.map +async function resolveProductsForSection(payload, lang) { + let products = []; + const limit = payload.limit || 3; + const productInclude = { + category: { + include: { translations: true }, + }, + brand: true, + translations: true, + variants: { + include: { + bomItems: { include: { rawMaterial: true } }, + }, + orderBy: { price: "asc" }, + }, + images: { + orderBy: { order: "asc" }, + }, + }; + if (payload.type === "featured") { + products = await prisma.product.findMany({ + where: { categoryId: Number(payload.categoryId) || 1 }, + include: productInclude, + take: limit, + }); + } + else if ((payload.type === "scent" || payload.type === "brand") && + (payload.scentId || payload.brandId)) { + products = await prisma.product.findMany({ + where: { brandId: Number(payload.brandId || payload.scentId) }, + include: productInclude, + take: limit, + }); + } + else if (payload.type === "custom" && Array.isArray(payload.productIds)) { + const ids = payload.productIds.map(Number); + if (ids.length > 0) { + products = await prisma.product.findMany({ + where: { id: { in: ids } }, + include: productInclude, + }); + products.sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id)); + } + } + else { + products = await prisma.product.findMany({ + include: productInclude, + take: limit, + }); + } + return products.map((p) => { + if (lang === "all") { + const nameObj = {}; + const descObj = {}; + const detailsObj = {}; + p.translations?.forEach((t) => { + nameObj[t.langCode] = t.name; + descObj[t.langCode] = t.description; + detailsObj[t.langCode] = t.details; + }); + return { ...p, name: nameObj, description: descObj, details: detailsObj }; + } + else { + const trans = p.translations?.find((t) => t.langCode === lang) || + p.translations?.find((t) => t.langCode === "th") || + p.translations?.[0]; + return { + ...p, + name: trans?.name || p.brand?.name || "", + description: trans?.description, + details: trans?.details, + }; + } + }); +} +export async function hydrateSectionPayload(section, lang) { + const payload = section.payload; + if (!payload) + return section; + const populatedPayload = { ...payload }; + if (section.type === "PRODUCTS" || + (section.type === "PRODUCT_CAROUSEL" && + !Array.isArray(populatedPayload.products))) { + populatedPayload.products = await resolveProductsForSection(payload, lang); + } + else if (section.type === "CATEGORIES") { + let categories = []; + if (Array.isArray(payload.categoryIds) && payload.categoryIds.length > 0) { + const ids = payload.categoryIds.map(Number); + categories = await prisma.category.findMany({ + where: { id: { in: ids } }, + include: { + translations: true, + _count: { + select: { products: true }, + }, + }, + }); + categories.sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id)); + } + else { + categories = await prisma.category.findMany({ + include: { + translations: true, + _count: { + select: { products: true }, + }, + }, + }); + } + // Resolve name for each category using the lang param (supports 'all') + populatedPayload.categories = categories.map((cat) => ({ + ...cat, + name: resolveCatName(cat, lang), + })); + } + return { + ...section, + payload: populatedPayload, + }; +} +//# sourceMappingURL=pages.js.map \ No newline at end of file diff --git a/apps/backend/src/routes/pages.js.map b/apps/backend/src/routes/pages.js.map index b75ddd7..35ddb80 100644 --- a/apps/backend/src/routes/pages.js.map +++ b/apps/backend/src/routes/pages.js.map @@ -1 +1 @@ -{"version":3,"file":"pages.js","sourceRoot":"","sources":["pages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,MAAM,MAAM,eAAe,CAAC;AACnC,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,8BAA8B,EAC9B,4BAA4B,EAC5B,0BAA0B,EAC1B,wBAAwB,EACxB,mCAAmC,EACnC,8BAA8B,EAC9B,iCAAiC,EACjC,qCAAqC,EACrC,wBAAwB,EACxB,qBAAqB,EACrB,gCAAgC,EAChC,yBAAyB,EACzB,4BAA4B,EAC5B,6BAA6B,EAC7B,+BAA+B,EAC/B,+BAA+B,EAChC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,SAAS,sBAAsB,CAAC,KAAc;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9E,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC;AACvF,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC;AACpC,CAAC;AAED,SAAS,0BAA0B,CAAC,OAAY;IAC9C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,+BAA+B,CAAC;IACpF,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,mCAAmC,CAAC;IACvF,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAC;IACpE,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC5E,OAAO,GAAG,KAAK,8BAA8B,CAAC;QAChD,CAAC;IACH,CAAC;IACD,MAAM,YAAY,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB,EAAE,cAAc,CAAU,CAAC;IACxG,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;QACjC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACpE,OAAO,GAAG,KAAK,oBAAoB,CAAC;QACtC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAY;IAC3C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,+BAA+B,CAAC;IACpF,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,mCAAmC,CAAC;IACtH,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,qCAAqC,CAAC;IAC3F,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,kCAAkC,CAAC,OAAY;IACtD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,+BAA+B,CAAC;IACpF,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,mCAAmC,CAAC;IACtH,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,WAAW,CAAC;QAAE,OAAO,yCAAyC,CAAC;IACxI,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,CAAU,CAAC;IACnF,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,qBAAqB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC5F,OAAO,GAAG,KAAK,uDAAuD,CAAC;QACzE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,2BAA2B,CAAC,OAAY;IAC/C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,+BAA+B,CAAC;IACpF,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,mCAAmC,CAAC;IACvF,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,oCAAoC,CAAC;IACzH,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO,kCAAkC,CAAC;IACnH,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,8BAA8B,CAAC,OAAY;IAClD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,+BAA+B,CAAC;IACpF,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,mCAAmC,CAAC;IACtH,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,WAAW,CAAC;QAAE,OAAO,yCAAyC,CAAC;IACxI,IAAI,OAAO,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC;QAAE,OAAO,gCAAgC,CAAC;IACzH,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QAAE,OAAO,kCAAkC,CAAC;IACrI,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC;QAAE,OAAO,8BAA8B,CAAC;IAClH,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC;QAAE,OAAO,kCAAkC,CAAC;IAC9H,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAY;IAC5C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,+BAA+B,CAAC;IACpF,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,mCAAmC,CAAC;IACtH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,uCAAuC,CAAC;IAC1H,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC;QAChE,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;YAAE,OAAO,cAAc,QAAQ,qBAAqB,CAAC;QAClG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,cAAc,QAAQ,mCAAmC,CAAC;QAC7G,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,cAAc,QAAQ,yBAAyB,CAAC;QAC1H,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1E,OAAO,cAAc,QAAQ,uCAAuC,CAAC;QACvE,CAAC;QACD,KAAK,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9D,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;gBAAE,OAAO,cAAc,QAAQ,cAAc,MAAM,qBAAqB,CAAC;YACtH,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,OAAO,cAAc,QAAQ,cAAc,MAAM,gCAAgC,CAAC;YAC3H,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAAE,OAAO,cAAc,QAAQ,cAAc,MAAM,gCAAgC,CAAC;QAC7H,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,0BAA0B,CAAC,OAAY;IAC9C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,+BAA+B,CAAC;IACpF,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,mCAAmC,CAAC;IACtH,KAAK,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAU,EAAE,CAAC;QACnE,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAAE,OAAO,GAAG,KAAK,8BAA8B,CAAC;IAC7F,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,0BAA0B,CAAC,OAAY;IAC9C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,+BAA+B,CAAC;IACpF,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,mCAAmC,CAAC;IACtH,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,sCAAsC,CAAC;IAC/H,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,cAAc,GAAG;IACrB,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ;IACvE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa;IAC/D,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW;IACpD,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK;CACnC,CAAC;AAEF,uEAAuE;AACvE,SAAS,cAAc,CAAC,GAAQ,EAAE,IAAY;IAC5C,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,MAAM,OAAO,GAAQ,EAAE,CAAC;QACxB,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,EAAO,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC;WAChE,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC;WACvD,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3B,OAAO,KAAK,EAAE,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;KACvD,GAAG,CAAC,GAAG,EAAE,KAAK,IAAI,EAAE;IACnB,OAAO,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;QAChC,OAAO,EAAE;YACP,QAAQ,EAAE;gBACR,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;aAC1B;SACF;KACF,CAAC,CAAC;AACL,CAAC,CAAC;KACD,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE;IACxD,MAAM,eAAe,GAAG,MAAM,CAAE,KAAa,EAAE,eAAe,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;IAC/F,MAAM,IAAI,GAAI,KAAa,EAAE,IAAI,IAAI,IAAI,CAAC;IAC1C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QACxC,KAAK,EAAE,EAAE,IAAI,EAAE;QACf,OAAO,EAAE;YACP,QAAQ,EAAE;gBACR,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;gBACvD,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;aAC1B;SACF;KACF,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,GAAG,CACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAc,CAAC;QACvC,IAAI,CAAC,OAAO;YAAE,OAAO,OAAO,CAAC;QAE7B,MAAM,gBAAgB,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QAExC,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAChC,IAAI,QAAQ,GAAU,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;YAEjC,MAAM,cAAc,GAAG;gBACrB,QAAQ,EAAE;oBACR,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;iBAChC;gBACD,KAAK,EAAE,IAAI;gBACX,YAAY,EAAE,IAAI;gBAClB,QAAQ,EAAE;oBACR,OAAO,EAAE;wBACP,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;qBAC7C;oBACD,OAAO,EAAE,EAAE,KAAK,EAAE,KAAc,EAAE;iBACnC;gBACD,MAAM,EAAE;oBACN,OAAO,EAAE,EAAE,KAAK,EAAE,KAAc,EAAE;iBACnC;aACF,CAAC;YAEF,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAChC,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACvC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE;oBACxB,OAAO,EAAE,cAAc;oBACvB,IAAI,EAAE,KAAK;iBACZ,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACvD,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACvC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;oBAC3C,OAAO,EAAE,cAAc;oBACvB,IAAI,EAAE,KAAK;iBACZ,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1E,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC3C,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACvC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE;oBAC1B,OAAO,EAAE,cAAc;iBACxB,CAAC,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC;YAED,gBAAgB,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;gBAClD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;oBACnB,MAAM,OAAO,GAAQ,EAAE,CAAC;oBACxB,MAAM,OAAO,GAAQ,EAAE,CAAC;oBACxB,MAAM,UAAU,GAAQ,EAAE,CAAC;oBAC3B,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAM,EAAE,EAAE;wBAChC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBAC7B,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC;wBACpC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;oBACtC,CAAC,CAAC,CAAC;oBACH,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;gBAC5E,CAAC;qBAAM,CAAC;oBACN,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;oBACpJ,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;gBACtH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,kBAAkB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5F,IAAI,QAAQ,GAAU,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;YAEjC,MAAM,cAAc,GAAG;gBACrB,QAAQ,EAAE;oBACR,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;iBAChC;gBACD,KAAK,EAAE,IAAI;gBACX,YAAY,EAAE,IAAI;gBAClB,QAAQ,EAAE;oBACR,OAAO,EAAE;wBACP,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE;qBAC7C;oBACD,OAAO,EAAE,EAAE,KAAK,EAAE,KAAc,EAAE;iBACnC;gBACD,MAAM,EAAE;oBACN,OAAO,EAAE,EAAE,KAAK,EAAE,KAAc,EAAE;iBACnC;aACF,CAAC;YAEF,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;gBACvE,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACvC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE;oBACxB,OAAO,EAAE,cAAc;oBACvB,IAAI,EAAE,KAAK;iBACZ,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACvD,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACvC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;oBAC3C,OAAO,EAAE,cAAc;oBACvB,IAAI,EAAE,KAAK;iBACZ,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7C,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC3C,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACvC,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE;oBAC1B,OAAO,EAAE,cAAc;iBACxB,CAAC,CAAC;gBACH,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACvC,OAAO,EAAE,cAAc;oBACvB,IAAI,EAAE,KAAK;iBACZ,CAAC,CAAC;YACL,CAAC;YAED,gBAAgB,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;gBAClD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;oBACnB,MAAM,OAAO,GAAQ,EAAE,CAAC;oBACxB,MAAM,OAAO,GAAQ,EAAE,CAAC;oBACxB,MAAM,UAAU,GAAQ,EAAE,CAAC;oBAC3B,CAAC,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAM,EAAE,EAAE;wBACjC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBAC7B,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC;wBACpC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;oBACrC,CAAC,CAAC,CAAC;oBACH,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;gBAC5E,CAAC;gBACD,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;gBACpJ,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;YACtH,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YACzC,IAAI,UAAU,GAAU,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzE,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC5C,UAAU,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAC1C,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE;oBAC1B,OAAO,EAAE;wBACP,YAAY,EAAE,IAAI;wBAClB,MAAM,EAAE;4BACN,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;yBAC3B;qBACF;iBACF,CAAC,CAAC;gBACH,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACnE,CAAC;iBAAM,CAAC;gBACN,UAAU,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBAC1C,OAAO,EAAE;wBACP,YAAY,EAAE,IAAI;wBAClB,MAAM,EAAE;4BACN,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;yBAC3B;qBACF;iBACF,CAAC,CAAC;YACL,CAAC;YACD,uEAAuE;YACvE,gBAAgB,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;gBAC1D,GAAG,GAAG;gBACN,IAAI,EAAE,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC;aAChC,CAAC,CAAC,CAAC;QACN,CAAC;QAED,OAAO;YACL,GAAG,OAAO;YACV,OAAO,EAAE,gBAAgB;SAC1B,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEF,OAAO;QACL,GAAG,IAAI;QACP,QAAQ,EAAE,iBAAiB;KAC5B,CAAC;AACJ,CAAC,CAAC;KACD,GAAG,CAAC,iBAAiB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;IAC1D,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC;YACvC,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;YAC/B,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;SAC1B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC;IACpD,CAAC;AACH,CAAC,CAAC;KACD,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE;IAC3C,IAAI,CAAC;QACH,MAAM,EAAE,KAAK,EAAE,GAAG,IAAyB,CAAC;QAC5C,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;YACjB,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QAC5C,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,MAAM,CAAC;YACrD,KAAK,EAAE,EAAE,KAAK,EAAE;YAChB,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE,KAAK,EAAE;SAClB,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC1C,CAAC;AACH,CAAC,EAAE;IACD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;KAClB,CAAC;CACH,CAAC;KACD,GAAG,CAAC,SAAS,CAAC;KACd,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE;IACjC,MAAM,IAAI,GAAG,IAAW,CAAC;IACzB,MAAM,SAAS,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAEhE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC5E,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;YACjB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,SAAS;gBACT,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;gBAC9B,IAAI;gBACJ,KAAK;gBACL,KAAK,EAAE,8BAA8B;gBACrC,UAAU,EAAE,sEAAsE;aACnF,CAAC;QACJ,CAAC;QAED,IAAI,gBAAgB,GAAG,IAAI,CAAC;QAC5B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,gBAAgB,GAAG,MAAM,KAAK,WAAW,CAAC;QAC5C,CAAC;aAAM,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YACrC,gBAAgB,GAAG,WAAW,CAAC;QACjC,CAAC;QAED,MAAM,IAAI,GAAG,EAAE;YACb,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBACzB,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EAAE;gBACzB,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE;aACrD,CAAC;YACF,CAAC,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBACzB,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE;aACrD,CAAC,CAAC;QAEL,OAAO;YACL,OAAO,EAAE,IAAI;YACb,SAAS;YACT,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,IAAI;YACJ,UAAU,EAAE,SAAS,KAAK,QAAQ;gBAChC,CAAC,CAAC,4BAA4B;gBAC9B,CAAC,CAAC,4BAA4B;SACjC,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QACrC,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;QACjB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,SAAS;YACT,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;YACzC,IAAI,EAAE,IAAI,EAAE,IAAI;YAChB,KAAK,EAAE,IAAI,EAAE,KAAK;YAClB,KAAK,EAAE,qBAAqB;YAC5B,UAAU,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,qCAAqC;SACvF,CAAC;IACJ,CAAC;AACH,CAAC,EAAE;IACD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACpC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9B,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;KAC9B,CAAC;CACH,CAAC;KACD,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YACvB,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE;SAC5B,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC,CAAC;KACD,KAAK,CAAC,mBAAmB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE;IAC1D,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7B,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACd,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IACtC,CAAC;IAED,MAAM,OAAO,GAAG,IAAW,CAAC;IAC5B,MAAM,OAAO,GAAU,EAAE,CAAC;IAC1B,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAEnD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC;QACjH,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC;YACvD,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;SAC3D,CAAC,CAAC;QAEH,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;gBAClD,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE;gBAC1B,IAAI,EAAE,EAAE,KAAK,EAAE;aAChB,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC;gBAClD,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE;aAC5C,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QAC3C,KAAK,EAAE,EAAE,EAAE,EAAE;QACb,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;KAChC,CAAC,CAAC;IAEH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AACjE,CAAC,CAAC;KACD,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE;IACjE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAW,CAAC;QAEvD,MAAM,eAAe,GAAG,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9D,IAAI,eAAe,EAAE,CAAC;YACpB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;YACjB,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QACpC,CAAC;QAED,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC;gBACrD,KAAK,EAAE,EAAE,MAAM,EAAE;gBACjB,OAAO,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;aAC3B,CAAC,CAAC;YACH,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;YACrC,IAAI,EAAE;gBACJ,MAAM;gBACN,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;gBACxB,KAAK,EAAE,UAAU;gBACjB,OAAO;gBACP,QAAQ,EAAE,QAAQ,KAAK,KAAK;aAC7B;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;QAC5C,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC,EAAE;IACD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE;QAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;KAClC,CAAC;CACH,CAAC;KACD,GAAG,CAAC,sBAAsB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE;IAC1E,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAW,CAAC;QAEvD,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,cAAc,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC/E,IAAI,CAAC,eAAe,EAAE,CAAC;oBACrB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;oBACjB,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;gBACxC,CAAC;gBACD,cAAc,GAAG,eAAe,CAAC,IAAI,CAAC;YACxC,CAAC;YACD,MAAM,eAAe,GAAG,sBAAsB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YACxE,IAAI,eAAe,EAAE,CAAC;gBACpB,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;gBACjB,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;YACpC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;YACrC,KAAK,EAAE,EAAE,EAAE,EAAE;YACb,IAAI,EAAE;gBACJ,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;gBAC3C,KAAK;gBACL,OAAO;gBACP,QAAQ;aACT;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACnD,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;IAC/C,CAAC;AACH,CAAC,EAAE;IACD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5B,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAC5B,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;KAClC,CAAC;CACH,CAAC;KACD,GAAG,CAAC,yBAAyB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE;IACxE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,EAAE,aAAa,EAAE,GAAG,IAA0D,CAAC;QAErF,MAAM,MAAM,CAAC,YAAY,CACvB,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACzB,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;YACxB,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE;YAC9B,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;SAC5B,CAAC,CACH,CACF,CAAC;QACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;QACpD,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;IACjD,CAAC;AACH,CAAC,EAAE;IACD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACb,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;YAC9B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;YACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;SAClB,CAAC,CAAC;KACJ,CAAC;CACH,CAAC;KACD,MAAM,CAAC,sBAAsB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;IACvE,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;YAC9B,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE;SACjC,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;IAC/C,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,SAAS,sBAAsB,CAAC,IAAY,EAAE,OAAY;IACxD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,+BAA+B,CAAC;IACzC,CAAC;IAED,QAAQ,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,GAAG,GAAG,wBAAwB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1G,MAAM;QACR,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,GAAG,GAAG,8BAA8B,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC9D,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1G,MAAM;QACR,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,GAAG,GAAG,4BAA4B,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC5D,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1G,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,GAAG,GAAG,0BAA0B,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC1D,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1G,MAAM;QACR,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,GAAG,GAAG,wBAAwB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1G,MAAM;QACR,CAAC;QACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,MAAM,GAAG,GAAG,mCAAmC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACnE,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1G,MAAM;QACR,CAAC;QACD,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,GAAG,GAAG,8BAA8B,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC9D,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1G,MAAM;QACR,CAAC;QACD,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,MAAM,GAAG,GAAG,iCAAiC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACjE,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1G,MAAM;QACR,CAAC;QACD,KAAK,oBAAoB,CAAC,CAAC,CAAC;YAC1B,MAAM,GAAG,GAAG,qCAAqC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACrE,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1G,MAAM;QACR,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,KAAK,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxB,MAAM;QACR,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,KAAK,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;YAC/C,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxB,MAAM;QACR,CAAC;QACD,KAAK,uBAAuB,CAAC,CAAC,CAAC;YAC7B,MAAM,KAAK,GAAG,kCAAkC,CAAC,OAAO,CAAC,CAAC;YAC1D,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxB,MAAM;QACR,CAAC;QACD,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,MAAM,KAAK,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxB,MAAM;QACR,CAAC;QACD,KAAK,kBAAkB,CAAC,CAAC,CAAC;YACxB,MAAM,KAAK,GAAG,8BAA8B,CAAC,OAAO,CAAC,CAAC;YACtD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxB,MAAM;QACR,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,KAAK,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxB,MAAM;QACR,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,KAAK,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxB,MAAM;QACR,CAAC;QACD,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,KAAK,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;YACxB,MAAM;QACR,CAAC;QACD;YACE,OAAO,yBAAyB,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"} \ No newline at end of file +{"version":3,"file":"pages.js","sourceRoot":"","sources":["pages.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/apps/backend/src/routes/product-attributes.d.ts b/apps/backend/src/routes/product-attributes.d.ts new file mode 100644 index 0000000..0ebafa8 --- /dev/null +++ b/apps/backend/src/routes/product-attributes.d.ts @@ -0,0 +1,349 @@ +import { Elysia } from "elysia"; +export declare const productAttributesRoute: Elysia<"", { + decorator: {}; + store: {}; + derive: {}; + resolve: {}; +}, { + typebox: {}; + error: {}; +}, { + schema: {}; + standaloneSchema: {}; + macro: {}; + macroFn: {}; + parser: {}; + response: {}; +}, { + "product-attributes": { + definitions: { + get: { + body: unknown; + params: {}; + query: unknown; + headers: unknown; + response: { + [x: string]: any; + [x: number]: any; + [x: symbol]: any; + }; + }; + }; + }; +} & { + "product-attributes": { + definitions: { + ":id": { + get: { + body: unknown; + params: { + id: string; + } & {}; + query: unknown; + headers: unknown; + response: { + [x: string]: any; + [x: number]: any; + [x: symbol]: any; + }; + }; + }; + }; + }; +} & { + "product-attributes": { + definitions: { + post: { + body: any; + params: {}; + query: unknown; + headers: unknown; + response: { + 200: { + success: boolean; + definition: any; + }; + 400: { + readonly message: "Attribute definition code already exists"; + }; + 500: { + readonly message: any; + }; + }; + }; + }; + }; +} & { + "product-attributes": { + definitions: { + ":id": { + put: { + body: any; + params: { + id: string; + } & {}; + query: unknown; + headers: unknown; + response: { + 200: { + success: boolean; + definition: any; + }; + 400: { + readonly message: "Attribute definition code already exists"; + }; + 404: { + readonly message: "Attribute definition not found"; + }; + 422: { + type: "validation"; + on: string; + summary?: string; + message?: string; + found?: unknown; + property?: string; + expected?: string; + }; + 500: { + readonly message: any; + }; + }; + }; + }; + }; + }; +} & { + "product-attributes": { + definitions: { + ":id": { + translations: { + patch: { + body: any; + params: { + id: string; + } & {}; + query: unknown; + headers: unknown; + response: { + 200: { + success: boolean; + definition: any; + translations: any[]; + }; + 400: { + readonly message: "No valid translations provided"; + }; + 404: { + readonly message: "Attribute definition not found"; + }; + 422: { + type: "validation"; + on: string; + summary?: string; + message?: string; + found?: unknown; + property?: string; + expected?: string; + }; + 500: { + readonly message: any; + }; + }; + }; + }; + }; + }; + }; +} & { + products: { + ":id": { + attributes: { + get: { + body: unknown; + params: { + id: string; + } & {}; + query: unknown; + headers: unknown; + response: { + [x: string]: any; + [x: number]: any; + [x: symbol]: any; + }; + }; + }; + }; + }; +} & { + products: { + ":id": { + attributes: { + post: { + body: any; + params: { + id: string; + } & {}; + query: unknown; + headers: unknown; + response: { + 200: { + success: boolean; + attribute: any; + }; + 400: { + readonly message: "attributeDefinitionId is required"; + } | { + readonly message: any; + }; + 404: { + readonly message: any; + }; + 422: { + type: "validation"; + on: string; + summary?: string; + message?: string; + found?: unknown; + property?: string; + expected?: string; + }; + }; + }; + }; + }; + }; +} & { + products: { + ":id": { + attributes: { + put: { + body: any; + params: { + id: string; + } & {}; + query: unknown; + headers: unknown; + response: { + 200: { + success: boolean; + attributes: any; + }; + 400: { + readonly message: "attributes array is required"; + } | { + readonly message: any; + }; + 404: { + readonly message: "Product not found"; + } | { + readonly message: any; + }; + 422: { + type: "validation"; + on: string; + summary?: string; + message?: string; + found?: unknown; + property?: string; + expected?: string; + }; + }; + }; + }; + }; + }; +} & { + products: { + ":id": { + attributes: { + ":productAttributeId": { + put: { + body: any; + params: { + id: string; + productAttributeId: string; + } & {}; + query: unknown; + headers: unknown; + response: { + 200: { + success: boolean; + attribute: any; + }; + 400: { + readonly message: any; + }; + 404: { + readonly message: "Product attribute not found"; + }; + 422: { + type: "validation"; + on: string; + summary?: string; + message?: string; + found?: unknown; + property?: string; + expected?: string; + }; + }; + }; + }; + }; + }; + }; +} & { + products: { + ":id": { + attributes: { + ":productAttributeId": { + translations: { + patch: { + body: any; + params: { + id: string; + productAttributeId: string; + } & {}; + query: unknown; + headers: unknown; + response: { + 200: { + success: boolean; + attribute: any; + translations: any[]; + }; + 400: { + readonly message: any; + }; + 404: { + readonly message: "Product attribute not found"; + }; + 422: { + type: "validation"; + on: string; + summary?: string; + message?: string; + found?: unknown; + property?: string; + expected?: string; + }; + }; + }; + }; + }; + }; + }; + }; +}, { + derive: {}; + resolve: {}; + schema: {}; + standaloneSchema: {}; + response: {}; +}, { + derive: {}; + resolve: {}; + schema: {}; + standaloneSchema: {}; + response: {}; +}>; +//# sourceMappingURL=product-attributes.d.ts.map \ No newline at end of file diff --git a/apps/backend/src/routes/product-attributes.d.ts.map b/apps/backend/src/routes/product-attributes.d.ts.map new file mode 100644 index 0000000..81870c1 --- /dev/null +++ b/apps/backend/src/routes/product-attributes.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"product-attributes.d.ts","sourceRoot":"","sources":["product-attributes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAK,MAAM,QAAQ,CAAC;AAiDnC,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqY/B,CAAC"} \ No newline at end of file diff --git a/apps/backend/src/routes/product-attributes.js b/apps/backend/src/routes/product-attributes.js new file mode 100644 index 0000000..e36765a --- /dev/null +++ b/apps/backend/src/routes/product-attributes.js @@ -0,0 +1,417 @@ +import { Elysia, t } from "elysia"; +import prisma from "../lib/prisma"; +import { SUPPORTED_LANGS, localizeAttributeDefinition, localizeProductAttribute, normalizeAttributeType, validateAttributeValue, validateSelectOption, } from "../lib/productAttributes"; +function parseId(value, label) { + const parsed = parseInt(value); + if (Number.isNaN(parsed)) { + throw new Error(`Invalid ${label}`); + } + return parsed; +} +function buildDefinitionPayload(payload) { + return { + code: payload.code, + label: payload.label, + description: payload.description ?? null, + type: normalizeAttributeType(payload.type), + unit: payload.unit ?? null, + options: payload.options ?? null, + isRequired: Boolean(payload.isRequired), + isFilterable: Boolean(payload.isFilterable), + sortOrder: typeof payload.sortOrder === 'number' ? payload.sortOrder : 0, + categoryId: payload.categoryId ?? null, + }; +} +async function assertProductAndDefinitionMatch(productId, attributeDefinitionId) { + const [product, definition] = await Promise.all([ + prisma.product.findUnique({ where: { id: productId } }), + prisma.attributeDefinition.findUnique({ where: { id: attributeDefinitionId } }), + ]); + if (!product) + throw new Error("Product not found"); + if (!definition) + throw new Error("Attribute definition not found"); + if (definition.categoryId && definition.categoryId !== product.categoryId) { + throw new Error("Attribute definition category does not match product category"); + } + return { product, definition }; +} +export const productAttributesRoute = new Elysia() + .get("/product-attributes/definitions", async ({ query }) => { + const lang = query.lang || 'th'; + const categoryId = query.categoryId ? parseInt(query.categoryId) : undefined; + const definitions = await prisma.attributeDefinition.findMany({ + where: categoryId ? { OR: [{ categoryId }, { categoryId: null }] } : undefined, + include: { + category: true, + translations: true, + }, + orderBy: [ + { sortOrder: 'asc' }, + { code: 'asc' }, + ], + }); + return definitions.map((definition) => localizeAttributeDefinition(definition, lang)); +}) + .get("/product-attributes/definitions/:id", async ({ params, query, status }) => { + try { + const id = parseId(params.id, "attribute definition ID"); + const lang = query.lang || 'th'; + const definition = await prisma.attributeDefinition.findUnique({ + where: { id }, + include: { + category: true, + translations: true, + }, + }); + if (!definition) + return status(404, { message: "Attribute definition not found" }); + return localizeAttributeDefinition(definition, lang); + } + catch (err) { + return status(400, { message: err.message }); + } +}) + .post("/product-attributes/definitions", async ({ body, status }) => { + try { + const payload = body; + const definition = await prisma.attributeDefinition.create({ + data: { + ...buildDefinitionPayload(payload), + translations: payload.translations && typeof payload.translations === 'object' + ? { + create: Object.entries(payload.translations) + .filter(([lang, value]) => SUPPORTED_LANGS.includes(lang) && value && typeof value === 'object' && value.label) + .map(([lang, value]) => ({ + langCode: lang, + label: value.label, + description: value.description ?? null, + })), + } + : undefined, + }, + include: { + category: true, + translations: true, + }, + }); + return { success: true, definition }; + } + catch (err) { + if (err.code === 'P2002') + return status(400, { message: "Attribute definition code already exists" }); + return status(500, { message: err?.message || "Failed to create attribute definition" }); + } +}, { + body: t.Any(), +}) + .put("/product-attributes/definitions/:id", async ({ params, body, status }) => { + try { + const id = parseId(params.id, "attribute definition ID"); + const payload = body; + const definition = await prisma.attributeDefinition.update({ + where: { id }, + data: buildDefinitionPayload(payload), + include: { + category: true, + translations: true, + }, + }); + return { success: true, definition }; + } + catch (err) { + if (err.code === 'P2025') + return status(404, { message: "Attribute definition not found" }); + if (err.code === 'P2002') + return status(400, { message: "Attribute definition code already exists" }); + return status(500, { message: err?.message || "Failed to update attribute definition" }); + } +}, { + body: t.Any(), +}) + .patch("/product-attributes/definitions/:id/translations", async ({ params, body, status }) => { + try { + const id = parseId(params.id, "attribute definition ID"); + const definition = await prisma.attributeDefinition.findUnique({ where: { id } }); + if (!definition) + return status(404, { message: "Attribute definition not found" }); + const payload = body; + const results = []; + for (const lang of SUPPORTED_LANGS) { + const item = payload.translations?.[lang] + || ((payload.label?.[lang] || payload.description?.[lang]) ? { label: payload.label?.[lang], description: payload.description?.[lang] } : null); + if (!item?.label) + continue; + const existing = await prisma.attributeDefinitionTranslation.findUnique({ + where: { attributeDefinitionId_langCode: { attributeDefinitionId: id, langCode: lang } }, + }); + const data = { + label: item.label, + description: item.description ?? null, + }; + if (existing) { + results.push(await prisma.attributeDefinitionTranslation.update({ + where: { id: existing.id }, + data, + })); + } + else { + results.push(await prisma.attributeDefinitionTranslation.create({ + data: { + attributeDefinitionId: id, + langCode: lang, + ...data, + }, + })); + } + } + if (results.length === 0) + return status(400, { message: "No valid translations provided" }); + const updated = await prisma.attributeDefinition.findUnique({ + where: { id }, + include: { category: true, translations: true }, + }); + return { success: true, definition: updated, translations: results }; + } + catch (err) { + return status(500, { message: err?.message || "Failed to update attribute definition translations" }); + } +}, { + body: t.Any(), +}) + .get("/products/:id/attributes", async ({ params, query, status }) => { + try { + const productId = parseId(params.id, "product ID"); + const lang = query.lang || 'th'; + const product = await prisma.product.findUnique({ where: { id: productId } }); + if (!product) + return status(404, { message: "Product not found" }); + const attributes = await prisma.productAttribute.findMany({ + where: { productId }, + include: { + translations: true, + attributeDefinition: { + include: { + category: true, + translations: true, + }, + }, + }, + orderBy: [ + { attributeDefinition: { sortOrder: 'asc' } }, + { id: 'asc' }, + ], + }); + return attributes.map((attribute) => localizeProductAttribute(attribute, lang)); + } + catch (err) { + return status(400, { message: err.message }); + } +}) + .post("/products/:id/attributes", async ({ params, body, status }) => { + try { + const productId = parseId(params.id, "product ID"); + const payload = body; + const attributeDefinitionId = Number(payload.attributeDefinitionId); + if (!attributeDefinitionId) + return status(400, { message: "attributeDefinitionId is required" }); + const { definition } = await assertProductAndDefinitionMatch(productId, attributeDefinitionId); + const type = normalizeAttributeType(definition.type); + validateAttributeValue(type, payload); + if (type === 'SELECT') + validateSelectOption(definition.options, payload.valueText); + const attribute = await prisma.productAttribute.upsert({ + where: { productId_attributeDefinitionId: { productId, attributeDefinitionId } }, + update: { + valueText: payload.valueText ?? null, + valueNumber: payload.valueNumber ?? null, + valueBoolean: payload.valueBoolean ?? null, + valueJson: payload.valueJson ?? null, + }, + create: { + productId, + attributeDefinitionId, + valueText: payload.valueText ?? null, + valueNumber: payload.valueNumber ?? null, + valueBoolean: payload.valueBoolean ?? null, + valueJson: payload.valueJson ?? null, + }, + include: { + translations: true, + attributeDefinition: { include: { category: true, translations: true } }, + }, + }); + return { success: true, attribute }; + } + catch (err) { + const code = err.message === "Product not found" || err.message === "Attribute definition not found" ? 404 : 400; + return status(code, { message: err.message }); + } +}, { + body: t.Any(), +}) + .put("/products/:id/attributes", async ({ params, body, status }) => { + try { + const productId = parseId(params.id, "product ID"); + const payload = body; + if (!Array.isArray(payload.attributes)) + return status(400, { message: "attributes array is required" }); + const product = await prisma.product.findUnique({ where: { id: productId } }); + if (!product) + return status(404, { message: "Product not found" }); + const existing = await prisma.productAttribute.findMany({ + where: { productId }, + select: { id: true, attributeDefinitionId: true }, + }); + const incomingDefinitionIds = payload.attributes.map((item) => Number(item.attributeDefinitionId)).filter(Boolean); + const toDelete = existing.filter((item) => !incomingDefinitionIds.includes(item.attributeDefinitionId)); + if (toDelete.length > 0) { + await prisma.productAttribute.deleteMany({ + where: { id: { in: toDelete.map((item) => item.id) } }, + }); + } + const results = []; + for (const item of payload.attributes) { + const attributeDefinitionId = Number(item.attributeDefinitionId); + const { definition } = await assertProductAndDefinitionMatch(productId, attributeDefinitionId); + const type = normalizeAttributeType(definition.type); + validateAttributeValue(type, item); + if (type === 'SELECT') + validateSelectOption(definition.options, item.valueText); + const attribute = await prisma.productAttribute.upsert({ + where: { productId_attributeDefinitionId: { productId, attributeDefinitionId } }, + update: { + valueText: item.valueText ?? null, + valueNumber: item.valueNumber ?? null, + valueBoolean: item.valueBoolean ?? null, + valueJson: item.valueJson ?? null, + }, + create: { + productId, + attributeDefinitionId, + valueText: item.valueText ?? null, + valueNumber: item.valueNumber ?? null, + valueBoolean: item.valueBoolean ?? null, + valueJson: item.valueJson ?? null, + }, + include: { + translations: true, + attributeDefinition: { include: { category: true, translations: true } }, + }, + }); + if (type === 'TEXT' && item.translations && typeof item.translations === 'object') { + for (const lang of SUPPORTED_LANGS) { + const translatedValue = item.translations[lang]; + if (typeof translatedValue !== 'string' || !translatedValue.trim()) + continue; + await prisma.productAttributeTranslation.upsert({ + where: { productAttributeId_langCode: { productAttributeId: attribute.id, langCode: lang } }, + update: { valueText: translatedValue }, + create: { productAttributeId: attribute.id, langCode: lang, valueText: translatedValue }, + }); + } + } + results.push(attribute); + } + const updated = await prisma.productAttribute.findMany({ + where: { productId }, + include: { + translations: true, + attributeDefinition: { include: { category: true, translations: true } }, + }, + orderBy: [ + { attributeDefinition: { sortOrder: 'asc' } }, + { id: 'asc' }, + ], + }); + return { success: true, attributes: updated }; + } + catch (err) { + const code = err.message === "Product not found" || err.message === "Attribute definition not found" ? 404 : 400; + return status(code, { message: err.message }); + } +}, { + body: t.Any(), +}) + .put("/products/:id/attributes/:productAttributeId", async ({ params, body, status }) => { + try { + const productId = parseId(params.id, "product ID"); + const productAttributeId = parseId(params.productAttributeId, "product attribute ID"); + const attribute = await prisma.productAttribute.findUnique({ + where: { id: productAttributeId }, + include: { attributeDefinition: true }, + }); + if (!attribute || attribute.productId !== productId) { + return status(404, { message: "Product attribute not found" }); + } + const type = normalizeAttributeType(attribute.attributeDefinition.type); + const payload = body; + validateAttributeValue(type, payload); + if (type === 'SELECT') + validateSelectOption(attribute.attributeDefinition.options, payload.valueText); + const updated = await prisma.productAttribute.update({ + where: { id: productAttributeId }, + data: { + valueText: payload.valueText ?? null, + valueNumber: payload.valueNumber ?? null, + valueBoolean: payload.valueBoolean ?? null, + valueJson: payload.valueJson ?? null, + }, + include: { + translations: true, + attributeDefinition: { include: { category: true, translations: true } }, + }, + }); + return { success: true, attribute: updated }; + } + catch (err) { + return status(400, { message: err.message }); + } +}, { + body: t.Any(), +}) + .patch("/products/:id/attributes/:productAttributeId/translations", async ({ params, body, status }) => { + try { + const productId = parseId(params.id, "product ID"); + const productAttributeId = parseId(params.productAttributeId, "product attribute ID"); + const attribute = await prisma.productAttribute.findUnique({ + where: { id: productAttributeId }, + include: { attributeDefinition: true, translations: true }, + }); + if (!attribute || attribute.productId !== productId) { + return status(404, { message: "Product attribute not found" }); + } + const type = normalizeAttributeType(attribute.attributeDefinition.type); + if (type !== 'TEXT') { + return status(400, { message: "Only TEXT product attributes support translations in this phase" }); + } + const payload = body; + const results = []; + for (const lang of SUPPORTED_LANGS) { + const valueText = payload.translations?.[lang] ?? payload.valueText?.[lang]; + if (typeof valueText !== 'string' || !valueText.trim()) + continue; + results.push(await prisma.productAttributeTranslation.upsert({ + where: { productAttributeId_langCode: { productAttributeId, langCode: lang } }, + update: { valueText }, + create: { productAttributeId, langCode: lang, valueText }, + })); + } + if (results.length === 0) + return status(400, { message: "No valid translations provided" }); + const updated = await prisma.productAttribute.findUnique({ + where: { id: productAttributeId }, + include: { + translations: true, + attributeDefinition: { include: { category: true, translations: true } }, + }, + }); + return { success: true, attribute: updated, translations: results }; + } + catch (err) { + return status(400, { message: err.message }); + } +}, { + body: t.Any(), +}); +//# sourceMappingURL=product-attributes.js.map \ No newline at end of file diff --git a/apps/backend/src/routes/product-attributes.js.map b/apps/backend/src/routes/product-attributes.js.map new file mode 100644 index 0000000..2c0b980 --- /dev/null +++ b/apps/backend/src/routes/product-attributes.js.map @@ -0,0 +1 @@ +{"version":3,"file":"product-attributes.js","sourceRoot":"","sources":["product-attributes.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/apps/backend/src/routes/products.d.ts b/apps/backend/src/routes/products.d.ts index 1cc1f1b..7d1957c 100644 --- a/apps/backend/src/routes/products.d.ts +++ b/apps/backend/src/routes/products.d.ts @@ -1,6 +1,8 @@ import { Elysia } from "elysia"; export declare const productsRoute: Elysia<"/products", { - decorator: {}; + decorator: { + validateVariants: (options?: any[], variants?: any[]) => void; + }; store: {}; derive: {}; resolve: {}; @@ -139,7 +141,7 @@ export declare const productsRoute: Elysia<"/products", { }; 500: { readonly success: false; - readonly message: "Failed to update product"; + readonly message: any; }; }; }; @@ -182,7 +184,7 @@ export declare const productsRoute: Elysia<"/products", { }; 500: { readonly success: false; - readonly message: "Failed to add product image"; + readonly message: any; }; }; }; @@ -203,7 +205,41 @@ export declare const productsRoute: Elysia<"/products", { }; 500: { readonly success: false; - readonly message: "Failed to create product"; + readonly message: any; + }; + }; + }; + }; +} & { + products: { + bulk: { + post: { + body: any[]; + params: {}; + query: unknown; + headers: unknown; + response: { + 200: { + success: boolean; + products: any; + }; + 400: { + readonly success: false; + readonly message: "Payload must be an array of products"; + }; + 422: { + type: "validation"; + on: string; + summary?: string; + message?: string; + found?: unknown; + property?: string; + expected?: string; + }; + 500: { + readonly success: false; + readonly message: any; + }; }; }; }; @@ -237,7 +273,7 @@ export declare const productsRoute: Elysia<"/products", { }; 500: { readonly success: false; - readonly message: "Failed to patch product"; + readonly message: any; }; }; }; diff --git a/apps/backend/src/routes/products.d.ts.map b/apps/backend/src/routes/products.d.ts.map index cb92fd3..c477ee5 100644 --- a/apps/backend/src/routes/products.d.ts.map +++ b/apps/backend/src/routes/products.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"products.d.ts","sourceRoot":"","sources":["products.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAK,MAAM,QAAQ,CAAC;AAGnC,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2bvB,CAAC"} \ No newline at end of file +{"version":3,"file":"products.d.ts","sourceRoot":"","sources":["products.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAK,MAAM,QAAQ,CAAC;AAInC,eAAO,MAAM,aAAa;;qCACgB,GAAG,EAAE,aAAiB,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4tBlE,CAAC"} \ No newline at end of file diff --git a/apps/backend/src/routes/products.js b/apps/backend/src/routes/products.js index fa69701..65f741a 100644 --- a/apps/backend/src/routes/products.js +++ b/apps/backend/src/routes/products.js @@ -1,6 +1,41 @@ import { Elysia, t } from "elysia"; import prisma from "../lib/prisma"; +import { localizeProductAttribute } from "../lib/productAttributes"; export const productsRoute = new Elysia({ prefix: "/products" }) + .decorate("validateVariants", (options = [], variants = []) => { + if (options.length > 3) + throw new Error("Options array length cannot exceed 3."); + const getPrimaryValues = (values) => { + return values.map(val => { + if (typeof val === 'string') + return val; + if (typeof val === 'object' && val !== null) { + return val.th || Object.values(val)[0]; + } + return String(val); + }); + }; + for (const v of variants) { + if (v.option1 && options[0]) { + const validValues = getPrimaryValues(options[0].values); + if (!validValues.includes(v.option1)) { + throw new Error(`Variant option1 '${v.option1}' is not found in options[0].values [${validValues.join(', ')}]`); + } + } + if (v.option2 && options[1]) { + const validValues = getPrimaryValues(options[1].values); + if (!validValues.includes(v.option2)) { + throw new Error(`Variant option2 '${v.option2}' is not found in options[1].values [${validValues.join(', ')}]`); + } + } + if (v.option3 && options[2]) { + const validValues = getPrimaryValues(options[2].values); + if (!validValues.includes(v.option3)) { + throw new Error(`Variant option3 '${v.option3}' is not found in options[2].values [${validValues.join(', ')}]`); + } + } + } +}) .get("/brands", async () => { return await prisma.productBrand.findMany({ orderBy: { name: "asc" }, @@ -68,6 +103,21 @@ export const productsRoute = new Elysia({ prefix: "/products" }) category: { include: { translations: true } }, brand: true, translations: true, + attributes: { + include: { + translations: true, + attributeDefinition: { + include: { + category: true, + translations: true, + }, + }, + }, + orderBy: [ + { attributeDefinition: { sortOrder: "asc" } }, + { id: "asc" }, + ], + }, variants: { include: { bomItems: { include: { rawMaterial: true } } @@ -82,27 +132,35 @@ export const productsRoute = new Elysia({ prefix: "/products" }) prisma.product.count({ where }), ]); // Map translations - const mappedProducts = products.map(p => { + const mappedProducts = products.map((p) => { if (lang === 'all') { const nameObj = {}; const descObj = {}; const detailsObj = {}; - p.translations.forEach(t => { + p.translations.forEach((t) => { nameObj[t.langCode] = t.name; descObj[t.langCode] = t.description; detailsObj[t.langCode] = t.details; }); - return { ...p, name: nameObj, description: descObj, details: detailsObj, category: { ...p.category, name: p.category.name } }; // Actually for 'all', keep as is, but wait, category name needs resolving if we want it? Let's just resolve it simply below. + return { + ...p, + name: nameObj, + description: descObj, + details: detailsObj, + category: { ...p.category, name: p.category.name }, + attributes: p.attributes.map((attribute) => localizeProductAttribute(attribute, lang)), + }; } else { - const trans = p.translations.find(t => t.langCode === lang) || p.translations.find(t => t.langCode === 'th') || p.translations[0]; + const trans = p.translations.find((t) => t.langCode === lang) || p.translations.find((t) => t.langCode === 'th') || p.translations[0]; const catTrans = p.category.translations?.find((t) => t.langCode === lang) || p.category.translations?.find((t) => t.langCode === 'th') || p.category.translations?.[0]; return { ...p, name: trans?.name || p.name || '', description: trans?.description || p.description, details: trans?.details || p.details, - category: { ...p.category, name: catTrans?.name || p.category.name } + category: { ...p.category, name: catTrans?.name || p.category.name }, + attributes: p.attributes.map((attribute) => localizeProductAttribute(attribute, lang)), }; } }); @@ -132,6 +190,21 @@ export const productsRoute = new Elysia({ prefix: "/products" }) category: { include: { translations: true } }, brand: true, translations: true, + attributes: { + include: { + translations: true, + attributeDefinition: { + include: { + category: true, + translations: true, + }, + }, + }, + orderBy: [ + { attributeDefinition: { sortOrder: "asc" } }, + { id: "asc" }, + ], + }, variants: { include: { bomItems: { include: { rawMaterial: true } } @@ -147,31 +220,47 @@ export const productsRoute = new Elysia({ prefix: "/products" }) const nameObj = {}; const descObj = {}; const detailsObj = {}; - product.translations.forEach(t => { + product.translations.forEach((t) => { nameObj[t.langCode] = t.name; descObj[t.langCode] = t.description; detailsObj[t.langCode] = t.details; }); - return { ...product, name: nameObj, description: descObj, details: detailsObj }; + return { + ...product, + name: nameObj, + description: descObj, + details: detailsObj, + attributes: product.attributes.map((attribute) => localizeProductAttribute(attribute, lang)), + }; } else { - const trans = product.translations.find(t => t.langCode === lang) || product.translations.find(t => t.langCode === 'th') || product.translations[0]; + const trans = product.translations.find((t) => t.langCode === lang) || product.translations.find((t) => t.langCode === 'th') || product.translations[0]; const catTrans = product.category.translations?.find((t) => t.langCode === lang) || product.category.translations?.find((t) => t.langCode === 'th') || product.category.translations?.[0]; return { ...product, name: trans?.name || product.name || '', description: trans?.description || product.description, details: trans?.details || product.details, - category: { ...product.category, name: catTrans?.name || product.category.name } + category: { ...product.category, name: catTrans?.name || product.category.name }, + attributes: product.attributes.map((attribute) => localizeProductAttribute(attribute, lang)), }; } }) - .put("/:id", async ({ params, body, status }) => { + .put("/:id", async ({ params, body, status, validateVariants }) => { const id = parseInt(params.id); if (isNaN(id)) return status(400, { message: "Invalid product ID" }); const { categoryId, description, details, variants, images } = body; + let options = body.options; try { + if (variants && Array.isArray(variants)) { + // If options is not passed but variants are, we might need to fetch existing options + if (options === undefined) { + const existingProduct = await prisma.product.findUnique({ where: { id } }); + options = existingProduct?.options || []; + } + validateVariants(options, variants); + } const updatedProduct = await prisma.$transaction(async (tx) => { // 1. Update basic product info const updateData = {}; @@ -184,45 +273,97 @@ export const productsRoute = new Elysia({ prefix: "/products" }) data: updateData, }); // 2. Sync Variants - await tx.productVariant.deleteMany({ - where: { productId: id }, - }); - if (variants && variants.length > 0) { - for (const v of variants) { - await tx.productVariant.create({ - data: { - productId: id, - sku: v.sku || null, - barcode: v.barcode || null, - stock: v.stock || 0, - option1: v.option1 || "", - option2: v.option2 || "", - option3: v.option3 || "", - price: v.price || 0, - bomItems: v.bomItems && v.bomItems.length > 0 ? { - create: v.bomItems.map((b) => ({ - rawMaterialId: b.rawMaterialId, - quantity: b.quantity, - })) - } : undefined - } + if (variants && Array.isArray(variants)) { + const existingVariants = await tx.productVariant.findMany({ where: { productId: id } }); + const incomingIds = variants.map((v) => v.id).filter(Boolean); + // Delete variants not in incoming payload + const variantsToDelete = existingVariants.filter(ev => !incomingIds.includes(ev.id)); + if (variantsToDelete.length > 0) { + await tx.productVariant.deleteMany({ + where: { id: { in: variantsToDelete.map(ev => ev.id) } } }); } + for (const v of variants) { + if (v.id) { + // Check if it really belongs to this product + const exists = existingVariants.find(ev => ev.id === v.id); + if (exists) { + await tx.productVariant.update({ + where: { id: v.id }, + data: { + sku: v.sku || null, + barcode: v.barcode || null, + stock: v.stock || 0, + option1: v.option1 || "", + option2: v.option2 || "", + option3: v.option3 || "", + price: v.price || 0, + bomItems: v.bomItems ? { + deleteMany: {}, + create: v.bomItems.map((b) => ({ + rawMaterialId: b.rawMaterialId, + quantity: b.quantity, + })) + } : undefined + } + }); + } + } + else { + await tx.productVariant.create({ + data: { + productId: id, + sku: v.sku || null, + barcode: v.barcode || null, + stock: v.stock || 0, + option1: v.option1 || "", + option2: v.option2 || "", + option3: v.option3 || "", + price: v.price || 0, + bomItems: v.bomItems && v.bomItems.length > 0 ? { + create: v.bomItems.map((b) => ({ + rawMaterialId: b.rawMaterialId, + quantity: b.quantity, + })) + } : undefined + } + }); + } + } } // 3. Sync Images - await tx.productImage.deleteMany({ - where: { productId: id }, - }); - if (images && images.length > 0) { - for (const [idx, img] of images.entries()) { - await tx.productImage.create({ - data: { - productId: id, - url: img.url, - order: img.order ?? (typeof img.order === 'number' ? img.order : idx), - } + if (images && Array.isArray(images)) { + const existingImages = await tx.productImage.findMany({ where: { productId: id } }); + const incomingImgIds = images.map((img) => img.id).filter(Boolean); + const imagesToDelete = existingImages.filter(ei => !incomingImgIds.includes(ei.id)); + if (imagesToDelete.length > 0) { + await tx.productImage.deleteMany({ + where: { id: { in: imagesToDelete.map(ei => ei.id) } } }); } + for (const [idx, img] of images.entries()) { + if (img.id) { + const exists = existingImages.find(ei => ei.id === img.id); + if (exists) { + await tx.productImage.update({ + where: { id: img.id }, + data: { + url: img.url, + order: img.order ?? (typeof img.order === 'number' ? img.order : idx), + } + }); + } + } + else { + await tx.productImage.create({ + data: { + productId: id, + url: img.url, + order: img.order ?? (typeof img.order === 'number' ? img.order : idx), + } + }); + } + } } return prod; }); @@ -230,7 +371,7 @@ export const productsRoute = new Elysia({ prefix: "/products" }) } catch (err) { console.error("Update product error:", err); - return status(500, { success: false, message: "Failed to update product" }); + return status(500, { success: false, message: err?.message || "Failed to update product" }); } }, { body: t.Any(), @@ -264,37 +405,70 @@ export const productsRoute = new Elysia({ prefix: "/products" }) } catch (err) { console.error("Add product image error:", err); - return status(500, { success: false, message: "Failed to add product image" }); + return status(500, { success: false, message: err?.message || "Failed to add product image" }); } }, { body: t.Object({ url: t.String() }) }) - .post("/", async ({ body, status }) => { + .post("/", async ({ body, status, validateVariants }) => { const payload = body; try { + if (payload.variants && Array.isArray(payload.variants)) { + validateVariants(payload.options || [], payload.variants); + } const product = await prisma.$transaction(async (tx) => { + let categoryId = payload.categoryId; + if (!categoryId && payload.categoryName) { + let cat = await tx.category.findUnique({ where: { name: payload.categoryName } }); + if (!cat) { + cat = await tx.category.create({ data: { name: payload.categoryName } }); + } + categoryId = cat.id; + } + let brandId = payload.brandId; + if (!brandId && payload.brandName) { + let brand = await tx.productBrand.findUnique({ where: { name: payload.brandName } }); + if (!brand) { + brand = await tx.productBrand.create({ data: { name: payload.brandName } }); + } + brandId = brand.id; + } const prod = await tx.product.create({ data: { - categoryId: payload.categoryId, - brandId: payload.brandId, + categoryId: categoryId, + brandId: brandId, name: payload.name || "New Product", - price: payload.price || 0, description: payload.description || "", details: payload.details || "", options: payload.options || [], } }); - await tx.productTranslation.create({ - data: { - productId: prod.id, - langCode: 'th', - name: payload.name || "New Product", - description: payload.description || "", - details: payload.details || "", + if (payload.translations && typeof payload.translations === 'object') { + for (const [lang, trans] of Object.entries(payload.translations)) { + await tx.productTranslation.create({ + data: { + productId: prod.id, + langCode: lang, + name: trans.name || payload.name || "New Product", + description: trans.description || payload.description || "", + details: trans.details || payload.details || "", + } + }); } - }); + } + else { + await tx.productTranslation.create({ + data: { + productId: prod.id, + langCode: 'th', + name: payload.name || "New Product", + description: payload.description || "", + details: payload.details || "", + } + }); + } if (payload.variants && payload.variants.length > 0) { for (const v of payload.variants) { await tx.productVariant.create({ @@ -328,7 +502,7 @@ export const productsRoute = new Elysia({ prefix: "/products" }) } catch (err) { console.error("Create product error:", err); - return status(500, { success: false, message: "Failed to create product" }); + return status(500, { success: false, message: err?.message || "Failed to create product" }); } }, { body: t.Any(), @@ -336,6 +510,112 @@ export const productsRoute = new Elysia({ prefix: "/products" }) summary: "Create Product", tags: ["products"], }, +}) + .post("/bulk", async ({ body, status, validateVariants }) => { + const payloadArray = body; + if (!Array.isArray(payloadArray)) { + return status(400, { success: false, message: "Payload must be an array of products" }); + } + try { + const createdProducts = await prisma.$transaction(async (tx) => { + const results = []; + for (const payload of payloadArray) { + if (payload.variants && Array.isArray(payload.variants)) { + validateVariants(payload.options || [], payload.variants); + } + let categoryId = payload.categoryId; + if (!categoryId && payload.categoryName) { + let cat = await tx.category.findUnique({ where: { name: payload.categoryName } }); + if (!cat) { + cat = await tx.category.create({ data: { name: payload.categoryName } }); + } + categoryId = cat.id; + } + let brandId = payload.brandId; + if (!brandId && payload.brandName) { + let brand = await tx.productBrand.findUnique({ where: { name: payload.brandName } }); + if (!brand) { + brand = await tx.productBrand.create({ data: { name: payload.brandName } }); + } + brandId = brand.id; + } + const prod = await tx.product.create({ + data: { + categoryId: categoryId, + brandId: brandId, + name: payload.name || "New Product", + description: payload.description || "", + details: payload.details || "", + options: payload.options || [], + } + }); + if (payload.translations && typeof payload.translations === 'object') { + for (const [lang, trans] of Object.entries(payload.translations)) { + await tx.productTranslation.create({ + data: { + productId: prod.id, + langCode: lang, + name: trans.name || payload.name || "New Product", + description: trans.description || payload.description || "", + details: trans.details || payload.details || "", + } + }); + } + } + else { + await tx.productTranslation.create({ + data: { + productId: prod.id, + langCode: 'th', + name: payload.name || "New Product", + description: payload.description || "", + details: payload.details || "", + } + }); + } + if (payload.variants && payload.variants.length > 0) { + for (const v of payload.variants) { + await tx.productVariant.create({ + data: { + productId: prod.id, + sku: v.sku || null, + barcode: v.barcode || null, + stock: v.stock || 0, + option1: v.option1 || "", + option2: v.option2 || "", + option3: v.option3 || "", + price: v.price || 0, + } + }); + } + } + if (payload.images && payload.images.length > 0) { + for (const [idx, img] of payload.images.entries()) { + await tx.productImage.create({ + data: { + productId: prod.id, + url: img.url, + order: img.order ?? idx, + } + }); + } + } + results.push(prod); + } + return results; + }); + return { success: true, products: createdProducts }; + } + catch (err) { + console.error("Bulk create products error:", err); + return status(500, { success: false, message: err?.message || "Failed to bulk create products" }); + } +}, { + body: t.Array(t.Any()), + detail: { + summary: "Bulk Create Products", + tags: ["products"], + }, }) .patch("/:id", async ({ params, body, status }) => { const id = parseInt(params.id); @@ -348,8 +628,6 @@ export const productsRoute = new Elysia({ prefix: "/products" }) prodData.categoryId = payload.categoryId; if (payload.brandId !== undefined) prodData.brandId = payload.brandId; - if (payload.price !== undefined) - prodData.price = payload.price; if (payload.options !== undefined) prodData.options = payload.options; const prod = await prisma.product.update({ @@ -412,7 +690,7 @@ export const productsRoute = new Elysia({ prefix: "/products" }) } catch (err) { console.error("Patch product error:", err); - return status(500, { success: false, message: "Failed to patch product" }); + return status(500, { success: false, message: err?.message || "Failed to patch product" }); } }, { body: t.Any(), diff --git a/apps/backend/src/routes/products.js.map b/apps/backend/src/routes/products.js.map index cc2a4ba..032f00b 100644 --- a/apps/backend/src/routes/products.js.map +++ b/apps/backend/src/routes/products.js.map @@ -1 +1 @@ -{"version":3,"file":"products.js","sourceRoot":"","sources":["products.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"products.js","sourceRoot":"","sources":["products.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/apps/backend/src/routes/products.ts b/apps/backend/src/routes/products.ts index f4b3a1c..e674bb5 100644 --- a/apps/backend/src/routes/products.ts +++ b/apps/backend/src/routes/products.ts @@ -465,7 +465,6 @@ export const productsRoute = new Elysia({ prefix: "/products" }) categoryId: categoryId, brandId: brandId, name: payload.name || "New Product", - price: payload.price || 0, description: payload.description || "", details: payload.details || "", options: payload.options || [], @@ -582,7 +581,6 @@ export const productsRoute = new Elysia({ prefix: "/products" }) categoryId: categoryId, brandId: brandId, name: payload.name || "New Product", - price: payload.price || 0, description: payload.description || "", details: payload.details || "", options: payload.options || [], @@ -671,7 +669,6 @@ export const productsRoute = new Elysia({ prefix: "/products" }) const prodData: any = {}; if (payload.categoryId !== undefined) prodData.categoryId = payload.categoryId; if (payload.brandId !== undefined) prodData.brandId = payload.brandId; - if (payload.price !== undefined) prodData.price = payload.price; if (payload.options !== undefined) prodData.options = payload.options; const prod = await prisma.product.update({ diff --git a/apps/backend/src/routes/promotions.d.ts b/apps/backend/src/routes/promotions.d.ts index a0b546b..fe7e597 100644 --- a/apps/backend/src/routes/promotions.d.ts +++ b/apps/backend/src/routes/promotions.d.ts @@ -54,8 +54,8 @@ export declare const promotionsRoute: Elysia<"/promotions", { type: string; isActive: boolean; value: number; - minPurchase: number; level: number; + minPurchase: number; }; params: {}; query: unknown; @@ -78,8 +78,8 @@ export declare const promotionsRoute: Elysia<"/promotions", { type: string; isActive: boolean; value: number; - minPurchase: number; level: number; + minPurchase: number; }; params: { id: string; diff --git a/apps/backend/tsconfig.tsbuildinfo b/apps/backend/tsconfig.tsbuildinfo index 06757d0..fee57e5 100644 --- a/apps/backend/tsconfig.tsbuildinfo +++ b/apps/backend/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./check_cat.ts","./prisma.config.ts","./prisma/seed-pages.ts","./scripts/fix-menus.ts","./scripts/fix-scent-guide.ts","./scripts/migrate-i18n.ts","./scripts/migrate-pages.ts","./scripts/migrate-production.ts","./src/index.ts","./src/lib/lineClient.ts","./src/lib/notifications.ts","./src/lib/prisma.ts","./src/middleware/auth.ts","./src/routes/articles.ts","./src/routes/auth.ts","./src/routes/categories.ts","./src/routes/contacts.ts","./src/routes/coupons.ts","./src/routes/customers.ts","./src/routes/hero.d.ts","./src/routes/lazadaOrder.ts","./src/routes/line.ts","./src/routes/media.ts","./src/routes/menus.ts","./src/routes/newsletter.ts","./src/routes/orders.ts","./src/routes/pages.ts","./src/routes/payments.ts","./src/routes/products.ts","./src/routes/profile.ts","./src/routes/promotions.ts","./src/routes/raw-materials.ts","./src/routes/reviews.ts","./src/routes/settings.ts","./src/routes/shopee.ts","./src/routes/tiktok.ts","./src/routes/tiktokOrder.ts","./src/routes/upload.ts"],"errors":true,"version":"6.0.3"} \ No newline at end of file +{"root":["./check_cat.ts","./delete_products.ts","./prisma.config.ts","./query.ts","./scratch_seed_product.ts","./scratch_test.ts","./scratch_test_langs.ts","./scratch_test_menus.ts","./scratch_test_page.ts","./scratch_test_page2.ts","./prisma/seed-pages.ts","./scripts/fix-menus.ts","./scripts/fix-scent-guide.ts","./scripts/migrate-i18n.ts","./scripts/migrate-pages.ts","./scripts/migrate-production.ts","./src/index.ts","./src/lib/lineClient.ts","./src/lib/notifications.ts","./src/lib/prisma.ts","./src/lib/productAttributes.ts","./src/middleware/auth.ts","./src/routes/articles.ts","./src/routes/auth.ts","./src/routes/categories.ts","./src/routes/contacts.ts","./src/routes/coupons.ts","./src/routes/customers.ts","./src/routes/hero.d.ts","./src/routes/lazadaOrder.ts","./src/routes/line.ts","./src/routes/media.ts","./src/routes/menus.ts","./src/routes/newsletter.ts","./src/routes/orders.ts","./src/routes/pages.ts","./src/routes/payments.ts","./src/routes/product-attributes.ts","./src/routes/products.ts","./src/routes/profile.ts","./src/routes/promotions.ts","./src/routes/raw-materials.ts","./src/routes/reviews.ts","./src/routes/settings.ts","./src/routes/shopee.ts","./src/routes/tiktok.ts","./src/routes/tiktokOrder.ts","./src/routes/upload.ts"],"errors":true,"version":"6.0.3"} \ No newline at end of file diff --git a/apps/mcp-server/index.ts b/apps/mcp-server/index.ts index 84d6a25..062693b 100644 --- a/apps/mcp-server/index.ts +++ b/apps/mcp-server/index.ts @@ -266,7 +266,6 @@ server.setRequestHandler(ListToolsRequestSchema, async () => { name: { type: "string" }, description: { type: "string" }, details: { type: "string" }, - price: { type: "number", description: "Base price if no variants are provided" }, translations: { type: "object", description: "Object with lang codes as keys (e.g. 'th', 'en') and {name, description, details} as values", @@ -340,7 +339,6 @@ server.setRequestHandler(ListToolsRequestSchema, async () => { name: { type: "string" }, description: { type: "string" }, details: { type: "string" }, - price: { type: "number" }, translations: { type: "object", additionalProperties: { diff --git a/apps/spa/src/components/ProductCard.tsx b/apps/spa/src/components/ProductCard.tsx index 458fae1..40c4ade 100644 --- a/apps/spa/src/components/ProductCard.tsx +++ b/apps/spa/src/components/ProductCard.tsx @@ -111,7 +111,7 @@ export default function ProductCard({ product, enableQuickShop = false, category
- {formatPrice(selectedVariant?.price ?? product.variants?.[0]?.price ?? product.price)} + {formatPrice(selectedVariant?.price ?? product.variants?.[0]?.price ?? 0)} {!enableQuickShop && ( @@ -134,7 +134,7 @@ export default function ProductCard({ product, enableQuickShop = false, category productId: product.id, variantId: targetVariant.id, quantity: 1, - price: targetVariant.price || product.price || 0, + price: targetVariant.price || 0, productName: displayName, variantName: [targetVariant.option1, targetVariant.option2, targetVariant.option3].filter(Boolean).map(opt => resolveOptionValue(opt, product.options, i18n.language)).join(' / '), productImage: product.images?.[0]?.url || getCategoryImage(displayCategoryName) diff --git a/apps/spa/src/pages/ProductDetailPage.tsx b/apps/spa/src/pages/ProductDetailPage.tsx index 3d1468c..70459fa 100644 --- a/apps/spa/src/pages/ProductDetailPage.tsx +++ b/apps/spa/src/pages/ProductDetailPage.tsx @@ -163,7 +163,7 @@ export default function ProductDetailPage() { productId: product.id, variantId: currentVariant.id, quantity: 1, - price: currentVariant.price || product.price || 0, + price: currentVariant.price || 0, productName: displayName, variantName: [currentVariant.option1, currentVariant.option2, currentVariant.option3].filter(Boolean).map(opt => resolveOptionValue(opt, product.options, i18n.language)).join(' / '), productImage: product.images?.[0]?.url || getCategoryImage(typeof product.category.name === 'string' ? product.category.name : (product.category.name as any)?.en || '') diff --git a/apps/website/src/components/AddToCartSection.tsx b/apps/website/src/components/AddToCartSection.tsx index 9d3fb76..510d363 100644 --- a/apps/website/src/components/AddToCartSection.tsx +++ b/apps/website/src/components/AddToCartSection.tsx @@ -99,7 +99,7 @@ export default function AddToCartSection({ product }: Props) { productId: product.id, variantId: currentVariant.id, quantity: 1, - price: currentVariant.price || product.price || 0, + price: currentVariant.price || 0, productName, variantName: variantName || undefined, productImage: product.images?.[0]?.url || product.category.imageUrl || getCategoryImage(categoryName), @@ -133,7 +133,7 @@ export default function AddToCartSection({ product }: Props) {
- {formatPrice(currentVariant?.price ?? product.price)} + {formatPrice(currentVariant?.price ?? 0)} {currentVariantName && / {currentVariantName}}
@@ -215,7 +215,7 @@ export default function AddToCartSection({ product }: Props) { {currentVariantName || 'Total Price'} - {formatPrice(currentVariant?.price ?? product.price)} + {formatPrice(currentVariant?.price ?? 0)}