diff --git a/check-image-rv.mjs b/check-image-rv.mjs new file mode 100644 index 0000000..f274c31 --- /dev/null +++ b/check-image-rv.mjs @@ -0,0 +1,52 @@ +import sql from 'mssql'; +import 'dotenv/config'; + +const config = { + server: process.env.MSSQL_SERVER || 'localhost', + port: Number(process.env.MSSQL_PORT) || 1433, + database: process.env.MSSQL_DATABASE || 'Mandant_3', + user: process.env.MSSQL_USER, + password: process.env.MSSQL_PASSWORD, + options: { + encrypt: process.env.MSSQL_ENCRYPT !== 'false', + trustServerCertificate: process.env.MSSQL_TRUST_SERVER_CERTIFICATE !== 'false', + }, +}; + +async function main() { + try { + const pool = await sql.connect(config); + + const result = await pool.request().query(` + SELECT + a.kArtikel as id, a.cArtNr as sku, + CONVERT(BIGINT, a.bRowversion) as articleRV, + MAX(CONVERT(BIGINT, abp.bRowversion)) as maxImageRV, + CASE + WHEN MAX(CONVERT(BIGINT, abp.bRowversion)) IS NOT NULL + AND MAX(CONVERT(BIGINT, abp.bRowversion)) > CONVERT(BIGINT, a.bRowversion) + THEN MAX(CONVERT(BIGINT, abp.bRowversion)) + ELSE CONVERT(BIGINT, a.bRowversion) + END as effectiveLastChanged + FROM dbo.tArtikel a + INNER JOIN dbo.tArtikelBeschreibung ab ON ab.kArtikel = a.kArtikel AND ab.kSprache = 1 + LEFT JOIN dbo.tArtikelbildPlattform abp ON abp.kArtikel = a.kArtikel AND abp.kShop = 1 + WHERE a.cAktiv = 'Y' + GROUP BY a.kArtikel, a.cArtNr, a.bRowversion + ORDER BY a.kArtikel + `); + + console.log('Product effective lastChanged (with image RV for shop 1):'); + for (const row of result.recordset) { + const diff = row.maxImageRV && row.maxImageRV > row.articleRV ? ' (IMAGE RV HIGHER!)' : ''; + console.log(' ID: ' + row.id + ', SKU: ' + row.sku + ', articleRV: ' + row.articleRV + ', maxImageRV: ' + (row.maxImageRV || 'none') + ', effective: ' + row.effectiveLastChanged + diff); + } + + await pool.close(); + } catch (err) { + console.error('Error:', err.message); + process.exit(1); + } +} + +main(); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 69b9860..2ab5654 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "sharp": "^0.35.3" }, "engines": { - "node": ">=18" + "node": ">=22" } }, "node_modules/@azure-rest/core-client": { diff --git a/package.json b/package.json index 545949e..768a18f 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "main": "server.js", "scripts": { "cert": "node generate-cert.js", - "start": "node server.js", + "start": "node --watch server.js", "test:client": "node test-client.js" }, "engines": { diff --git a/src/queries/product-count.js b/src/queries/product-count.js index 94e47f0..9ae1bff 100644 --- a/src/queries/product-count.js +++ b/src/queries/product-count.js @@ -10,7 +10,15 @@ INNER JOIN dbo.tKategorieArtikel ka ON ka.kArtikel = a.kArtikel WHERE a.cAktiv = 'Y' AND ka.kKategorie IN (SELECT kKategorie FROM CategoryTree) AND (@kShop = 0 OR EXISTS (SELECT 1 FROM dbo.tKategorieShop ks WHERE ks.kKategorie = ka.kKategorie AND ks.kShop = @kShop)) - AND CONVERT(BIGINT, a.bRowversion) > @cursor; + AND ( + CONVERT(BIGINT, a.bRowversion) > @cursor + OR EXISTS ( + SELECT 1 FROM dbo.tArtikelbildPlattform abp + WHERE abp.kArtikel = a.kArtikel + AND abp.kShop = @kShop + AND CONVERT(BIGINT, abp.bRowversion) > @cursor + ) + ); `; export async function getProductCount({ cursor = 0, rootCategoryId = getRootCategoryId() } = {}) { diff --git a/src/queries/product-list.js b/src/queries/product-list.js index 971b22e..688dadc 100644 --- a/src/queries/product-list.js +++ b/src/queries/product-list.js @@ -14,6 +14,12 @@ WITH TaxRates AS ( SELECT kSteuerklasse, fSteuersatz FROM dbo.tSteuersatz WHERE kSteuerzone IN (SELECT kSteuerzone FROM dbo.tSteuerzone WHERE cName = @taxZoneName) +), +ImageRV AS ( + SELECT kArtikel, MAX(CONVERT(BIGINT, bRowversion)) AS maxImageRV + FROM dbo.tArtikelbildPlattform + WHERE kShop = @kShop + GROUP BY kArtikel ) SELECT TOP (@limit) a.kArtikel AS id, @@ -22,7 +28,11 @@ SELECT TOP (@limit) a.fVKNetto AS netPrice, tr.fSteuersatz AS taxRate, a.dErstelldatum AS createdAt, - CONVERT(BIGINT, a.bRowversion) AS lastChanged, + CASE + WHEN ir.maxImageRV IS NOT NULL AND ir.maxImageRV > CONVERT(BIGINT, a.bRowversion) + THEN ir.maxImageRV + ELSE CONVERT(BIGINT, a.bRowversion) + END AS lastChanged, ( SELECT TOP 1 img.cHash FROM dbo.tArtikelbildPlattform abp @@ -48,13 +58,17 @@ SELECT TOP (@limit) FROM dbo.tArtikel a INNER JOIN dbo.tArtikelBeschreibung ab ON ab.kArtikel = a.kArtikel AND ab.kSprache = @languageId LEFT JOIN TaxRates tr ON tr.kSteuerklasse = a.kSteuerklasse +LEFT JOIN ImageRV ir ON ir.kArtikel = a.kArtikel WHERE a.cAktiv = 'Y' AND (@kShop = 0 OR EXISTS ( SELECT 1 FROM dbo.tKategorieArtikel ka INNER JOIN dbo.tKategorieShop ks ON ks.kKategorie = ka.kKategorie AND ks.kShop = @kShop WHERE ka.kArtikel = a.kArtikel )) - AND CONVERT(BIGINT, a.bRowversion) > @cursor + AND ( + CONVERT(BIGINT, a.bRowversion) > @cursor + OR (ir.maxImageRV IS NOT NULL AND ir.maxImageRV > @cursor) + ) ORDER BY lastChanged ASC; `;