update roles and permissions

This commit is contained in:
2025-12-23 12:07:33 +03:30
parent 4e1300c6b9
commit 9916426814
7 changed files with 28 additions and 55 deletions
+17 -13
View File
@@ -17,17 +17,19 @@ export enum Permission {
// Reports & Finances // Reports & Finances
VIEW_REPORTS = 'view_reports', VIEW_REPORTS = 'view_reports',
MANAGE_FINANCES = 'manage_finances',
// Restaurant Management
GET_OWN_RESTAURANT = 'get_own_restaurant',
GET_ALL_RESTAURANTS = 'get_all_restaurants',
CREATE_RESTAURANT = 'create_restaurant',
DELETE_RESTAURANT = 'delete_restaurant',
UPDATE_RESTAURANT = 'update_restaurant', UPDATE_RESTAURANT = 'update_restaurant',
// Role Management // Role Management
CREATE_ROLE = 'create_role', MANAGE_ROLES = 'manage_roles',
MANAGE_REVIEWS = 'manage_reviews',
MANAGE_COUPONS = 'manage_coupons',
MANAGE_PAYMENTS = 'manage_payments',
MANAGE_DELIVERY = 'manage_delivery',
MANAGE_SETTINGS = 'manage_settings',
MANAGE_SCHEDULES = 'manage_schedules',
MANAGE_REPORTS = 'manage_reports',
} }
/** /**
@@ -42,11 +44,13 @@ export const PermissionTitles: Record<Permission, string> = {
[Permission.MANAGE_ADMINS]: 'مدیریت مدیران', [Permission.MANAGE_ADMINS]: 'مدیریت مدیران',
[Permission.MANAGE_USERS]: 'مدیریت کاربران', [Permission.MANAGE_USERS]: 'مدیریت کاربران',
[Permission.VIEW_REPORTS]: 'مشاهده گزارشات', [Permission.VIEW_REPORTS]: 'مشاهده گزارشات',
[Permission.MANAGE_FINANCES]: 'مدیریت مالی',
[Permission.GET_OWN_RESTAURANT]: 'مشاهده رستوران خود',
[Permission.GET_ALL_RESTAURANTS]: 'مشاهده همه رستوران‌ها',
[Permission.CREATE_RESTAURANT]: 'ایجاد رستوران',
[Permission.DELETE_RESTAURANT]: 'حذف رستوران',
[Permission.UPDATE_RESTAURANT]: 'ویرایش رستوران', [Permission.UPDATE_RESTAURANT]: 'ویرایش رستوران',
[Permission.CREATE_ROLE]: 'ایجاد نقش', [Permission.MANAGE_ROLES]: 'مدیریت نقش‌ها',
[Permission.MANAGE_REVIEWS]: 'مدیریت نظرات',
[Permission.MANAGE_COUPONS]: 'مدیریت کوپن‌ها',
[Permission.MANAGE_PAYMENTS]: 'مدیریت پرداخت‌ها',
[Permission.MANAGE_DELIVERY]: 'مدیریت تحویل',
[Permission.MANAGE_SETTINGS]: 'مدیریت تنظیمات',
[Permission.MANAGE_SCHEDULES]: 'مدیریت برنامه‌ها',
[Permission.MANAGE_REPORTS]: 'مدیریت گزارشات',
}; };
@@ -10,9 +10,7 @@ export class Permission extends BaseEntity {
@Property() @Property()
title!: string; title!: string;
// اضافه شد
@Property({ default: 'general' })
group!: string;
@ManyToMany({ entity: () => Role, mappedBy: 'permissions' }) @ManyToMany({ entity: () => Role, mappedBy: 'permissions' })
roles = new Collection<Role>(this); roles = new Collection<Role>(this);
+1 -11
View File
@@ -17,7 +17,7 @@ export class RolesService {
@InjectRepository(Permission) @InjectRepository(Permission)
private readonly permissionRepository: EntityRepository<Permission>, private readonly permissionRepository: EntityRepository<Permission>,
private readonly em: EntityManager, private readonly em: EntityManager,
) {} ) { }
async createRestaurantRole(dto: CreateRoleDto, restId: string) { async createRestaurantRole(dto: CreateRoleDto, restId: string) {
const { name, permissionIds } = dto; const { name, permissionIds } = dto;
@@ -48,11 +48,6 @@ 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');
}
permissions.forEach(p => role.permissions.add(p)); permissions.forEach(p => role.permissions.add(p));
} }
@@ -102,11 +97,6 @@ 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));
} }
+1 -6
View File
@@ -1,15 +1,10 @@
import { Permission, PermissionTitles } from '../../common/enums/permission.enum'; import { Permission, PermissionTitles } from '../../common/enums/permission.enum';
export const specialPermissions = [
Permission.CREATE_RESTAURANT,
Permission.DELETE_RESTAURANT,
Permission.UPDATE_RESTAURANT,
];
export const getPermissionsData = () => { export const getPermissionsData = () => {
return Object.values(Permission).map(name => ({ return Object.values(Permission).map(name => ({
name, name,
title: PermissionTitles[name], title: PermissionTitles[name],
group: specialPermissions.includes(name) ? 'special' : 'general',
})); }));
}; };
+2 -10
View File
@@ -10,20 +10,12 @@ export const rolesData: RoleConfig[] = [
{ {
name: 'restaurant', name: 'restaurant',
isSystem: false, isSystem: false,
permissionFilter: () => true, // Will be filtered by group in seeder permissionFilter: () => true, // All permissions for restaurant role
}, },
{ {
name: 'accountant', name: 'accountant',
isSystem: false, isSystem: false,
permissionFilter: (name: Permission) => permissionFilter: (name: Permission) =>
name === Permission.VIEW_REPORTS || name === Permission.MANAGE_FINANCES || name === Permission.MANAGE_ORDERS, name === Permission.VIEW_REPORTS || name === Permission.MANAGE_PAYMENTS || name === Permission.MANAGE_ORDERS,
},
{
name: 'superAdmin',
isSystem: true,
permissionFilter: (name: Permission) =>
name === Permission.CREATE_RESTAURANT ||
name === Permission.DELETE_RESTAURANT ||
name === Permission.UPDATE_RESTAURANT,
}, },
]; ];
+3 -3
View File
@@ -13,9 +13,9 @@ export class PermissionsSeeder {
permission = em.create(PermissionEntity, permData); permission = em.create(PermissionEntity, permData);
em.persist(permission); em.persist(permission);
} else { } else {
// Update existing permission's group if it changed // Update existing permission's title if it changed
if (permission.group !== permData.group) { if (permission.title !== permData.title) {
permission.group = permData.group; permission.title = permData.title;
em.persist(permission); em.persist(permission);
} }
} }
+3 -9
View File
@@ -19,15 +19,9 @@ export class RolesSeeder {
// Add permissions based on role configuration // Add permissions based on role configuration
// 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;
if (roleConfig.name === 'restaurant') { // Use the permission filter for all roles
// Add all general permissions to restaurant role const filteredPermissions = permissions.filter(p => roleConfig.permissionFilter(p.name as Permission));
const generalPermissions = permissions.filter(p => p.group === 'general'); filteredPermissions.forEach(p => newRole.permissions.add(p));
generalPermissions.forEach(p => newRole.permissions.add(p));
} else {
// For other roles, use the permission filter
const filteredPermissions = permissions.filter(p => roleConfig.permissionFilter(p.name as Permission));
filteredPermissions.forEach(p => newRole.permissions.add(p));
}
em.persist(newRole); em.persist(newRole);
} }