Files
CRM_Montzar/apps/api/src/pipelines/pipelines.controller.ts
T
Mahdi 7ae6a5837a feat: enforce role section permissions and add a leads permission
Unticking a section hides it from the menu, closes its routes and blocks its writes on the server; existing roles keep their current access via migration.
2026-10-21 13:45:16 +03:30

142 lines
3.7 KiB
TypeScript

import {
Body,
Controller,
Delete,
Get,
Param,
Patch,
Post,
Query,
UseGuards,
} from '@nestjs/common';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
import { RequirePermission, SectionPermissionGuard } from '../auth/section-permission.guard';
import { CurrentUser } from '../auth/current-user.decorator';
import { Roles } from '../auth/roles.decorator';
import { RolesGuard } from '../auth/roles.guard';
import type { Actor } from '../common/record-scope';
import {
CreatePipelineDto,
CreatePipelineStageDto,
MergePipelineDto,
ReorderPipelineStagesDto,
UpdatePipelineStageDto,
} from './dto';
import { PipelinesService } from './pipelines.service';
@Controller('pipelines')
@UseGuards(JwtAuthGuard, RolesGuard, SectionPermissionGuard)
@RequirePermission('sales')
export class PipelinesController {
constructor(private readonly pipelinesService: PipelinesService) {}
@Get()
list(@CurrentUser() user: { organizationId: string }) {
return this.pipelinesService.list(user.organizationId);
}
@Get('board')
board(
@CurrentUser() user: Actor,
@Query('pipelineId') pipelineId?: string,
@Query('prior') prior?: string,
) {
return this.pipelinesService.getBoard(user.organizationId, pipelineId, user, prior === 'all');
}
@Post()
@Roles('owner', 'admin')
create(
@CurrentUser() user: { organizationId: string },
@Body() dto: CreatePipelineDto,
) {
return this.pipelinesService.create(user.organizationId, dto.name);
}
@Get(':pipelineId/merge-preview')
@Roles('owner', 'admin')
mergePreview(
@CurrentUser() user: { organizationId: string },
@Param('pipelineId') pipelineId: string,
) {
return this.pipelinesService.mergePreview(user.organizationId, pipelineId);
}
@Post(':pipelineId/merge')
@Roles('owner', 'admin')
merge(
@CurrentUser() user: { organizationId: string },
@Param('pipelineId') pipelineId: string,
@Body() dto: MergePipelineDto,
) {
return this.pipelinesService.merge(user.organizationId, pipelineId, dto);
}
@Delete(':pipelineId')
@Roles('owner', 'admin')
remove(
@CurrentUser() user: { organizationId: string },
@Param('pipelineId') pipelineId: string,
) {
return this.pipelinesService.remove(user.organizationId, pipelineId);
}
@Post(':pipelineId/stages')
@Roles('owner', 'admin')
createStage(
@CurrentUser() user: { organizationId: string },
@Param('pipelineId') pipelineId: string,
@Body() dto: CreatePipelineStageDto,
) {
return this.pipelinesService.createStage(
user.organizationId,
pipelineId,
dto.name,
);
}
@Patch(':pipelineId/stages/order')
@Roles('owner', 'admin')
reorderStages(
@CurrentUser() user: { organizationId: string },
@Param('pipelineId') pipelineId: string,
@Body() dto: ReorderPipelineStagesDto,
) {
return this.pipelinesService.reorderStages(
user.organizationId,
pipelineId,
dto.stageIds,
);
}
@Patch(':pipelineId/stages/:stageId')
@Roles('owner', 'admin')
updateStage(
@CurrentUser() user: { organizationId: string },
@Param('pipelineId') pipelineId: string,
@Param('stageId') stageId: string,
@Body() dto: UpdatePipelineStageDto,
) {
return this.pipelinesService.updateStage(
user.organizationId,
pipelineId,
stageId,
dto.name,
);
}
@Delete(':pipelineId/stages/:stageId')
@Roles('owner', 'admin')
deleteStage(
@CurrentUser() user: { organizationId: string },
@Param('pipelineId') pipelineId: string,
@Param('stageId') stageId: string,
) {
return this.pipelinesService.deleteStage(
user.organizationId,
pipelineId,
stageId,
);
}
}