IdentityManagement.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <?php
  2. declare(strict_types=1);
  3. namespace app\miniapi\service;
  4. use app\miniapi\model\MiniUser;
  5. use app\miniapi\model\MiniGrant;
  6. use app\miniapi\http\Fields;
  7. use app\miniapi\http\Input;
  8. use app\miniapi\http\Pagination;
  9. use app\miniapi\exception\ApiException;
  10. use plugin\saiadmin\app\model\water\WaterOperator;
  11. final class IdentityManagement
  12. {
  13. private function authorize(int $admin): void
  14. {
  15. if ($admin !== 1 || !WaterOperator::query()->where('id', $admin)->where('status', 1)->whereNull('delete_time')->exists()) {
  16. throw new ApiException(40301, '仅超级管理员可管理小程序身份', 403);
  17. }
  18. }
  19. public function users(int $admin, array $input): array
  20. {
  21. $this->authorize($admin);
  22. $page = new Pagination($input);
  23. $q = MiniUser::query();
  24. if (isset($input['user_id'])) {
  25. $q->where('id', Fields::id($input, 'user_id'));
  26. }
  27. $total = (clone $q)->count();
  28. return $page->result($q->orderByDesc('id')->offset($page->offset())->limit($page->pageSize)->get()->map(function ($u) {
  29. return [
  30. 'id' => (int) $u->id,
  31. 'nickname' => $u->nickname,
  32. 'status' => (int) $u->status,
  33. 'created_at' => $u->created_at,
  34. 'grants' => MiniGrant::query()->where('user_id', $u->id)->get([
  35. 'id',
  36. 'role',
  37. 'resource_id',
  38. 'status',
  39. ])->toArray(),
  40. ];
  41. })->all(), $total);
  42. }
  43. public function grant(int $admin, array $input): array
  44. {
  45. $this->authorize($admin);
  46. Fields::only($input, [
  47. 'user_id',
  48. 'role',
  49. 'resource_id',
  50. 'status',
  51. ]);
  52. $user = Fields::id($input, 'user_id');
  53. $role = Fields::choice($input, 'role', Access::roles());
  54. $resource = Fields::id($input, 'resource_id');
  55. $status = Input::integer($input['status'] ?? 1, 'status', 0, 1);
  56. return (new MiniUser())->getConnection()->transaction(function () use ($admin, $user, $role, $resource, $status) {
  57. if (!MiniUser::query()->where('id', $user)->lockForUpdate()->first()) {
  58. throw new ApiException(40401, '小程序用户不存在', 404);
  59. }
  60. if ($status === 1 && MiniGrant::query()->where('user_id', $user)->where('status', 1)
  61. ->where(function ($query) use ($role, $resource) {
  62. $query->where('role', '!=', $role)->orWhere('resource_id', '!=', $resource);
  63. })->exists()) {
  64. throw new ApiException(40903, '一个小程序账号只能绑定一个业务身份,请先停用原身份', 409);
  65. }
  66. $model = Access::resourceModel($role);
  67. if (!$model::query()->where('id', $resource)->exists()) {
  68. throw new ApiException(40401, '业务档案不存在', 404);
  69. }
  70. $row = MiniGrant::query()->updateOrCreate(
  71. [
  72. 'user_id' => $user,
  73. 'role' => $role,
  74. 'resource_id' => $resource,
  75. ],
  76. [
  77. 'status' => $status,
  78. 'created_by' => $admin,
  79. 'created_at' => date('Y-m-d H:i:s'),
  80. 'updated_at' => date('Y-m-d H:i:s'),
  81. ]
  82. );
  83. Commands::audit('admin', $admin, 'identity.grant', (int) $row->id, [
  84. 'user_id' => $user,
  85. 'role' => $role,
  86. 'resource_id' => $resource,
  87. 'status' => $status,
  88. ]);
  89. return [
  90. 'id' => (int) $row->id,
  91. 'status' => $status,
  92. ];
  93. });
  94. }
  95. }