# Backend Architecture Improvements — Tasks ## Итерация 1: Shared envelope DTO + consistency fixes ✅ - [x] 1.1 Создать документ аудита в `docs/research/` - [x] 1.2 Вынести `ApiResponseMeta` в `common/dto/api-response.dto.ts` как единый shared класс - [x] 1.3 Заменить `AuthResponseMetaDto` на `ApiResponseMeta` в `auth/` - [x] 1.4 Заменить `PortfolioResponseMetaDto` на `ApiResponseMeta` в `portfolio/` - [x] 1.5 Заменить `BrokerResponseMetaDto` на `ApiResponseMeta` в `tbank/` - [x] 1.6 Поправить `shares/shares.service.ts:getShare()` — обернуть в `ApiEnvelopePayload` - [x] 1.7 Убрать лишний импорт `CacheModule` из `securities/securities.module.ts` - [x] 1.8 Удалить дублирующиеся envelope DTO (`ScreenerResponseMetaDto`, `AuthResponseMetaDto`, `PortfolioResponseMetaDto`, `BrokerResponseMetaDto`) - [x] 1.9 `npm run build` успешен, 116 тестов проходят ## Итерация 2: Screener caching ✅ - [x] 2.1 Добавить `screenerTtl` в конфиг (900s default) - [x] 2.2 Перевести screener на отдельный TTL - [x] 2.3 Тест на cache key + ttl config key ## Итерация 3: Domain exceptions ✅ - [x] 3.1 Создать `common/exceptions/domain.exception.ts` - [x] 3.2 Создать `common/exceptions/entity-not-found.exception.ts` - [x] 3.3 Создать `common/exceptions/moex-api.exception.ts` - [x] 3.4 Создать `common/exceptions/tbank-api.exception.ts` (+ `TBankNotConfiguredException`) - [x] 3.5 Создать `common/exceptions/portfolio-access.exception.ts` - [x] 3.6 Обновить `HttpExceptionFilter` с логгированием необработанных ошибок - [x] 3.7 Заменить generic исключения в shares, bonds, portfolio, tbank сервисах - [x] 3.8 Обновлены все тесты (117 проходят) ## Итерация 4: Health check ✅ - [x] 4.1 Создан `HealthService` с `checkPrisma()` — реальный SQL-запрос - [x] 4.2 Добавлен `checkMoex()` — HTTP-запрос к ISS MOEX с 5s timeout - [x] 4.3 Добавлен `checkTBank()` — проверка наличия токена - [x] 4.4 `HealthResponseDto` обновлён: добавлено поле `checks: HealthCheckResultDto[]` - [x] 4.5 Модуль обновлён (imports PrismaModule, providers HealthService) - [x] 4.6 Тесты: `health.service.spec.ts` (3 теста) + `envelope-contract.spec.ts` проверяет checks - [x] Все 120 тестов проходят ## Итерация 5: RequestLoggingMiddleware DI ✅ - [x] 5.1 `AppModule` implements `NestModule` с `configure()` → `consumer.apply(RequestLoggingMiddleware).forRoutes('*')` - [x] 5.2 Убран `new RequestLoggingMiddleware()` и `app.use()` из `main.ts` - [x] 120 тестов проходят, build успешен ## Итерация 6: MoexClientService split → `docs/features/moex-client-split/` - [x] 6.1 ADR на разделение MoexClientService - [x] 6.2 spec/plan/tasks отдельного эпика → перенесено в `docs/features/moex-client-split/{spec,plan,tasks}.md`