UserService.php 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <?php
  2. namespace App\Services;
  3. use App\Models\User;
  4. use DB;
  5. use RuntimeException;
  6. class UserService
  7. {
  8. private ?User $user;
  9. public function __construct(?User $user = null)
  10. {
  11. $this->user = $user ?? auth()->user();
  12. }
  13. public function getProfile(): array
  14. {
  15. $user = $this->getUser();
  16. return [
  17. 'id' => $user->id,
  18. 'nickname' => $user->nickname,
  19. 'account' => $user->username,
  20. 'port' => $user->port,
  21. 'passwd' => $user->passwd,
  22. 'uuid' => $user->vmess_id,
  23. 'transfer_enable' => $user->transfer_enable,
  24. 'u' => $user->u,
  25. 'd' => $user->d,
  26. 't' => $user->t,
  27. 'enable' => $user->enable,
  28. 'speed_limit' => $user->speed_limit,
  29. 'credit' => $user->credit,
  30. 'expired_at' => strtotime($user->expired_at),
  31. 'ban_time' => $user->ban_time,
  32. 'level' => $user->level_name,
  33. 'group' => $user->userGroup->name ?? null,
  34. 'last_login' => $user->last_login,
  35. 'reset_time' => $user->reset_date,
  36. 'invite_num' => $user->invite_num,
  37. 'status' => $user->status,
  38. 'invite_url' => $user->invite_url,
  39. ];
  40. }
  41. private function getUser(): User
  42. {
  43. if (! $this->user || ! $this->user->exists) {
  44. $user = auth()->user();
  45. if (! $user) {
  46. throw new RuntimeException('User not authenticated');
  47. }
  48. $this->setUser($user);
  49. }
  50. return $this->user;
  51. }
  52. public function setUser(User $user): void
  53. {
  54. $this->user = $user;
  55. }
  56. public function getRemainingDays(): int
  57. {
  58. return now()->diffInDays($this->getUser()->expired_at, false);
  59. }
  60. public function getResetDays(): ?int
  61. {
  62. return $this->getUser()->reset_time ? now()->diffInDays($this->getUser()->reset_time, false) : null;
  63. }
  64. public function getUnusedTrafficPercent(): float
  65. {
  66. $totalTransfer = $this->getUser()->transfer_enable;
  67. return $totalTransfer > 0 ? round($this->getUser()->unused_traffic * 100 / $totalTransfer, 2) : 0;
  68. }
  69. public function isTrafficWarning(): bool
  70. { // 流量异常警告
  71. return ((int) sysConfig('traffic_abuse_limit') * GiB) <= $this->recentTrafficUsed();
  72. }
  73. public function recentTrafficUsed(): int
  74. {
  75. return $this->getUser()->hourlyDataFlows()->userRecentUsed()
  76. ->sum(DB::raw('u + d')); // 假设 traffic_used 是记录流量消耗的字段
  77. }
  78. public function isActivePaying(): bool
  79. {
  80. return $this->getUser()->orders()->active()->where('origin_amount', '>', 0)->exists();
  81. }
  82. }