Files
lehuo/apps/api/src/financial-disclosures/financial-disclosures.controller.ts
T

92 lines
3.2 KiB
TypeScript

import {
Body,
Controller,
Get,
Inject,
Param,
Patch,
Post,
Query,
Req,
ValidationPipe,
} from '@nestjs/common';
import { PERMISSION_CODES } from '@lehuo/contracts';
import { RequireSessionChannel } from '../auth/decorators/require-session-channel.decorator';
import { CurrentAuth } from '../common/decorators/current-auth.decorator';
import { Public } from '../common/decorators/public.decorator';
import { RequirePermissions } from '../common/decorators/require-permissions.decorator';
import type { AuthContext, RequestContext } from '../common/request-context';
import { SessionChannel } from '../generated/prisma/enums';
import {
CreateFinancialDisclosureDto,
FinancialDisclosureQueryDto,
TransitionFinancialDisclosureDto,
UpdateFinancialDisclosureDto,
} from './dto/financial-disclosure.dto';
import { FinancialDisclosuresService } from './financial-disclosures.service';
const strict = (expectedType: new () => object) =>
new ValidationPipe({
transform: true,
whitelist: true,
forbidNonWhitelisted: true,
expectedType,
});
@Controller('api/v1/financial-disclosures')
@Public()
export class PublicFinancialDisclosuresController {
constructor(
@Inject(FinancialDisclosuresService) private readonly service: FinancialDisclosuresService,
) {}
@Get() list(@Query(strict(FinancialDisclosureQueryDto)) q: FinancialDisclosureQueryDto) {
return this.service.listPublic(q);
}
@Get(':publicId') get(@Param('publicId') id: string) {
return this.service.getPublic(id);
}
}
@Controller('api/v1/admin/financial-disclosures')
@RequireSessionChannel(SessionChannel.ADMIN)
export class AdminFinancialDisclosuresController {
constructor(
@Inject(FinancialDisclosuresService) private readonly service: FinancialDisclosuresService,
) {}
@Get() @RequirePermissions(PERMISSION_CODES.FINANCIAL_DISCLOSURES_READ) list(
@Query(strict(FinancialDisclosureQueryDto)) q: FinancialDisclosureQueryDto,
) {
return this.service.listAdmin(q);
}
@Get(':publicId') @RequirePermissions(PERMISSION_CODES.FINANCIAL_DISCLOSURES_READ) get(
@Param('publicId') id: string,
) {
return this.service.getAdmin(id);
}
@Post() @RequirePermissions(PERMISSION_CODES.FINANCIAL_DISCLOSURES_MANAGE) create(
@Body(strict(CreateFinancialDisclosureDto)) input: CreateFinancialDisclosureDto,
@CurrentAuth() actor: AuthContext,
@Req() req: RequestContext,
) {
return this.service.create(input, actor, req);
}
@Patch(':publicId') @RequirePermissions(PERMISSION_CODES.FINANCIAL_DISCLOSURES_MANAGE) update(
@Param('publicId') id: string,
@Body(strict(UpdateFinancialDisclosureDto)) input: UpdateFinancialDisclosureDto,
@CurrentAuth() actor: AuthContext,
@Req() req: RequestContext,
) {
return this.service.update(id, input, actor, req);
}
@Post(':publicId/transition')
@RequirePermissions(PERMISSION_CODES.FINANCIAL_DISCLOSURES_PUBLISH)
transition(
@Param('publicId') id: string,
@Body(strict(TransitionFinancialDisclosureDto)) input: TransitionFinancialDisclosureDto,
@CurrentAuth() actor: AuthContext,
@Req() req: RequestContext,
) {
return this.service.transition(id, input, actor, req);
}
}