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
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.
41 lines
2.4 KiB
Markdown
41 lines
2.4 KiB
Markdown
# Backend errors
|
||
|
||
## Поток
|
||
|
||
```text
|
||
application/domain outcome → application mapping → HttpExceptionFilter
|
||
→ application/problem+json
|
||
```
|
||
|
||
Сохраняй принятый профиль RFC 9457: `status`, стабильный публичный `code`,
|
||
для validation — `errors: [{ pointer, detail }]`. Точный контракт validation
|
||
описан в [HTTP API](http-api.md#источник-контракта).
|
||
Не добавляй `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](engineering.md#domain-values).
|
||
- Общий envelope, default status mapping и unexpected errors принадлежат
|
||
[HttpExceptionFilter](../../src/common/filters/http-exception.filter.ts).
|
||
Не дублируй `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](observability.md). Redaction не
|
||
делает произвольное сообщение ошибки безопасным.
|
||
|
||
## Проверка
|
||
|
||
Для изменённого кода проверь observable status/code и сохранность данных.
|
||
Для validation нужен request через `configureApp`: fabricated `ValidationError`
|
||
в unit test filter не доказывает форму, выходящую из реального ValidationPipe.
|
||
OpenAPI parity проверяет schema, а не response pipeline; [Testing](testing.md).
|