mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-15 20:30:33 +00:00
feat(nestjs): migrate to NestJS
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
12
packages/server/src/modules/Dashboard/Dashboard.module.ts
Normal file
12
packages/server/src/modules/Dashboard/Dashboard.module.ts
Normal 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 {}
|
||||
76
packages/server/src/modules/Dashboard/Dashboard.service.ts
Normal file
76
packages/server/src/modules/Dashboard/Dashboard.service.ts
Normal 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);
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user