UserObserver.php 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. <?php
  2. namespace App\Observers;
  3. use App\Components\Helpers;
  4. use App\Jobs\VNet\addUser;
  5. use App\Jobs\VNet\delUser;
  6. use App\Jobs\VNet\editUser;
  7. use App\Models\User;
  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()->pluck('id');
  15. if (count($allowNodes)) {
  16. addUser::dispatch($user->id, $allowNodes);
  17. }
  18. }
  19. public function updated(User $user): void
  20. {
  21. $changes = $user->getChanges();
  22. $allowNodes = $user->nodes()->whereType(4)->get();
  23. $oldAllowNodes = $user->nodes($user->getOriginal('level'), $user->getOriginal('user_group_id'))->whereType(4)->get();
  24. if ($allowNodes->isNotEmpty() || $oldAllowNodes->isNotEmpty()) {
  25. if (Arr::hasAny($changes, ['level', 'user_group_id', 'enable'])) {
  26. if (Arr::has($changes, 'enable')) {
  27. if ($user->enable) { // TODO: 由于vnet未正确使用enable字段,临时解决方案
  28. addUser::dispatch($user->id, $allowNodes);
  29. } else {
  30. delUser::dispatch($user->id, $allowNodes);
  31. }
  32. } else {
  33. // 权限修改,消除重叠的部分
  34. if ($oldAllowNodes->isNotEmpty() && $oldAllowNodes->diff($allowNodes)->isNotEmpty()) {
  35. delUser::dispatch($user->id, $oldAllowNodes->diff($allowNodes));
  36. }
  37. if ($allowNodes->diff($oldAllowNodes)->isNotEmpty()) {
  38. addUser::dispatch($user->id, $allowNodes->diff($oldAllowNodes));
  39. }
  40. }
  41. } elseif (Arr::hasAny($changes, ['port', 'passwd', 'speed_limit'])) {
  42. editUser::dispatch($user, $allowNodes);
  43. }
  44. }
  45. }
  46. public function deleted(User $user): void
  47. {
  48. $allowNodes = $user->nodes()->whereType(4)->get();
  49. if ($allowNodes->isNotEmpty()) {
  50. delUser::dispatch($user->id, $allowNodes);
  51. }
  52. }
  53. }