order
This commit is contained in:
@@ -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);
|
||||
// }
|
||||
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user