feat(nestjs): migrate to NestJS

This commit is contained in:
Ahmed Bouhuolia
2025-04-07 11:51:24 +02:00
parent f068218a16
commit 55fcc908ef
3779 changed files with 631 additions and 195332 deletions

View File

@@ -0,0 +1,19 @@
import { DashboardService } from './Dashboard.service';
import { Controller, Get } from '@nestjs/common';
import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
@ApiTags('dashboard')
@Controller('dashboard')
export class DashboardController {
constructor(private readonly dashboardService: DashboardService) {}
@ApiOperation({ summary: 'Get dashboard boot metadata' })
@ApiResponse({
status: 200,
description: 'Returns dashboard boot metadata including abilities, features, and cloud status',
})
@Get('boot')
getBootMeta() {
return this.dashboardService.getBootMeta();
}
}

View File

@@ -0,0 +1,12 @@
import { Module } from '@nestjs/common';
import { DashboardService } from './Dashboard.service';
import { FeaturesModule } from '../Features/Features.module';
import { DashboardController } from './Dashboard.controller';
import { TenancyContext } from '../Tenancy/TenancyContext.service';
@Module({
imports: [FeaturesModule],
providers: [DashboardService, TenancyContext],
controllers: [DashboardController],
})
export class DashboardModule {}

View File

@@ -0,0 +1,76 @@
import { TenantModelProxy } from '../System/models/TenantBaseModel';
import { FeaturesManager } from '../Features/FeaturesManager';
import { ConfigService } from '@nestjs/config';
import { TenancyContext } from '../Tenancy/TenancyContext.service';
import { IFeatureAllItem } from '@/common/types/Features';
import { Inject } from '@nestjs/common';
import { TenantUser } from '../Tenancy/TenancyModels/models/TenantUser.model';
interface IRoleAbility {
subject: string;
ability: string;
}
interface IDashboardBootMeta {
abilities: IRoleAbility[];
features: IFeatureAllItem[];
isBigcapitalCloud: boolean;
}
export class DashboardService {
constructor(
private readonly featuresManager: FeaturesManager,
private readonly configService: ConfigService,
private readonly tenancyContext: TenancyContext,
@Inject(TenantUser.name)
private readonly tenantUserModel: TenantModelProxy<typeof TenantUser>,
) {}
/**
* Retrieve dashboard meta.
* @param {number} tenantId
* @param {number} authorizedUser
*/
public getBootMeta = async (): Promise<IDashboardBootMeta> => {
// Retrieves all orgnaization abilities.
const abilities = await this.getBootAbilities();
// Retrieves all organization features.
const features = await this.featuresManager.all();
return {
abilities,
features,
isBigcapitalCloud: this.configService.get('hostedOnBigcapitalCloud'),
};
};
/**
* Transformes role permissions to abilities.
*/
transformRoleAbility = (permissions) => {
return permissions
.filter((permission) => permission.value)
.map((permission) => ({
subject: permission.subject,
action: permission.ability,
}));
};
/**
* Retrieve the boot abilities.
* @returns
*/
private getBootAbilities = async (): Promise<IRoleAbility[]> => {
const authorizedUser = await this.tenancyContext.getSystemUser();
const tenantUser = await this.tenantUserModel().query()
.findOne('systemUserId', authorizedUser.id)
.withGraphFetched('role.permissions');
return tenantUser.role.slug === 'admin'
? [{ subject: 'all', action: 'manage' }]
: this.transformRoleAbility(tenantUser.role.permissions);
};
}