Files
ABSDEV/Modules/Builder/Http/Controllers/BuilderController.php
T
2026-07-24 14:59:44 +01:00

62 lines
2.8 KiB
PHP

<?php
namespace Modules\Builder\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Str;
use Illuminate\View\View;
use Modules\Builder\Models\BuilderDocument;
use Modules\Builder\Services\BuilderDocumentService;
use Modules\Builder\Services\BuilderRegistry;
final class BuilderController extends Controller
{
public function index(Request $request): View
{
$type = $request->string('type')->toString();
$documents = BuilderDocument::query()->when($type, fn ($q) => $q->where('type', $type))->latest()->paginate(20)->withQueryString();
return view('builder::index', compact('documents', 'type'));
}
public function create(BuilderRegistry $registry): View
{
return view('builder::editor', ['document' => new BuilderDocument(['type' => request('type', 'page'), 'document' => ['nodes' => []]]), 'components' => $registry->components()]);
}
public function edit(BuilderDocument $document, BuilderRegistry $registry): View
{
return view('builder::editor', ['document' => $document, 'components' => $registry->components()]);
}
public function store(Request $request, BuilderDocumentService $service): RedirectResponse
{
$document = $service->save(new BuilderDocument, $this->validated($request), $request->user()?->id);
return redirect()->route('administration.builder.edit', $document)->with('status', 'Builder document created.');
}
public function update(Request $request, BuilderDocument $document, BuilderDocumentService $service): RedirectResponse
{
$service->save($document, $this->validated($request), $request->user()?->id);
return back()->with('status', 'Builder document saved.');
}
public function destroy(BuilderDocument $document): RedirectResponse
{
$document->delete();
return redirect()->route('administration.builder.index')->with('status', 'Builder document deleted.');
}
private function validated(Request $request): array
{
$data = $request->validate(['type' => ['required', 'in:'.implode(',', config('builder.allowed_types'))], 'name' => ['required', 'string', 'max:255'], 'slug' => ['nullable', 'string', 'max:255'], 'status' => ['required', 'in:draft,published,archived'], 'document_json' => ['required', 'json'], 'settings_json' => ['nullable', 'json']]);
return ['type' => $data['type'], 'name' => $data['name'], 'slug' => $data['slug'] ?: Str::slug($data['name']), 'status' => $data['status'], 'document' => json_decode($data['document_json'], true, 512, JSON_THROW_ON_ERROR), 'settings' => json_decode($data['settings_json'] ?: '{}', true, 512, JSON_THROW_ON_ERROR), 'published_at' => $data['status'] === 'published' ? now() : null];
}
}