import { Controller, Get, Post, Param, UseGuards, Patch, Query, Body, Delete } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiBearerAuth } from '@nestjs/swagger'; import { OrderService } from '../providers/order.service'; import { AuthGuard } from '../../auth/guards/auth.guard'; import { UserId } from '../../../common/decorators/user-id.decorator'; import { FindOrdersDto } from '../dto/find-orders.dto'; import { CreateOrderAsUSerDto, CreateOrderItemAsUserDto, CreateOrderItemDtoAsAdmin, CreateOrderAsAdminDto } from '../dto/create-order.dto'; import { AdminId } from 'src/common/decorators/admin-id.decorator'; import { AssignDesignerDto } from '../dto/assign-designer.dto'; import { UpdateOrderItemDtoAsAdmin, UpdateOrderItemDtoAsUser } from '../dto/update-order-item.dto'; import { UpdateOrderAsAdminDto } from '../dto/update-order.dto'; import { AdminAuthGuard } from 'src/modules/auth/guards/adminAuth.guard'; import { CreatePrintFormDto } from '../dto/create-print-form.dto'; import { FindOrderItemsDto } from '../dto/find-order-items.dto'; import { Permissions } from 'src/common/decorators/permissions.decorator'; import { PermissionEnum } from 'src/common/enums/permission.enum'; @ApiTags('orders') @ApiBearerAuth() @Controller() export class OrderController { constructor(private readonly orderService: OrderService) { } // ================== Public =================== @Post('public/orders') @UseGuards(AuthGuard) @ApiOperation({ summary: 'create order ' }) createOrder(@UserId() userId: string, @Body() body: CreateOrderAsUSerDto) { return this.orderService.createOrderAsUser(userId, body); } @Delete('public/orders/:id') @UseGuards(AuthGuard) @ApiOperation({ summary: 'Delete order ' }) deleteOrder(@Param('id') orderId: string, @UserId() userId: string) { return this.orderService.removeOrderAsUser(userId, orderId); } @Get('public/orders') @UseGuards(AuthGuard) @ApiOperation({ summary: 'Get all orders with pagination and filters' }) findAll(@Query() dto: FindOrdersDto, @UserId() userId: string) { return this.orderService.findOrdersAsUser(userId, dto); } @Get('public/orders/:id') @UseGuards(AuthGuard) @ApiOperation({ summary: 'order detail' }) orderDetail(@Param('id') orderId: string, @UserId() userId: string) { return this.orderService.getOrderAsUser(userId, orderId); } @Post('public/orders/:id/item') @UseGuards(AuthGuard) @ApiOperation({ summary: 'add item to order ' }) addOrderItem(@Param('id') orderId: string, @UserId() userId: string, @Body() body: CreateOrderItemAsUserDto) { return this.orderService.addOrderItemAsUser(userId, orderId, body); } @Patch('public/orders/:id/item/:itemId') @UseGuards(AuthGuard) @ApiOperation({ summary: 'Update order item ' }) updateOrderItem(@Param('id') orderId: string, @UserId() userId: string, @Param('itemId') itemId: string, @Body() body: UpdateOrderItemDtoAsUser) { return this.orderService.updateOrderItemAsUser(userId, orderId, itemId, body); } @Patch('public/orders/:orderId/items/:orderItemId/confirm') @UseGuards(AuthGuard) @ApiOperation({ summary: 'Confirm Invoice Item ' }) confirmOrderItem( @Param('orderId') orderId: string, @Param('orderItemId') orderItemId: string, @UserId() userId: string ) { return this.orderService.confirmOrderItem(userId, orderId, orderItemId); } @Delete('public/orders/:orderId/items/:orderItemId') @UseGuards(AuthGuard) @ApiOperation({ summary: 'Remove order Item ' }) removeOrderItem( @Param('orderId') orderId: string, @Param('orderItemId') orderItemId: string, @UserId() userId: string ) { return this.orderService.removeOrderItemAsUser(userId, orderId, orderItemId); } /*========================== Admin Routes =====================*/ @Post('admin/orders') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.CREATE_ORDER) @ApiOperation({ summary: 'create order ' }) createOrderAsAdmin(@AdminId() adminId: string, @Body() body: CreateOrderAsAdminDto) { return this.orderService.createOrderAsAdmin(adminId, body); } @Get('admin/orders/request') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.VIEW_REQUESTS) @ApiOperation({ summary: 'Get all order requests with pagination and filters' }) findOrderRequestAsAdmin(@Query() dto: FindOrdersDto) { return this.orderService.findOrderRequestsAsAdmin(dto); } // this route permission is handled inside service @Get('admin/orders/invoiced') @UseGuards(AdminAuthGuard) @ApiOperation({ summary: 'Get all invoiced orders with pagination and filters' }) findInvoicedOrdersAsAdmin(@Query() dto: FindOrdersDto, @AdminId() adminId: string) { return this.orderService.findInvoicedOrdersAsAdmin(adminId, dto); } @Get('admin/orders/:id') @UseGuards(AdminAuthGuard) @ApiOperation({ summary: 'order detail' }) orderDetailAsAdmin(@Param('id') orderId: string) { return this.orderService.findOrderOrFail(orderId); } @Patch('admin/orders/:id') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.UPDATE_ORDER) @ApiOperation({ summary: 'Update Order ' }) updateOrder(@Param('id') id: string, @Body() dto: UpdateOrderAsAdminDto) { return this.orderService.updateOrderAsAdmin2(id, dto); } @Delete('admin/orders/:orderId') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.REMOVE_ORDER) @ApiOperation({ summary: 'Hard Delete Order ' }) hardDelete(@Param('orderId') orderId: string) { return this.orderService.hardDeleteOrder(orderId); } // =============== Order Item ================ @Get('admin/orders/item/print') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.VIEW_All_ORDERS) @ApiOperation({ summary: 'get print orders' }) getPrintOrders(@Body() dto: FindOrderItemsDto) { return this.orderService.findPrintOrderItemsAsAdmin(dto); } @Get('admin/orders/item/:id') @UseGuards(AdminAuthGuard) @ApiOperation({ summary: 'order item detail' }) getOrderItem(@Param('id') itemId: string) { return this.orderService.findOrderItemOrFailByItemId(itemId); } @Post('admin/orders/:orderId/item/:itemId/designer') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.ASSIGN_DESIGNER) @ApiOperation({ summary: 'Assign Order Designer ' }) assignDesigner(@Param('orderId') orderId: string, @Param('itemId') itemId: string, @Body() body: AssignDesignerDto) { return this.orderService.assignDesigner(orderId, itemId, body.designerId); } @Patch('admin/orders/:id/item/:itemId/print') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.CREATE_ORDER_PRINT) @ApiOperation({ summary: 'Create Print form for order item' }) createPrintForm(@Param('id') id: string, @Param('itemId') itemId: string, @Body() dto: CreatePrintFormDto) { return this.orderService.createPrintForm(id, itemId, dto); } // @Post('admin/orders/:orderId/invoice') // @UseGuards(AdminAuthGuard) // @ApiOperation({ summary: 'Create Order invoice ' }) // createInvoice(@Param('orderId') orderId: string) { // return this.orderService.createInvoice(orderId); // } @Delete('admin/orders/:id/items/:itemId') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.UPDATE_ORDER) @ApiOperation({ summary: 'Remove order Item ' }) removeOrderItemAdAdmin( @Param('id') orderId: string, @Param('itemId') itemId: string, ) { return this.orderService.removeOrderItemAsAdmin(orderId, itemId); } @Post('admin/orders/:id/item') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.UPDATE_ORDER) @ApiOperation({ summary: 'add item to order ' }) addOrderItemAsAdmin(@Param('id') orderId: string, @Body() body: CreateOrderItemDtoAsAdmin) { return this.orderService.addOrderItemAsAdmin(orderId, body); } @Patch('admin/orders/:id/item/:itemId') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.UPDATE_ORDER) @ApiOperation({ summary: 'Update order item' }) updateOrderItemAsAdmin(@Param('id') orderId: string, @Param('itemId') itemId: string, @Body() body: UpdateOrderItemDtoAsAdmin) { return this.orderService.updateOrderItemAsAdmin(orderId, itemId, body); } }