All checks were successful
CD / Build and push images (push) Successful in 1m46s
CI / Lint, typecheck, test (push) Successful in 1m17s
CI / Auth e2e pack (push) Successful in 1m39s
CI / Build container images (push) Has been skipped
CD / Deploy to Test (push) Successful in 8s
CD / Smoke tests against Test (push) Successful in 1m6s
CD / Promote to Int (push) Successful in 10s
- quota_overrides + pond_usage models (BigInt values, unique per
subject+key); migration 20260705185146_quotas
- instance-default quota keys in the settings registry (editors 5,
readers 50, additional ponds 0, storage 1 GiB, max file 25 MiB)
- QuotaService: getEffective with pond → user → instance resolution
(zero counts as a value, not a gap); assertCanCreateSharedPond and
checkAndConsume serialize via pg_advisory_xact_lock inside the guarded
write's transaction; release never drops below zero
- pond creation enforces additional_ponds (personal ponds don't count);
quota errors carry code quota_exceeded + {quotaKey, limit}, localized
- seed grants fixtures an additional_ponds override (default is 0)
- table-driven resolution tests, parallel-consumption test, e2e for the
pond-creation limit
Closes #22
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UpQz6ypHJsLfMf4S6fyQEB
45 lines
2.1 KiB
JSON
45 lines
2.1 KiB
JSON
{
|
|
"bad_request": "Die Anfrage ist ungültig.",
|
|
"unauthorized": "Bitte melde dich an, um fortzufahren.",
|
|
"forbidden": "Dir fehlt die Berechtigung für diese Aktion.",
|
|
"not_found": "Die angeforderte Ressource existiert nicht.",
|
|
"conflict": "Die Anfrage steht im Widerspruch zum aktuellen Zustand.",
|
|
"gone": "Diese Ressource ist nicht mehr verfügbar.",
|
|
"payload_too_large": "Die übermittelten Daten sind zu groß.",
|
|
"rate_limited": "Zu viele Anfragen — bitte versuche es später erneut.",
|
|
"internal_error": "Interner Serverfehler.",
|
|
"registration_closed": "Die Registrierung ist auf dieser Instanz derzeit geschlossen.",
|
|
"token_invalid": "Dieser Link ist ungültig oder abgelaufen.",
|
|
"login_failed": "Benutzername/E-Mail oder Passwort ist falsch.",
|
|
"login_backoff": "Zu viele Fehlversuche — bitte warte ein paar Minuten.",
|
|
"email_unverified": "Bitte bestätige zuerst deine E-Mail-Adresse.",
|
|
"account_disabled": "Dieses Konto wurde deaktiviert.",
|
|
"password_incorrect": "Das aktuelle Passwort ist falsch.",
|
|
"csrf_origin_mismatch": "Die Anfrage kam von einer unerwarteten Herkunft.",
|
|
"cannot_revoke_current_session": "Beende deine aktuelle Sitzung über die Abmeldung.",
|
|
"personal_pond_undeletable": "Der persönliche Teich kann nicht gelöscht werden.",
|
|
"quota_exceeded": "Das Kontingent ist erreicht (Limit: {{limit}}).",
|
|
"network": "Der Server war nicht erreichbar.",
|
|
"validation": {
|
|
"required": "Dieses Feld ist erforderlich.",
|
|
"taken": "Dieser Wert ist bereits vergeben.",
|
|
"username": {
|
|
"tooShort": "Der Benutzername braucht mindestens 3 Zeichen.",
|
|
"tooLong": "Der Benutzername darf höchstens 32 Zeichen haben.",
|
|
"charset": "Erlaubt sind nur Buchstaben, Ziffern und Bindestriche."
|
|
},
|
|
"password": {
|
|
"tooShort": "Das Passwort braucht mindestens 10 Zeichen.",
|
|
"tooLong": "Das Passwort darf höchstens 128 Zeichen haben.",
|
|
"tooCommon": "Dieses Passwort ist zu verbreitet."
|
|
},
|
|
"email": {
|
|
"invalid": "Bitte gib eine gültige E-Mail-Adresse ein."
|
|
},
|
|
"displayName": {
|
|
"required": "Bitte gib einen Anzeigenamen ein."
|
|
},
|
|
"tooLong": "Die Eingabe ist zu lang."
|
|
}
|
|
}
|