feat(geschichte): bound title and JOURNEY intro at all three layers
Title: requireTitle() turns the VARCHAR(255) DB bound into a friendly 400 (GESCHICHTE_TITLE_TOO_LONG). JOURNEY intro: MAX_INTRO_LENGTH = 4000 in bodyForType() plus a V75 CHECK as atomic backstop (defensive clamp first, STORY bodies exempt) — GESCHICHTE_INTRO_TOO_LONG. Both codes wired through ErrorCode.java, errors.ts, getErrorMessage and de/en/es. DB-layer boundary pins added: exactly-2000 note insert (V74 CHECK) and 4000/4001 intro inserts against real Postgres. Docs: error-code lists, db puml diagrams. The matching maxlength attributes land with the component commits. Review round 3: Markus (b), Nora (1), Sara (DB 2000 boundary). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -53,6 +53,8 @@ export type ErrorCode =
|
||||
| 'JOURNEY_DOCUMENT_ALREADY_ADDED'
|
||||
| 'GESCHICHTE_TYPE_MISMATCH'
|
||||
| 'GESCHICHTE_TYPE_IMMUTABLE'
|
||||
| 'GESCHICHTE_TITLE_TOO_LONG'
|
||||
| 'GESCHICHTE_INTRO_TOO_LONG'
|
||||
| 'INVALID_CREDENTIALS'
|
||||
| 'SESSION_EXPIRED'
|
||||
| 'MISSING_CREDENTIALS'
|
||||
@@ -185,6 +187,10 @@ export function getErrorMessage(code: ErrorCode | string | undefined): string {
|
||||
return m.error_geschichte_type_mismatch();
|
||||
case 'GESCHICHTE_TYPE_IMMUTABLE':
|
||||
return m.error_geschichte_type_immutable();
|
||||
case 'GESCHICHTE_TITLE_TOO_LONG':
|
||||
return m.error_geschichte_title_too_long();
|
||||
case 'GESCHICHTE_INTRO_TOO_LONG':
|
||||
return m.error_geschichte_intro_too_long();
|
||||
case 'INVALID_CREDENTIALS':
|
||||
return m.error_invalid_credentials();
|
||||
case 'SESSION_EXPIRED':
|
||||
|
||||
Reference in New Issue
Block a user