fix: validate request org id existance in guards

This commit is contained in:
Ahmed Bouhuolia
2025-10-25 15:15:13 +02:00
parent 2b4772a070
commit 1bccba572a
3 changed files with 23 additions and 5 deletions

View File

@@ -18,7 +18,7 @@ export class EnsureTenantIsInitializedGuard implements CanActivate {
constructor( constructor(
private readonly tenancyContext: TenancyContext, private readonly tenancyContext: TenancyContext,
private reflector: Reflector, private reflector: Reflector,
) {} ) { }
/** /**
* Validate the tenant of the current request is initialized.. * Validate the tenant of the current request is initialized..
@@ -41,6 +41,12 @@ export class EnsureTenantIsInitializedGuard implements CanActivate {
} }
const tenant = await this.tenancyContext.getTenant(); const tenant = await this.tenancyContext.getTenant();
if (!tenant) {
throw new UnauthorizedException({
message: 'Tenant not found.',
errors: [{ type: 'TENANT.NOT.FOUND' }],
});
}
if (!tenant?.initializedAt) { if (!tenant?.initializedAt) {
throw new UnauthorizedException({ throw new UnauthorizedException({
statusCode: 400, statusCode: 400,

View File

@@ -19,7 +19,7 @@ export class EnsureTenantIsSeededGuard implements CanActivate {
constructor( constructor(
private readonly tenancyContext: TenancyContext, private readonly tenancyContext: TenancyContext,
private reflector: Reflector, private reflector: Reflector,
) {} ) { }
/** /**
* Validate the tenant of the current request is seeded. * Validate the tenant of the current request is seeded.
@@ -41,6 +41,12 @@ export class EnsureTenantIsSeededGuard implements CanActivate {
} }
const tenant = await this.tenancyContext.getTenant(); const tenant = await this.tenancyContext.getTenant();
if (!tenant) {
throw new UnauthorizedException({
message: 'Tenant not found.',
errors: [{ type: 'TENANT.NOT.FOUND' }],
});
}
if (!tenant.seededAt) { if (!tenant.seededAt) {
throw new UnauthorizedException({ throw new UnauthorizedException({
message: 'Tenant database is not seeded with initial data yet.', message: 'Tenant database is not seeded with initial data yet.',

View File

@@ -2,6 +2,7 @@ import { Inject, Injectable } from '@nestjs/common';
import { ClsService } from 'nestjs-cls'; import { ClsService } from 'nestjs-cls';
import { SystemUser } from '../System/models/SystemUser'; import { SystemUser } from '../System/models/SystemUser';
import { TenantModel } from '../System/models/TenantModel'; import { TenantModel } from '../System/models/TenantModel';
import { ServiceError } from '../Items/ServiceError';
@Injectable() @Injectable()
export class TenancyContext { export class TenancyContext {
@@ -13,14 +14,14 @@ export class TenancyContext {
@Inject(TenantModel.name) @Inject(TenantModel.name)
private readonly systemTenantModel: typeof TenantModel, private readonly systemTenantModel: typeof TenantModel,
) {} ) { }
/** /**
* Get the current tenant. * Get the current tenant.
* @param {boolean} withMetadata - If true, the tenant metadata will be fetched. * @param {boolean} withMetadata - If true, the tenant metadata will be fetched.
* @returns * @returns
*/ */
getTenant(withMetadata: boolean = false) { async getTenant(withMetadata: boolean = false) {
// Get the tenant from the request headers. // Get the tenant from the request headers.
const organizationId = this.cls.get('organizationId'); const organizationId = this.cls.get('organizationId');
@@ -32,7 +33,12 @@ export class TenancyContext {
if (withMetadata) { if (withMetadata) {
query.withGraphFetched('metadata'); query.withGraphFetched('metadata');
} }
return query; const queryResult = await query;
if (!queryResult) {
throw new ServiceError('TENANT_NOT_FOUND', 'Tenant not found');
}
return queryResult;
} }
async getTenantMetadata() { async getTenantMetadata() {