This commit is contained in:
2025-11-21 15:48:38 +03:30
parent f07837cfdb
commit 89593d0f2e
5 changed files with 40 additions and 12 deletions
+1 -2
View File
@@ -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));
} }
+6 -3
View File
@@ -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')
+19 -6
View File
@@ -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);