This commit is contained in:
2026-02-20 11:38:21 +03:30
parent 5d4154d135
commit b2be6ba772
5 changed files with 75 additions and 82 deletions
+7 -9
View File
@@ -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, string> = {
[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, string> = {
[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]: ""
};
@@ -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);
// }
}
-6
View File
@@ -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()
+40 -5
View File
@@ -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<PaginatedResult<Order>> {
return this.orderRepository.findAllPaginated({
userId,
...dto
})
}
async findOrdersAsAdmin(dto: FindOrdersDto): Promise<PaginatedResult<Order>> {
return this.orderRepository.findAllPaginated(dto)
}
async getOrderAsUser(userId: string, orderId: string): Promise<Order> {
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<Order> {
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<Order> {
const order = await this.findOrderOrFail(id);
@@ -150,4 +170,19 @@ export class OrderService {
await this.em.flush();
return order;
}
async softDeleteOrder(orderId: string): Promise<void> {
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
}
}
@@ -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<Order> {
userId,
from,
to,
isInvoiced,
designerId
} = opts;