#591 - databases

This commit is contained in:
Saeed Vaziry
2025-05-20 17:35:20 +02:00
parent eb86204069
commit 2850c1fa59
30 changed files with 940 additions and 284 deletions

View File

@ -50,8 +50,6 @@ public function create(Request $request, Project $project, Server $server): Data
$this->validateRoute($project, $server);
$this->validate($request, CreateDatabase::rules($server, $request->input()));
$database = app(CreateDatabase::class)->create($server, $request->all());
return new DatabaseResource($database);

View File

@ -87,7 +87,9 @@ public function delete(Project $project): Response
/** @var User $user */
$user = auth()->user();
app(DeleteProject::class)->delete($user, $project);
app(DeleteProject::class)->delete($user, $project, [
'name' => $project->name,
]);
return response()->noContent();
}

View File

@ -0,0 +1,96 @@
<?php
namespace App\Http\Controllers;
use App\Actions\Database\CreateDatabase;
use App\Actions\Database\DeleteDatabase;
use App\Actions\Database\SyncDatabases;
use App\Http\Resources\DatabaseResource;
use App\Models\Database;
use App\Models\Server;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Inertia\Inertia;
use Inertia\Response;
use Spatie\RouteAttributes\Attributes\Delete;
use Spatie\RouteAttributes\Attributes\Get;
use Spatie\RouteAttributes\Attributes\Middleware;
use Spatie\RouteAttributes\Attributes\Patch;
use Spatie\RouteAttributes\Attributes\Post;
use Spatie\RouteAttributes\Attributes\Prefix;
#[Prefix('servers/{server}/database')]
#[Middleware(['auth', 'has-project'])]
class DatabaseController extends Controller
{
#[Get('/', name: 'databases')]
public function index(Server $server): Response
{
$this->authorize('viewAny', [Database::class, $server]);
return Inertia::render('databases/index', [
'databases' => DatabaseResource::collection($server->databases()->simplePaginate(config('web.pagination_size'))),
]);
}
#[Get('/charsets', name: 'databases.charsets')]
public function charsets(Server $server): JsonResponse
{
$this->authorize('view', $server);
$charsets = [];
foreach ($server->database()->type_data['charsets'] as $charset => $value) {
$charsets[] = $charset;
}
return response()->json($charsets);
}
#[Get('/collations/{charset?}', name: 'databases.collations')]
public function collations(Server $server, ?string $charset = null): JsonResponse
{
$this->authorize('view', $server);
if (! $charset) {
$charset = $server->database()->type_data['defaultCharset'] ?? null;
}
$charsets = $server->database()->type_data['charsets'] ?? [];
return response()->json(data_get($charsets, $charset.'.list', data_get($charsets, $charset.'.default', [])));
}
#[Post('/', name: 'databases.store')]
public function store(Request $request, Server $server): RedirectResponse
{
$this->authorize('create', [Database::class, $server]);
app(CreateDatabase::class)->create($server, $request->all());
return back()
->with('success', 'Database created successfully.');
}
#[Patch('/sync', name: 'databases.sync')]
public function sync(Server $server): RedirectResponse
{
$this->authorize('create', [Database::class, $server]);
app(SyncDatabases::class)->sync($server);
return back()
->with('success', 'Databases synced successfully.');
}
#[Delete('/{database}', name: 'databases.destroy')]
public function destroy(Server $server, Database $database): RedirectResponse
{
$this->authorize('delete', [$database, $server]);
app(DeleteDatabase::class)->delete($server, $database);
return back()
->with('success', 'Database deleted successfully.');
}
}

View File

@ -10,6 +10,7 @@
use App\Models\ServerProvider;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\URL;
use Illuminate\Validation\Rule;
use Inertia\Inertia;
use Inertia\Response;
@ -57,8 +58,7 @@ public function show(Server $server): Response
$this->authorize('view', $server);
return Inertia::render('servers/show', [
'server' => ServerResource::make($server),
'logs' => ServerLogResource::collection($server->logs()->latest()->paginate(config('web.pagination_size'))),
'logs' => ServerLogResource::collection($server->logs()->latest()->simplePaginate(config('web.pagination_size'))),
]);
}
@ -67,6 +67,18 @@ public function switch(Server $server): RedirectResponse
{
$this->authorize('view', $server);
$previousUrl = URL::previous();
$previousRequest = Request::create($previousUrl);
$previousRoute = app('router')->getRoutes()->match($previousRequest);
if ($previousRoute->hasParameter('server')) {
if (count($previousRoute->parameters()) > 1) {
return redirect()->route('servers.show', ['server' => $server->id]);
}
return redirect()->route($previousRoute->getName(), ['server' => $server]);
}
return redirect()->route('servers.show', ['server' => $server->id]);
}

View File

@ -51,8 +51,14 @@ public function share(Request $request): array
$servers = ServerResource::collection($user->currentProject?->servers);
}
$data = [];
if ($request->route('server')) {
$data['server'] = ServerResource::make($request->route('server'));
}
return [
...parent::share($request),
...$data,
'name' => config('app.name'),
'quote' => ['message' => trim($message), 'author' => trim($author)],
'auth' => [

View File

@ -18,7 +18,10 @@ public function toArray(Request $request): array
'id' => $this->id,
'server_id' => $this->server_id,
'name' => $this->name,
'collation' => $this->collation,
'charset' => $this->charset,
'status' => $this->status,
'status_color' => $this::$statusColors[$this->status] ?? 'gray',
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
];