diff --git a/src/sql/catalog-maker.ts b/src/sql/catalog-maker.ts index b3b64b1..70e4d9f 100644 --- a/src/sql/catalog-maker.ts +++ b/src/sql/catalog-maker.ts @@ -94,11 +94,8 @@ export function productToDoByManufacturerSql({ manufacturerId, position = 1 }) { p.id_product, p.price, ( - SELECT CONCAT('https://www.9b-plus.com/', i.id_image, '-home_default/', pl.link_rewrite, '.jpg') + SELECT ${prestaImageUrl("i.id_image", "home_default")} FROM ps_image i - JOIN ps_product_lang pl - ON pl.id_product = i.id_product - AND pl.id_lang = 2 WHERE i.id_product = p.id_product ORDER BY i.cover DESC, i.position ASC LIMIT 1 @@ -155,11 +152,8 @@ export function productByEanSql({ manufacturerId, ean }) { p.id_product, p.price, ( - SELECT CONCAT('https://www.9b-plus.com/', i.id_image, '-home_default/', pl.link_rewrite, '.jpg') + SELECT ${prestaImageUrl("i.id_image", "home_default")} FROM ps_image i - JOIN ps_product_lang pl - ON pl.id_product = i.id_product - AND pl.id_lang = 2 WHERE i.id_product = p.id_product ORDER BY i.cover DESC, i.position ASC LIMIT 1 @@ -345,11 +339,8 @@ export function suggestedProductsSql({ manufacturerId, supplierReference, produc p.supplier_reference, p.active, ( - SELECT CONCAT('https://www.9b-plus.com/', i.id_image, '-cart_default/', pli.link_rewrite, '.jpg') + SELECT ${prestaImageUrl("i.id_image", "cart_default")} FROM ps_image i - JOIN ps_product_lang pli - ON pli.id_product = i.id_product - AND pli.id_lang = 2 WHERE i.id_product = p.id_product ORDER BY i.cover DESC, i.position ASC LIMIT 1 @@ -429,6 +420,20 @@ function escapeSqlIdentifier(value) { return `\`${text}\``; } +function prestaImageUrl(idExpression, size) { + const safeSize = String(size ?? "").trim(); + if (!/^[a-zA-Z0-9_]+$/.test(safeSize)) { + throw new Error("PrestaShop image size contains unsupported characters."); + } + + const idText = `CAST(${idExpression} AS CHAR)`; + const pathParts = Array.from({ length: 10 }, (_, index) => + `IF(CHAR_LENGTH(${idText}) > ${index}, CONCAT(SUBSTRING(${idText}, ${index + 1}, 1), '/'), '')`, + ).join(", "); + + return `CONCAT('https://www.9b-plus.com/img/p/', ${pathParts}, ${idExpression}, '-${safeSize}.jpg')`; +} + function escapeSqlString(value) { return String(value ?? "").replaceAll("\\", "\\\\").replaceAll("'", "''").trim(); }