permission

This commit is contained in:
2026-02-04 20:43:28 +03:30
parent 14eeba4cfd
commit d4ae03fa4f
24 changed files with 175 additions and 110 deletions
+26 -19
View File
@@ -1,14 +1,18 @@
export enum Permission { export enum PermissionEnum {
MANAGE_PRODUCTS = 'manage_products', MANAGE_PRODUCTS = 'manage_products',
MANAGE_CATEGORIES = 'manage_categories', MANAGE_CATEGORIES = 'manage_categories',
// Order Management // Order Management
VIEW_All_REQUEST_ORDERS = 'view_all_request_order',
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_All_ORDERS = 'view_all_orders',
VIEW_MY_ASSIGNED_ORDERS='view_my_assigned_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',
CHANGE_ORDER_STATUS = 'change_order_status', CHANGE_ORDER_STATUS = 'change_order_status',
REMOVE_ORDER = 'remove_order', REMOVE_ORDER = 'remove_order',
@@ -33,23 +37,26 @@ export enum Permission {
* Permission titles mapping (Farsi) * Permission titles mapping (Farsi)
* Maps permission names to their Farsi titles * Maps permission names to their Farsi titles
*/ */
export const PermissionTitles: Record<Permission, string> = { export const PermissionTitles: Record<PermissionEnum, string> = {
[Permission.MANAGE_PRODUCTS]: 'مدیریت محصولات', [PermissionEnum.MANAGE_PRODUCTS]: 'مدیریت محصولات',
[Permission.MANAGE_CATEGORIES]: 'مدیریت دسته‌بندی‌ها', [PermissionEnum.MANAGE_CATEGORIES]: 'مدیریت دسته‌بندی‌ها',
[Permission.CREATE_ORDER]: 'ایجاد سفارش جدید', [PermissionEnum.CREATE_ORDER]: 'ایجاد سفارش جدید',
[Permission.UPDATE_ORDER]: 'ویرایش سفارش ', [PermissionEnum.UPDATE_ORDER]: 'ویرایش سفارش ',
[Permission.VIEW_All_ORDERS]: "مشاهده همه سفارش ها", [PermissionEnum.VIEW_All_ORDERS]: "مشاهده همه سفارش ها",
[Permission.ASSIGN_DESIGNER]: "اضافه کردن طراح به سفارش", [PermissionEnum.ASSIGN_DESIGNER]: "اضافه کردن طراح به سفارش",
[Permission.CHANGE_ORDER_STATUS]: "تغییر وضعیت سفارش", [PermissionEnum.CHANGE_ORDER_STATUS]: "تغییر وضعیت سفارش",
[Permission.REMOVE_ORDER]: "حذف سفارش", [PermissionEnum.REMOVE_ORDER]: "حذف سفارش",
[Permission.MANAGE_ADMINS]: 'مدیریت مدیران', [PermissionEnum.MANAGE_ADMINS]: 'مدیریت مدیران',
[Permission.MANAGE_USERS]: 'مدیریت کاربران', [PermissionEnum.MANAGE_USERS]: 'مدیریت کاربران',
[Permission.MANAGE_ROLES]: 'مدیریت نقش‌ها', [PermissionEnum.MANAGE_ROLES]: 'مدیریت نقش‌ها',
[Permission.MANAGE_PAYMENTS]: 'مدیریت پرداخت‌ها', [PermissionEnum.MANAGE_PAYMENTS]: 'مدیریت پرداخت‌ها',
[Permission.MANAGE_SETTINGS]: 'مدیریت تنظیمات', [PermissionEnum.MANAGE_SETTINGS]: 'مدیریت تنظیمات',
[Permission.MANAGE_FORM_BUILDER]: "مدیریت فرم بیلدر", [PermissionEnum.MANAGE_FORM_BUILDER]: "مدیریت فرم بیلدر",
[Permission.MANAGE_PRINT]: 'مدیریت فرم پرینت', [PermissionEnum.MANAGE_PRINT]: 'مدیریت فرم پرینت',
[Permission.VIEW_MY_ASSIGNED_ORDERS]: "مشاهده سفارشات اساین شده به من", [PermissionEnum.VIEW_All_REQUEST_ORDERS]: "مشاهده همه درخواست سفارش ها",
[PermissionEnum.VIEW_All_INVOICED_ORDERS]: "مشاهده همه سفارشات پیش فاکتور شده",
[PermissionEnum.VIEW_MY_ASSIGNED_INVOICED_REQUESTS]: "مشاهده همه پیش فاکتور های من",
[PermissionEnum.CREATE_ORDER_PRINT]: "ایجاد سفارش چاپ"
}; };
@@ -6,7 +6,7 @@ import { ApiTags, ApiOperation, ApiBody, ApiBearerAuth, ApiParam } from '@nestjs
import { AdminAuthGuard } from 'src/modules/auth/guards/adminAuth.guard'; import { AdminAuthGuard } from 'src/modules/auth/guards/adminAuth.guard';
import { AdminId } from 'src/common/decorators/admin-id.decorator'; import { AdminId } from 'src/common/decorators/admin-id.decorator';
import { Admin } from '../entities/admin.entity'; import { Admin } from '../entities/admin.entity';
import { Permission } from 'src/common/enums/permission.enum'; import { PermissionEnum } from 'src/common/enums/permission.enum';
import { Permissions } from 'src/common/decorators/permissions.decorator'; import { Permissions } from 'src/common/decorators/permissions.decorator';
// TODO : if admin deleted then recreated it must be doable // TODO : if admin deleted then recreated it must be doable
@@ -14,7 +14,7 @@ import { Permissions } from 'src/common/decorators/permissions.decorator';
@ApiTags('admin') @ApiTags('admin')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@ApiBearerAuth() @ApiBearerAuth()
@Permissions(Permission.MANAGE_ADMINS) @Permissions(PermissionEnum.MANAGE_ADMINS)
export class AdminController { export class AdminController {
constructor(private readonly adminService: AdminService) { } constructor(private readonly adminService: AdminService) { }
@@ -8,6 +8,7 @@ import { CreateAdminDto } from '../dto/create-admin.dto';
import { AdminRepository } from '../repositories/admin.repository'; import { AdminRepository } from '../repositories/admin.repository';
import { RoleRepository } from 'src/modules/roles/respository/role.repository'; import { RoleRepository } from 'src/modules/roles/respository/role.repository';
import { NotificationPreference } from 'src/modules/notification/entities/notification-preference.entity'; import { NotificationPreference } from 'src/modules/notification/entities/notification-preference.entity';
import { PermissionEnum } from 'src/common/enums/permission.enum';
@Injectable() @Injectable()
export class AdminService { export class AdminService {
@@ -153,4 +154,20 @@ export class AdminService {
} }
return admins return admins
} }
async hasPermission(adminId: string, permissionName: PermissionEnum): Promise<boolean> {
const has = await this.adminRepository.count({
id: adminId,
role: {
permissions: {
$some: {
name: permissionName
}
}
}
})
return !!has
}
} }
@@ -1,6 +1,7 @@
import { EntityManager, EntityRepository } from '@mikro-orm/postgresql'; import { EntityManager, EntityRepository } from '@mikro-orm/postgresql';
import { Admin } from '../entities/admin.entity'; import { Admin } from '../entities/admin.entity';
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { PermissionEnum } from 'src/common/enums/permission.enum';
@Injectable() @Injectable()
export class AdminRepository extends EntityRepository<Admin> { export class AdminRepository extends EntityRepository<Admin> {
@@ -10,7 +11,7 @@ export class AdminRepository extends EntityRepository<Admin> {
super(em, Admin); super(em, Admin);
} }
async findAdminsWithPermission(permission: string): Promise<Admin[]> { async findAdminsWithPermission(permission: PermissionEnum): Promise<Admin[]> {
const admins = await this.em.find( const admins = await this.em.find(
Admin, Admin,
{ role: { permissions: { name: permission } } }, { role: { permissions: { name: permission } } },
+2 -2
View File
@@ -13,7 +13,7 @@ import { JwtService } from '@nestjs/jwt';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { IAdminTokenPayload } from '../interfaces/IToken-payload'; import { IAdminTokenPayload } from '../interfaces/IToken-payload';
import { PERMISSIONS_KEY } from '../../../common/decorators/permissions.decorator'; import { PERMISSIONS_KEY } from '../../../common/decorators/permissions.decorator';
import { PermissionsService } from 'src/modules/roles/providers/permissions.service'; import { PermissionService } from 'src/modules/roles/providers/permissions.service';
export interface AdminAuthRequest extends Request { export interface AdminAuthRequest extends Request {
adminId: string; adminId: string;
@@ -28,7 +28,7 @@ export class AdminAuthGuard implements CanActivate {
private readonly jwtService: JwtService, private readonly jwtService: JwtService,
@Inject(ConfigService) @Inject(ConfigService)
private readonly configService: ConfigService, private readonly configService: ConfigService,
private readonly permissionsService: PermissionsService, private readonly permissionsService: PermissionService,
private readonly reflector: Reflector, private readonly reflector: Reflector,
) { } ) { }
@@ -9,7 +9,7 @@ import { UpdateFieldDto } from '../dto/update-field.dto';
import { UpdateFieldOptionDto } from '../dto/update-field-option.dto'; import { UpdateFieldOptionDto } from '../dto/update-field-option.dto';
import { FindFieldsGroupDto } from '../dto/find-field-group.dto'; import { FindFieldsGroupDto } from '../dto/find-field-group.dto';
import { Permissions } from 'src/common/decorators/permissions.decorator'; import { Permissions } from 'src/common/decorators/permissions.decorator';
import { Permission } from 'src/common/enums/permission.enum'; import { PermissionEnum } from 'src/common/enums/permission.enum';
@Controller() @Controller()
@ApiBearerAuth() @ApiBearerAuth()
@@ -31,7 +31,7 @@ export class FormBuilderController {
// ============= Admin ================= // ============= Admin =================
@Post('admin/entity/:id/field') @Post('admin/entity/:id/field')
@ApiOperation({ summary: 'Create field for entity' }) @ApiOperation({ summary: 'Create field for entity' })
@Permissions(Permission.MANAGE_FORM_BUILDER) @Permissions(PermissionEnum.MANAGE_FORM_BUILDER)
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
createField(@Body() dto: CreateFieldDto, @Param('id') entityId: string) { createField(@Body() dto: CreateFieldDto, @Param('id') entityId: string) {
return this.fieldService.create(+entityId, dto); return this.fieldService.create(+entityId, dto);
@@ -61,7 +61,7 @@ export class FormBuilderController {
@Patch('admin/entity/field/:id') @Patch('admin/entity/field/:id')
@ApiOperation({ summary: 'Update field' }) @ApiOperation({ summary: 'Update field' })
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(Permission.MANAGE_FORM_BUILDER) @Permissions(PermissionEnum.MANAGE_FORM_BUILDER)
updateField(@Param('id') id: string, @Body() dto: UpdateFieldDto) { updateField(@Param('id') id: string, @Body() dto: UpdateFieldDto) {
return this.fieldService.update(+id, dto); return this.fieldService.update(+id, dto);
} }
@@ -69,7 +69,7 @@ export class FormBuilderController {
@Delete('admin/entity/field/:id') @Delete('admin/entity/field/:id')
@ApiOperation({ summary: 'Remove field' }) @ApiOperation({ summary: 'Remove field' })
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(Permission.MANAGE_FORM_BUILDER) @Permissions(PermissionEnum.MANAGE_FORM_BUILDER)
removeField(@Param('id') id: string) { removeField(@Param('id') id: string) {
return this.fieldService.remove(+id); return this.fieldService.remove(+id);
} }
@@ -79,7 +79,7 @@ export class FormBuilderController {
@Post('admin/entity/field/:id/option') @Post('admin/entity/field/:id/option')
@ApiOperation({ summary: 'Create field Options ' }) @ApiOperation({ summary: 'Create field Options ' })
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(Permission.MANAGE_FORM_BUILDER) @Permissions(PermissionEnum.MANAGE_FORM_BUILDER)
createFieldOption(@Body() dto: CreateFieldOptionDto, @Param('id') id: string) { createFieldOption(@Body() dto: CreateFieldOptionDto, @Param('id') id: string) {
return this.fieldOptionService.create(+id, dto); return this.fieldOptionService.create(+id, dto);
} }
@@ -101,7 +101,7 @@ export class FormBuilderController {
@Patch('admin/entity/field/option/:id') @Patch('admin/entity/field/option/:id')
@ApiOperation({ summary: 'Update field Option' }) @ApiOperation({ summary: 'Update field Option' })
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(Permission.MANAGE_FORM_BUILDER) @Permissions(PermissionEnum.MANAGE_FORM_BUILDER)
updateFieldOption(@Param('id') id: string, @Body() dto: UpdateFieldOptionDto) { updateFieldOption(@Param('id') id: string, @Body() dto: UpdateFieldOptionDto) {
return this.fieldOptionService.update(+id, dto); return this.fieldOptionService.update(+id, dto);
} }
@@ -109,7 +109,7 @@ export class FormBuilderController {
@Delete('admin/entity/field/option/:id') @Delete('admin/entity/field/option/:id')
@ApiOperation({ summary: 'Renopve field Option' }) @ApiOperation({ summary: 'Renopve field Option' })
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(Permission.MANAGE_FORM_BUILDER) @Permissions(PermissionEnum.MANAGE_FORM_BUILDER)
removeFieldOption(@Param('id') id: string) { removeFieldOption(@Param('id') id: string) {
return this.fieldOptionService.remove(+id); return this.fieldOptionService.remove(+id);
} }
@@ -10,7 +10,7 @@ import { CreatePreferenceDto } from '../dto/create-preference.dto';
import { AdminId } from 'src/common/decorators/admin-id.decorator'; import { AdminId } from 'src/common/decorators/admin-id.decorator';
import { NotificationMessage } from 'src/common/enums/message.enum'; import { NotificationMessage } from 'src/common/enums/message.enum';
import { Permissions } from 'src/common/decorators/permissions.decorator'; import { Permissions } from 'src/common/decorators/permissions.decorator';
import { Permission } from 'src/common/enums/permission.enum'; import { PermissionEnum } from 'src/common/enums/permission.enum';
@ApiTags('notifications') @ApiTags('notifications')
@Controller() @Controller()
@@ -15,6 +15,8 @@ import { UpdateOrderAsAdminDto } from '../dto/update-order.dto';
import { AdminAuthGuard } from 'src/modules/auth/guards/adminAuth.guard'; import { AdminAuthGuard } from 'src/modules/auth/guards/adminAuth.guard';
import { CreatePrintFormDto } from '../dto/create-print-form.dto'; import { CreatePrintFormDto } from '../dto/create-print-form.dto';
import { FindOrderItemsDto } from '../dto/find-order-items.dto'; import { FindOrderItemsDto } from '../dto/find-order-items.dto';
import { Permissions } from 'src/common/decorators/permissions.decorator';
import { PermissionEnum } from 'src/common/enums/permission.enum';
@ApiTags('orders') @ApiTags('orders')
@ApiBearerAuth() @ApiBearerAuth()
@@ -94,6 +96,7 @@ export class OrderController {
@Post('admin/orders') @Post('admin/orders')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(PermissionEnum.CREATE_ORDER)
@ApiOperation({ summary: 'create order ' }) @ApiOperation({ summary: 'create order ' })
createOrderAsAdmin(@AdminId() adminId: string, @Body() body: CreateOrderAsAdminDto) { createOrderAsAdmin(@AdminId() adminId: string, @Body() body: CreateOrderAsAdminDto) {
return this.orderService.createOrderAsAdmin(adminId, body); return this.orderService.createOrderAsAdmin(adminId, body);
@@ -101,17 +104,18 @@ export class OrderController {
@Get('admin/orders/request') @Get('admin/orders/request')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(PermissionEnum.VIEW_All_REQUEST_ORDERS)
@ApiOperation({ summary: 'Get all order requests with pagination and filters' }) @ApiOperation({ summary: 'Get all order requests with pagination and filters' })
findOrderRequestAsAdmin(@Query() dto: FindOrdersDto) { findOrderRequestAsAdmin(@Query() dto: FindOrdersDto) {
return this.orderService.findOrderRequestsAsAdmin(dto); return this.orderService.findOrderRequestsAsAdmin(dto);
} }
// this route permission is handled inside service
@Get('admin/orders/invoiced') @Get('admin/orders/invoiced')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@ApiOperation({ summary: 'Get all invoiced orders with pagination and filters' }) @ApiOperation({ summary: 'Get all invoiced orders with pagination and filters' })
findInvoicedOrdersAsAdmin(@Query() dto: FindOrdersDto) { findInvoicedOrdersAsAdmin(@Query() dto: FindOrdersDto, @AdminId() adminId: string) {
return this.orderService.findOrderRequestsAsAdmin(dto); return this.orderService.findInvoicedOrdersAsAdmin(adminId, dto);
} }
@Get('admin/orders/:id') @Get('admin/orders/:id')
@@ -123,6 +127,7 @@ export class OrderController {
@Get('admin/orders/item/print') @Get('admin/orders/item/print')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(PermissionEnum.VIEW_All_ORDERS)
@ApiOperation({ summary: 'get print orders' }) @ApiOperation({ summary: 'get print orders' })
getPrintOrders(@Body() dto: FindOrderItemsDto) { getPrintOrders(@Body() dto: FindOrderItemsDto) {
return this.orderService.findPrintOrderItemsAsAdmin(dto); return this.orderService.findPrintOrderItemsAsAdmin(dto);
@@ -135,19 +140,6 @@ export class OrderController {
return this.orderService.findOrderItemOrFailByItemId(+itemId); return this.orderService.findOrderItemOrFailByItemId(+itemId);
} }
@Get('admin/orders/item/:id/print')
@UseGuards(AdminAuthGuard)
@ApiOperation({ summary: 'create order item print' })
createOrderItemPrint(@Param('id') itemId: string) {
// return this.orderService.findOrderItemOrFailByItemId(+itemId);
}
// @Patch('admin/orders/:orderId')
// @UseGuards(AdminAuthGuard)
// @ApiOperation({ summary: 'Update Order ' })
// updateOrder(@Param('orderId') orderId: string, @Body() dto: UpdateOrderAsAdminDto) {
// return this.orderService.updateOrderAsAdmin(orderId, dto);
// }
@Patch('admin/orders/:orderId') @Patch('admin/orders/:orderId')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@ApiOperation({ summary: 'Update Order ' }) @ApiOperation({ summary: 'Update Order ' })
@@ -157,6 +149,7 @@ export class OrderController {
@Patch('admin/orders/:id/item/:itemId/print') @Patch('admin/orders/:id/item/:itemId/print')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(PermissionEnum.CREATE_ORDER_PRINT)
@ApiOperation({ summary: 'Create Print form for order item' }) @ApiOperation({ summary: 'Create Print form for order item' })
createPrintForm(@Param('id') id: string, @Param('itemId') itemId: string, @Body() dto: CreatePrintFormDto) { createPrintForm(@Param('id') id: string, @Param('itemId') itemId: string, @Body() dto: CreatePrintFormDto) {
return this.orderService.createPrintForm(id, +itemId, dto); return this.orderService.createPrintForm(id, +itemId, dto);
@@ -2,7 +2,7 @@ import { Injectable, Logger } from '@nestjs/common';
import { OnEvent } from '@nestjs/event-emitter'; import { OnEvent } from '@nestjs/event-emitter';
import { AdminRepository } from 'src/modules/admin/repositories/admin.repository'; import { AdminRepository } from 'src/modules/admin/repositories/admin.repository';
import { OrderCreatedEvent, OrderStatusChangedEvent } from '../events/order.events'; import { OrderCreatedEvent, OrderStatusChangedEvent } from '../events/order.events';
import { Permission } from 'src/common/enums/permission.enum'; import { PermissionEnum } from 'src/common/enums/permission.enum';
import { NotifEvent } from 'src/modules/notification/interfaces/notification.interface'; import { NotifEvent } from 'src/modules/notification/interfaces/notification.interface';
import { NotificationService } from 'src/modules/notification/services/notification.service'; import { NotificationService } from 'src/modules/notification/services/notification.service';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
+21 -3
View File
@@ -30,8 +30,9 @@ import { AdminService } from 'src/modules/admin/providers/admin.service';
import { OrderItem } from '../entities/order-item.entity'; import { OrderItem } from '../entities/order-item.entity';
import { UpdateOrderAsAdminDto } from '../dto/update-order.dto'; import { UpdateOrderAsAdminDto } from '../dto/update-order.dto';
import { CreatePrintFormDto } from '../dto/create-print-form.dto'; import { CreatePrintFormDto } from '../dto/create-print-form.dto';
import { Product } from 'src/modules/product/entities/product.entity';
import { FindOrderItemsDto } from '../dto/find-order-items.dto'; import { FindOrderItemsDto } from '../dto/find-order-items.dto';
import { PermissionService } from 'src/modules/roles/providers/permissions.service';
import { PermissionEnum } from 'src/common/enums/permission.enum';
@Injectable() @Injectable()
@@ -51,6 +52,7 @@ export class OrderService {
private readonly eventEmitter: EventEmitter2, private readonly eventEmitter: EventEmitter2,
private readonly adminRepository: AdminRepository, private readonly adminRepository: AdminRepository,
private readonly paymentRepository: PaymentRepository, private readonly paymentRepository: PaymentRepository,
private readonly permissionService: PermissionService,
) { } ) { }
async createOrderAsAdmin(adminId: string, dto: CreateOrderAsAdminDto) { async createOrderAsAdmin(adminId: string, dto: CreateOrderAsAdminDto) {
@@ -83,6 +85,7 @@ export class OrderService {
// return updateOrder // return updateOrder
} }
//TODO : clean
async updateOrderAsAdmin2(orderId: string, dto: UpdateOrderAsAdminDto) { async updateOrderAsAdmin2(orderId: string, dto: UpdateOrderAsAdminDto) {
const order = await this.findOrderOrFail(orderId) const order = await this.findOrderOrFail(orderId)
@@ -291,8 +294,23 @@ export class OrderService {
return orders return orders
} }
async findInvoicedOrdersAsAdmin(dto: FindOrdersDto) { async findInvoicedOrdersAsAdmin(adminId: string, dto: FindOrdersDto) {
const orders = await this.orderRepository.findAllPaginated({ ...dto, isInvoiced: true, }) const canSeeAll = await this.adminService.hasPermission(adminId, PermissionEnum.VIEW_All_INVOICED_ORDERS)
let canSeeAsigned = false
if (!canSeeAll) {
canSeeAsigned = await this.adminService.hasPermission(adminId, PermissionEnum.VIEW_MY_ASSIGNED_INVOICED_REQUESTS)
}
if (!canSeeAsigned && !canSeeAll) {
throw new BadRequestException("You dont have Permission")
}
let designerId = canSeeAll ? undefined : adminId
const orders = await this.orderRepository.findAllPaginated({ ...dto, isInvoiced: true, designerId })
return orders return orders
} }
@@ -10,6 +10,7 @@ import { FindOrdersDto } from '../dto/find-orders.dto';
class FindOrdersOpts extends FindOrdersDto { class FindOrdersOpts extends FindOrdersDto {
userId?: string; userId?: string;
isInvoiced?: boolean; isInvoiced?: boolean;
designerId?: string
}; };
@Injectable() @Injectable()
@@ -29,7 +30,8 @@ export class OrderRepository extends EntityRepository<Order> {
userId, userId,
from, from,
to, to,
isInvoiced isInvoiced,
designerId
} = opts; } = opts;
const offset = (page - 1) * limit; const offset = (page - 1) * limit;
@@ -60,11 +62,14 @@ export class OrderRepository extends EntityRepository<Order> {
if (isInvoiced != undefined) { if (isInvoiced != undefined) {
if (isInvoiced == true) { if (isInvoiced == true) {
where.invoicedAt = { $not: null } where.invoicedAt = { $not: null }
}else{ } else {
where.invoicedAt = null where.invoicedAt = null
} }
} }
if (designerId) {
where.items = { $some: { designer: { id: designerId } } }
}
// Filter by date range // Filter by date range
if (from || to) { if (from || to) {
where.createdAt = {}; where.createdAt = {};
@@ -18,7 +18,7 @@ import { FindPaymentsDto } from '../dto/find-payments.dto';
import { AdminAuthGuard } from 'src/modules/auth/guards/adminAuth.guard'; import { AdminAuthGuard } from 'src/modules/auth/guards/adminAuth.guard';
import { AdminId } from 'src/common/decorators/admin-id.decorator'; import { AdminId } from 'src/common/decorators/admin-id.decorator';
import { Permissions } from 'src/common/decorators/permissions.decorator'; import { Permissions } from 'src/common/decorators/permissions.decorator';
import { Permission } from 'src/common/enums/permission.enum'; import { PermissionEnum } from 'src/common/enums/permission.enum';
@ApiTags('payment') @ApiTags('payment')
@ApiBearerAuth() @ApiBearerAuth()
@@ -54,7 +54,7 @@ export class PaymentController {
@Post('admin/payments/order/:id/pay') @Post('admin/payments/order/:id/pay')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(Permission.MANAGE_PAYMENTS) @Permissions(PermissionEnum.MANAGE_PAYMENTS)
@ApiOperation({ summary: 'Pay for an order as Admin' }) @ApiOperation({ summary: 'Pay for an order as Admin' })
payOrderAsAdmin(@Param('orderId') orderId: string, @AdminId() adminId: string, @Body() dto: PayOrderDto) { payOrderAsAdmin(@Param('orderId') orderId: string, @AdminId() adminId: string, @Body() dto: PayOrderDto) {
return this.paymentService.payOrder(orderId, dto, adminId); return this.paymentService.payOrder(orderId, dto, adminId);
@@ -62,7 +62,7 @@ export class PaymentController {
@Post('admin/payments/online/:token/verify') @Post('admin/payments/online/:token/verify')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(Permission.MANAGE_PAYMENTS) @Permissions(PermissionEnum.MANAGE_PAYMENTS)
@ApiOperation({ summary: 'Verify online payment as admin' }) @ApiOperation({ summary: 'Verify online payment as admin' })
verifyOnlinePaymentAsAdmin(@Param('paymentId') token: string) { verifyOnlinePaymentAsAdmin(@Param('paymentId') token: string) {
return this.paymentService.verifyOnlinePayment(token); return this.paymentService.verifyOnlinePayment(token);
@@ -70,7 +70,7 @@ export class PaymentController {
@Post('admin/payments/:paymentId/cash/verify') @Post('admin/payments/:paymentId/cash/verify')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(Permission.MANAGE_PAYMENTS) @Permissions(PermissionEnum.MANAGE_PAYMENTS)
@ApiOperation({ summary: 'Verify cash payment' }) @ApiOperation({ summary: 'Verify cash payment' })
confirmPayment(@Param('paymentId') paymentId: string) { confirmPayment(@Param('paymentId') paymentId: string) {
return this.paymentService.confirmCashPayment(paymentId); return this.paymentService.confirmCashPayment(paymentId);
@@ -78,7 +78,7 @@ export class PaymentController {
@Delete('admin/payments/:paymentId/cash/deny') @Delete('admin/payments/:paymentId/cash/deny')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(Permission.MANAGE_PAYMENTS) @Permissions(PermissionEnum.MANAGE_PAYMENTS)
@ApiOperation({ summary: 'Deny cash payment' }) @ApiOperation({ summary: 'Deny cash payment' })
denyPayment(@Param('paymentId') paymentId: string) { denyPayment(@Param('paymentId') paymentId: string) {
return this.paymentService.denyCashPayment(paymentId); return this.paymentService.denyCashPayment(paymentId);
@@ -87,7 +87,7 @@ export class PaymentController {
@Get('admin/payments') @Get('admin/payments')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(Permission.MANAGE_PAYMENTS) @Permissions(PermissionEnum.MANAGE_PAYMENTS)
@ApiOperation({ summary: 'get all payments as admin' }) @ApiOperation({ summary: 'get all payments as admin' })
findAllPayments(@Body() dto: FindPaymentsDto) { findAllPayments(@Body() dto: FindPaymentsDto) {
return this.paymentService.findAll(dto); return this.paymentService.findAll(dto);
@@ -2,7 +2,7 @@ import { Injectable, Logger } from '@nestjs/common';
import { OnEvent } from '@nestjs/event-emitter'; import { OnEvent } from '@nestjs/event-emitter';
import { AdminRepository } from 'src/modules/admin/repositories/admin.repository'; import { AdminRepository } from 'src/modules/admin/repositories/admin.repository';
import { onlinePaymentSucceedEvent, paymentSucceedEvent } from '../events/payment.events'; import { onlinePaymentSucceedEvent, paymentSucceedEvent } from '../events/payment.events';
import { Permission } from 'src/common/enums/permission.enum'; import { PermissionEnum } from 'src/common/enums/permission.enum';
import { NotifEvent } from 'src/modules/notification/interfaces/notification.interface'; import { NotifEvent } from 'src/modules/notification/interfaces/notification.interface';
import { NotificationService } from 'src/modules/notification/services/notification.service'; import { NotificationService } from 'src/modules/notification/services/notification.service';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
@@ -5,7 +5,7 @@ import { ApiBearerAuth, ApiOperation } from '@nestjs/swagger';
import { AdminAuthGuard } from '../../auth/guards/adminAuth.guard'; import { AdminAuthGuard } from '../../auth/guards/adminAuth.guard';
import { UpdateSectionDto } from '../dto/update-section.dto'; import { UpdateSectionDto } from '../dto/update-section.dto';
import { Permissions } from 'src/common/decorators/permissions.decorator'; import { Permissions } from 'src/common/decorators/permissions.decorator';
import { Permission } from 'src/common/enums/permission.enum'; import { PermissionEnum } from 'src/common/enums/permission.enum';
@Controller('admin') @Controller('admin')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@@ -18,7 +18,7 @@ export class PrintController {
/*================================ Section ========================== */ /*================================ Section ========================== */
@Post('section') @Post('section')
@Permissions(Permission.MANAGE_PRINT) @Permissions(PermissionEnum.MANAGE_PRINT)
@ApiOperation({ summary: 'Create section' }) @ApiOperation({ summary: 'Create section' })
create(@Body() dto: CreateSectionDto) { create(@Body() dto: CreateSectionDto) {
return this.printService.create(dto); return this.printService.create(dto);
@@ -37,14 +37,14 @@ export class PrintController {
} }
@Patch('section/:id') @Patch('section/:id')
@Permissions(Permission.MANAGE_PRINT) @Permissions(PermissionEnum.MANAGE_PRINT)
@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.printService.update(+id, dto); return this.printService.update(+id, dto);
} }
@Delete('section/:id') @Delete('section/:id')
@Permissions(Permission.MANAGE_PRINT) @Permissions(PermissionEnum.MANAGE_PRINT)
@ApiOperation({ summary: 'Remove section' }) @ApiOperation({ summary: 'Remove section' })
remove(@Param('id') id: string) { remove(@Param('id') id: string) {
return this.printService.remove(+id); return this.printService.remove(+id);
@@ -11,7 +11,7 @@ import {
ApiParam, ApiParam,
ApiBearerAuth, ApiBearerAuth,
} from '@nestjs/swagger'; } from '@nestjs/swagger';
import { Permission } from 'src/common/enums/permission.enum'; import { PermissionEnum } from 'src/common/enums/permission.enum';
import { Permissions } from 'src/common/decorators/permissions.decorator'; import { Permissions } from 'src/common/decorators/permissions.decorator';
import { CreateCategoryDto } from '../dto/create-category.dto'; import { CreateCategoryDto } from '../dto/create-category.dto';
import { CategoryService } from '../providers/category.service'; import { CategoryService } from '../providers/category.service';
@@ -35,7 +35,7 @@ export class ProductController {
@Post('admin/category') @Post('admin/category')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(Permission.MANAGE_CATEGORIES) @Permissions(PermissionEnum.MANAGE_CATEGORIES)
@ApiOperation({ summary: 'Create a new category' }) @ApiOperation({ summary: 'Create a new category' })
createCategory(@Body() createproductDto: CreateCategoryDto) { createCategory(@Body() createproductDto: CreateCategoryDto) {
return this.categoryService.create(createproductDto); return this.categoryService.create(createproductDto);
@@ -66,7 +66,7 @@ export class ProductController {
@Patch('admin/category/:id') @Patch('admin/category/:id')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(Permission.MANAGE_CATEGORIES) @Permissions(PermissionEnum.MANAGE_CATEGORIES)
@ApiOperation({ summary: 'Update a category' }) @ApiOperation({ summary: 'Update a category' })
@ApiParam({ name: 'id', required: true }) @ApiParam({ name: 'id', required: true })
@ApiBody({ type: UpdateCategoryDto }) @ApiBody({ type: UpdateCategoryDto })
@@ -76,7 +76,7 @@ export class ProductController {
@Delete('admin/category/:id') @Delete('admin/category/:id')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(Permission.MANAGE_CATEGORIES) @Permissions(PermissionEnum.MANAGE_CATEGORIES)
@ApiOperation({ summary: 'Delete (soft) a category' }) @ApiOperation({ summary: 'Delete (soft) a category' })
@ApiParam({ name: 'id', required: true }) @ApiParam({ name: 'id', required: true })
removeCategory(@Param('id') id: string,) { removeCategory(@Param('id') id: string,) {
@@ -95,7 +95,7 @@ export class ProductController {
@Post('admin/product') @Post('admin/product')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(Permission.MANAGE_PRODUCTS) @Permissions(PermissionEnum.MANAGE_PRODUCTS)
@ApiOperation({ summary: 'Create a new product' }) @ApiOperation({ summary: 'Create a new product' })
@ApiBody({ type: CreateproductDto }) @ApiBody({ type: CreateproductDto })
create(@Body() createproductDto: CreateproductDto) { create(@Body() createproductDto: CreateproductDto) {
@@ -104,7 +104,7 @@ export class ProductController {
@Get('admin/products') @Get('admin/products')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(Permission.MANAGE_PRODUCTS) @Permissions(PermissionEnum.MANAGE_PRODUCTS)
@ApiOperation({ summary: 'Get a paginated list of products' }) @ApiOperation({ summary: 'Get a paginated list of products' })
@ApiQuery({ name: 'page', required: false, type: Number }) @ApiQuery({ name: 'page', required: false, type: Number })
@ApiQuery({ name: 'limit', required: false, type: Number }) @ApiQuery({ name: 'limit', required: false, type: Number })
@@ -120,7 +120,7 @@ export class ProductController {
@Get('admin/products/:id') @Get('admin/products/:id')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(Permission.MANAGE_PRODUCTS) @Permissions(PermissionEnum.MANAGE_PRODUCTS)
@ApiOperation({ summary: 'Get a product by id' }) @ApiOperation({ summary: 'Get a product by id' })
@ApiParam({ name: 'id', required: true }) @ApiParam({ name: 'id', required: true })
findById(@Param('id') id: string,) { findById(@Param('id') id: string,) {
@@ -129,7 +129,7 @@ export class ProductController {
@Patch('admin/products/:id') @Patch('admin/products/:id')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(Permission.MANAGE_PRODUCTS) @Permissions(PermissionEnum.MANAGE_PRODUCTS)
@ApiOperation({ summary: 'Update a product' }) @ApiOperation({ summary: 'Update a product' })
@ApiParam({ name: 'id', required: true }) @ApiParam({ name: 'id', required: true })
update(@Param('id') id: string, @Body() updateproductDto: UpdateproductDto) { update(@Param('id') id: string, @Body() updateproductDto: UpdateproductDto) {
@@ -138,7 +138,7 @@ export class ProductController {
@Delete('admin/products/:id') @Delete('admin/products/:id')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(Permission.MANAGE_PRODUCTS) @Permissions(PermissionEnum.MANAGE_PRODUCTS)
@ApiOperation({ summary: 'Delete (soft) a product' }) @ApiOperation({ summary: 'Delete (soft) a product' })
@ApiParam({ name: 'id', required: true }) @ApiParam({ name: 'id', required: true })
remove(@Param('id') id: string,) { remove(@Param('id') id: string,) {
@@ -1,13 +1,13 @@
import { Controller, Get, Post, Body, Param, Patch, Delete, UseGuards } from '@nestjs/common'; import { Controller, Get, Post, Body, Param, Patch, Delete, UseGuards } from '@nestjs/common';
import { ApiTags, ApiOperation, ApiBody, ApiBearerAuth } from '@nestjs/swagger'; import { ApiTags, ApiOperation, ApiBody, ApiBearerAuth } from '@nestjs/swagger';
import { RolesService } from '../providers/roles.service'; import { RolesService } from '../providers/roles.service';
import { PermissionsService } from '../providers/permissions.service'; import { PermissionService } from '../providers/permissions.service';
import { CreateRoleDto } from '../dto/create-role.dto'; import { CreateRoleDto } from '../dto/create-role.dto';
import { UpdateRoleDto } from '../dto/update-role.dto'; import { UpdateRoleDto } from '../dto/update-role.dto';
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 { AdminId } from 'src/common/decorators/admin-id.decorator'; import { AdminId } from 'src/common/decorators/admin-id.decorator';
import { Permission } from 'src/common/enums/permission.enum'; import { PermissionEnum } from 'src/common/enums/permission.enum';
@@ -18,39 +18,39 @@ import { Permission } from 'src/common/enums/permission.enum';
export class RolesController { export class RolesController {
constructor( constructor(
private readonly roleService: RolesService, private readonly roleService: RolesService,
private readonly permissionService: PermissionsService, private readonly permissionService: PermissionService,
) { } ) { }
@Post('admin/role') @Post('admin/role')
@Permissions(Permission.MANAGE_ROLES) @Permissions(PermissionEnum.MANAGE_ROLES)
@ApiOperation({ summary: 'Create a new role' }) @ApiOperation({ summary: 'Create a new role' })
create(@Body() dto: CreateRoleDto,) { create(@Body() dto: CreateRoleDto,) {
return this.roleService.create(dto); return this.roleService.create(dto);
} }
@Get('admin/roles') @Get('admin/roles')
@Permissions(Permission.MANAGE_ROLES) @Permissions(PermissionEnum.MANAGE_ROLES)
@ApiOperation({ summary: 'Get all through restaurant roles with pagination and filters' }) @ApiOperation({ summary: 'Get all through restaurant roles with pagination and filters' })
findAll() { findAll() {
return this.roleService.findAll(); return this.roleService.findAll();
} }
@Get('admin/roles/permissions') @Get('admin/roles/permissions')
@Permissions(Permission.MANAGE_ROLES) @Permissions(PermissionEnum.MANAGE_ROLES)
@ApiOperation({ summary: 'Get all permissions that the admin has' }) @ApiOperation({ summary: 'Get all permissions that the admin has' })
async findAllPermissions(@AdminId() adminId: string,) { async findAllPermissions(@AdminId() adminId: string,) {
return this.permissionService.getAdminPermissions(adminId); return this.permissionService.getAdminPermissions(adminId);
} }
@Get('admin/roles/:id') @Get('admin/roles/:id')
@Permissions(Permission.MANAGE_ROLES) @Permissions(PermissionEnum.MANAGE_ROLES)
@ApiOperation({ summary: 'Get a specific role by ID' }) @ApiOperation({ summary: 'Get a specific role by ID' })
findOne(@Param('id') id: string,) { findOne(@Param('id') id: string,) {
return this.roleService.findOne(id); return this.roleService.findOne(id);
} }
@Patch('admin/roles/:id') @Patch('admin/roles/:id')
@Permissions(Permission.MANAGE_ROLES) @Permissions(PermissionEnum.MANAGE_ROLES)
@ApiOperation({ summary: 'Update a role' }) @ApiOperation({ summary: 'Update a role' })
@ApiBody({ type: UpdateRoleDto }) @ApiBody({ type: UpdateRoleDto })
update(@Param('id') id: string, @Body() dto: UpdateRoleDto,) { update(@Param('id') id: string, @Body() dto: UpdateRoleDto,) {
@@ -58,7 +58,7 @@ export class RolesController {
} }
@Delete('admin/roles/:id') @Delete('admin/roles/:id')
@Permissions(Permission.MANAGE_ROLES) @Permissions(PermissionEnum.MANAGE_ROLES)
@ApiOperation({ summary: 'Delete a role' }) @ApiOperation({ summary: 'Delete a role' })
remove(@Param('id') id: string,) { remove(@Param('id') id: string,) {
return this.roleService.remove(id); return this.roleService.remove(id);
@@ -1,15 +1,16 @@
import { Entity, Property, Unique, ManyToMany, Collection, PrimaryKey } from '@mikro-orm/core'; import { Entity, Property, Unique, ManyToMany, Collection, PrimaryKey, Enum } from '@mikro-orm/core';
import { BaseEntity } from '../../../common/entities/base.entity'; import { BaseEntity } from '../../../common/entities/base.entity';
import { Role } from './role.entity'; import { Role } from './role.entity';
import { ulid } from 'ulid'; import { ulid } from 'ulid';
import { PermissionEnum } from 'src/common/enums/permission.enum';
@Entity({ tableName: 'permissions' }) @Entity({ tableName: 'permissions' })
export class Permission extends BaseEntity { export class Permission extends BaseEntity {
@PrimaryKey({ type: 'string', columnType: 'char(26)' }) @PrimaryKey({ type: 'string', columnType: 'char(26)' })
id: string = ulid() id: string = ulid()
@Property({ unique: true }) @Enum(() => PermissionEnum)
name!: string; name!: PermissionEnum;
@Property() @Property()
title!: string; title!: string;
+13 -3
View File
@@ -1,11 +1,13 @@
import { Collection, Entity, ManyToMany, OneToMany, PrimaryKey, Property } from '@mikro-orm/core'; import { Collection, Entity, ManyToMany, OneToMany, OptionalProps, PrimaryKey, Property } from '@mikro-orm/core';
import { BaseEntity } from '../../../common/entities/base.entity';
import { Permission } from './permission.entity'; import { Permission } from './permission.entity';
import { RolePermission } from './rolePermission.entity'; import { RolePermission } from './rolePermission.entity';
import { ulid } from 'ulid'; import { ulid } from 'ulid';
import { Admin } from 'src/modules/admin/entities/admin.entity';
@Entity({ tableName: 'roles' }) @Entity({ tableName: 'roles' })
export class Role extends BaseEntity { export class Role {
[OptionalProps]?: 'createdAt' | 'deletedAt' | 'admins';
@PrimaryKey({ type: 'string', columnType: 'char(26)' }) @PrimaryKey({ type: 'string', columnType: 'char(26)' })
id: string = ulid() id: string = ulid()
@@ -21,5 +23,13 @@ export class Role extends BaseEntity {
@ManyToMany({ entity: () => Permission, pivotEntity: () => RolePermission, inversedBy: p => p.roles }) @ManyToMany({ entity: () => Permission, pivotEntity: () => RolePermission, inversedBy: p => p.roles })
permissions = new Collection<Permission>(this); permissions = new Collection<Permission>(this);
@OneToMany(() => Admin, (admin) => admin.role)
admins: Admin
@Property({ defaultRaw: 'now()', columnType: 'timestamptz' })
createdAt: Date = new Date();
@Property({ nullable: true, columnType: 'timestamptz' })
deletedAt?: Date;
} }
@@ -1,12 +1,13 @@
import { Injectable } from '@nestjs/common'; import { BadRequestException, Injectable } from '@nestjs/common';
import { InjectRepository } from '@mikro-orm/nestjs'; import { InjectRepository } from '@mikro-orm/nestjs';
import { EntityRepository } from '@mikro-orm/core'; import { EntityRepository } from '@mikro-orm/core';
import { Permission } from '../entities/permission.entity'; import { Permission } from '../entities/permission.entity';
import { AdminRepository } from 'src/modules/admin/repositories/admin.repository'; import { AdminRepository } from 'src/modules/admin/repositories/admin.repository';
import { PermissionEnum } from 'src/common/enums/permission.enum';
@Injectable() @Injectable()
export class PermissionsService { export class PermissionService {
constructor( constructor(
@InjectRepository(Permission) @InjectRepository(Permission)
@@ -27,7 +28,11 @@ export class PermissionsService {
{ populate: ['role', 'role.permissions'] }, { populate: ['role', 'role.permissions'] },
); );
if (!admin || !admin.role) { if (!admin) {
throw new BadRequestException("Admin not found")
}
if (!admin.role) {
return []; return [];
} }
@@ -36,4 +41,12 @@ export class PermissionsService {
return permissions return permissions
} }
async getAdminPermissionsName(adminId: string) {
const permissions = await this.getAdminPermissions(adminId)
return permissions.map(p => p.name)
}
} }
+3 -3
View File
@@ -2,7 +2,7 @@ import { Global, Module } from '@nestjs/common';
import { MikroOrmModule } from '@mikro-orm/nestjs'; import { MikroOrmModule } from '@mikro-orm/nestjs';
import { RolesService } from './providers/roles.service'; import { RolesService } from './providers/roles.service';
import { RolesController } from './controllers/roles.controller'; import { RolesController } from './controllers/roles.controller';
import { PermissionsService } from './providers/permissions.service'; import { PermissionService } from './providers/permissions.service';
import { Role } from './entities/role.entity'; import { Role } from './entities/role.entity';
import { Permission } from './entities/permission.entity'; import { Permission } from './entities/permission.entity';
import { RolePermission } from './entities/rolePermission.entity'; import { RolePermission } from './entities/rolePermission.entity';
@@ -15,7 +15,7 @@ import { RoleRepository } from './respository/role.repository';
@Module({ @Module({
imports: [MikroOrmModule.forFeature([Role, Permission, RolePermission]), JwtModule, UtilsModule, AdminModule], imports: [MikroOrmModule.forFeature([Role, Permission, RolePermission]), JwtModule, UtilsModule, AdminModule],
controllers: [RolesController], controllers: [RolesController],
providers: [RolesService, PermissionsService, RoleRepository], providers: [RolesService, PermissionService, RoleRepository],
exports: [RolesService, PermissionsService, RoleRepository], exports: [RolesService, PermissionService, RoleRepository],
}) })
export class RolesModule { } export class RolesModule { }
+2 -2
View File
@@ -1,9 +1,9 @@
import { Permission, PermissionTitles } from '../../common/enums/permission.enum'; import { PermissionEnum, PermissionTitles } from '../../common/enums/permission.enum';
export const getPermissionsData = () => { export const getPermissionsData = () => {
return Object.values(Permission).map(name => ({ return Object.values(PermissionEnum).map(name => ({
name, name,
title: PermissionTitles[name], title: PermissionTitles[name],
})); }));
+3 -3
View File
@@ -1,10 +1,10 @@
import { Permission } from '../../common/enums/permission.enum'; import { PermissionEnum } from '../../common/enums/permission.enum';
export interface RoleConfig { export interface RoleConfig {
name: string; name: string;
title: string; title: string;
isSystem: boolean; isSystem: boolean;
permissionFilter: (permissionName: Permission) => boolean; permissionFilter: (permissionName: PermissionEnum) => boolean;
} }
export const rolesData: RoleConfig[] = [ export const rolesData: RoleConfig[] = [
@@ -12,7 +12,7 @@ export const rolesData: RoleConfig[] = [
name: 'admin', name: 'admin',
title: 'مدیرکل', title: 'مدیرکل',
isSystem: true, isSystem: true,
permissionFilter: (name: Permission) => true permissionFilter: (name: PermissionEnum) => true
}, },
]; ];
+5 -5
View File
@@ -1,16 +1,16 @@
import type { EntityManager } from '@mikro-orm/core'; import type { EntityManager } from '@mikro-orm/core';
import { Permission as PermissionEntity } from '../modules/roles/entities/permission.entity'; import { Permission } from '../modules/roles/entities/permission.entity';
import { getPermissionsData } from './data/permissions.data'; import { getPermissionsData } from './data/permissions.data';
export class PermissionsSeeder { export class PermissionsSeeder {
async run(em: EntityManager): Promise<PermissionEntity[]> { async run(em: EntityManager): Promise<Permission[]> {
const permissions = getPermissionsData(); const permissions = getPermissionsData();
const createdPermissions: PermissionEntity[] = []; const createdPermissions: Permission[] = [];
for (const permData of permissions) { for (const permData of permissions) {
let permission = await em.findOne(PermissionEntity, { name: permData.name }); let permission = await em.findOne(Permission, { name: permData.name });
if (!permission) { if (!permission) {
permission = em.create(PermissionEntity, permData); permission = em.create(Permission, permData);
em.persist(permission); em.persist(permission);
} else { } else {
// Update existing permission's title if it changed // Update existing permission's title if it changed
+5 -5
View File
@@ -1,11 +1,11 @@
import type { EntityManager } from '@mikro-orm/core'; import type { EntityManager } from '@mikro-orm/core';
import { Role } from '../modules/roles/entities/role.entity'; import { Role } from '../modules/roles/entities/role.entity';
import type { Permission } from '../common/enums/permission.enum'; import type { PermissionEnum } from '../common/enums/permission.enum';
import type { Permission as PermissionEntity } from '../modules/roles/entities/permission.entity'; import type {Permission } from '../modules/roles/entities/permission.entity';
import { rolesData } from './data/roles.data'; import { rolesData } from './data/roles.data';
export class RolesSeeder { export class RolesSeeder {
async run(em: EntityManager, permissions: PermissionEntity[]): Promise<Map<string, Role>> { async run(em: EntityManager, permissions: Permission[]): Promise<Map<string, Role>> {
const rolesMap = new Map<string, Role>(); const rolesMap = new Map<string, Role>();
for (const roleConfig of rolesData) { for (const roleConfig of rolesData) {
@@ -13,7 +13,7 @@ export class RolesSeeder {
if (!role) { if (!role) {
role = em.create(Role, { role = em.create(Role, {
name: roleConfig.name, name: roleConfig.name,
title:'', title: '',
isSystem: true, isSystem: true,
}); });
@@ -21,7 +21,7 @@ export class RolesSeeder {
// TypeScript knows role is not null here because we just created it // TypeScript knows role is not null here because we just created it
const newRole = role; const newRole = role;
// Use the permission filter for all roles // Use the permission filter for all roles
const filteredPermissions = permissions.filter(p => roleConfig.permissionFilter(p.name as Permission)); const filteredPermissions = permissions.filter(p => roleConfig.permissionFilter(p.name as PermissionEnum));
filteredPermissions.forEach(p => newRole.permissions.add(p)); filteredPermissions.forEach(p => newRole.permissions.add(p));
em.persist(newRole); em.persist(newRole);