diff --git a/src/modules/orders/controllers/orders.controller.ts b/src/modules/orders/controllers/orders.controller.ts index 80e1d6c..797584d 100644 --- a/src/modules/orders/controllers/orders.controller.ts +++ b/src/modules/orders/controllers/orders.controller.ts @@ -1,5 +1,5 @@ -import { Controller, Get, Post, Param, UseGuards, Patch, Query } from '@nestjs/common'; -import { ApiTags, ApiOperation, ApiBearerAuth, ApiParam, ApiHeader } from '@nestjs/swagger'; +import { Controller, Get, Post, Param, UseGuards, Patch, Query, Body } from '@nestjs/common'; +import { ApiTags, ApiOperation, ApiBearerAuth, ApiParam, ApiHeader, ApiBody } from '@nestjs/swagger'; import { OrdersService } from '../providers/orders.service'; import { AuthGuard } from '../../auth/guards/auth.guard'; import { UserId } from '../../../common/decorators/user-id.decorator'; @@ -8,16 +8,17 @@ import { AdminAuthGuard } from '../../auth/guards/adminAuth.guard'; import { FindOrdersDto } from '../dto/find-orders.dto'; import { OrderStatus } from '../interface/order.interface'; import { API_HEADER_SLUG } from 'src/common/constants/index'; +import { UpdateOrderStatusDto } from '../dto/update-order-status.dto'; @ApiTags('orders') @ApiBearerAuth() -@ApiHeader(API_HEADER_SLUG) @Controller() export class OrdersController { constructor(private readonly ordersService: OrdersService) {} @UseGuards(AuthGuard) @Post('public/checkout') + @ApiHeader(API_HEADER_SLUG) @ApiOperation({ summary: 'Checkout : create order and payment record' }) checkout(@UserId() userId: string, @RestId() restaurantId: string) { return this.ordersService.checkout(userId, restaurantId); @@ -25,6 +26,7 @@ export class OrdersController { @UseGuards(AuthGuard) @Get('public/orders') + @ApiHeader(API_HEADER_SLUG) @ApiOperation({ summary: 'Get all orders with pagination and filters' }) findAll(@RestId() restId: string, @Query() dto: FindOrdersDto, @UserId() userId: string) { return this.ordersService.findAllForUser(restId, dto, userId); @@ -33,6 +35,7 @@ export class OrdersController { @UseGuards(AuthGuard) @ApiOperation({ summary: 'Get an order By id for User' }) @ApiParam({ name: 'orderId', description: 'Order ID' }) + @ApiHeader(API_HEADER_SLUG) @Get('public/orders/:orderId') findOne(@Param('orderId') orderId: string, @RestId() restId: string) { return this.ordersService.findOne(orderId, restId); @@ -45,12 +48,20 @@ export class OrdersController { description: 'Order status', enum: OrderStatus, }) + @ApiHeader(API_HEADER_SLUG) + @ApiBody({ type: UpdateOrderStatusDto }) @ApiOperation({ summary: 'Update status of an order By User' }) @ApiParam({ name: 'id', description: 'Order ID' }) - cancelOrder(@Param('id') id: string, @Param('status') status: OrderStatus, @RestId() restId: string) { - return this.ordersService.changeOrderStatus(id, restId, status, 'user'); + cancelOrder( + @Body() dto: UpdateOrderStatusDto, + @Param('id') orderId: string, + @Param('status') status: OrderStatus, + @RestId() restId: string, + ) { + return this.ordersService.changeOrderStatus(orderId, restId, status, 'user', dto.desc); } + /******************** Admin Routes **********************/ @UseGuards(AdminAuthGuard) @Get('admin/orders') @ApiOperation({ summary: 'Get all orders with pagination and filters' }) @@ -70,13 +81,19 @@ export class OrdersController { @Patch('admin/orders/:orderId/:status') @ApiOperation({ summary: 'Update an order status' }) @ApiParam({ name: 'orderId', description: 'Order ID' }) + @ApiBody({ type: UpdateOrderStatusDto }) @ApiParam({ name: 'status', description: 'Order status', enum: OrderStatus, }) - updateStatus(@Param('orderId') orderId: string, @Param('status') status: OrderStatus, @RestId() restId: string) { - return this.ordersService.changeOrderStatus(orderId, restId, status, 'admin'); + updateStatus( + @Param('orderId') orderId: string, + @Body() dto: UpdateOrderStatusDto, + @Param('status') status: OrderStatus, + @RestId() restId: string, + ) { + return this.ordersService.changeOrderStatus(orderId, restId, status, 'admin', dto.desc); } // @UseGuards(AdminAuthGuard) diff --git a/src/modules/orders/dto/update-order-status.dto.ts b/src/modules/orders/dto/update-order-status.dto.ts new file mode 100644 index 0000000..e4026bf --- /dev/null +++ b/src/modules/orders/dto/update-order-status.dto.ts @@ -0,0 +1,10 @@ +import { ApiPropertyOptional } from '@nestjs/swagger'; +import { IsOptional, IsString } from 'class-validator'; +export class UpdateOrderStatusDto { + @ApiPropertyOptional({ + description: 'Change Status description', + }) + @IsOptional() + @IsString() + desc?: string; +} diff --git a/src/modules/orders/interface/order.interface.ts b/src/modules/orders/interface/order.interface.ts index e33af8d..88d294c 100644 --- a/src/modules/orders/interface/order.interface.ts +++ b/src/modules/orders/interface/order.interface.ts @@ -26,7 +26,6 @@ export enum OrderStatus { READY = 'ready', SHIPPED = 'shipped', COMPLETED = 'completed', - CANCELED = 'canceled', } diff --git a/src/modules/orders/providers/orders.service.ts b/src/modules/orders/providers/orders.service.ts index 98a6af7..65decd3 100644 --- a/src/modules/orders/providers/orders.service.ts +++ b/src/modules/orders/providers/orders.service.ts @@ -260,13 +260,16 @@ export class OrdersService { restId: string, toStatus: OrderStatus, ref: StatusTransitionRef, + desc?: string, ): Promise { const order = await this.getOrderOrFail(orderId, restId); this.assertStatusTransitionAllowed(order, toStatus, ref); order.status = toStatus; + order.history.push({ status: toStatus, changedAt: new Date(), desc: desc || null }); await this.em.persistAndFlush(order); + this.eventEmitter.emit( OrderStatusChangedEvent.name, new OrderStatusChangedEvent(