Buchungskalender: große Felder als TEXT (Zeilenbreite in Appwrite)

ukAnfragen überschritt mit gast/posten/stornobedingungenText als VARCHAR die MariaDB-Zeilenbreite von 65535 Byte; das Setup brach in Produktion nach 22 Attributen ab. Test sichert die Breite aller Collections ab.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
knsoandClaude Opus 5.5 committed 2026-10-07 15:57:10 +00:00
1 parent 69df9e7046
commit b264d7f734
2 files changed
+17 -6

No files matched your search

+3 -3
View File
@@ -73,9 +73,9 @@ export const UNTERKUNFT_COLLECTIONS = {
str('bis', 10),
int('personen'),
str('status', 12),
str('gast', 3000),
str('gast', 20000),
str('rechnungsadresse', 1500),
str('posten', 8000),
str('posten', 20000),
str('summen', 1000),
str('nachrichtVermieter', 2000),
dt('fristAt'),
@@ -87,7 +87,7 @@ export const UNTERKUNFT_COLLECTIONS = {
str('stripePaymentIntentId', 100),
int('erstattetCent'),
str('stornoGrund', 500),
str('stornobedingungenText', 5000),
str('stornobedingungenText', 20000),
str('rechtstexteFassung', 20),
str('ipHash', 16),
dt('freigegebenAt'),
+14 -3
View File
@@ -101,9 +101,9 @@ test('Schema: Typen und Groessen', () => {
ukPreise: { unterkunftId: 36, staffeln: 2000, steuerart: 20, stornobedingungen: 5000 },
ukSperren: { von: 10, bis: 10, quelle: 60, notiz: 200 },
ukAnfragen: {
nummer: 12, status: 12, gast: 3000, rechnungsadresse: 1500, posten: 8000, summen: 1000, nachrichtVermieter: 2000,
nummer: 12, status: 12, gast: 20000, rechnungsadresse: 1500, posten: 20000, summen: 1000, nachrichtVermieter: 2000,
tokenHash: 64, zahlart: 8, bezahltVia: 8, stripeSessionId: 100, stripePaymentIntentId: 100, stornoGrund: 500,
stornobedingungenText: 5000, rechtstexteFassung: 20, ipHash: 16, rechnungId: 36,
stornobedingungenText: 20000, rechtstexteFassung: 20, ipHash: 16, rechnungId: 36,
},
ukRechnungen: { art: 8, nummer: 24, datum: 10, inhalt: 20000 },
ukEinstellungen: {
@@ -200,7 +200,7 @@ test('main legt auf leerer Datenbank 6 Collections, alle Attribute und Indizes a
assert.deepEqual(result.missingCollections, NAMES)
assert.equal(result.missingIndexes.length, expectedIndexes.length)
assert.deepEqual(client.state.get('ukAnfragen').attrs.get('fristAt'), { key: 'fristAt', type: 'datetime', required: false })
assert.deepEqual(client.state.get('ukAnfragen').attrs.get('gast'), { key: 'gast', type: 'string', size: 3000, required: false })
assert.deepEqual(client.state.get('ukAnfragen').attrs.get('gast'), { key: 'gast', type: 'string', size: 20000, required: false })
})
test('main: zweiter Lauf legt nichts mehr an', async () => {
@@ -252,3 +252,14 @@ test('main: fehlendes termineOutbox.anhang wird gemeldet (--check, Exit-relevant
assert.ok(hinweise.some((l) => l.includes('termine-setup')))
assert.ok(!r.missing.some((a) => a.key === 'anhang'))
})
test('Schema: jede Collection bleibt unter der Zeilenbreite von Appwrite/MariaDB', async () => {
// Appwrite legt Strings bis 16381 Zeichen als VARCHAR (4 Byte je Zeichen) an; die Zeile darf 65535 Byte nicht
// überschreiten, dazu kommen interne Spalten. Längere Strings werden TEXT und zählen nicht mit.
const { UNTERKUNFT_COLLECTIONS } = await import('../server/services/unterkunft/schema.js')
for (const [name, c] of Object.entries(UNTERKUNFT_COLLECTIONS)) {
let breite = 0
for (const a of c.attributes) breite += a.type === 'string' ? (a.size > 16381 ? 0 : a.size * 4) : 8
assert.ok(breite <= 56000, `${name}: Zeilenbreite ${breite} Byte zu groß`)
}
})