- Replace 4 duplicate meta DTOs (AuthResponseMetaDto, PortfolioResponseMetaDto, BrokerResponseMetaDto, ScreenerResponseMetaDto) with shared ApiResponseMeta - Wrap shares getShare() in ApiEnvelopePayload (was raw object, unlike bonds) - Remove unnecessary CacheModule import from securities module - Update portfolio controller nullDataEnvelopeSchema to use shared ApiResponseMeta - All 116 tests pass
34 lines
2.1 KiB
Markdown
34 lines
2.1 KiB
Markdown
# Backend Architecture Improvements
|
||
|
||
## Цель
|
||
|
||
Устранить выявленные в ходе аудита архитектурные проблемы бэкенда: консистентность ответов API, качество кода модулей, обработку ошибок, тестируемость.
|
||
|
||
## Требования
|
||
|
||
1. Унифицировать формат ответов API — единый envelope DTO, используемый всеми модулями.
|
||
2. Устранить inconsistency между shares и bonds модулями.
|
||
3. Ввести иерархию доменных исключений с корректной обработкой.
|
||
4. Улучшить health check (проверка зависимостей).
|
||
5. Убрать дублирование и лишние зависимости.
|
||
6. Сохранить обратную совместимость API (поля ответов не меняются, только структура).
|
||
|
||
## Ограничения
|
||
|
||
- Не менять внешний API-контракт (формат `{ data, meta }` остаётся).
|
||
- Не рефакторить то, что не указано в требованиях.
|
||
- Каждое изменение идёт через TDD-цикл.
|
||
|
||
## Критерии приемки (Acceptance Criteria)
|
||
|
||
- [ ] Все модули используют единый shared envelope DTO из `common/dto/`
|
||
- [ ] `shares/shares.service.ts:getShare()` возвращает `ApiEnvelopePayload` как и `bonds/`
|
||
- [ ] Screener кеширует полный набор данных
|
||
- [ ] Создана иерархия доменных исключений
|
||
- [ ] `HttpExceptionFilter` корректно обрабатывает доменные исключения
|
||
- [ ] Health check проверяет Prisma, MOEX, T-Bank
|
||
- [ ] `RequestLoggingMiddleware` подключён через DI
|
||
- [ ] `securities/` не импортирует `CacheModule` напрямую
|
||
- [ ] Все тесты проходят
|
||
- [ ] `npm run build` успешен
|