是否有可能实现“基于列”的多租户,同时避免将 tenantId 添加到 NestJS/TypeORM 应用程序中的所有方法?

问题描述 投票:0回答:0

上下文

我们正在使用 NestJS 和 TypeORM(使用 PostgreSQL)构建我们的后端,并且已经确定对我们来说最佳的多租户策略是使用一个共享数据库/共享模式,其中有一列(companyId)标识“租户”(公司)我们所有的桌子。

当前解决方案

我们通过从请求中检索

companyId
(目前来自查询参数,但一旦身份验证到位它将在 JWT 令牌中)并将
companyId
传递给控制器中的所有方法调用,成功实施了此策略到服务,然后到存储库。

例如:

CatsController.create
方法从
@Query('companyId')
获取 companyId 并将其传递给我们的服务:

@Controller('cats')
export class CatsController {
  constructor(private readonly catsService: CatsService) {}

  @Post()
  create(
    @Query('companyId') companyId: string,
    @Body() createCatDto: CreateCatDto,
  ) {
    return this.catsService.create(companyId, createCatDto);
  }
}

我们服务上的

CatsService.create
方法也将
companyId
作为参数传递给存储库:

@Injectable()
export class CatsService {
  constructor(
    @InjectRepository(Cat)
    private readonly catRepository: Repository<Cat>,
  ) {}

  create(companyId: string, createCatDto: CreateCatDto) {
    return this.catRepository.save({ ...createCatDto, companyId });
  }
}

我创建了一个示例项目,其中包含我们实施的简化版本,以演示它如何变得复杂并导致大量样板代码来管理我们所有类方法的 companyId。

https://github.com/jmoyson/multi-tenant-example

问题

虽然这行得通,但随着我们继续开发更多模块,很明显这种方法对开发人员不友好,它迫使我们格外谨慎,以确保每个新模块都正确实施此策略,以防止出现任何数据分离问题.

所以我的问题是:
有没有更有效的方法来实现数据分离,而不必将 companyId 传递给所有方法调用,同时仍然使用我们决定实施的基于列的租户策略?

ps:如果可能的话,我们希望避免使用 Request Scoped 控制器/服务,因为我们所有的请求都需要实现解决方案,我们不想对性能产生负面影响。

design-patterns nestjs typeorm multi-tenant
© www.soinside.com 2019 - 2024. All rights reserved.