import { Body, Controller, Delete, Get, HttpCode, HttpStatus, NotFoundException, Param, Post, UseGuards } from "@nestjs/common"; import { getPrismaClient, withTenantContext } from "@b2bcall/database"; import { recordAuditEvent, type AccessTokenClaims } from "@b2bcall/auth"; import { JwtAuthGuard } from "../common/guards/jwt-auth.guard"; import { PermissionGuard } from "../common/guards/permission.guard"; import { RequirePermission } from "../common/decorators/require-permission.decorator"; import { CurrentUser } from "../common/decorators/current-user.decorator"; import { CreateDispositionDto } from "./dto/create-disposition.dto"; // "Call Center -> Disposições" (agente.md secao 89) — personalizável por // tenant, sem lista fixa hardcoded. Sem permission dedicada na secao 145; // reusa agents.* (mesmo criterio de PauseReasonsController). @UseGuards(JwtAuthGuard, PermissionGuard) @Controller("dispositions") export class DispositionsController { @RequirePermission("agents.manage") @Post() async create(@CurrentUser() user: AccessTokenClaims, @Body() dto: CreateDispositionDto) { const prisma = getPrismaClient(); const tenantId = user.tenantId!; const disposition = await withTenantContext(prisma, tenantId, (tx) => tx.disposition.create({ data: { tenantId, name: dto.name, code: dto.code } }), ); await recordAuditEvent(prisma, { action: "DISPOSITION_CREATE", tenantId, userId: user.sub, entityType: "disposition", entityId: disposition.id, after: { name: disposition.name, code: disposition.code }, }); return disposition; } @RequirePermission("agents.view") @Get() async list(@CurrentUser() user: AccessTokenClaims) { const prisma = getPrismaClient(); const tenantId = user.tenantId!; return withTenantContext(prisma, tenantId, (tx) => tx.disposition.findMany({ where: { enabled: true }, orderBy: { name: "asc" } }), ); } @RequirePermission("agents.manage") @Delete(":id") @HttpCode(HttpStatus.NO_CONTENT) async remove(@CurrentUser() user: AccessTokenClaims, @Param("id") id: string) { const prisma = getPrismaClient(); const tenantId = user.tenantId!; const result = await withTenantContext(prisma, tenantId, (tx) => tx.disposition.updateMany({ where: { id, tenantId }, data: { enabled: false } }), ); if (result.count === 0) throw new NotFoundException(); await recordAuditEvent(prisma, { action: "DISPOSITION_DELETE", tenantId, userId: user.sub, entityType: "disposition", entityId: id, }); } }