permission
This commit is contained in:
@@ -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 } } },
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 { }
|
||||||
|
|||||||
@@ -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],
|
||||||
}));
|
}));
|
||||||
|
|||||||
@@ -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
|
||||||
},
|
},
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user