up permisssions

This commit is contained in:
2026-07-02 21:31:02 +03:30
parent c22103a3a5
commit 28ccef030e
6 changed files with 37 additions and 68 deletions
+21 -21
View File
@@ -10,7 +10,7 @@ export enum PermissionEnum {
// invoice // invoice
VIEW_INVOICES = 'view_invoices', VIEW_INVOICES = 'view_invoices',
CREATE_INVOICE = 'create_invoice', CREATE_INVOICE = 'create_invoice',
UPDATE_INVOICE = 'update_invoice', UPDATE_INVOICE = 'update_invoice',
DELETE_INVOICE = 'delete_invoice', DELETE_INVOICE = 'delete_invoice',
@@ -39,8 +39,8 @@ export enum PermissionEnum {
MANAGE_SETTINGS = 'manage_settings', MANAGE_SETTINGS = 'manage_settings',
CREATE_PRINT = 'create_print', CREATE_PRINT_FORM = 'create_print_form',
VIEW_PRINT = 'view_print', VIEW_PRINT_FORM = 'view_print_form',
MANAGE_LEARNINGS = 'manage_learnings', MANAGE_LEARNINGS = 'manage_learnings',
MANAGE_CRITICISMS = 'manage_criticisms', MANAGE_CRITICISMS = 'manage_criticisms',
@@ -69,24 +69,24 @@ export const PermissionTitles: Record<PermissionEnum, string> = {
[PermissionEnum.MANAGE_PAYMENTS]: 'مدیریت پرداخت‌ها', [PermissionEnum.MANAGE_PAYMENTS]: 'مدیریت پرداخت‌ها',
[PermissionEnum.MANAGE_SETTINGS]: 'مدیریت تنظیمات', [PermissionEnum.MANAGE_SETTINGS]: 'مدیریت تنظیمات',
[PermissionEnum.VIEW_REQUESTS]: "مشاهده همه درخواست سفارش ها", [PermissionEnum.VIEW_REQUESTS]: "مشاهده همه درخواست سفارش ها",
[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]: "", [PermissionEnum.DELETE_ORDER]: "حدف سفارش",
[PermissionEnum.CREATE_PRINT]: "ایجاد فرم چاپ برای سفارش", [PermissionEnum.CREATE_PRINT_FORM]: "ایجاد فرم چاپ جدید برای سفارش",
[PermissionEnum.VIEW_PRINT]: دیریت فرم چاپ", [PermissionEnum.VIEW_PRINT_FORM]: شاهده همه فرم های چاپ",
[PermissionEnum.MANAGE_LEARNINGS]: "مدیریت آموزش‌ها", [PermissionEnum.MANAGE_LEARNINGS]: "مدیریت آموزش‌ها",
[PermissionEnum.MANAGE_CRITICISMS]: "مدیریت انتقادها و پیشنهادها", [PermissionEnum.MANAGE_CRITICISMS]: "مدیریت انتقادها و پیشنهادها",
[PermissionEnum.MANAGE_ANNOUNCEMENTS]: "مدیریت اطلاعیه‌ها", [PermissionEnum.MANAGE_ANNOUNCEMENTS]: "مدیریت اعلان‌ها",
[PermissionEnum.MANAGE_TICKETS]: "مدیریت تیکتها", [PermissionEnum.MANAGE_TICKETS]: "مدیریت تیکت ها",
[PermissionEnum.NEW_REQUEST_NOTIFICATION]: "", [PermissionEnum.CREATE_USER]: "ایجاد کاربر جدید",
[PermissionEnum.NEW_PAYMENT_NOTIFICATION]: "", [PermissionEnum.UPDATE_USER]: "ویرایش کاربر",
[PermissionEnum.CREATE_USER]: "", [PermissionEnum.DELETE_USER]: "حدف کاربر",
[PermissionEnum.UPDATE_USER]: "", [PermissionEnum.VIEW_USERS]: "مشاهده همه کاربران",
[PermissionEnum.DELETE_USER]: "", [PermissionEnum.NEW_REQUEST_NOTIFICATION]: "اعلان جدید برای درخواست سفارش",
[PermissionEnum.VIEW_USERS]: "", [PermissionEnum.NEW_PAYMENT_NOTIFICATION]: "اعلان جدید برای پرداخت",
[PermissionEnum.NEW_TICKET_NOTIFICATION]: "" [PermissionEnum.NEW_TICKET_NOTIFICATION]: "اعلان جدید برای تیکت",
}; };
+1 -1
View File
@@ -137,7 +137,7 @@ export class AdminService {
return admins return admins
} }
async hasPermissions(adminId: string, permissionNames: PermissionEnum[]): Promise<PermissionEnum[]> { async ownedPermissions(adminId: string, permissionNames: PermissionEnum[]): Promise<PermissionEnum[]> {
if (permissionNames.length === 0) return [] if (permissionNames.length === 0) return []
const admin = await this.adminRepository.findOne( const admin = await this.adminRepository.findOne(
@@ -55,7 +55,7 @@ export class OrderController {
// Permission handled inside service // Permission handled inside service
@Get('admin/orders') @Get('admin/orders')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(PermissionEnum.VIEW_ORDERS) // @Permissions(PermissionEnum.VIEW_ORDERS)
@ApiOperation({ summary: 'Get all orders with pagination and filters' }) @ApiOperation({ summary: 'Get all orders with pagination and filters' })
findAllAsAdmin(@Query() dto: FindOrdersDto, @AdminId() adminId: string) { findAllAsAdmin(@Query() dto: FindOrdersDto, @AdminId() adminId: string) {
return this.orderService.findOrdersAsAdmin(adminId, dto); return this.orderService.findOrdersAsAdmin(adminId, dto);
@@ -106,7 +106,7 @@ export class OrderController {
@Post('admin/orders/:orderId/print') @Post('admin/orders/:orderId/print')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(PermissionEnum.CREATE_PRINT) @Permissions(PermissionEnum.CREATE_PRINT_FORM)
@ApiOperation({ summary: 'Create order print' }) @ApiOperation({ summary: 'Create order print' })
@ApiOkResponse({ description: 'Order print created or updated' }) @ApiOkResponse({ description: 'Order print created or updated' })
createPrint(@Param('orderId') orderId: string, @Body() body: CreateOrderPrintDto) { createPrint(@Param('orderId') orderId: string, @Body() body: CreateOrderPrintDto) {
@@ -115,7 +115,7 @@ export class OrderController {
@Get('admin/orders/:orderId/print') @Get('admin/orders/:orderId/print')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(PermissionEnum.VIEW_PRINT) @Permissions(PermissionEnum.VIEW_PRINT_FORM)
@ApiOperation({ summary: 'Get order print' }) @ApiOperation({ summary: 'Get order print' })
@ApiOkResponse({ description: 'Order print details' }) @ApiOkResponse({ description: 'Order print details' })
getPrint(@Param('orderId') orderId: string) { getPrint(@Param('orderId') orderId: string) {
+5 -6
View File
@@ -130,18 +130,17 @@ export class OrderService {
} }
async findOrdersAsAdmin(adminId: string, dto: FindOrdersDto): Promise<PaginatedResult<Order>> { async findOrdersAsAdmin(adminId: string, dto: FindOrdersDto): Promise<PaginatedResult<Order>> {
const permissions = await this.adminService.hasPermissions(adminId, const permissions = await this.adminService.ownedPermissions(adminId,
[PermissionEnum.VIEW_ORDERS, PermissionEnum.VIEW_ASSIGNED_ORDERS]) [PermissionEnum.VIEW_ORDERS, PermissionEnum.VIEW_ASSIGNED_ORDERS])
if (permissions.includes(PermissionEnum.VIEW_ORDERS)) { if (permissions.includes(PermissionEnum.VIEW_ORDERS)) {
return this.orderRepository.findAllPaginated(dto) return this.orderRepository.findAllPaginated(dto)
} else if (permissions.includes(PermissionEnum.VIEW_ASSIGNED_ORDERS)) { } else if (permissions.includes(PermissionEnum.VIEW_ASSIGNED_ORDERS)) {
return this.orderRepository.findAllPaginated({
return this.orderRepository.findAllPaginated({ ...dto,
designerId: adminId, designerId: adminId,
...dto
}) })
} else { } else {
@@ -208,7 +207,7 @@ export class OrderService {
async updateStatus(orderId: string, adminId: string, dto: UpdateStatusDto): Promise<Order> { async updateStatus(orderId: string, adminId: string, dto: UpdateStatusDto): Promise<Order> {
const permissions = await this.adminService.hasPermissions(adminId, const permissions = await this.adminService.ownedPermissions(adminId,
[PermissionEnum.VIEW_ORDERS, PermissionEnum.VIEW_ASSIGNED_ORDERS]) [PermissionEnum.VIEW_ORDERS, PermissionEnum.VIEW_ASSIGNED_ORDERS])
if (permissions.includes(PermissionEnum.VIEW_ORDERS)) { if (permissions.includes(PermissionEnum.VIEW_ORDERS)) {
@@ -6,11 +6,6 @@ import { PaginatedResult } from 'src/common/interfaces/pagination.interface';
import { OrderStatusEnum } from '../interface/order.interface'; import { OrderStatusEnum } from '../interface/order.interface';
import { FindOrdersDto } from '../dto/find-orders.dto'; import { FindOrdersDto } from '../dto/find-orders.dto';
// class FindOrdersOpts extends FindOrdersDto {
// adminId?: string;
// };
@Injectable() @Injectable()
export class OrderRepository extends EntityRepository<Order> { export class OrderRepository extends EntityRepository<Order> {
constructor(readonly em: EntityManager) { constructor(readonly em: EntityManager) {
@@ -76,7 +71,6 @@ export class OrderRepository extends EntityRepository<Order> {
} }
} }
// Search by order number or user information // Search by order number or user information
if (search) { if (search) {
const searchPattern = `%${search}%`; const searchPattern = `%${search}%`;
@@ -103,31 +97,7 @@ export class OrderRepository extends EntityRepository<Order> {
populate: ['user', 'product', 'designer'], populate: ['user', 'product', 'designer'],
}); });
// Collect all (orderId, productId) pairs for efficient review lookup
// const orderproductPairs: Array<{ orderId: string; productId: bigint }> = [];
// for (const order of data) {
// for (const item of order.items.getItems()) {
// if (item.product?.id) {
// orderproductPairs.push({ orderId: order.id, productId: item.product.id });
// }
// }
// }
// Map reviewIds to products
// for (const order of data) {
// for (const item of order.items.getItems()) {
// if (item.product) {
// const key = `${order.id}-${item.product.id}`;
// // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
// const product = item.product as any;
// // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
// }
// }
// }
const totalPages = Math.ceil(total / limit); const totalPages = Math.ceil(total / limit);
return { return {
@@ -20,7 +20,7 @@ export class PrintFormController {
/*================================ Section ========================== */ /*================================ Section ========================== */
@Post('section') @Post('section')
@Permissions(PermissionEnum.VIEW_PRINT) @Permissions(PermissionEnum.VIEW_PRINT_FORM)
@ApiOperation({ summary: 'Create section' }) @ApiOperation({ summary: 'Create section' })
create(@Body() dto: CreateSectionDto) { create(@Body() dto: CreateSectionDto) {
return this.printFormService.create(dto); return this.printFormService.create(dto);
@@ -28,27 +28,27 @@ export class PrintFormController {
@Get('section') @Get('section')
@ApiOperation({ summary: 'find all section' }) @ApiOperation({ summary: 'find all section' })
@Permissions(PermissionEnum.VIEW_PRINT) @Permissions(PermissionEnum.VIEW_PRINT_FORM)
findAll() { findAll() {
return this.printFormService.findAll(); return this.printFormService.findAll();
} }
@Get('section/:id') @Get('section/:id')
@ApiOperation({ summary: 'Find one section' }) @ApiOperation({ summary: 'Find one section' })
@Permissions(PermissionEnum.VIEW_PRINT) @Permissions(PermissionEnum.VIEW_PRINT_FORM)
findOne(@Param('id') id: string) { findOne(@Param('id') id: string) {
return this.printFormService.finOrFail(id); return this.printFormService.finOrFail(id);
} }
@Patch('section/:id') @Patch('section/:id')
@Permissions(PermissionEnum.VIEW_PRINT) @Permissions(PermissionEnum.VIEW_PRINT_FORM)
@ApiOperation({ summary: 'Update section' }) @ApiOperation({ summary: 'Update section' })
update(@Param('id') id: string, @Body() dto: UpdateSectionDto) { update(@Param('id') id: string, @Body() dto: UpdateSectionDto) {
return this.printFormService.update(id, dto); return this.printFormService.update(id, dto);
} }
@Delete('section/:id') @Delete('section/:id')
@Permissions(PermissionEnum.VIEW_PRINT) @Permissions(PermissionEnum.VIEW_PRINT_FORM)
@ApiOperation({ summary: 'Remove section' }) @ApiOperation({ summary: 'Remove section' })
remove(@Param('id') id: string) { remove(@Param('id') id: string) {
return this.printFormService.remove(id); return this.printFormService.remove(id);
@@ -56,7 +56,7 @@ export class PrintFormController {
/// front end must send form with its selected fields /// front end must send form with its selected fields
@Post('pdf') @Post('pdf')
@Permissions(PermissionEnum.VIEW_PRINT) @Permissions(PermissionEnum.VIEW_PRINT_FORM)
@ApiOperation({ summary: 'Create Pdf' }) @ApiOperation({ summary: 'Create Pdf' })
async createPDf(@Body() dto: CreateSectionDto, @Res() res: FastifyReply) { async createPDf(@Body() dto: CreateSectionDto, @Res() res: FastifyReply) {
const html = ` const html = `