From 2314f7d940a487728c5585dba946899c15b59688 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 4 Oct 2026 23:26:30 +0000 Subject: [PATCH] =?UTF-8?q?=C3=96ffnungszeiten:=20Index=20idx=5Ffeature=20?= =?UTF-8?q?f=C3=BCr=20die=20Erinnerungsmerker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task 9 löscht die Merker einer Funktion per featureId; Appwrite verlangt dafür einen Index. Co-Authored-By: Claude Opus 5.5 --- server/services/zeiten/schema.js | 4 ++-- test/zeitenSetup.test.js | 12 ++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/server/services/zeiten/schema.js b/server/services/zeiten/schema.js index 71cb868..fa3aa58 100644 --- a/server/services/zeiten/schema.js +++ b/server/services/zeiten/schema.js @@ -40,10 +40,10 @@ export const ZEITEN_COLLECTIONS = { // Erinnerungsmerker der Feiertags-Mail; Dokument-ID = sha1(featureId|datum) gekuerzt (anlegen mit 409 = schon // erinnert). datum = Kalendertag 'YYYY-MM-DD' (Berliner Zeit); der Tagesjob loescht Merker, deren Datum > 30 Tage - // zurueckliegt (idx_datum). + // zurueckliegt (idx_datum); idx_feature: Loeschung der Merker einer Funktion (Kunden-Loeschen). zeitenErinnerungen: { attributes: [str('featureId', 64), str('datum', 10), dt('createdAt')], - indexes: [index('idx_datum', 'datum')], + indexes: [index('idx_datum', 'datum'), index('idx_feature', 'featureId')], }, } diff --git a/test/zeitenSetup.test.js b/test/zeitenSetup.test.js index 0621ec3..a02a197 100644 --- a/test/zeitenSetup.test.js +++ b/test/zeitenSetup.test.js @@ -113,7 +113,11 @@ test('zeitenErinnerungen: featureId, datum, createdAt', () => { assert.deepEqual(byKey.featureId, { key: 'featureId', type: 'string', size: 64, required: false }) assert.deepEqual(byKey.datum, { key: 'datum', type: 'string', size: 10, required: false }) assert.deepEqual(byKey.createdAt, { key: 'createdAt', type: 'datetime', required: false }) - assert.deepEqual(ZEITEN_COLLECTIONS.zeitenErinnerungen.indexes, [{ key: 'idx_datum', type: 'key', attributes: ['datum'] }]) + assert.deepEqual(ZEITEN_COLLECTIONS.zeitenErinnerungen.indexes, [ + { key: 'idx_datum', type: 'key', attributes: ['datum'] }, + // Task 9 loescht die Merker einer Funktion per featureId (Appwrite verlangt dafuer einen Index) + { key: 'idx_feature', type: 'key', attributes: ['featureId'] }, + ]) }) test('portalFeatures bekommt unlockedBy(8), aboEndeAt, einbau(12), behaltenSessionId(128), k24At', () => { @@ -193,6 +197,7 @@ test('main legt auf leerer Datenbank 2 Collections, alle Attribute und Indizes a assert.deepEqual([...client.calls.indexes].sort(), [...expectedIndexes].sort()) assert.ok(client.calls.indexes.includes('oeffnungszeiten.idx_customer')) assert.ok(client.calls.indexes.includes('zeitenErinnerungen.idx_datum')) + assert.ok(client.calls.indexes.includes('zeitenErinnerungen.idx_feature')) assert.equal(result.missing.length, expectedAttrs.length) assert.deepEqual(result.missingCollections, NAMES) assert.equal(result.missingIndexes.length, expectedIndexes.length) @@ -221,7 +226,10 @@ test('main legt nur fehlende Attribute und Indizes einer vorhandenen Collection await main({ client, log: quiet }) assert.ok(!client.calls.collections.some((c) => c.id === 'zeitenErinnerungen')) assert.deepEqual(client.calls.attrs.filter((k) => k.startsWith('zeitenErinnerungen.')), ['zeitenErinnerungen.createdAt']) - assert.deepEqual(client.calls.indexes.filter((k) => k.startsWith('zeitenErinnerungen.')), ['zeitenErinnerungen.idx_datum']) + assert.deepEqual( + client.calls.indexes.filter((k) => k.startsWith('zeitenErinnerungen.')), + ['zeitenErinnerungen.idx_datum', 'zeitenErinnerungen.idx_feature'], + ) assert.deepEqual( client.calls.attrs.filter((k) => k.startsWith(`${featuresId}.`)), [`${featuresId}.aboEndeAt`, `${featuresId}.behaltenSessionId`, `${featuresId}.k24At`],