mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-27 00:52:50 +00:00
76 lines
2.7 KiB
TypeScript
76 lines
2.7 KiB
TypeScript
import {
|
|
Body,
|
|
Controller,
|
|
Get,
|
|
Param,
|
|
ParseUUIDPipe,
|
|
Post,
|
|
Query,
|
|
} from '@nestjs/common';
|
|
import { ApiBearerAuth, ApiOperation, ApiQuery, ApiTags } from '@nestjs/swagger';
|
|
import { CurrentUser } from '@edr/api-common';
|
|
import type { TCurrentUser } from '@tria-plc/api-common/modules/auth/types/current-user.type';
|
|
|
|
import { RuleEngineManage, RuleEngineView } from '../../../common/rule-engine-guards';
|
|
import { isSuperAdmin } from '../../../common/freight-permission.util';
|
|
import {
|
|
DecidePriorityRuleChangeDto,
|
|
SubmitPriorityRuleChangeDto,
|
|
} from '../dto/priority-rule-change-request.dto';
|
|
import { PriorityRuleChangeStatus } from '../entities/priority-rule-change-request.entity';
|
|
import { PriorityRuleChangeRequestsService } from '../services/priority-rule-change-requests.service';
|
|
|
|
/**
|
|
* Approval workflow for priority-rule changes. Anyone with the manage
|
|
* permission SUBMITS a change; an approver (same permission — the team decides
|
|
* who reviews) approves or rejects it. The team is notified at each step.
|
|
*/
|
|
@ApiTags('priority-rule-change-requests')
|
|
@Controller('priority-rule-change-requests')
|
|
@ApiBearerAuth()
|
|
export class PriorityRuleChangeRequestsController {
|
|
constructor(private readonly service: PriorityRuleChangeRequestsService) {}
|
|
|
|
@Post()
|
|
@RuleEngineManage('priority-configs')
|
|
@ApiOperation({ summary: 'Submit a priority-rule change for approval' })
|
|
submit(
|
|
@Body() dto: SubmitPriorityRuleChangeDto,
|
|
@CurrentUser() user: TCurrentUser,
|
|
) {
|
|
return this.service.submit(dto, user?.id);
|
|
}
|
|
|
|
@Get()
|
|
@RuleEngineView('priority-configs')
|
|
@ApiQuery({ name: 'status', required: false, enum: ['PENDING', 'APPROVED', 'REJECTED'] })
|
|
@ApiOperation({ summary: 'List priority-rule change requests' })
|
|
list(@Query('status') status?: PriorityRuleChangeStatus) {
|
|
return this.service.list(status);
|
|
}
|
|
|
|
@Post(':id/approve')
|
|
@RuleEngineManage('priority-configs')
|
|
@ApiOperation({ summary: 'Approve and apply a pending change' })
|
|
approve(
|
|
@Param('id', ParseUUIDPipe) id: string,
|
|
@Body() dto: DecidePriorityRuleChangeDto,
|
|
@CurrentUser() user: TCurrentUser,
|
|
) {
|
|
// Super admins have full backoffice authority — they may approve a change
|
|
// they submitted; everyone else is held to separation of duties.
|
|
return this.service.approve(id, user?.id, dto.decisionNote, isSuperAdmin(user));
|
|
}
|
|
|
|
@Post(':id/reject')
|
|
@RuleEngineManage('priority-configs')
|
|
@ApiOperation({ summary: 'Reject a pending change' })
|
|
reject(
|
|
@Param('id', ParseUUIDPipe) id: string,
|
|
@Body() dto: DecidePriorityRuleChangeDto,
|
|
@CurrentUser() user: TCurrentUser,
|
|
) {
|
|
return this.service.reject(id, user?.id, dto.decisionNote);
|
|
}
|
|
}
|