From b2be6ba7727a89e7c59431a6305e8154e9e09090 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Fri, 20 Feb 2026 11:38:21 +0330 Subject: [PATCH] order --- src/common/enums/permission.enum.ts | 16 ++-- .../order/controllers/order.controller.ts | 88 ++++++------------- src/modules/order/dto/find-orders.dto.ts | 6 -- src/modules/order/providers/order.service.ts | 45 ++++++++-- .../order/repositories/order.repository.ts | 2 - 5 files changed, 75 insertions(+), 82 deletions(-) diff --git a/src/common/enums/permission.enum.ts b/src/common/enums/permission.enum.ts index c94982e..584f5cf 100644 --- a/src/common/enums/permission.enum.ts +++ b/src/common/enums/permission.enum.ts @@ -17,13 +17,12 @@ export enum PermissionEnum { VIEW_All_INVOICED_ORDERS = 'view_all_invoiced_orders', VIEW_MY_ASSIGNED_INVOICED_REQUESTS = 'view_my_assigned_invoiced_requests', - VIEW_All_ORDERS = 'view_all_orders', + VIEW_ORDERS = 'view_orders', + VIEW_MY_ORDERS = 'view_my_orders', CREATE_ORDER = 'create_order', UPDATE_ORDER = 'update_order', ASSIGN_DESIGNER = 'assign_designer', - CREATE_ORDER_PRINT = 'create_order_print', - CHANGE_ORDER_STATUS = 'change_order_status', - REMOVE_ORDER = 'remove_order', + DELETE_ORDER = 'delete_order', // User & Admin Management MANAGE_ADMINS = 'manage_admins', @@ -52,10 +51,9 @@ export const PermissionTitles: Record = { [PermissionEnum.CREATE_ORDER]: 'ایجاد سفارش جدید', [PermissionEnum.UPDATE_ORDER]: 'ویرایش سفارش ', - [PermissionEnum.VIEW_All_ORDERS]: "مشاهده همه سفارش ها", + [PermissionEnum.VIEW_ORDERS]: "مشاهده همه سفارش ها", + [PermissionEnum.VIEW_MY_ORDERS]: "مشاهده سفارش های من", [PermissionEnum.ASSIGN_DESIGNER]: "اضافه کردن طراح به سفارش", - [PermissionEnum.CHANGE_ORDER_STATUS]: "تغییر وضعیت سفارش", - [PermissionEnum.REMOVE_ORDER]: "حذف سفارش", [PermissionEnum.MANAGE_ADMINS]: 'مدیریت مدیران', [PermissionEnum.MANAGE_USERS]: 'مدیریت کاربران', @@ -67,11 +65,11 @@ export const PermissionTitles: Record = { [PermissionEnum.VIEW_REQUESTS]: "مشاهده همه درخواست سفارش ها", [PermissionEnum.VIEW_All_INVOICED_ORDERS]: "مشاهده همه سفارشات پیش فاکتور شده", [PermissionEnum.VIEW_MY_ASSIGNED_INVOICED_REQUESTS]: "مشاهده همه پیش فاکتور های من", - [PermissionEnum.CREATE_ORDER_PRINT]: "ایجاد سفارش چاپ", [PermissionEnum.DELETE_REQUEST]: "", [PermissionEnum.UPDATE_REQUEST]: "", [PermissionEnum.VIEW_INVOICES]: "", [PermissionEnum.CREATE_INVOICE]: "", [PermissionEnum.UPDATE_INVOICE]: "", - [PermissionEnum.DELETE_INVOICE]: "" + [PermissionEnum.DELETE_INVOICE]: "", + [PermissionEnum.DELETE_ORDER]: "" }; diff --git a/src/modules/order/controllers/order.controller.ts b/src/modules/order/controllers/order.controller.ts index 791d782..ec23782 100644 --- a/src/modules/order/controllers/order.controller.ts +++ b/src/modules/order/controllers/order.controller.ts @@ -4,14 +4,13 @@ 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 { 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'; @ApiTags('orders') @ApiBearerAuth() @@ -21,19 +20,19 @@ export class OrderController { // ================== 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') + @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/:id') + @UseGuards(AuthGuard) + @ApiOperation({ summary: 'order detail' }) + orderDetail(@Param('id') orderId: string, @UserId() userId: string) { + return this.orderService.getOrderAsUser(userId, orderId); + } /*========================== Admin Routes =====================*/ @@ -62,55 +61,24 @@ export class OrderController { return this.orderService.updateOrderAsAdmin(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 ================ - - - // @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); - // } + @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); + } - // @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); - // } + @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.designerId); + } - // @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); - // } } diff --git a/src/modules/order/dto/find-orders.dto.ts b/src/modules/order/dto/find-orders.dto.ts index 941a134..59846eb 100644 --- a/src/modules/order/dto/find-orders.dto.ts +++ b/src/modules/order/dto/find-orders.dto.ts @@ -11,7 +11,6 @@ import { import { Type, Transform } from 'class-transformer'; import { ApiPropertyOptional } from '@nestjs/swagger'; import { OrderStatusEnum } from '../interface/order.interface'; -import { PaymentStatusEnum } from '../../payment/interface/payment'; const sortOrderOptions = ['asc', 'desc'] as const; type SortOrder = (typeof sortOrderOptions)[number]; @@ -45,11 +44,6 @@ export class FindOrdersDto { @IsEnum(OrderStatusEnum, { each: true }) statuses?: OrderStatusEnum[]; - // @ApiPropertyOptional({ enum: PaymentStatusEnum }) - // @IsOptional() - // @IsEnum(PaymentStatusEnum) - // paymentStatus?: PaymentStatusEnum; - @ApiPropertyOptional() @IsOptional() @IsString() diff --git a/src/modules/order/providers/order.service.ts b/src/modules/order/providers/order.service.ts index 6af83fa..dd4f28b 100644 --- a/src/modules/order/providers/order.service.ts +++ b/src/modules/order/providers/order.service.ts @@ -25,6 +25,7 @@ import { User } from 'src/modules/user/entities/user.entity'; import { OrderType } from '../entities/order-type.entity'; import { Product } from 'src/modules/product/entities/product.entity'; import { InvoiceItem } from 'src/modules/invoice/entities/invoice-item.entity'; +import { PaginatedResult } from 'src/common/interfaces/pagination.interface'; @Injectable() export class OrderService { @@ -50,12 +51,12 @@ export class OrderService { let user: User | null = null if (dto.invoiceItemId) { - invoiceItem = await this.em.findOne(InvoiceItem, { id: dto.invoiceItemId },{populate:['invoice','invoice.user']}); + invoiceItem = await this.em.findOne(InvoiceItem, { id: dto.invoiceItemId }, { populate: ['invoice', 'invoice.user'] }); if (!invoiceItem) { throw new NotFoundException(`Invoice item with ID ${dto.invoiceItemId} not found.`); } - user=invoiceItem.invoice.user + user = invoiceItem.invoice.user } if (!invoiceItem) { @@ -70,10 +71,10 @@ export class OrderService { } } - if(!user){ + if (!user) { throw new NotFoundException(`User not found`); } - + const creator = await this.adminService.findOrFail(adminId); const type = await this.em.findOne(OrderType, { id: dto.typeId }); @@ -104,6 +105,25 @@ export class OrderService { return order; } + async findOrdersAsUser(userId: string, dto: FindOrdersDto): Promise> { + return this.orderRepository.findAllPaginated({ + userId, + ...dto + }) + } + + async findOrdersAsAdmin(dto: FindOrdersDto): Promise> { + return this.orderRepository.findAllPaginated(dto) + } + + async getOrderAsUser(userId: string, orderId: string): Promise { + const order = await this.findOrderOrFail(orderId) + if (order.user.id !== userId) { + throw new BadRequestException("this order doesnt belongs to you") + } + return order + } + async findOrderOrFail(id: string): Promise { const order = await this.em.findOne(Order, { id }, { populate: ['user', 'type', 'product', 'creator'] }); if (!order) { @@ -111,7 +131,7 @@ export class OrderService { } return order; } - // user should not be change able + async updateOrderAsAdmin(id: string, dto: UpdateOrderAsAdminDto): Promise { const order = await this.findOrderOrFail(id); @@ -150,4 +170,19 @@ export class OrderService { await this.em.flush(); return order; } + + async softDeleteOrder(orderId: string): Promise { + const order = await this.findOrderOrFail(orderId); + order.deletedAt = new Date(); + await this.em.flush(); + } + + async assignDesigner(orderId: string, designerId: string) { + const order = await this.findOrderOrFail(orderId) + const designer = await this.adminService.findOrFail(designerId) + + order.designer = designer + await this.em.flush() + return order + } } diff --git a/src/modules/order/repositories/order.repository.ts b/src/modules/order/repositories/order.repository.ts index 657f08c..c044040 100644 --- a/src/modules/order/repositories/order.repository.ts +++ b/src/modules/order/repositories/order.repository.ts @@ -9,7 +9,6 @@ import { FindOrdersDto } from '../dto/find-orders.dto'; class FindOrdersOpts extends FindOrdersDto { userId?: string; - isInvoiced?: boolean; designerId?: string }; @@ -30,7 +29,6 @@ export class OrderRepository extends EntityRepository { userId, from, to, - isInvoiced, designerId } = opts;