UserObserver.php 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?php
  2. namespace App\Observers;
  3. use App\Jobs\VNet\AddUser;
  4. use App\Jobs\VNet\DelUser;
  5. use App\Jobs\VNet\EditUser;
  6. use App\Models\User;
  7. use App\Utils\Helpers;
  8. use Arr;
  9. class UserObserver
  10. {
  11. public function created(User $user): void
  12. {
  13. $user->subscribe()->create(['code' => Helpers::makeSubscribeCode()]);
  14. $allowNodes = $user->nodes()->whereType(4)->get();
  15. if ($allowNodes->isNotEmpty()) {
  16. AddUser::dispatch($user->id, $allowNodes);
  17. }
  18. }
  19. public function updated(User $user): void
  20. {
  21. $changes = $user->getChanges();
  22. $enableChanged = Arr::has($changes, 'enable');
  23. $permissionFieldsChanged = Arr::hasAny($changes, ['level', 'user_group_id']);
  24. $configFieldsChanged = Arr::hasAny($changes, ['port', 'passwd', 'speed_limit']);
  25. // 如果enable状态发生变化,或者用户当前已启用且权限或配置字段发生变化
  26. if ($enableChanged || ($user->enable === 1 && ($permissionFieldsChanged || $configFieldsChanged))) {
  27. // 获取当前允许的节点
  28. $currentAllowedNodes = $user->nodes()->whereType(4)->get();
  29. if ($permissionFieldsChanged) {
  30. $oldAllowedNodes = $user->nodes($user->getOriginal('level'), $user->getOriginal('user_group_id'))->whereType(4)->get();
  31. if ($enableChanged) {
  32. if ($user->enable) {
  33. // 用户被启用,添加到所有当前允许的节点
  34. if ($currentAllowedNodes->isNotEmpty()) {
  35. AddUser::dispatch($user->id, $currentAllowedNodes);
  36. }
  37. } elseif ($oldAllowedNodes->isNotEmpty()) {
  38. DelUser::dispatch($user->id, $oldAllowedNodes);
  39. }
  40. } else {
  41. // 计算差异
  42. $nodesToRemove = $oldAllowedNodes->diff($currentAllowedNodes); // 用户失去权限的节点
  43. $nodesToAdd = $currentAllowedNodes->diff($oldAllowedNodes); // 用户新增权限的节点
  44. // 处理节点移除
  45. if ($nodesToRemove->isNotEmpty()) {
  46. DelUser::dispatch($user->id, $nodesToRemove);
  47. }
  48. // 处理节点添加
  49. if ($nodesToAdd->isNotEmpty()) {
  50. AddUser::dispatch($user->id, $nodesToAdd);
  51. }
  52. // 处理节点更新(权限未变但配置变了)
  53. if ($configFieldsChanged && $currentAllowedNodes->isNotEmpty()) {
  54. $nodesToUpdate = $currentAllowedNodes->intersect($oldAllowedNodes); // 权限未变但可能需要更新配置的节点
  55. if ($nodesToUpdate->isNotEmpty()) {
  56. EditUser::dispatch($user, $nodesToUpdate);
  57. }
  58. }
  59. }
  60. } elseif ($enableChanged && $currentAllowedNodes->isNotEmpty()) {
  61. // 启用状态变化处理
  62. if ($user->enable) {
  63. // 用户被启用,添加到所有允许的节点
  64. AddUser::dispatch($user->id, $currentAllowedNodes);
  65. } else {
  66. // 用户被禁用,从所有允许的节点中移除
  67. DelUser::dispatch($user->id, $currentAllowedNodes);
  68. }
  69. } elseif ($configFieldsChanged && $currentAllowedNodes->isNotEmpty()) {
  70. // 仅配置变化,更新所有允许的节点
  71. EditUser::dispatch($user, $currentAllowedNodes);
  72. }
  73. }
  74. if ($user->status === -1 && Arr::has($changes, ['status'])) {
  75. $user->invites()->whereStatus(0)->update(['status' => 2]); // 废除其名下邀请码
  76. }
  77. }
  78. public function deleted(User $user): void
  79. {
  80. $allowNodes = $user->nodes()->whereType(4)->get();
  81. if ($allowNodes->isNotEmpty()) {
  82. DelUser::dispatch($user->id, $allowNodes);
  83. }
  84. }
  85. }