UserObserver.php 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. $enableChange = Arr::has($changes, ['enable']);
  23. if (($user->enable === 1 || $enableChange) && Arr::hasAny($changes, ['level', 'user_group_id', 'enable', 'port', 'passwd', 'speed_limit'])) {
  24. $allowNodes = $user->nodes()->whereType(4)->get();
  25. if (Arr::hasAny($changes, ['level', 'user_group_id'])) {
  26. $oldAllowNodes = $user->nodes($user->getOriginal('level'), $user->getOriginal('user_group_id'))->whereType(4)->get();
  27. if ($enableChange) {
  28. if ($user->enable === 0 && $oldAllowNodes->isNotEmpty()) {
  29. delUser::dispatch($user->id, $oldAllowNodes);
  30. } elseif ($user->enable === 1 && $allowNodes->isNotEmpty()) {
  31. addUser::dispatch($user->id, $allowNodes);
  32. }
  33. } else {
  34. $old = $oldAllowNodes->diff($allowNodes); //old 有 allow 没有
  35. $new = $allowNodes->diff($oldAllowNodes); //allow 有 old 没有
  36. if ($old->isNotEmpty()) {
  37. delUser::dispatch($user->id, $old);
  38. }
  39. if ($new->isNotEmpty()) {
  40. addUser::dispatch($user->id, $new);
  41. }
  42. if (Arr::hasAny($changes, ['port', 'passwd', 'speed_limit'])) {
  43. $same = $allowNodes->intersect($oldAllowNodes); // 共有部分
  44. if ($same->isNotEmpty()) {
  45. editUser::dispatch($user, $same);
  46. }
  47. }
  48. }
  49. } elseif ($allowNodes->isNotEmpty()) {
  50. if ($enableChange) {
  51. if ($user->enable === 1) { // TODO: 由于vnet未正确使用enable字段,临时解决方案
  52. addUser::dispatch($user->id, $allowNodes);
  53. } else {
  54. delUser::dispatch($user->id, $allowNodes);
  55. }
  56. } elseif (Arr::hasAny($changes, ['port', 'passwd', 'speed_limit'])) {
  57. editUser::dispatch($user, $allowNodes);
  58. }
  59. }
  60. }
  61. if ($user->status === -1 && Arr::has($changes, ['status'])) {
  62. $user->invites()->whereStatus(0)->update(['status' => 2]); // 废除其名下邀请码
  63. }
  64. }
  65. public function deleted(User $user): void
  66. {
  67. $allowNodes = $user->nodes()->whereType(4)->get();
  68. if ($allowNodes->isNotEmpty()) {
  69. delUser::dispatch($user->id, $allowNodes);
  70. }
  71. }
  72. }