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
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',
// 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_USERS]: 'مدیریت کاربران',
[Permission.VIEW_REPORTS]: 'مشاهده گزارشات',
[Permission.MANAGE_FINANCES]: 'مدیریت مالی',
[Permission.GET_OWN_RESTAURANT]: 'مشاهده رستوران خود',
[Permission.GET_ALL_RESTAURANTS]: 'مشاهده همه رستوران‌ها',
[Permission.CREATE_RESTAURANT]: 'ایجاد رستوران',
[Permission.DELETE_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()
title!: string;
// اضافه شد
@Property({ default: 'general' })
group!: string;
@ManyToMany({ entity: () => Role, mappedBy: 'permissions' })
roles = new Collection<Role>(this);
+1 -11
View File
@@ -17,7 +17,7 @@ export class RolesService {
@InjectRepository(Permission)
private readonly permissionRepository: EntityRepository<Permission>,
private readonly em: EntityManager,
) {}
) { }
async createRestaurantRole(dto: CreateRoleDto, restId: string) {
const { name, permissionIds } = dto;
@@ -48,11 +48,6 @@ export class RolesService {
if (permissions.length !== permissionIds.length) {
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));
}
@@ -102,11 +97,6 @@ export class RolesService {
if (permissions.length !== dto.permissionIds.length) {
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));
}
+1 -6
View File
@@ -1,15 +1,10 @@
import { Permission, PermissionTitles } from '../../common/enums/permission.enum';
export const specialPermissions = [
Permission.CREATE_RESTAURANT,
Permission.DELETE_RESTAURANT,
Permission.UPDATE_RESTAURANT,
];
export const getPermissionsData = () => {
return Object.values(Permission).map(name => ({
name,
title: PermissionTitles[name],
group: specialPermissions.includes(name) ? 'special' : 'general',
}));
};
+2 -10
View File
@@ -10,20 +10,12 @@ export const rolesData: RoleConfig[] = [
{
name: 'restaurant',
isSystem: false,
permissionFilter: () => true, // Will be filtered by group in seeder
permissionFilter: () => true, // All permissions for restaurant role
},
{
name: 'accountant',
isSystem: false,
permissionFilter: (name: Permission) =>
name === Permission.VIEW_REPORTS || name === Permission.MANAGE_FINANCES || name === Permission.MANAGE_ORDERS,
},
{
name: 'superAdmin',
isSystem: true,
permissionFilter: (name: Permission) =>
name === Permission.CREATE_RESTAURANT ||
name === Permission.DELETE_RESTAURANT ||
name === Permission.UPDATE_RESTAURANT,
name === Permission.VIEW_REPORTS || name === Permission.MANAGE_PAYMENTS || name === Permission.MANAGE_ORDERS,
},
];
+3 -3
View File
@@ -13,9 +13,9 @@ export class PermissionsSeeder {
permission = em.create(PermissionEntity, permData);
em.persist(permission);
} else {
// Update existing permission's group if it changed
if (permission.group !== permData.group) {
permission.group = permData.group;
// Update existing permission's title if it changed
if (permission.title !== permData.title) {
permission.title = permData.title;
em.persist(permission);
}
}
+3 -9
View File
@@ -19,15 +19,9 @@ export class RolesSeeder {
// Add permissions based on role configuration
// TypeScript knows role is not null here because we just created it
const newRole = role;
if (roleConfig.name === 'restaurant') {
// Add all general permissions to restaurant role
const generalPermissions = permissions.filter(p => p.group === 'general');
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));
}
// Use the permission filter for all roles
const filteredPermissions = permissions.filter(p => roleConfig.permissionFilter(p.name as Permission));
filteredPermissions.forEach(p => newRole.permissions.add(p));
em.persist(newRole);
}