Files
bigcapital/packages/server/src/modules/Organization/Organization.controller.ts
2025-10-25 14:57:38 +02:00

134 lines
4.1 KiB
TypeScript

import {
ApiTags,
ApiOperation,
ApiResponse,
ApiBody,
ApiOkResponse,
ApiExtraModels,
getSchemaPath,
ApiParam,
} from '@nestjs/swagger';
import {
Controller,
Post,
Put,
Get,
Body,
HttpCode,
Param,
} from '@nestjs/common';
import { BuildOrganizationService } from './commands/BuildOrganization.service';
import {
BuildOrganizationDto,
UpdateOrganizationDto,
} from './dtos/Organization.dto';
import { GetCurrentOrganizationService } from './queries/GetCurrentOrganization.service';
import { UpdateOrganizationService } from './commands/UpdateOrganization.service';
import { IgnoreTenantInitializedRoute } from '../Tenancy/EnsureTenantIsInitialized.guard';
import { IgnoreTenantSeededRoute } from '../Tenancy/EnsureTenantIsSeeded.guards';
import { IgnoreTenantModelsInitialize } from '../Tenancy/TenancyInitializeModels.guard';
import { GetBuildOrganizationBuildJob } from './commands/GetBuildOrganizationJob.service';
import { OrganizationBaseCurrencyLocking } from './Organization/OrganizationBaseCurrencyLocking.service';
import {
OrganizationBuildResponseExample,
OrganizationBuiltResponseExample,
} from './Organization.swagger';
import { GetCurrentOrganizationResponseDto } from './dtos/GetCurrentOrganizationResponse.dto';
import { ApiCommonHeaders } from '@/common/decorators/ApiCommonHeaders';
@ApiTags('Organization')
@Controller('organization')
@IgnoreTenantInitializedRoute()
@IgnoreTenantSeededRoute()
@IgnoreTenantModelsInitialize()
@ApiExtraModels(GetCurrentOrganizationResponseDto)
@ApiCommonHeaders()
export class OrganizationController {
constructor(
private readonly buildOrganizationService: BuildOrganizationService,
private readonly getCurrentOrgService: GetCurrentOrganizationService,
private readonly updateOrganizationService: UpdateOrganizationService,
private readonly getBuildOrganizationJobService: GetBuildOrganizationBuildJob,
private readonly orgBaseCurrencyLockingService: OrganizationBaseCurrencyLocking,
) { }
@Post('build')
@HttpCode(200)
@ApiOperation({ summary: 'Build organization database' })
@ApiBody({ type: BuildOrganizationDto })
@ApiResponse({
status: 200,
description: 'The organization database has been initialized',
example: OrganizationBuildResponseExample,
})
@ApiResponse({
status: 500,
example: OrganizationBuiltResponseExample,
})
async build(@Body() buildDTO: BuildOrganizationDto) {
const result = await this.buildOrganizationService.buildRunJob(buildDTO);
return {
type: 'success',
code: 'ORGANIZATION.DATABASE.INITIALIZED',
message: 'The organization database has been initialized.',
data: result,
};
}
@Get('build/:buildJobId')
@ApiParam({
name: 'buildJobId',
required: true,
type: Number,
description: 'The build job id',
})
@HttpCode(200)
@ApiOperation({ summary: 'Gets the organization build job details' })
async buildJob(@Param('buildJobId') buildJobId: string) {
return this.getBuildOrganizationJobService.getJobDetails(buildJobId);
}
@Get('current')
@HttpCode(200)
@ApiOperation({ summary: 'Get current organization' })
@ApiResponse({
status: 200,
description: 'Returns the current organization',
schema: {
$ref: getSchemaPath(GetCurrentOrganizationResponseDto),
},
})
async currentOrganization() {
const organization =
await this.getCurrentOrgService.getCurrentOrganization();
return organization;
}
@Get('base-currency-mutate')
async baseCurrencyMutate() {
const abilities =
await this.orgBaseCurrencyLockingService.baseCurrencyMutateLocks();
return { abilities };
}
@Put()
@HttpCode(200)
@ApiOperation({ summary: 'Update organization information' })
@ApiBody({ type: UpdateOrganizationDto })
@ApiResponse({
status: 200,
description: 'Organization information has been updated successfully',
})
async updateOrganization(@Body() updateDTO: UpdateOrganizationDto) {
await this.updateOrganizationService.execute(updateDTO);
return {
code: 200,
message: 'Organization information has been updated successfully.',
};
}
}