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_All_INVOICED_ORDERS = 'view_all_invoiced_orders',
VIEW_MY_ASSIGNED_INVOICED_REQUESTS = 'view_my_assigned_invoiced_requests', 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', CREATE_ORDER = 'create_order',
UPDATE_ORDER = 'update_order', UPDATE_ORDER = 'update_order',
ASSIGN_DESIGNER = 'assign_designer', ASSIGN_DESIGNER = 'assign_designer',
CREATE_ORDER_PRINT = 'create_order_print', DELETE_ORDER = 'delete_order',
CHANGE_ORDER_STATUS = 'change_order_status',
REMOVE_ORDER = 'remove_order',
// User & Admin Management // User & Admin Management
MANAGE_ADMINS = 'manage_admins', MANAGE_ADMINS = 'manage_admins',
@@ -52,10 +51,9 @@ export const PermissionTitles: Record<PermissionEnum, string> = {
[PermissionEnum.CREATE_ORDER]: 'ایجاد سفارش جدید', [PermissionEnum.CREATE_ORDER]: 'ایجاد سفارش جدید',
[PermissionEnum.UPDATE_ORDER]: 'ویرایش سفارش ', [PermissionEnum.UPDATE_ORDER]: 'ویرایش سفارش ',
[PermissionEnum.VIEW_All_ORDERS]: "مشاهده همه سفارش ها", [PermissionEnum.VIEW_ORDERS]: "مشاهده همه سفارش ها",
[PermissionEnum.VIEW_MY_ORDERS]: "مشاهده سفارش های من",
[PermissionEnum.ASSIGN_DESIGNER]: "اضافه کردن طراح به سفارش", [PermissionEnum.ASSIGN_DESIGNER]: "اضافه کردن طراح به سفارش",
[PermissionEnum.CHANGE_ORDER_STATUS]: "تغییر وضعیت سفارش",
[PermissionEnum.REMOVE_ORDER]: "حذف سفارش",
[PermissionEnum.MANAGE_ADMINS]: 'مدیریت مدیران', [PermissionEnum.MANAGE_ADMINS]: 'مدیریت مدیران',
[PermissionEnum.MANAGE_USERS]: 'مدیریت کاربران', [PermissionEnum.MANAGE_USERS]: 'مدیریت کاربران',
@@ -67,11 +65,11 @@ export const PermissionTitles: Record<PermissionEnum, string> = {
[PermissionEnum.VIEW_REQUESTS]: "مشاهده همه درخواست سفارش ها", [PermissionEnum.VIEW_REQUESTS]: "مشاهده همه درخواست سفارش ها",
[PermissionEnum.VIEW_All_INVOICED_ORDERS]: "مشاهده همه سفارشات پیش فاکتور شده", [PermissionEnum.VIEW_All_INVOICED_ORDERS]: "مشاهده همه سفارشات پیش فاکتور شده",
[PermissionEnum.VIEW_MY_ASSIGNED_INVOICED_REQUESTS]: "مشاهده همه پیش فاکتور های من", [PermissionEnum.VIEW_MY_ASSIGNED_INVOICED_REQUESTS]: "مشاهده همه پیش فاکتور های من",
[PermissionEnum.CREATE_ORDER_PRINT]: "ایجاد سفارش چاپ",
[PermissionEnum.DELETE_REQUEST]: "", [PermissionEnum.DELETE_REQUEST]: "",
[PermissionEnum.UPDATE_REQUEST]: "", [PermissionEnum.UPDATE_REQUEST]: "",
[PermissionEnum.VIEW_INVOICES]: "", [PermissionEnum.VIEW_INVOICES]: "",
[PermissionEnum.CREATE_INVOICE]: "", [PermissionEnum.CREATE_INVOICE]: "",
[PermissionEnum.UPDATE_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 { AuthGuard } from '../../auth/guards/auth.guard';
import { UserId } from '../../../common/decorators/user-id.decorator'; import { UserId } from '../../../common/decorators/user-id.decorator';
import { FindOrdersDto } from '../dto/find-orders.dto'; import { FindOrdersDto } from '../dto/find-orders.dto';
import { import { CreateOrderAsAdminDto } from '../dto/create-order.dto';
CreateOrderAsAdminDto,
} from '../dto/create-order.dto';
import { UpdateOrderAsAdminDto } from '../dto/update-order.dto'; import { UpdateOrderAsAdminDto } from '../dto/update-order.dto';
import { AdminId } from 'src/common/decorators/admin-id.decorator'; import { AdminId } from 'src/common/decorators/admin-id.decorator';
import { AdminAuthGuard } from 'src/modules/auth/guards/adminAuth.guard'; import { AdminAuthGuard } from 'src/modules/auth/guards/adminAuth.guard';
import { Permissions } from 'src/common/decorators/permissions.decorator'; import { Permissions } from 'src/common/decorators/permissions.decorator';
import { PermissionEnum } from 'src/common/enums/permission.enum'; import { PermissionEnum } from 'src/common/enums/permission.enum';
import { AssignDesignerDto } from '../dto/assign-designer.dto';
@ApiTags('orders') @ApiTags('orders')
@ApiBearerAuth() @ApiBearerAuth()
@@ -21,19 +20,19 @@ export class OrderController {
// ================== Public =================== // ================== Public ===================
// @Get('public/orders') @Get('public/orders')
// @UseGuards(AuthGuard) @UseGuards(AuthGuard)
// @ApiOperation({ summary: 'Get all orders with pagination and filters' }) @ApiOperation({ summary: 'Get all orders with pagination and filters' })
// findAll(@Query() dto: FindOrdersDto, @UserId() userId: string) { findAll(@Query() dto: FindOrdersDto, @UserId() userId: string) {
// return this.orderService.findOrdersAsUser(userId, dto); return this.orderService.findOrdersAsUser(userId, dto);
// } }
// @Get('public/orders/:id') @Get('public/orders/:id')
// @UseGuards(AuthGuard) @UseGuards(AuthGuard)
// @ApiOperation({ summary: 'order detail' }) @ApiOperation({ summary: 'order detail' })
// orderDetail(@Param('id') orderId: string, @UserId() userId: string) { orderDetail(@Param('id') orderId: string, @UserId() userId: string) {
// return this.orderService.getOrderAsUser(userId, orderId); return this.orderService.getOrderAsUser(userId, orderId);
// } }
/*========================== Admin Routes =====================*/ /*========================== Admin Routes =====================*/
@@ -62,55 +61,24 @@ export class OrderController {
return this.orderService.updateOrderAsAdmin(id, dto); return this.orderService.updateOrderAsAdmin(id, dto);
} }
// @Delete('admin/orders/:orderId') @Delete('admin/orders/:orderId')
// @UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
// @Permissions(PermissionEnum.REMOVE_ORDER) @Permissions(PermissionEnum.DELETE_ORDER)
// @ApiOperation({ summary: 'Hard Delete Order ' }) @ApiOperation({ summary: 'Soft Delete Order ' })
// hardDelete(@Param('orderId') orderId: string) { softDeleteOrder(@Param('orderId') orderId: string) {
// return this.orderService.hardDeleteOrder(orderId); return this.orderService.softDeleteOrder(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/:id/items/:itemId') @Post('admin/orders/:orderId/designer')
// @UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
// @Permissions(PermissionEnum.UPDATE_ORDER) @Permissions(PermissionEnum.ASSIGN_DESIGNER)
// @ApiOperation({ summary: 'Remove order Item ' }) @ApiOperation({ summary: 'Assign Order Designer ' })
// removeOrderItemAdAdmin( assignDesigner(@Param('orderId') orderId: string, @Body() body: AssignDesignerDto) {
// @Param('id') orderId: string, return this.orderService.assignDesigner(orderId, body.designerId);
// @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);
// }
// @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 { Type, Transform } from 'class-transformer';
import { ApiPropertyOptional } from '@nestjs/swagger'; import { ApiPropertyOptional } from '@nestjs/swagger';
import { OrderStatusEnum } from '../interface/order.interface'; import { OrderStatusEnum } from '../interface/order.interface';
import { PaymentStatusEnum } from '../../payment/interface/payment';
const sortOrderOptions = ['asc', 'desc'] as const; const sortOrderOptions = ['asc', 'desc'] as const;
type SortOrder = (typeof sortOrderOptions)[number]; type SortOrder = (typeof sortOrderOptions)[number];
@@ -45,11 +44,6 @@ export class FindOrdersDto {
@IsEnum(OrderStatusEnum, { each: true }) @IsEnum(OrderStatusEnum, { each: true })
statuses?: OrderStatusEnum[]; statuses?: OrderStatusEnum[];
// @ApiPropertyOptional({ enum: PaymentStatusEnum })
// @IsOptional()
// @IsEnum(PaymentStatusEnum)
// paymentStatus?: PaymentStatusEnum;
@ApiPropertyOptional() @ApiPropertyOptional()
@IsOptional() @IsOptional()
@IsString() @IsString()
+39 -4
View File
@@ -25,6 +25,7 @@ import { User } from 'src/modules/user/entities/user.entity';
import { OrderType } from '../entities/order-type.entity'; import { OrderType } from '../entities/order-type.entity';
import { Product } from 'src/modules/product/entities/product.entity'; import { Product } from 'src/modules/product/entities/product.entity';
import { InvoiceItem } from 'src/modules/invoice/entities/invoice-item.entity'; import { InvoiceItem } from 'src/modules/invoice/entities/invoice-item.entity';
import { PaginatedResult } from 'src/common/interfaces/pagination.interface';
@Injectable() @Injectable()
export class OrderService { export class OrderService {
@@ -50,12 +51,12 @@ export class OrderService {
let user: User | null = null let user: User | null = null
if (dto.invoiceItemId) { 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) { if (!invoiceItem) {
throw new NotFoundException(`Invoice item with ID ${dto.invoiceItemId} not found.`); throw new NotFoundException(`Invoice item with ID ${dto.invoiceItemId} not found.`);
} }
user=invoiceItem.invoice.user user = invoiceItem.invoice.user
} }
if (!invoiceItem) { if (!invoiceItem) {
@@ -70,7 +71,7 @@ export class OrderService {
} }
} }
if(!user){ if (!user) {
throw new NotFoundException(`User not found`); throw new NotFoundException(`User not found`);
} }
@@ -104,6 +105,25 @@ export class OrderService {
return order; 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> { async findOrderOrFail(id: string): Promise<Order> {
const order = await this.em.findOne(Order, { id }, { populate: ['user', 'type', 'product', 'creator'] }); const order = await this.em.findOne(Order, { id }, { populate: ['user', 'type', 'product', 'creator'] });
if (!order) { if (!order) {
@@ -111,7 +131,7 @@ export class OrderService {
} }
return order; return order;
} }
// user should not be change able
async updateOrderAsAdmin(id: string, dto: UpdateOrderAsAdminDto): Promise<Order> { async updateOrderAsAdmin(id: string, dto: UpdateOrderAsAdminDto): Promise<Order> {
const order = await this.findOrderOrFail(id); const order = await this.findOrderOrFail(id);
@@ -150,4 +170,19 @@ export class OrderService {
await this.em.flush(); await this.em.flush();
return order; 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 { class FindOrdersOpts extends FindOrdersDto {
userId?: string; userId?: string;
isInvoiced?: boolean;
designerId?: string designerId?: string
}; };
@@ -30,7 +29,6 @@ export class OrderRepository extends EntityRepository<Order> {
userId, userId,
from, from,
to, to,
isInvoiced,
designerId designerId
} = opts; } = opts;