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:
1 parent
69df9e7046
commit
b264d7f734
2 files changed
+17
-6
No files matched your search
@@ -73,9 +73,9 @@ export const UNTERKUNFT_COLLECTIONS = {
|
|||||||
str('bis', 10),
|
str('bis', 10),
|
||||||
int('personen'),
|
int('personen'),
|
||||||
str('status', 12),
|
str('status', 12),
|
||||||
str('gast', 3000),
|
str('gast', 20000),
|
||||||
str('rechnungsadresse', 1500),
|
str('rechnungsadresse', 1500),
|
||||||
str('posten', 8000),
|
str('posten', 20000),
|
||||||
str('summen', 1000),
|
str('summen', 1000),
|
||||||
str('nachrichtVermieter', 2000),
|
str('nachrichtVermieter', 2000),
|
||||||
dt('fristAt'),
|
dt('fristAt'),
|
||||||
@@ -87,7 +87,7 @@ export const UNTERKUNFT_COLLECTIONS = {
|
|||||||
str('stripePaymentIntentId', 100),
|
str('stripePaymentIntentId', 100),
|
||||||
int('erstattetCent'),
|
int('erstattetCent'),
|
||||||
str('stornoGrund', 500),
|
str('stornoGrund', 500),
|
||||||
str('stornobedingungenText', 5000),
|
str('stornobedingungenText', 20000),
|
||||||
str('rechtstexteFassung', 20),
|
str('rechtstexteFassung', 20),
|
||||||
str('ipHash', 16),
|
str('ipHash', 16),
|
||||||
dt('freigegebenAt'),
|
dt('freigegebenAt'),
|
||||||
|
|||||||
@@ -101,9 +101,9 @@ test('Schema: Typen und Groessen', () => {
|
|||||||
ukPreise: { unterkunftId: 36, staffeln: 2000, steuerart: 20, stornobedingungen: 5000 },
|
ukPreise: { unterkunftId: 36, staffeln: 2000, steuerart: 20, stornobedingungen: 5000 },
|
||||||
ukSperren: { von: 10, bis: 10, quelle: 60, notiz: 200 },
|
ukSperren: { von: 10, bis: 10, quelle: 60, notiz: 200 },
|
||||||
ukAnfragen: {
|
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,
|
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 },
|
ukRechnungen: { art: 8, nummer: 24, datum: 10, inhalt: 20000 },
|
||||||
ukEinstellungen: {
|
ukEinstellungen: {
|
||||||
@@ -200,7 +200,7 @@ test('main legt auf leerer Datenbank 6 Collections, alle Attribute und Indizes a
|
|||||||
assert.deepEqual(result.missingCollections, NAMES)
|
assert.deepEqual(result.missingCollections, NAMES)
|
||||||
assert.equal(result.missingIndexes.length, expectedIndexes.length)
|
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('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 () => {
|
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(hinweise.some((l) => l.includes('termine-setup')))
|
||||||
assert.ok(!r.missing.some((a) => a.key === 'anhang'))
|
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ß`)
|
||||||
|
}
|
||||||
|
})
|
||||||
Reference in new issue
Block a user