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