From c5859dba6cdd0361e462fcde76c34a0ccc55a828 Mon Sep 17 00:00:00 2001 From: ghost2023 Date: Fri, 5 Jun 2026 09:47:46 +0300 Subject: [PATCH] feat(bookings): Implement document upload API for DRAFT bookings --- .../src/modules/bookings/bookings.controller.ts | 12 ++++++++++++ .../src/modules/bookings/bookings.service.ts | 15 +++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/apps/edr-freight-api/src/modules/bookings/bookings.controller.ts b/apps/edr-freight-api/src/modules/bookings/bookings.controller.ts index 03c5cfde4..367aab41f 100644 --- a/apps/edr-freight-api/src/modules/bookings/bookings.controller.ts +++ b/apps/edr-freight-api/src/modules/bookings/bookings.controller.ts @@ -147,6 +147,18 @@ export class BookingsController { return this.bookingsService.remove(id); } + @Post(':id/documents') + @UseInterceptors(AnyFilesInterceptor()) + @ApiConsumes('multipart/form-data') + @ApiOperation({ summary: 'Upload documents for a booking (DRAFT only)' }) + async uploadDocuments( + @Param('id', ParseUUIDPipe) id: string, + @UploadedFiles() files: Express.Multer.File[], + ) { + const booking = await this.bookingsService.uploadDocuments(id, files ?? []); + return this.transitionService.enrichBookingResponse(booking); + } + @Post(':id/generate-price') @ApiOperation({ summary: 'Generate price preview (DRAFT only)' }) @ApiOkResponse({ type: GeneratePriceResponseDto }) diff --git a/apps/edr-freight-api/src/modules/bookings/bookings.service.ts b/apps/edr-freight-api/src/modules/bookings/bookings.service.ts index 89085f144..b18a2600b 100644 --- a/apps/edr-freight-api/src/modules/bookings/bookings.service.ts +++ b/apps/edr-freight-api/src/modules/bookings/bookings.service.ts @@ -452,6 +452,21 @@ export class BookingsService { return this.findById(booking.id); } + /** Upload documents for a DRAFT booking. */ + async uploadDocuments( + id: string, + files: Express.Multer.File[], + ): Promise { + const booking = await this.findById(id); + if (booking.status !== 'DRAFT') { + throw new BadRequestException( + 'Documents can only be uploaded for DRAFT bookings', + ); + } + await this.filesService.uploadMany(id, 'bookings', files); + return this.findById(id); + } + async remove(id: string): Promise { const booking = await this.findById(id); if (booking.status !== 'DRAFT') {