role.service.mt.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import { DataSource } from 'typeorm';
  2. import { RoleMt } from '../entities/role.entity.mt';
  3. import { ConcreteCrudService } from '@d8d/shared-crud';
  4. export class RoleServiceMt extends ConcreteCrudService<RoleMt> {
  5. constructor(dataSource: DataSource) {
  6. super(RoleMt, {
  7. userTracking: {
  8. // 禁用用户追踪
  9. },
  10. tenantOptions: {
  11. tenantIdField: 'tenantId',
  12. autoExtractFromContext: true
  13. }
  14. });
  15. }
  16. /**
  17. * 根据角色名获取角色(自动添加租户过滤)
  18. */
  19. async getRoleByName(name: string, tenantId?: number): Promise<RoleMt | null> {
  20. try {
  21. const where: any = { name };
  22. // 如果提供了租户ID,添加租户过滤
  23. if (tenantId !== undefined) {
  24. where.tenantId = tenantId;
  25. }
  26. const roles = await this.repository.find({ where });
  27. return roles.length > 0 ? roles[0] ?? null : null;
  28. } catch (error) {
  29. console.error('Error getting role by name:', error);
  30. throw new Error('Failed to get role by name');
  31. }
  32. }
  33. /**
  34. * 检查角色是否拥有指定权限
  35. */
  36. async hasPermission(roleId: number, permission: string, tenantId?: number): Promise<boolean> {
  37. try {
  38. const role = await this.getById(roleId, [], tenantId);
  39. if (!role) return false;
  40. return role.permissions.includes(permission);
  41. } catch (error) {
  42. console.error('Error checking permission:', error);
  43. throw new Error('Failed to check permission');
  44. }
  45. }
  46. /**
  47. * 获取所有角色(自动添加租户过滤)
  48. */
  49. async getRoles(tenantId?: number): Promise<RoleMt[]> {
  50. try {
  51. const where: any = {};
  52. // 如果提供了租户ID,添加租户过滤
  53. if (tenantId !== undefined) {
  54. where.tenantId = tenantId;
  55. }
  56. return await this.repository.find({ where });
  57. } catch (error) {
  58. console.error('Error getting roles:', error);
  59. throw new Error(`Failed to get roles: ${error instanceof Error ? error.message : String(error)}`);
  60. }
  61. }
  62. /**
  63. * 根据ID获取角色(重写以添加租户过滤)
  64. */
  65. override async getById(id: number, relations: string[] = [], userId?: string | number): Promise<RoleMt | null> {
  66. try {
  67. const where: any = { id };
  68. // 如果提供了租户ID(作为userId参数传递),添加租户过滤
  69. if (userId !== undefined && typeof userId === 'number') {
  70. where.tenantId = userId;
  71. }
  72. return await this.repository.findOne({ where, relations });
  73. } catch (error) {
  74. console.error('Error getting role by id:', error);
  75. throw new Error('Failed to get role by id');
  76. }
  77. }
  78. /**
  79. * 更新角色(重写以添加租户过滤)
  80. */
  81. override async update(id: number, data: Partial<RoleMt>, userId?: string | number): Promise<RoleMt | null> {
  82. try {
  83. // 首先验证角色是否存在且属于指定租户
  84. const existingRole = await this.getById(id, [], userId);
  85. if (!existingRole) return null;
  86. // 更新角色
  87. await this.repository.update(id, data);
  88. // 返回更新后的角色
  89. return await this.getById(id, [], userId);
  90. } catch (error) {
  91. console.error('Error updating role:', error);
  92. throw new Error('Failed to update role');
  93. }
  94. }
  95. /**
  96. * 删除角色(重写以添加租户过滤)
  97. */
  98. override async delete(id: number, userId?: string | number): Promise<boolean> {
  99. try {
  100. // 首先验证角色是否存在且属于指定租户
  101. const existingRole = await this.getById(id, [], userId);
  102. if (!existingRole) return false;
  103. // 删除角色
  104. const result = await this.repository.delete(id);
  105. return result.affected === 1;
  106. } catch (error) {
  107. console.error('Error deleting role:', error);
  108. throw new Error('Failed to delete role');
  109. }
  110. }
  111. }