import { Controller, Get, Post, Param, UseGuards, Patch, Query, Body, Delete } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiBearerAuth, ApiOkResponse } 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 { CreateOrderAsAdminDto } from '../dto/create-order.dto'; import { UpdateOrderAsAdminDto } from '../dto/update-order.dto'; import { AdminId } from 'src/common/decorators/admin-id.decorator'; import { AdminAuthGuard } from 'src/modules/auth/guards/adminAuth.guard'; import { Permissions } from 'src/common/decorators/permissions.decorator'; import { PermissionEnum } from 'src/common/enums/permission.enum'; import { AssignDesignerDto } from '../dto/assign-designer.dto'; import { UpdateStatusDto } from '../dto/update-status.dto'; import { CreateOrderPrintDto } from '../dto/create-order-print.dto'; @ApiTags('orders') @ApiBearerAuth() @Controller() export class OrderController { constructor(private readonly orderService: OrderService) { } // ================== Public =================== @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); } @Get('public/orders/stats') @UseGuards(AuthGuard) @ApiOperation({ summary: 'Get User Orders stats' }) getStats( @UserId() userId: string) { return this.orderService.getStats(userId); } /*========================== 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); } // Permission handled inside service @Get('admin/orders') @UseGuards(AdminAuthGuard) // @Permissions(PermissionEnum.VIEW_ORDERS) @ApiOperation({ summary: 'Get all orders with pagination and filters' }) findAllAsAdmin(@Query() dto: FindOrdersDto, @AdminId() adminId: string) { return this.orderService.findOrdersAsAdmin(adminId, dto); } @Get('admin/orders/tab-counts') @UseGuards(AdminAuthGuard) @ApiOperation({ summary: 'Get order tab counts for admin order list' }) getAdminOrderTabCounts(@Query() dto: FindOrdersDto, @AdminId() adminId: string) { return this.orderService.getAdminOrderTabCounts(adminId, dto); } @Get('admin/orders/:id') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.VIEW_ORDERS) @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.updateOrderAsAdmin(id, dto); } @Delete('admin/orders/:orderId') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.DELETE_ORDER) @ApiOperation({ summary: 'Soft Delete Order ' }) softDeleteOrder(@Param('orderId') orderId: string) { return this.orderService.softDeleteOrder(orderId); } @Post('admin/orders/:orderId/designer') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.ASSIGN_DESIGNER) @ApiOperation({ summary: 'Assign Order Designer ' }) assignDesigner(@Param('orderId') orderId: string, @Body() body: AssignDesignerDto) { return this.orderService.assignDesigner(orderId, body); } // Permission handled inside service @Post('admin/orders/:orderId/status') @UseGuards(AdminAuthGuard) @ApiOperation({ summary: 'Assign Order Designer ' }) updateStatus(@Param('orderId') orderId: string,@AdminId()adminId:string, @Body() dto: UpdateStatusDto) { return this.orderService.updateStatus(orderId,adminId, dto); } @Post('admin/orders/:orderId/print') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.CREATE_PRINT_FORM) @ApiOperation({ summary: 'Create order print' }) @ApiOkResponse({ description: 'Order print created or updated' }) createPrint(@Param('orderId') orderId: string, @Body() body: CreateOrderPrintDto) { return this.orderService.createPrint(orderId, body); } @Get('admin/orders/:orderId/print') @UseGuards(AdminAuthGuard) @Permissions(PermissionEnum.VIEW_PRINT_FORM) @ApiOperation({ summary: 'Get order print' }) @ApiOkResponse({ description: 'Order print details' }) getPrint(@Param('orderId') orderId: string) { return this.orderService.getPrint(orderId); } @Get('admin/orders/stats') @UseGuards(AdminAuthGuard) @ApiOperation({ summary: 'Get Admin Orders stats' }) getAdminStats() { return this.orderService.getAdminStats(); } }