UserController.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Events\UserUpdateCreditsEvent;
  4. use App\Http\Controllers\Controller;
  5. use App\Models\DiscordUser;
  6. use App\Models\User;
  7. use Illuminate\Contracts\Foundation\Application;
  8. use Illuminate\Contracts\Pagination\LengthAwarePaginator;
  9. use Illuminate\Contracts\Routing\ResponseFactory;
  10. use Illuminate\Database\Eloquent\Builder;
  11. use Illuminate\Database\Eloquent\Collection;
  12. use Illuminate\Http\Request;
  13. use Illuminate\Http\Response;
  14. use Illuminate\Validation\Rule;
  15. use Illuminate\Validation\ValidationException;
  16. use Spatie\QueryBuilder\QueryBuilder;
  17. class UserController extends Controller
  18. {
  19. const ALLOWED_INCLUDES = ['servers', 'payments', 'vouchers', 'discordUser'];
  20. const ALLOWED_FILTERS = ['email', 'pterodactyl_id', 'role', 'suspended'];
  21. /**
  22. * Display a listing of the resource.
  23. *
  24. * @param Request $request
  25. * @return LengthAwarePaginator
  26. */
  27. public function index(Request $request)
  28. {
  29. $query = QueryBuilder::for(User::class)
  30. ->allowedIncludes(self::ALLOWED_INCLUDES)
  31. ->allowedFilters(self::ALLOWED_FILTERS);
  32. return $query->paginate($request->input('per_page') ?? 50);
  33. }
  34. /**
  35. * Display the specified resource.
  36. *
  37. * @param int $id
  38. * @return User|Collection
  39. */
  40. public function show(int $id)
  41. {
  42. $discordUser = DiscordUser::find($id);
  43. $user = $discordUser ? $discordUser->user : User::findOrFail($id);
  44. $query = QueryBuilder::for($user)
  45. ->with('discordUser')
  46. ->allowedIncludes(self::ALLOWED_INCLUDES)
  47. ->where('users.id' , '=' , $id)
  48. ->orWhereHas('discordUser' , function (Builder $builder) use ($id) {
  49. $builder->where('id' , '=' , $id);
  50. });
  51. return $query->get();
  52. }
  53. /**
  54. * Update the specified resource in storage.
  55. *
  56. * @param Request $request
  57. * @param int $id
  58. * @return User
  59. */
  60. public function update(Request $request, int $id)
  61. {
  62. $discordUser = DiscordUser::find($id);
  63. $user = $discordUser ? $discordUser->user : User::findOrFail($id);
  64. $request->validate([
  65. "name" => "sometimes|string|min:4|max:30",
  66. "email" => "sometimes|string|email",
  67. "credits" => "sometimes|numeric|min:0|max:1000000",
  68. "server_limit" => "sometimes|numeric|min:0|max:1000000",
  69. "role" => ['sometimes', Rule::in(['admin', 'mod', 'client', 'member'])],
  70. ]);
  71. $user->update($request->all());
  72. event(new UserUpdateCreditsEvent($user));
  73. return $user;
  74. }
  75. /**
  76. * increments the users credits or/and server_limit
  77. *
  78. * @param Request $request
  79. * @param int $id
  80. * @return User
  81. * @throws ValidationException
  82. */
  83. public function increment(Request $request, int $id)
  84. {
  85. $discordUser = DiscordUser::find($id);
  86. $user = $discordUser ? $discordUser->user : User::findOrFail($id);
  87. $request->validate([
  88. "credits" => "sometimes|numeric|min:0|max:1000000",
  89. "server_limit" => "sometimes|numeric|min:0|max:1000000",
  90. ]);
  91. if ($request->credits) {
  92. if ($user->credits + $request->credits >= 99999999) throw ValidationException::withMessages([
  93. 'credits' => "You can't add this amount of credits because you would exceed the credit limit"
  94. ]);
  95. event(new UserUpdateCreditsEvent($user));
  96. $user->increment('credits', $request->credits);
  97. }
  98. if ($request->server_limit) {
  99. if ($user->server_limit + $request->server_limit >= 2147483647) throw ValidationException::withMessages([
  100. 'server_limit' => "You cannot add this amount of servers because it would exceed the server limit."
  101. ]);
  102. $user->increment('server_limit', $request->server_limit);
  103. }
  104. return $user;
  105. }
  106. /**
  107. * decrements the users credits or/and server_limit
  108. *
  109. * @param Request $request
  110. * @param int $id
  111. * @return User
  112. * @throws ValidationException
  113. */
  114. public function decrement(Request $request, int $id)
  115. {
  116. $discordUser = DiscordUser::find($id);
  117. $user = $discordUser ? $discordUser->user : User::findOrFail($id);
  118. $request->validate([
  119. "credits" => "sometimes|numeric|min:0|max:1000000",
  120. "server_limit" => "sometimes|numeric|min:0|max:1000000",
  121. ]);
  122. if ($request->credits) {
  123. if ($user->credits - $request->credits < 0) throw ValidationException::withMessages([
  124. 'credits' => "You can't remove this amount of credits because you would exceed the minimum credit limit"
  125. ]);
  126. $user->decrement('credits', $request->credits);
  127. }
  128. if ($request->server_limit) {
  129. if ($user->server_limit - $request->server_limit < 0) throw ValidationException::withMessages([
  130. 'server_limit' => "You cannot remove this amount of servers because it would exceed the minimum server."
  131. ]);
  132. $user->decrement('server_limit', $request->server_limit);
  133. }
  134. return $user;
  135. }
  136. /**
  137. * Remove the specified resource from storage.
  138. *
  139. * @param int $id
  140. * @return Application|Response|ResponseFactory
  141. */
  142. public function destroy(int $id)
  143. {
  144. $discordUser = DiscordUser::find($id);
  145. $user = $discordUser ? $discordUser->user : User::findOrFail($id);
  146. $user->delete();
  147. return response($user, 200);
  148. }
  149. }