69 lines
2.5 KiB
PHP
69 lines
2.5 KiB
PHP
<?php
|
|
|
|
namespace Modules\Sites\Http\Controllers;
|
|
|
|
use Illuminate\Http\RedirectResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Routing\Controller;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Validation\Rule;
|
|
use Illuminate\View\View;
|
|
use Modules\Sites\Models\Site;
|
|
|
|
final class SiteController extends Controller
|
|
{
|
|
public function index(): View
|
|
{
|
|
return view('sites::admin.sites.index', ['sites' => Site::query()->with('domains')->orderByDesc('is_default')->orderBy('name')->paginate(20)]);
|
|
}
|
|
|
|
public function create(): View
|
|
{
|
|
return view('sites::admin.sites.form', ['site' => new Site]);
|
|
}
|
|
|
|
public function store(Request $request): RedirectResponse
|
|
{
|
|
$site = Site::query()->create($this->validated($request));
|
|
|
|
return redirect()->route('administration.sites.edit', $site)->with('success', 'Site created.');
|
|
}
|
|
|
|
public function edit(Site $site): View
|
|
{
|
|
return view('sites::admin.sites.form', ['site' => $site->load(['domains', 'settings'])]);
|
|
}
|
|
|
|
public function update(Request $request, Site $site): RedirectResponse
|
|
{
|
|
DB::transaction(function () use ($request, $site): void {
|
|
$data = $this->validated($request, $site);
|
|
if ($data['is_default']) {
|
|
Site::query()->whereKeyNot($site->id)->update(['is_default' => false]);
|
|
} $site->update($data);
|
|
});
|
|
|
|
return back()->with('success', 'Site updated.');
|
|
}
|
|
|
|
public function destroy(Site $site): RedirectResponse
|
|
{
|
|
abort_if($site->is_default, 422, 'The default site cannot be deleted.');
|
|
$site->delete();
|
|
|
|
return redirect()->route('administration.sites.index')->with('success', 'Site deleted.');
|
|
}
|
|
|
|
public function switch(Request $request, Site $site): RedirectResponse
|
|
{
|
|
$request->session()->put(config('sites.session_key'), $site->id);
|
|
|
|
return back()->with('success', "Site context changed to {$site->name}.");
|
|
}
|
|
|
|
private function validated(Request $request, ?Site $site = null): array
|
|
{
|
|
return $request->validate(['name' => ['required', 'string', 'max:150'], 'key' => ['required', 'alpha_dash', 'max:100', Rule::unique('sites', 'key')->ignore($site)], 'status' => ['required', Rule::in(['active', 'inactive', 'maintenance'])], 'theme' => ['nullable', 'string', 'max:100'], 'default_locale' => ['required', 'string', 'max:20'], 'timezone' => ['required', 'timezone'], 'is_default' => ['sometimes', 'boolean']]) + ['is_default' => $request->boolean('is_default')];
|
|
}
|
|
}
|