From 1bef27364d987428ff7bf72e797177472e07c5a5 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Wed, 18 Feb 2026 22:44:53 +0330 Subject: [PATCH] request --- src/common/enums/permission.enum.ts | 15 ++-- .../order/controllers/order.controller.ts | 2 +- src/modules/request/request.controller.ts | 36 +++++++++- src/modules/request/request.service.ts | 69 ++++++++++++++++++- 4 files changed, 113 insertions(+), 9 deletions(-) diff --git a/src/common/enums/permission.enum.ts b/src/common/enums/permission.enum.ts index 8927ea5..e561f5a 100644 --- a/src/common/enums/permission.enum.ts +++ b/src/common/enums/permission.enum.ts @@ -3,8 +3,11 @@ export enum PermissionEnum { MANAGE_PRODUCTS = 'manage_products', MANAGE_CATEGORIES = 'manage_categories', - // Order Management - VIEW_All_REQUEST_ORDERS = 'view_all_request_order', + // Request Management + VIEW_REQUESTS = 'view_requests', + DELETE_REQUEST = 'delete_request', + UPDATE_REQUEST = 'update_request', + VIEW_All_INVOICED_ORDERS = 'view_all_invoiced_orders', VIEW_MY_ASSIGNED_INVOICED_REQUESTS = 'view_my_assigned_invoiced_requests', @@ -12,7 +15,7 @@ export enum PermissionEnum { CREATE_ORDER = 'create_order', UPDATE_ORDER = 'update_order', ASSIGN_DESIGNER = 'assign_designer', - CREATE_ORDER_PRINT='create_order_print', + CREATE_ORDER_PRINT = 'create_order_print', CHANGE_ORDER_STATUS = 'change_order_status', REMOVE_ORDER = 'remove_order', @@ -55,8 +58,10 @@ export const PermissionTitles: Record = { [PermissionEnum.MANAGE_SETTINGS]: 'مدیریت تنظیمات', [PermissionEnum.MANAGE_FORM_BUILDER]: "مدیریت فرم بیلدر", [PermissionEnum.MANAGE_PRINT]: 'مدیریت فرم پرینت', - [PermissionEnum.VIEW_All_REQUEST_ORDERS]: "مشاهده همه درخواست سفارش ها", + [PermissionEnum.VIEW_REQUESTS]: "مشاهده همه درخواست سفارش ها", [PermissionEnum.VIEW_All_INVOICED_ORDERS]: "مشاهده همه سفارشات پیش فاکتور شده", [PermissionEnum.VIEW_MY_ASSIGNED_INVOICED_REQUESTS]: "مشاهده همه پیش فاکتور های من", - [PermissionEnum.CREATE_ORDER_PRINT]: "ایجاد سفارش چاپ" + [PermissionEnum.CREATE_ORDER_PRINT]: "ایجاد سفارش چاپ", + [PermissionEnum.DELETE_REQUEST]: "", + [PermissionEnum.UPDATE_REQUEST]: "" }; diff --git a/src/modules/order/controllers/order.controller.ts b/src/modules/order/controllers/order.controller.ts index 51caba5..450c660 100644 --- a/src/modules/order/controllers/order.controller.ts +++ b/src/modules/order/controllers/order.controller.ts @@ -104,7 +104,7 @@ export class OrderController { @Get('admin/orders/request') @UseGuards(AdminAuthGuard) - @Permissions(PermissionEnum.VIEW_All_REQUEST_ORDERS) + @Permissions(PermissionEnum.VIEW_REQUESTS) @ApiOperation({ summary: 'Get all order requests with pagination and filters' }) findOrderRequestAsAdmin(@Query() dto: FindOrdersDto) { return this.orderService.findOrderRequestsAsAdmin(dto); diff --git a/src/modules/request/request.controller.ts b/src/modules/request/request.controller.ts index 7a3bee5..ba8d141 100644 --- a/src/modules/request/request.controller.ts +++ b/src/modules/request/request.controller.ts @@ -5,6 +5,9 @@ import { UpdateRequestDto } from './dto/update-request.dto'; import { AuthGuard } from '../auth/guards/auth.guard'; import { UserId } from 'src/common/decorators'; import { FindRequestsDto } from './dto/find-requests.dto'; +import { AdminAuthGuard } from '../auth/guards/adminAuth.guard'; +import { Permissions } from 'src/common/decorators/permissions.decorator'; +import { PermissionEnum } from 'src/common/enums/permission.enum'; @Controller() export class RequestController { @@ -30,8 +33,8 @@ export class RequestController { @Patch('public/request/:id') @UseGuards(AuthGuard) - update(@Param('id') id: string, @Body() updateRequestDto: UpdateRequestDto, @UserId() userId: string) { - return this.requestService.update(id, updateRequestDto, userId); + update(@Param('id') id: string, @Body() dto: UpdateRequestDto, @UserId() userId: string) { + return this.requestService.update(id, dto, userId); } @Delete('public/request/:id') @@ -39,4 +42,33 @@ export class RequestController { remove(@Param('id') id: string, @UserId() userId: string) { return this.requestService.remove(id, userId); } + + //-----------------ADmin Routes ------------------- + @Get('admin/request') + @UseGuards(AdminAuthGuard) + @Permissions(PermissionEnum.VIEW_REQUESTS) + findAllAsAdmin(@Query() dto: FindRequestsDto) { + return this.requestService.findAllAsAdmin(dto); + } + + @Get('admin/request/:id') + @UseGuards(AdminAuthGuard) + @Permissions(PermissionEnum.VIEW_REQUESTS) + findOneAsAdmin(@Param('id') id: string) { + return this.requestService.findOneAsAdmin(id); + } + + @Patch('public/request/:id') + @UseGuards(AdminAuthGuard) + @Permissions(PermissionEnum.UPDATE_REQUEST) + updateRequestAsAdmin(@Param('id') id: string, @Body() dto: UpdateRequestDto) { + return this.requestService.updateAsAdmin(id, dto); + } + + @Delete('public/request/:id') + @UseGuards(AdminAuthGuard) + @Permissions(PermissionEnum.DELETE_REQUEST) + removeRequestAsAdmin(@Param('id') id: string) { + return this.requestService.removeAsAdmin(id); + } } diff --git a/src/modules/request/request.service.ts b/src/modules/request/request.service.ts index a5ff5d6..4a4c738 100644 --- a/src/modules/request/request.service.ts +++ b/src/modules/request/request.service.ts @@ -17,7 +17,7 @@ export class RequestService { private readonly requestRepository: RequestRepository, private readonly userService: UserService, private readonly productService: ProductService, - ) {} + ) { } async create(createRequestDto: CreateRequestDto, userId: string) { const { items } = createRequestDto; @@ -53,6 +53,10 @@ export class RequestService { return this.requestRepository.findAllPaginated({ userId, ...dto }); } + findAllAsAdmin(dto: FindRequestsDto) { + return this.requestRepository.findAllPaginated(dto); + } + async findOne(id: string, userId: string) { const request = await this.requestRepository.findOne( { id, user: { id: userId } }, @@ -64,6 +68,17 @@ export class RequestService { return request; } + async findOneAsAdmin(id: string) { + const request = await this.requestRepository.findOne( + { id }, + { populate: ['items', 'items.product', 'user'] }, + ); + if (!request) { + throw new NotFoundException('Request not found'); + } + return request; + } + async update(id: string, updateRequestDto: UpdateRequestDto, userId: string) { const request = await this.requestRepository.findOne( { id, user: { id: userId } }, @@ -73,6 +88,46 @@ export class RequestService { throw new NotFoundException('Request not found'); } + if (request.status !== RequestStatusEnum.PENDING) { + throw new BadRequestException('Only pending requests can be updated'); + } + + const { items } = updateRequestDto; + if (items?.length) { + return this.em.transactional(async (em) => { + request.items.removeAll(); + await em.flush(); + + for (const item of items) { + const product = await this.productService.findOneOrFail(item.productId); + const requestItem = em.create(RequestItem, { + request, + product, + quantity: item.quantity, + attributes: item.attributes, + description: item.description, + attachments: item.attachments, + }); + request.items.add(requestItem); + } + + await em.flush(); + return request; + }); + } + + return request; + } + + async updateAsAdmin(id: string, updateRequestDto: UpdateRequestDto) { + const request = await this.requestRepository.findOne( + { id }, + { populate: ['items', 'items.product', 'user'] }, + ); + if (!request) { + throw new NotFoundException('Request not found'); + } + const { items } = updateRequestDto; if (items?.length) { return this.em.transactional(async (em) => { @@ -114,4 +169,16 @@ export class RequestService { await this.em.flush(); return request; } + + async removeAsAdmin(id: string) { + const request = await this.requestRepository.findOne( + { id }, + ); + if (!request) { + throw new NotFoundException('Request not found'); + } + request.deletedAt = new Date(); + await this.em.flush(); + return request; + } }