Приложения (`apps/`)
Приложения — тонкие оболочки. Вся логика в libs/apis/providers (см. 03-services/). Здесь описан bootstrap и подключение модулей каждого сервиса.
Сводная таблица
Заголовок раздела «Сводная таблица»| Сервис | Префикс | Версиярование | Swagger | Порт | Подключённые доменные модули |
|---|---|---|---|---|---|
auth-api | api | URI (v1) | /api | APP_PORT | CustomerAuth, EmployeeAuth, UserAuth, AdminAuth |
user-api | api | URI (v1) | /api | APP_PORT | Customer, Employee, Profile |
project-api | api | URI (v1) | /api | APP_PORT | Project |
admin-api | api/v1 | URI | /api/v1/docs | ADMIN_API_PORT (деф. 3002) | AdminProject, AdminUser |
ai-agent-service | api | URI (v1) | /api | APP_PORT | AgentChat (+ WebSocket, RabbitMQ) |
core-api | api | — | нет | PORT (деф. 3000) | — (только Prisma-схема/сиды) |
Порт
APP_PORTберётся изAppConfigService(configshared/app). Уadmin-apiиcore-api— своя логика порта.
Общий bootstrap (main.ts)
Заголовок раздела «Общий bootstrap (main.ts)»Почти все HTTP-сервисы (auth, user, project, ai-agent) настраиваются одинаково:
app.useStaticAssets(.../assets); // раздача статики (шаблоны/файлы)app.enableCors({ credentials: true, origin: true, exposedHeaders: ['set-cookie'] });app.enableVersioning({ type: VersioningType.URI });app.setGlobalPrefix('api');app.useGlobalPipes(new ValidationPipe({ transform: true, transformOptions: { strategy: 'excludeAll' } }));app.useGlobalFilters(new PrismaExceptionFilter(httpAdapter));app.use(cookieParser());// Swagger DocumentBuilder + addBearerAuth(customer/employee[/admin])Отличия:
admin-api— префиксapi/v1,ValidationPipeсwhitelist + forbidNonWhitelisted, толькоADMIN_ACCESS_TOKENbearer, Swagger наapi/v1/docs, портADMIN_API_PORT || 3002.ai-agent-service— безuseStaticAssetsиcookieParser; добавляет WebSocket-gateway (см. ai-agent-service).user-api/project-api—ValidationPipeдополнительно сwhitelist: true.core-api— минимальный bootstrap без Swagger/пайпов.
Общий app.module.ts
Заголовок раздела «Общий app.module.ts»Каждое приложение (кроме core-api) поднимает одинаковый каркас:
@Module({ imports: [ AppConfigModule, ClsModule.forRoot({ global: true, middleware: { mount: true, generateId: true, idGenerator: (req) => req.headers['X-Request-Id'] ?? uuid() }, plugins: [ new ClsPluginTransactional({ imports: [PrismaClientModule], adapter: new TransactionalAdapterPrisma({ prismaInjectionToken: PrismaClientService }), })], }), /* ...доменные модули сервиса... */ ],})То есть: конфиг приложения + CLS-транзакции поверх Prisma + доменные модули. Именно сюда добавляется новый доменный модуль при расширении сервиса.
core-api — особый случай
Заголовок раздела «core-api — особый случай»core-api не бизнес-сервис. Это держатель:
- Prisma-схемы —
apps/core-api/prisma/schema.prisma(единый источник для всех); - миграций —
apps/core-api/prisma/migrations/; - сидов —
apps/core-api/prisma/seeds/.
Его app.module.ts содержит лишь заглушечный AppController/AppService. Подробнее — schema, migrations, seeds.