Skip to content

Commit 9d7e744

Browse files
feat: Multi-tenancy support
1 parent d8f8cbc commit 9d7e744

22 files changed

+320
-35
lines changed

package-lock.json

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/authentication/authentication.guard.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
22
import { GqlExecutionContext } from '@nestjs/graphql';
33
import { AuthenticationHelper } from './authentication.helper';
4+
import { ExecutionManager } from '../util/execution.manager';
45

56
@Injectable()
67
export class AuthGuard implements CanActivate {
@@ -13,6 +14,7 @@ export class AuthGuard implements CanActivate {
1314
if (token) {
1415
const reqAuthToken = token.split(' ')[1];
1516
ctx.user = this.authenticationHelper.validateAuthToken(reqAuthToken);
17+
ExecutionManager.setTenantId(ctx.user.tenantId);
1618
return true;
1719
}
1820
}

src/authentication/authentication.helper.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@ export class AuthenticationHelper {
1313
this.configService.get('JWT_TOKEN_EXPTIME') * 1 || 60 * 60;
1414
const secret = this.configService.get('JWT_SECRET') as string;
1515
const username = userDetails.email || userDetails.phone;
16-
16+
const tenantId = userDetails.tenantId;
1717
const dataStoredInToken = {
1818
username: username,
19+
tenantId,
1920
sub: userDetails.id,
2021
env: this.configService.get('ENV') || 'local',
2122
};
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { PrimaryColumn } from 'typeorm';
2+
import BaseEntity from './base.entity';
3+
4+
class AbstractTenantEntity extends BaseEntity {
5+
@PrimaryColumn({ type: 'uuid' })
6+
public tenantId!: string;
7+
}
8+
9+
export default AbstractTenantEntity;

src/authorization/entity/entity.entity.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm';
2-
import BaseEntity from './base.entity';
2+
import AbstractTenantEntity from './abstract.tenant.entity';
33

44
@Entity()
55
@Index('entity_name_unique_idx', { synchronize: false })
6-
class EntityModel extends BaseEntity {
6+
class EntityModel extends AbstractTenantEntity {
77
@PrimaryGeneratedColumn('uuid')
88
public id!: string;
99

src/authorization/entity/entityPermission.entity.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { Entity, PrimaryColumn } from 'typeorm';
2-
import BaseEntity from './base.entity';
2+
import AbstractTenantEntity from './abstract.tenant.entity';
33

44
@Entity()
5-
class EntityPermission extends BaseEntity {
5+
class EntityPermission extends AbstractTenantEntity {
66
@PrimaryColumn({ type: 'uuid' })
77
public permissionId!: string;
88

src/authorization/entity/group.entity.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm';
2-
import BaseEntity from './base.entity';
2+
import AbstractTenantEntity from './abstract.tenant.entity';
33

44
@Entity()
55
@Index('group_name_unique_idx', { synchronize: false })
6-
class Group extends BaseEntity {
6+
class Group extends AbstractTenantEntity {
77
@PrimaryGeneratedColumn('uuid')
88
public id!: string;
99

src/authorization/entity/groupPermission.entity.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { Entity, PrimaryColumn } from 'typeorm';
2-
import BaseEntity from './base.entity';
2+
import AbstractTenantEntity from './abstract.tenant.entity';
33

44
@Entity()
5-
class GroupPermission extends BaseEntity {
5+
class GroupPermission extends AbstractTenantEntity {
66
@PrimaryColumn({ type: 'uuid' })
77
public permissionId!: string;
88

src/authorization/entity/groupRole.entity.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { Entity, PrimaryColumn } from 'typeorm';
2-
import BaseEntity from './base.entity';
2+
import AbstractTenantEntity from './abstract.tenant.entity';
33

44
@Entity()
5-
class GroupRole extends BaseEntity {
5+
class GroupRole extends AbstractTenantEntity {
66
@PrimaryColumn({ type: 'uuid' })
77
public roleId!: string;
88

src/authorization/entity/role.entity.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm';
2-
import BaseEntity from './base.entity';
2+
import AbstractTenantEntity from './abstract.tenant.entity';
33

44
@Entity()
55
@Index('role_name_unique_idx', { synchronize: false })
6-
class Role extends BaseEntity {
6+
class Role extends AbstractTenantEntity {
77
@PrimaryGeneratedColumn('uuid')
88
public id!: string;
99

0 commit comments

Comments
 (0)