Files
negareh-api/src/modules/order/controllers/order.controller.ts
T
morteza 915266f7b4
deploy to danak / build_and_deploy (push) Has been cancelled
designers
2026-07-17 19:18:37 +03:30

139 lines
5.2 KiB
TypeScript

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();
}
}