up
This commit is contained in:
@@ -3,7 +3,7 @@ import { IsNotEmpty, IsString, IsArray, ValidateNested, IsNumber, Min } from 'cl
|
|||||||
import { Type } from 'class-transformer';
|
import { Type } from 'class-transformer';
|
||||||
|
|
||||||
export class CartItemDto {
|
export class CartItemDto {
|
||||||
@ApiProperty({ description: 'Food ID', example: '01KA9Q52JSWFY98TW3HZY6XEVZ' })
|
@ApiProperty({ description: 'Food ID' })
|
||||||
@IsNotEmpty()
|
@IsNotEmpty()
|
||||||
@IsString()
|
@IsString()
|
||||||
foodId!: string;
|
foodId!: string;
|
||||||
@@ -19,7 +19,6 @@ export class CreateCartDto {
|
|||||||
@ApiProperty({
|
@ApiProperty({
|
||||||
description: 'List of cart items',
|
description: 'List of cart items',
|
||||||
type: [CartItemDto],
|
type: [CartItemDto],
|
||||||
example: [{ foodId: '01KA9Q52JSWFY98TW3HZY6XEVZ', quantity: 2 }],
|
|
||||||
})
|
})
|
||||||
@IsNotEmpty()
|
@IsNotEmpty()
|
||||||
@IsArray()
|
@IsArray()
|
||||||
|
|||||||
@@ -10,7 +10,10 @@ export class Permission extends BaseEntity {
|
|||||||
|
|
||||||
@Property()
|
@Property()
|
||||||
title!: string;
|
title!: string;
|
||||||
|
// اضافه شد
|
||||||
|
@Property({ default: 'general' })
|
||||||
|
group!: string;
|
||||||
|
|
||||||
@ManyToMany({ entity: () => Role, mappedBy: r => r.permissions })
|
@ManyToMany({ entity: () => Role, mappedBy: 'permissions' })
|
||||||
roles = new Collection<Role>(this);
|
roles = new Collection<Role>(this);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,6 +49,11 @@ export class RolesService {
|
|||||||
if (permissions.length !== permissionIds.length) {
|
if (permissions.length !== permissionIds.length) {
|
||||||
throw new BadRequestException('One or more permissions not found');
|
throw new BadRequestException('One or more permissions not found');
|
||||||
}
|
}
|
||||||
|
// Check if any permission is special
|
||||||
|
const specialPermissions = permissions.filter(p => p.group === 'special');
|
||||||
|
if (specialPermissions.length > 0) {
|
||||||
|
throw new BadRequestException('Special permissions cannot be assigned to roles');
|
||||||
|
}
|
||||||
permissions.forEach(p => role.permissions.add(p));
|
permissions.forEach(p => role.permissions.add(p));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,6 +127,11 @@ export class RolesService {
|
|||||||
if (permissions.length !== dto.permissionIds.length) {
|
if (permissions.length !== dto.permissionIds.length) {
|
||||||
throw new BadRequestException('One or more permissions not found');
|
throw new BadRequestException('One or more permissions not found');
|
||||||
}
|
}
|
||||||
|
// Check if any permission is special
|
||||||
|
const specialPermissions = permissions.filter(p => p.group === 'special');
|
||||||
|
if (specialPermissions.length > 0) {
|
||||||
|
throw new BadRequestException('Special permissions cannot be assigned to roles');
|
||||||
|
}
|
||||||
permissions.forEach(p => role.permissions.add(p));
|
permissions.forEach(p => role.permissions.add(p));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import { FindRolesDto } from './dto/find-roles.dto';
|
|||||||
import { AdminAuthGuard } from '../auth/guards/adminAuth.guard';
|
import { AdminAuthGuard } from '../auth/guards/adminAuth.guard';
|
||||||
import { Permissions } from '../auth/decorators/permissions.decorator';
|
import { Permissions } from '../auth/decorators/permissions.decorator';
|
||||||
import { RestId } from 'src/common/decorators';
|
import { RestId } from 'src/common/decorators';
|
||||||
|
import { AdminId } from 'src/common/decorators/admin-id.decorator';
|
||||||
|
|
||||||
@UseGuards(AdminAuthGuard)
|
@UseGuards(AdminAuthGuard)
|
||||||
@ApiBearerAuth()
|
@ApiBearerAuth()
|
||||||
@@ -27,10 +28,12 @@ export class RolesController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Get('permissions')
|
@Get('permissions')
|
||||||
@ApiOperation({ summary: 'Get all permissions' })
|
@ApiOperation({ summary: 'Get all permissions that the admin has' })
|
||||||
@ApiResponse({ status: 200, description: 'Permissions retrieved successfully' })
|
@ApiResponse({ status: 200, description: 'Permissions retrieved successfully' })
|
||||||
findAllPermissions() {
|
async findAllPermissions(@AdminId() adminId: string, @RestId() restId: string) {
|
||||||
return this.permissionService.findAll();
|
const adminPermissionNames = await this.permissionService.getAdminPermissions(adminId, restId);
|
||||||
|
|
||||||
|
return adminPermissionNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Permissions('create-role')
|
@Permissions('create-role')
|
||||||
|
|||||||
@@ -13,9 +13,16 @@ import { Permission, PermissionTitles } from '../common/enums/permission.enum';
|
|||||||
export class DatabaseSeeder extends Seeder {
|
export class DatabaseSeeder extends Seeder {
|
||||||
async run(em: EntityManager) {
|
async run(em: EntityManager) {
|
||||||
// 1. Create Permissions (English)
|
// 1. Create Permissions (English)
|
||||||
|
const specialPermissions = [
|
||||||
|
Permission.CREATE_RESTAURANT,
|
||||||
|
Permission.DELETE_RESTAURANT,
|
||||||
|
Permission.UPDATE_RESTAURANT,
|
||||||
|
];
|
||||||
|
|
||||||
const permissions = Object.values(Permission).map(name => ({
|
const permissions = Object.values(Permission).map(name => ({
|
||||||
name,
|
name,
|
||||||
title: PermissionTitles[name],
|
title: PermissionTitles[name],
|
||||||
|
group: specialPermissions.includes(name) ? 'special' : 'general',
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const createdPermissions: PermissionEntity[] = [];
|
const createdPermissions: PermissionEntity[] = [];
|
||||||
@@ -24,6 +31,12 @@ export class DatabaseSeeder extends Seeder {
|
|||||||
if (!permission) {
|
if (!permission) {
|
||||||
permission = em.create(PermissionEntity, permData);
|
permission = em.create(PermissionEntity, permData);
|
||||||
em.persist(permission);
|
em.persist(permission);
|
||||||
|
} else {
|
||||||
|
// Update existing permission's group if it changed
|
||||||
|
if (permission.group !== permData.group) {
|
||||||
|
permission.group = permData.group;
|
||||||
|
em.persist(permission);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
createdPermissions.push(permission);
|
createdPermissions.push(permission);
|
||||||
}
|
}
|
||||||
@@ -44,9 +57,9 @@ export class DatabaseSeeder extends Seeder {
|
|||||||
// Add financial permissions to accountant
|
// Add financial permissions to accountant
|
||||||
const financialPerms = createdPermissions.filter(
|
const financialPerms = createdPermissions.filter(
|
||||||
p =>
|
p =>
|
||||||
p.name === Permission.VIEW_REPORTS ||
|
(p.name as Permission) === Permission.VIEW_REPORTS ||
|
||||||
p.name === Permission.MANAGE_FINANCES ||
|
(p.name as Permission) === Permission.MANAGE_FINANCES ||
|
||||||
p.name === Permission.MANAGE_ORDERS,
|
(p.name as Permission) === Permission.MANAGE_ORDERS,
|
||||||
);
|
);
|
||||||
financialPerms.forEach(p => role.permissions.add(p));
|
financialPerms.forEach(p => role.permissions.add(p));
|
||||||
em.persist(role);
|
em.persist(role);
|
||||||
@@ -58,9 +71,9 @@ export class DatabaseSeeder extends Seeder {
|
|||||||
// Add restaurant management permissions to superAdmin
|
// Add restaurant management permissions to superAdmin
|
||||||
const restaurantPerms = createdPermissions.filter(
|
const restaurantPerms = createdPermissions.filter(
|
||||||
p =>
|
p =>
|
||||||
p.name === Permission.CREATE_RESTAURANT ||
|
(p.name as Permission) === Permission.CREATE_RESTAURANT ||
|
||||||
p.name === Permission.DELETE_RESTAURANT ||
|
(p.name as Permission) === Permission.DELETE_RESTAURANT ||
|
||||||
p.name === Permission.UPDATE_RESTAURANT,
|
(p.name as Permission) === Permission.UPDATE_RESTAURANT,
|
||||||
);
|
);
|
||||||
restaurantPerms.forEach(p => role.permissions.add(p));
|
restaurantPerms.forEach(p => role.permissions.add(p));
|
||||||
em.persist(role);
|
em.persist(role);
|
||||||
|
|||||||
Reference in New Issue
Block a user