From 87e08df93ac71c24bbddb7595c87182dc56a9a40 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Wed, 30 Sep 2026 09:30:24 +0200 Subject: [PATCH 1/2] =?UTF-8?q?Aktualisiere=20die=20Version=20auf=201.8.12?= =?UTF-8?q?,=20passe=20die=20Protokollnachricht=20f=C3=BCr=20den=20QTTR-Im?= =?UTF-8?q?port=20an=20und=20f=C3=BCge=20Tests=20f=C3=BCr=20die=20QTTR-Imp?= =?UTF-8?q?ortsignatur=20hinzu.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- server/plugins/spielplan-import-scheduler.js | 2 +- server/utils/qttr-import.js | 10 +++++++-- tests/qttr-import.spec.ts | 23 ++++++++++++++++++++ 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 tests/qttr-import.spec.ts diff --git a/package.json b/package.json index 179bc5d..7ac0009 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "harheimertc-website", - "version": "1.8.11", + "version": "1.8.12", "description": "Moderne Webseite für den Harheimer Tischtennis Club", "private": true, "type": "module", diff --git a/server/plugins/spielplan-import-scheduler.js b/server/plugins/spielplan-import-scheduler.js index d647e05..d06e122 100755 --- a/server/plugins/spielplan-import-scheduler.js +++ b/server/plugins/spielplan-import-scheduler.js @@ -141,7 +141,7 @@ function createQttrJob() { return { run: async (reason) => { const qttr = await importQttrValues() - loggerInfo(`[qttr-import] ${reason}: ${qttr.rowCount} QTTR-Werte importiert`, { + loggerInfo(`[qttr-import] ${reason}: ${qttr.rowCount} TTR-/QTTR-Werte importiert`, { outputFile: qttr.outputFile, tableCount: qttr.tableCount }) diff --git a/server/utils/qttr-import.js b/server/utils/qttr-import.js index a2222a2..cb38a60 100755 --- a/server/utils/qttr-import.js +++ b/server/utils/qttr-import.js @@ -287,15 +287,21 @@ async function importAuthenticatedTtrValues(connection) { }) await sendOwnTtrChangePush(changes) if (previousQttrSignature && previousQttrSignature !== nextQttrSignature) { - await sendQttrListUpdatedPush({ importedAt, rowCount: rows.length }) + await sendQttrListUpdatedPush({ + importedAt, + rowCount: rows.filter(row => row.currentQttr != null).length + }) } await saveMyTischtennisConnection({ ...connection, lastSuccessfulImportAt: importedAt, lastImportError: null }) return { outputFile: OUTPUT_FILE, tableCount: 1, ...payload } } -function qttrListSignature(rows) { +export function qttrListSignature(rows) { if (!Array.isArray(rows) || rows.length === 0) return '' return rows + // TTR-only players are refreshed daily. They must neither alter the + // quarterly QTTR signature nor trigger a QTTR-list notification. + .filter(row => row?.currentQttr != null) .map(row => [ String(row?.playerNumber || row?.playerName || '').trim().toLocaleLowerCase('de-DE'), row?.currentQttr ?? '' diff --git a/tests/qttr-import.spec.ts b/tests/qttr-import.spec.ts new file mode 100644 index 0000000..e79b1da --- /dev/null +++ b/tests/qttr-import.spec.ts @@ -0,0 +1,23 @@ +import { describe, expect, it } from 'vitest' +import { qttrListSignature } from '../server/utils/qttr-import.js' + +describe('QTTR import signature', () => { + it('ignores TTR-only players so daily TTR changes cannot trigger a QTTR push', () => { + const qttrRows = [ + { playerNumber: 1, playerName: 'QTTR Spieler', currentQttr: 1500, currentTtr: 1512 } + ] + const withChangedTtrOnlyPlayer = [ + ...qttrRows, + { playerNumber: 2, playerName: 'Nur TTR', currentQttr: null, currentTtr: 1333 } + ] + + expect(qttrListSignature(withChangedTtrOnlyPlayer)).toBe(qttrListSignature(qttrRows)) + }) + + it('changes when an actual QTTR value changes', () => { + const previous = [{ playerNumber: 1, playerName: 'QTTR Spieler', currentQttr: 1500 }] + const updated = [{ playerNumber: 1, playerName: 'QTTR Spieler', currentQttr: 1501 }] + + expect(qttrListSignature(updated)).not.toBe(qttrListSignature(previous)) + }) +}) -- 2.34.1 From 91335422aa5b5ec8097207d2accf305edb56a221 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Wed, 30 Sep 2026 14:01:05 +0200 Subject: [PATCH 2/2] =?UTF-8?q?Aktualisiere=20die=20Version=20auf=201.8.12?= =?UTF-8?q?=20und=20aktualisiere=20die=20Abh=C3=A4ngigkeiten=20f=C3=BCr=20?= =?UTF-8?q?brace-expansion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4b9ec9a..815fb28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "harheimertc-website", - "version": "1.8.9", + "version": "1.8.12", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "harheimertc-website", - "version": "1.8.9", + "version": "1.8.12", "hasInstallScript": true, "dependencies": { "@pinia/nuxt": "^0.11.2", @@ -3921,9 +3921,9 @@ "license": "MIT" }, "node_modules/archiver-utils/node_modules/brace-expansion": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", - "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -4318,9 +4318,9 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -9410,9 +9410,9 @@ "license": "MIT" }, "node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", - "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -9492,9 +9492,9 @@ "license": "MIT" }, "node_modules/replace-in-file/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { -- 2.34.1