diff --git a/packages/shared/database/src/database.module.ts b/packages/shared/database/src/database.module.ts index 52755ec..5878e3e 100644 --- a/packages/shared/database/src/database.module.ts +++ b/packages/shared/database/src/database.module.ts @@ -1,9 +1,14 @@ -import { DynamicModule, Module } from '@nestjs/common'; +import { DynamicModule, MiddlewareConsumer, Module, NestModule } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ConfigService } from '@nestjs/config'; +import { TenantContextMiddleware } from './tenant-context.middleware'; @Module({}) -export class DatabaseModule { +export class DatabaseModule implements NestModule { + configure(consumer: MiddlewareConsumer) { + consumer.apply(TenantContextMiddleware).forRoutes('*'); + } + static forRoot(): DynamicModule { return { module: DatabaseModule, diff --git a/packages/shared/database/src/index.ts b/packages/shared/database/src/index.ts index b80b2db..232512f 100644 --- a/packages/shared/database/src/index.ts +++ b/packages/shared/database/src/index.ts @@ -1,3 +1,4 @@ export * from './tenant-aware.repository'; export * from './database.module'; export * from './tenant-provisioning.service'; +export * from './tenant-context.middleware'; diff --git a/packages/shared/database/src/tenant-context.middleware.ts b/packages/shared/database/src/tenant-context.middleware.ts new file mode 100644 index 0000000..534000b --- /dev/null +++ b/packages/shared/database/src/tenant-context.middleware.ts @@ -0,0 +1,24 @@ +import { Injectable, NestMiddleware } from '@nestjs/common'; +import { Request, Response, NextFunction } from 'express'; +import { TenantContextService } from '@it0/common'; +import { TenantInfo } from '@it0/common'; + +@Injectable() +export class TenantContextMiddleware implements NestMiddleware { + use(req: Request, res: Response, next: NextFunction) { + const tenantId = req.headers['x-tenant-id'] as string; + + if (!tenantId) { + return next(); + } + + const tenantInfo: TenantInfo = { + tenantId, + tenantName: tenantId, + plan: 'free', + schemaName: `it0_t_${tenantId}`, + }; + + TenantContextService.run(tenantInfo, () => next()); + } +}