Files
ploi-core/app/Http/Controllers/ServerController.php
2023-09-26 23:44:58 +02:00

124 lines
3.9 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Server;
use Illuminate\Http\Request;
use App\Jobs\Servers\DeleteServer;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\RedirectResponse;
use App\Http\Resources\ServerResource;
use App\DataTransferObjects\ServerData;
use App\Actions\Server\CreateServerAction;
use App\Http\Requests\ServerUpdateRequest;
class ServerController extends Controller
{
public function index()
{
$servers = auth()->user()->servers()
->withCount('sites')
->latest()
->paginate();
$providers = auth()->user()->package ? auth()->user()->package->providers()->pluck('name', 'id') : [];
return inertia('Servers/Index', [
'servers' => ServerResource::collection($servers),
'dataProviders' => $providers
]);
}
public function store(Request $request): RedirectResponse
{
$this->authorize('create', Server::class);
if ($package = $request->user()->package) {
if ($package->maximum_servers > 0 && $request->user()->servers()->count() >= $package->maximum_servers) {
return redirect()->back()->withErrors(['name' => 'You have received the maximum servers you\'re allowed to create.']);
}
}
$data = $request->validate([
'name' => ['required'],
'provider_id' => ['required'],
'provider_region_id' => ['required'],
'provider_plan_id' => ['required'],
'database_type' => ['required'],
]);
$data['user_id'] = Auth::id();
app(CreateServerAction::class)->execute(
ServerData::validateAndCreate($data)
);
return redirect()->route('servers.index');
}
public function show($id)
{
$server = auth()->user()->servers()->findOrFail($id);
if ($server->status === Server::STATUS_BUSY) {
return redirect()->back()->with('info', 'This server is currently busy, please check back later.');
}
return inertia('Servers/Show', [
'server' => $server,
'sites' => $server->sites()->latest()->paginate(5, ['*'], 'sites_per_page'),
]);
}
public function update(ServerUpdateRequest $request, $id)
{
$server = $request->user()->servers()->findOrFail($id);
$server->update([
'name' => $request->input('name')
]);
return redirect()->route('servers.settings.show', $id)->with('success', __('Server information has been updated'));
}
public function destroy(Request $request, $id)
{
$server = $request->user()->servers()->findOrFail($id);
$this->authorize('delete', $server);
dispatch(new DeleteServer($server->ploi_id));
$request->user()->systemLogs()->create([
'title' => 'Server ' . $server->name . ' has been deleted',
'description' => 'The server ' . $server->name . ' has been deleted by user ' . $request->user()->name
]);
$server->delete();
return redirect()->route('servers.index')->with('success', __('Your server is deleted'));
}
public function plansAndRegions(Request $request, $providerId)
{
$provider = $request->user()->package->providers()->findOrFail($providerId);
$regions = $provider->regions()
->when($provider->allowed_regions, function ($query) use ($provider) {
return $query->whereIn('id', $provider->allowed_regions);
})
->pluck('label', 'id');
$plans = $provider->plans()
->when($provider->allowed_plans, function ($query) use ($provider) {
return $query->whereIn('id', $provider->allowed_plans);
})
->pluck('label', 'id');
return [
'regions' => $regions,
'plans' => $plans,
];
}
}