54 lines
1.7 KiB
PHP
54 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Models\LegalPage;
|
|
use App\Support\ApiError;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Routing\Controller as BaseController;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
class LegalController extends BaseController
|
|
{
|
|
public function show(Request $request, string $slug)
|
|
{
|
|
$locale = $request->query('lang', 'de');
|
|
|
|
// Support common English aliases as fallbacks
|
|
$s = strtolower($slug);
|
|
$aliasMap = [
|
|
'imprint' => 'impressum',
|
|
'privacy' => 'datenschutz',
|
|
'terms' => 'agb',
|
|
];
|
|
$resolved = $aliasMap[$s] ?? $s;
|
|
|
|
$page = LegalPage::query()
|
|
->where('slug', $resolved)
|
|
->where('is_published', true)
|
|
->orderByDesc('version')
|
|
->first();
|
|
if (! $page) {
|
|
return ApiError::response(
|
|
'legal_page_not_found',
|
|
'Legal Page Not Found',
|
|
'The requested legal document does not exist.',
|
|
Response::HTTP_NOT_FOUND,
|
|
['slug' => $resolved]
|
|
);
|
|
}
|
|
|
|
$title = $page->title[$locale] ?? $page->title[$page->locale_fallback] ?? $page->title['de'] ?? $page->title['en'] ?? $page->slug;
|
|
$body = $page->body_markdown[$locale] ?? $page->body_markdown[$page->locale_fallback] ?? reset($page->body_markdown);
|
|
|
|
return response()->json([
|
|
'slug' => $page->slug,
|
|
'version' => (int) $page->version,
|
|
'effective_from' => optional($page->effective_from)->toIso8601String(),
|
|
'locale' => $locale,
|
|
'title' => $title,
|
|
'body_markdown' => (string) $body,
|
|
])->header('Cache-Control', 'no-store');
|
|
}
|
|
}
|