ctrlpanel/app/Http/Controllers/Api/UserController.php

176 lines
5.5 KiB
PHP
Raw Normal View History

2021-06-05 09:26:32 +00:00
<?php
namespace App\Http\Controllers\Api;
use App\Events\UserUpdateCreditsEvent;
use App\Http\Controllers\Controller;
use App\Models\DiscordUser;
use App\Models\User;
use Illuminate\Contracts\Foundation\Application;
2021-10-11 21:46:06 +00:00
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Contracts\Routing\ResponseFactory;
2021-10-11 21:46:06 +00:00
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Validation\Rule;
2021-07-28 08:47:10 +00:00
use Illuminate\Validation\ValidationException;
2021-10-11 21:46:06 +00:00
use Spatie\QueryBuilder\QueryBuilder;
class UserController extends Controller
{
2021-10-11 21:46:06 +00:00
const ALLOWED_INCLUDES = ['servers', 'payments', 'vouchers', 'discordUser'];
const ALLOWED_FILTERS = ['email', 'pterodactyl_id', 'role', 'suspended'];
/**
* Display a listing of the resource.
*
2021-06-06 19:11:42 +00:00
* @param Request $request
2021-10-11 21:46:06 +00:00
* @return LengthAwarePaginator
*/
public function index(Request $request)
{
2021-10-11 21:46:06 +00:00
$query = QueryBuilder::for(User::class)
->allowedIncludes(self::ALLOWED_INCLUDES)
->allowedFilters(self::ALLOWED_FILTERS);
return $query->paginate($request->input('per_page') ?? 50);
}
/**
* Display the specified resource.
*
* @param int $id
2021-10-11 21:46:06 +00:00
* @return User|Collection
*/
public function show(int $id)
{
$discordUser = DiscordUser::find($id);
2021-10-11 21:46:06 +00:00
$user = $discordUser ? $discordUser->user : User::findOrFail($id);
$query = QueryBuilder::for($user)
->with('discordUser')
->allowedIncludes(self::ALLOWED_INCLUDES)
->where('users.id' , '=' , $id)
->orWhereHas('discordUser' , function (Builder $builder) use ($id) {
$builder->where('id' , '=' , $id);
});
return $query->get();
}
/**
* Update the specified resource in storage.
*
* @param Request $request
* @param int $id
* @return User
*/
public function update(Request $request, int $id)
{
$discordUser = DiscordUser::find($id);
$user = $discordUser ? $discordUser->user : User::findOrFail($id);
$request->validate([
2021-10-11 21:46:06 +00:00
"name" => "sometimes|string|min:4|max:30",
"email" => "sometimes|string|email",
"credits" => "sometimes|numeric|min:0|max:1000000",
"server_limit" => "sometimes|numeric|min:0|max:1000000",
2021-10-11 21:46:06 +00:00
"role" => ['sometimes', Rule::in(['admin', 'mod', 'client', 'member'])],
]);
$user->update($request->all());
event(new UserUpdateCreditsEvent($user));
return $user;
}
2021-07-23 19:41:49 +00:00
/**
2021-07-27 12:20:31 +00:00
* increments the users credits or/and server_limit
2021-08-02 14:33:34 +00:00
*
2021-07-23 19:41:49 +00:00
* @param Request $request
* @param int $id
* @return User
2021-08-02 14:33:34 +00:00
* @throws ValidationException
2021-07-23 19:41:49 +00:00
*/
2021-07-27 08:15:10 +00:00
public function increment(Request $request, int $id)
2021-07-23 19:41:49 +00:00
{
$discordUser = DiscordUser::find($id);
$user = $discordUser ? $discordUser->user : User::findOrFail($id);
$request->validate([
2021-10-11 21:46:06 +00:00
"credits" => "sometimes|numeric|min:0|max:1000000",
2021-07-27 08:15:10 +00:00
"server_limit" => "sometimes|numeric|min:0|max:1000000",
2021-07-25 18:19:59 +00:00
]);
2021-08-02 14:33:34 +00:00
2021-10-11 21:46:06 +00:00
if ($request->credits) {
if ($user->credits + $request->credits >= 99999999) throw ValidationException::withMessages([
2021-07-27 08:15:10 +00:00
'credits' => "You can't add this amount of credits because you would exceed the credit limit"
]);
event(new UserUpdateCreditsEvent($user));
2021-07-27 08:15:10 +00:00
$user->increment('credits', $request->credits);
2021-10-11 21:46:06 +00:00
}
2021-07-27 08:15:10 +00:00
2021-10-11 21:46:06 +00:00
if ($request->server_limit) {
2021-07-27 12:20:31 +00:00
if ($user->server_limit + $request->server_limit >= 2147483647) throw ValidationException::withMessages([
'server_limit' => "You cannot add this amount of servers because it would exceed the server limit."
]);
2021-10-11 21:46:06 +00:00
$user->increment('server_limit', $request->server_limit);
2021-07-27 08:15:10 +00:00
}
2021-07-23 19:41:49 +00:00
return $user;
}
2021-07-27 12:20:31 +00:00
/**
* decrements the users credits or/and server_limit
2021-08-02 14:33:34 +00:00
*
2021-07-27 12:20:31 +00:00
* @param Request $request
* @param int $id
* @return User
2021-08-02 14:33:34 +00:00
* @throws ValidationException
2021-07-27 12:20:31 +00:00
*/
public function decrement(Request $request, int $id)
{
$discordUser = DiscordUser::find($id);
$user = $discordUser ? $discordUser->user : User::findOrFail($id);
$request->validate([
2021-10-11 21:46:06 +00:00
"credits" => "sometimes|numeric|min:0|max:1000000",
2021-07-27 12:20:31 +00:00
"server_limit" => "sometimes|numeric|min:0|max:1000000",
]);
2021-08-02 14:33:34 +00:00
2021-10-11 21:46:06 +00:00
if ($request->credits) {
if ($user->credits - $request->credits < 0) throw ValidationException::withMessages([
2021-07-28 08:47:10 +00:00
'credits' => "You can't remove this amount of credits because you would exceed the minimum credit limit"
2021-07-27 12:20:31 +00:00
]);
$user->decrement('credits', $request->credits);
2021-10-11 21:46:06 +00:00
}
2021-07-27 12:20:31 +00:00
2021-10-11 21:46:06 +00:00
if ($request->server_limit) {
if ($user->server_limit - $request->server_limit < 0) throw ValidationException::withMessages([
2021-07-28 08:47:10 +00:00
'server_limit' => "You cannot remove this amount of servers because it would exceed the minimum server."
]);
2021-10-11 21:46:06 +00:00
$user->decrement('server_limit', $request->server_limit);
2021-07-27 12:20:31 +00:00
}
return $user;
}
/**
* Remove the specified resource from storage.
*
* @param int $id
2021-08-02 14:33:34 +00:00
* @return Application|Response|ResponseFactory
*/
public function destroy(int $id)
{
$discordUser = DiscordUser::find($id);
$user = $discordUser ? $discordUser->user : User::findOrFail($id);
$user->delete();
return response($user, 200);
}
}