Files
backend/.ai/conventions/error-handling.md
T
ksv741 4796d9d3f0
Backend security / security (push) Successful in 8s
Backend verify / verify (push) Successful in 11m9s
Conventional commits / commits (pull_request) Successful in 28s
Backend security / security (pull_request) Successful in 7s
Backend verify / verify (pull_request) Successful in 10m38s
fix: harden auth and investment synchronization
Resolve A01-A10 and C01-C07 from the backend audit.
Preserve auth failures, forced candle reconciliation and forecast freshness.
Validate MOEX responses and nested HTTP errors; remove unused legacy paths.

Verified: 209 unit tests, 262 SQLite e2e tests on Linux, OpenAPI and durability.
Record the remaining macOS native SQLite abort in the audit.
2026-09-27 14:09:05 +03:00

2.4 KiB
Raw Blame History

Backend errors

Поток

application/domain outcome → application mapping → HttpExceptionFilter
                          → application/problem+json

Сохраняй принятый профиль RFC 9457: status, стабильный публичный code, для validation — errors: [{ pointer, detail }]. Точный контракт validation описан в HTTP API. Не добавляй type/title/instance как обязательные поля без contract change.

Чистый domain не импортирует Nest HTTP exceptions. Существующий application service может бросить подходящий HttpException с public code; не нужен новый error framework/registry. Если domain outcome требует HTTP interpretation, маппинг принадлежит application/transport boundary.

Codes и безопасность

  • Используй existing code владельца, не сравнивай внутренние сообщения. Новое значение имеет один symbolic owner; metadata/validation и consumers согласуются по domain values.
  • Общий envelope, default status mapping и unexpected errors принадлежат HttpExceptionFilter. Не дублируй res.status().json() в controllers/services.
  • Неожиданный exception → 500 / INTERNAL_SERVER_ERROR, без message/stack, SQL, credentials или raw upstream payload в ответе.
  • External auth failure и временная недоступность имеют разные outcomes; translation выполняется на existing integration/access boundary.
  • Логи используют observability. Redaction не делает произвольное сообщение ошибки безопасным.

Проверка

Для изменённого кода проверь observable status/code и сохранность данных. Для validation нужен request через configureApp: fabricated ValidationError в unit test filter не доказывает форму, выходящую из реального ValidationPipe. OpenAPI parity проверяет schema, а не response pipeline; Testing.