import { Body, Controller, Get, HttpCode, Param, ParseUUIDPipe, Patch, Post, Put, } from '@nestjs/common'; import { AssigneesUpdateSchema, ChecklistPatchSchema, CommentCreateSchema, ConsumePartSchema, LaborTimeCreateSchema, ReportUpsertSchema, TransitionRequestSchema, WorkOrderCreateSchema, type AssigneesUpdate, type ChecklistPatch, type CommentCreate, type ConsumePart, type LaborTimeCreate, type ReportUpsert, type TransitionRequest, type WorkOrderCreate, } from '@siop/shared'; import { AuthenticatedUser, CurrentUser, } from '../auth/current-user.decorator'; import { ZodValidationPipe } from '../common/zod-validation.pipe'; import { RequirePermission } from '../permissions/require-permission.decorator'; import { WorkOrdersService } from './work-orders.service'; @Controller('work-orders') export class WorkOrdersController { constructor(private readonly workOrders: WorkOrdersService) {} @Get() @RequirePermission('WORK_ORDERS', 'view') list(@CurrentUser() user: AuthenticatedUser) { return this.workOrders.list(user); } @Get(':id') @RequirePermission('WORK_ORDERS', 'view') get(@Param('id', ParseUUIDPipe) id: string, @CurrentUser() user: AuthenticatedUser) { return this.workOrders.get(id, user); } @Post() @RequirePermission('WORK_ORDERS', 'create') create( @Body(new ZodValidationPipe(WorkOrderCreateSchema)) body: WorkOrderCreate, @CurrentUser() user: AuthenticatedUser, ) { return this.workOrders.create(body, user); } @Post(':id/transition') @HttpCode(200) // le contrat : 200, l'état change — rien n'est « créé » @RequirePermission('WORK_ORDERS', 'edit') transition( @Param('id', ParseUUIDPipe) id: string, @Body(new ZodValidationPipe(TransitionRequestSchema)) body: TransitionRequest, @CurrentUser() user: AuthenticatedUser, ) { return this.workOrders.transition(id, body, user); } @Post(':id/comments') @RequirePermission('WORK_ORDERS', 'edit') comment( @Param('id', ParseUUIDPipe) id: string, @Body(new ZodValidationPipe(CommentCreateSchema)) body: CommentCreate, @CurrentUser() user: AuthenticatedUser, ) { return this.workOrders.comment(id, body.message, user); } @Put(':id/assignees') @RequirePermission('WORK_ORDERS', 'edit') setAssignees( @Param('id', ParseUUIDPipe) id: string, @Body(new ZodValidationPipe(AssigneesUpdateSchema)) body: AssigneesUpdate, @CurrentUser() user: AuthenticatedUser, ) { return this.workOrders.setAssignees(id, body, user); } @Put(':id/report') @RequirePermission('WORK_ORDERS', 'edit') upsertReport( @Param('id', ParseUUIDPipe) id: string, @Body(new ZodValidationPipe(ReportUpsertSchema)) body: ReportUpsert, @CurrentUser() user: AuthenticatedUser, ) { return this.workOrders.upsertReport(id, body, user); } @Post(':id/consume-part') @RequirePermission('WORK_ORDERS', 'edit') consumePart( @Param('id', ParseUUIDPipe) id: string, @Body(new ZodValidationPipe(ConsumePartSchema)) body: ConsumePart, @CurrentUser() user: AuthenticatedUser, ) { return this.workOrders.consumePart(id, body, user); } @Post(':id/labor') @RequirePermission('WORK_ORDERS', 'edit') addLabor( @Param('id', ParseUUIDPipe) id: string, @Body(new ZodValidationPipe(LaborTimeCreateSchema)) body: LaborTimeCreate, @CurrentUser() user: AuthenticatedUser, ) { return this.workOrders.addLabor(id, body, user); } @Patch(':id/checklist/:itemId') @RequirePermission('WORK_ORDERS', 'edit') patchChecklist( @Param('id', ParseUUIDPipe) id: string, @Param('itemId', ParseUUIDPipe) itemId: string, @Body(new ZodValidationPipe(ChecklistPatchSchema)) body: ChecklistPatch, @CurrentUser() user: AuthenticatedUser, ) { return this.workOrders.patchChecklist(id, itemId, body, user); } }