Поток данных запроса
Как HTTP-запрос проходит сквозь слои типичного сервиса (auth/user/project/admin).
Общий путь
Заголовок раздела «Общий путь»sequenceDiagram participant C as Клиент participant MW as Middleware (CLS + cookie-parser) participant G as Guard (JWT-стратегия) participant CT as Controller participant VP as ValidationPipe participant S as Service (@Transactional) participant R as Repository participant DB as Prisma → PostgreSQL participant RD as Redis (сессии/коды)
C->>MW: HTTP /api/v1/... (+ Bearer / cookie) MW->>MW: генерация X-Request-Id, старт CLS-контекста MW->>G: запрос G->>G: валидация JWT, извлечение пользователя/сессии G->>CT: разрешено CT->>VP: body/query/params VP->>VP: валидация + transform (excludeAll) VP->>S: типизированный DTO S->>S: бизнес-правила, старт транзакции (CLS) S->>R: вызов репозитория R->>DB: Prisma-запрос (в транзакции) R-->>S: сущность S->>RD: (опц.) чтение/запись сессии/кода S-->>CT: результат CT->>CT: маппинг сущность→DTO (MapperService) CT-->>C: JSON (+ Set-Cookie при необходимости)Пошагово
Заголовок раздела «Пошагово»- Middleware.
cookie-parserпарсит cookie (refresh-токены).ClsModuleсоздаёт контекст запроса иX-Request-Id(из заголовка или новый uuid). В этом же контексте живут транзакции. - Guard. Passport-JWT-стратегия по типу пользователя (customer/employee/admin) валидирует access-токен, проверяет регистрацию токена/сессии и блокировку, кладёт пользователя в
request. - Controller. Извлекает данные декораторами (
@Token(),@HeaderFingerprint(),@HeaderSessionId(),@Body()и т.д.) и вызывает сервис. Логики не содержит. - ValidationPipe (глобальный). Валидирует вход (
class-validator) и трансформирует (class-transformer, стратегияexcludeAll). - Service. Бизнес-правила. Транзакции — декларативно через CLS (
@nestjs-cls/transactional), поэтому несколько репозиториев работают в одной транзакции без ручного пробросаtx. - Repository. Инкапсулирует Prisma/Redis-запросы.
PrismaClientServiceуже участвует в CLS-транзакции. - Ответ. Сущность маппится в DTO через
MapperService; наружу уходят только@Expose()-поля. При аутентификации выставляются httpOnly cookie (cookie.helper). - Ошибки. Исключения Prisma перехватывает глобальный
PrismaExceptionFilterи превращает в корректные HTTP-статусы.
Особые потоки
Заголовок раздела «Особые потоки»Аутентификация (выдача токенов)
Заголовок раздела «Аутентификация (выдача токенов)»Access-токен — в теле/заголовке ответа; refresh-токен — в httpOnly cookie. Сессия и/или регистрация токена хранятся так, чтобы можно было отозвать доступ. Детали — auth-api.
Реалтайм-чат (ai-agent-service)
Заголовок раздела «Реалтайм-чат (ai-agent-service)»Здесь путь другой — не «запрос-ответ», а WebSocket + RabbitMQ: клиент держит WS-соединение с gateway, сообщения уходят во внешнего AI-агента через очередь и возвращаются асинхронно. См. ai-agent-service и messaging.
Загрузка файлов/аватаров
Заголовок раздела «Загрузка файлов/аватаров»Идёт через s3-client с presigned URL. См. user-api.