RoleService.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. <?php
  2. /**
  3. * @Name
  4. * @Description
  5. * @Author 刘学玺
  6. * @Date 2024/8/18 22:44
  7. */
  8. namespace App\Http\Services\Backend\Server\System;
  9. use App\Enums\System\Role\DataScope;
  10. use App\Exceptions\ApiException;
  11. use App\Http\Services\Service;
  12. use App\Models\System\DictType;
  13. use App\Models\System\Menu;
  14. use App\Models\System\Role;
  15. use Ramsey\Uuid\Type\Integer;
  16. use Spatie\Permission\Guard;
  17. use Symfony\Component\HttpFoundation\Response;
  18. class RoleService extends Service
  19. {
  20. /**
  21. * @throws ApiException
  22. */
  23. public function createRole($params)
  24. {
  25. $params['guard_name'] = $params['guard_name'] ?? Guard::getDefaultName(static::class);
  26. // 1. 校验角色
  27. self::validateRoleDuplicate($params['name'], $params['guard_name']);;
  28. $params['data_scope'] = DataScope::ALL;
  29. // 2. 插入到数据库
  30. $role = Role::create($params);
  31. // 3. 记录操作日志上下文
  32. return $role->id;
  33. }
  34. /**
  35. * @throws ApiException
  36. */
  37. public function updateRole(array $params, int $id): bool|int
  38. {
  39. $params['guard_name'] = $params['guard_name'] ?? Guard::getDefaultName(static::class);
  40. // 校验是否可以更新
  41. $role = self::validateRoleForUpdate($id);
  42. // 校验角色名称是否重复
  43. self::validateRoleDuplicate($params['name'], $params['guard_name'], $id);
  44. // 更新到数据库
  45. return $role->update([...$params, 'id' => $id]);
  46. // 记录操作日志上下文
  47. }
  48. public function deleteRole($id): ?bool
  49. {
  50. // 1. 校验是否可以更新
  51. $role = self::validateRoleForUpdate($id);
  52. // 2.1 标记删除
  53. return $role->delete();
  54. // 2.2 删除相关数据
  55. // permissionService.processRoleDeleted(id);
  56. // 3. 记录操作日志上下文
  57. // LogRecordContext.putVariable(DiffParseFunction.OLD_OBJECT, BeanUtils.toBean(role, RoleSaveReqVO.class));
  58. // LogRecordContext.putVariable("role", role);
  59. }
  60. public function getRoleList($data): array
  61. {
  62. $role = Role::query();
  63. isset($data['name']) && $role->whereLike('name', "%{$data['name']}%");
  64. isset($data['status']) && $role->where('status', $data['status']);
  65. $rolePage = $role->orderBy('sort')->paginate($data['pageSize'], ['*'], 'page', $data['pageNo']);
  66. return ['list' => $rolePage->items(), 'total' => $rolePage->total()];
  67. }
  68. // public function getRolePermissions($id)
  69. // {
  70. // $role = Role::findById($id);
  71. // return $role->getAllPermissions()->pluck('id');
  72. // }
  73. /**
  74. * 校验角色的唯一字段是否重复
  75. *
  76. * 1. 是否存在相同名字的角色
  77. * 2. 是否存在相同编码的角色
  78. *
  79. * @param String $name 角色名字
  80. * @param String $guard_name
  81. * @param int $id 角色编号
  82. * @throws ApiException
  83. */
  84. public static function validateRoleDuplicate(string $name, string $guard_name, int $id = 0): void
  85. {
  86. // 0. 超级管理员,不允许创建
  87. // if (RoleCodeEnum.isSuperAdmin(code)) {
  88. // throw exception(ROLE_ADMIN_CODE_ERROR, code);
  89. // }
  90. // 1. 该 name 名字被其它角色所使用
  91. $role = self::selectByName($name, $guard_name);
  92. $role && $role->id !== $id && self::error('ROLE_NAME_DUPLICATE', Response::HTTP_UNPROCESSABLE_ENTITY);
  93. }
  94. public static function validateRoleForUpdate($id): Role
  95. {
  96. $role = Role::findById($id);
  97. // throw exception(ROLE_NOT_EXISTS);
  98. // 内置角色,不允许删除
  99. // if (RoleTypeEnum.SYSTEM.getType().equals(role.getType())) {
  100. // throw exception(ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE);
  101. // }
  102. return $role;
  103. }
  104. protected static function selectByName($name, $guard_name = null)
  105. {
  106. $attributes = ['name' => $name];
  107. $attributes['guard_name'] = $guard_name ?? config('auth.defaults.guard');
  108. return Role::query()->where($attributes)->first();
  109. }
  110. }