Перейти к содержимому

Приложения (`apps/`)

Приложения — тонкие оболочки. Вся логика в libs/apis/providers (см. 03-services/). Здесь описан bootstrap и подключение модулей каждого сервиса.

СервисПрефиксВерсия­рованиеSwaggerПортПодключённые доменные модули
auth-apiapiURI (v1)/apiAPP_PORTCustomerAuth, EmployeeAuth, UserAuth, AdminAuth
user-apiapiURI (v1)/apiAPP_PORTCustomer, Employee, Profile
project-apiapiURI (v1)/apiAPP_PORTProject
admin-apiapi/v1URI/api/v1/docsADMIN_API_PORT (деф. 3002)AdminProject, AdminUser
ai-agent-serviceapiURI (v1)/apiAPP_PORTAgentChat (+ WebSocket, RabbitMQ)
core-apiapiнетPORT (деф. 3000)— (только Prisma-схема/сиды)

Порт APP_PORT берётся из AppConfigService (config shared/app). У admin-api и core-api — своя логика порта.

Почти все 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_TOKEN bearer, Swagger на api/v1/docs, порт ADMIN_API_PORT || 3002.
  • ai-agent-service — без useStaticAssets и cookieParser; добавляет WebSocket-gateway (см. ai-agent-service).
  • user-api / project-apiValidationPipe дополнительно с whitelist: true.
  • core-api — минимальный bootstrap без Swagger/пайпов.

Каждое приложение (кроме 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 не бизнес-сервис. Это держатель:

  • 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.