role.service.mt.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import { DataSource } from 'typeorm';
  2. import { RoleMt } from '../entities/role.entity';
  3. import { ConcreteCrudService } from '@d8d/shared-crud';
  4. export class RoleServiceMt extends ConcreteCrudService<RoleMt> {
  5. constructor(dataSource: DataSource) {
  6. super(RoleMt, {
  7. userTracking: {
  8. enabled: true,
  9. createdByField: 'createdBy',
  10. updatedByField: 'updatedBy'
  11. },
  12. tenantOptions: {
  13. enabled: true,
  14. tenantIdField: 'tenantId',
  15. autoExtractFromContext: false
  16. }
  17. });
  18. }
  19. /**
  20. * 根据角色名获取角色(自动添加租户过滤)
  21. */
  22. async getRoleByName(name: string, tenantId?: number): Promise<RoleMt | null> {
  23. try {
  24. const where: any = { name };
  25. // 如果提供了租户ID,添加租户过滤
  26. if (tenantId !== undefined) {
  27. where.tenantId = tenantId;
  28. }
  29. const roles = await this.repository.find({ where });
  30. return roles.length > 0 ? roles[0] : null;
  31. } catch (error) {
  32. console.error('Error getting role by name:', error);
  33. throw new Error('Failed to get role by name');
  34. }
  35. }
  36. /**
  37. * 检查角色是否拥有指定权限
  38. */
  39. async hasPermission(roleId: number, permission: string, tenantId?: number): Promise<boolean> {
  40. try {
  41. const role = await this.getById(roleId);
  42. if (!role) return false;
  43. // 验证租户一致性
  44. if (tenantId !== undefined && role.tenantId !== tenantId) {
  45. throw new Error('无权操作该角色');
  46. }
  47. return role.permissions.includes(permission);
  48. } catch (error) {
  49. console.error('Error checking permission:', error);
  50. throw new Error('Failed to check permission');
  51. }
  52. }
  53. /**
  54. * 获取所有角色(自动添加租户过滤)
  55. */
  56. async getRoles(tenantId?: number): Promise<RoleMt[]> {
  57. try {
  58. const where: any = {};
  59. // 如果提供了租户ID,添加租户过滤
  60. if (tenantId !== undefined) {
  61. where.tenantId = tenantId;
  62. }
  63. return await this.repository.find({ where });
  64. } catch (error) {
  65. console.error('Error getting roles:', error);
  66. throw new Error(`Failed to get roles: ${error instanceof Error ? error.message : String(error)}`);
  67. }
  68. }
  69. }