import { Controller, Get, Post, Put, Delete, Patch, Body, Param, Query, UseGuards, } from '@nestjs/common'; import { PolicyEngineService } from './policy-engine.service'; import { PolicyEvaluationService } from './policy-evaluation.service'; import type { EvaluationInput } from './services/master-value-resolver.service'; import { CreatePolicyDto } from './dto/create-policy.dto'; import { UpdatePolicyDto } from './dto/update-policy.dto'; import { PolicyStatus, AudienceType } from './entities/policy.enums'; import { PermissionsGuard } from '../auth/guards/permissions.guard'; import { RequirePermissions } from '../auth/decorators/permissions.decorator'; @Controller('policy-engine') @UseGuards(PermissionsGuard) export class PolicyEngineController { constructor( private readonly policyEngineService: PolicyEngineService, private readonly policyEvaluationService: PolicyEvaluationService, ) { } @Post('evaluate') @RequirePermissions('simulation:execute', 'recovery:evaluate') async evaluate(@Body() input: EvaluationInput) { return this.policyEvaluationService.evaluateIncident(input); } @Post('evaluate-batch') @RequirePermissions('simulation:execute', 'recovery:evaluate') async evaluateBatch(@Body() inputs: EvaluationInput[]) { const list = Array.isArray(inputs) ? inputs : [inputs]; return Promise.all( list.map((item) => this.policyEvaluationService.evaluateIncident(item)), ); } @Post() @RequirePermissions('policy_engine:create') async create(@Body() createPolicyDto: CreatePolicyDto) { return this.policyEngineService.create(createPolicyDto); } @Get() @RequirePermissions('policy_engine:view') async findAll( @Query('page') page: string = '1', @Query('limit') limit: string = '10', @Query('status') status?: PolicyStatus, @Query('audienceType') audienceType?: AudienceType, ) { return this.policyEngineService.findAll( Number(page), Number(limit), status, audienceType, ); } @Get(':id') @RequirePermissions('policy_engine:view') async findOne(@Param('id') id: string) { return this.policyEngineService.findOne(id); } @Put(':id') @RequirePermissions('policy_engine:edit') async update( @Param('id') id: string, @Body() updatePolicyDto: UpdatePolicyDto, ) { return this.policyEngineService.update(id, updatePolicyDto); } @Patch(':id/status') @RequirePermissions('policy_engine:publish', 'policy_engine:edit') async updateStatus( @Param('id') id: string, @Body('status') status: PolicyStatus, ) { return this.policyEngineService.updateStatus(id, status); } @Delete(':id') @RequirePermissions('policy_engine:delete') async remove(@Param('id') id: string) { return this.policyEngineService.remove(id); } }