import { Body, Controller, ForbiddenException, Get, HttpCode, Param, ParseIntPipe, ParseUUIDPipe, Patch, Post, Query, } from '@nestjs/common'; import { ClsService } from 'nestjs-cls'; import { createZodDto } from 'nestjs-zod'; import { AprovarPedidoSchema, CreatePedidoSchema, PedidoListQuerySchema, RecusarPedidoSchema, type AprovarPedido, type CreatePedido, type PedidoDetail, type PedidoListQuery, type PedidoListResponse, type RecusarPedido, } from '@sar/api-interface'; import type { WorkspaceClsStore } from '../workspace/workspace.types'; import { OrdersService } from './orders.service'; class PedidoListQueryDto extends createZodDto(PedidoListQuerySchema) {} class CreatePedidoDto extends createZodDto(CreatePedidoSchema) {} class AprovarPedidoDto extends createZodDto(AprovarPedidoSchema) {} class RecusarPedidoDto extends createZodDto(RecusarPedidoSchema) {} @Controller({ path: 'orders' }) export class OrdersController { constructor( private readonly orders: OrdersService, private readonly cls: ClsService, ) {} @Get() list(@Query() query: PedidoListQueryDto): Promise { const parsed = PedidoListQuerySchema.parse(query) as PedidoListQuery; return this.orders.list(parsed); } @Post() @HttpCode(201) create(@Body() body: CreatePedidoDto): Promise { const parsed = CreatePedidoSchema.parse(body) as CreatePedido; return this.orders.create(parsed); } @Patch(':id/transmit') transmit(@Param('id', ParseUUIDPipe) id: string): Promise { return this.orders.transmit(id); } @Patch(':id/approve') approve( @Param('id', ParseUUIDPipe) id: string, @Body() body: AprovarPedidoDto, ): Promise { const role = this.cls.get('role') ?? 'rep'; if (role === 'rep') throw new ForbiddenException('Apenas supervisores podem aprovar pedidos'); const parsed = AprovarPedidoSchema.parse(body) as AprovarPedido; return this.orders.approve(id, parsed); } @Patch(':id/reject') reject( @Param('id', ParseUUIDPipe) id: string, @Body() body: RecusarPedidoDto, ): Promise { const role = this.cls.get('role') ?? 'rep'; if (role === 'rep') throw new ForbiddenException('Apenas supervisores podem recusar pedidos'); const parsed = RecusarPedidoSchema.parse(body) as RecusarPedido; return this.orders.reject(id, parsed); } @Get('erp/:idPedido') findOneErp(@Param('idPedido', ParseIntPipe) idPedido: number): Promise { return this.orders.findOneErp(idPedido); } @Get(':id') findOne(@Param('id', ParseUUIDPipe) id: string): Promise { return this.orders.findOne(id); } }