51 lines
1.6 KiB
PHP
51 lines
1.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\MagicLink;
|
|
use App\Models\PressRelease;
|
|
use Illuminate\Contracts\View\View;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
class PressReleasePreviewController extends Controller
|
|
{
|
|
public function __invoke(string $token): View|Response
|
|
{
|
|
$magicLink = MagicLink::query()
|
|
->where('token_hash', hash('sha256', $token))
|
|
->where('purpose', 'press_release_access')
|
|
->first();
|
|
|
|
if (! $magicLink) {
|
|
return $this->renderError(__('Der Vorschau-Link ist ungültig.'), 404);
|
|
}
|
|
|
|
if ($magicLink->expires_at && $magicLink->expires_at->isPast()) {
|
|
return $this->renderError(__('Der Vorschau-Link ist abgelaufen.'), 410);
|
|
}
|
|
|
|
$pressReleaseId = (int) ($magicLink->payload['press_release_id'] ?? 0);
|
|
|
|
$pressRelease = $pressReleaseId
|
|
? PressRelease::withoutGlobalScopes()
|
|
->with(['company:id,name,slug', 'category.translations', 'images', 'user:id,name'])
|
|
->find($pressReleaseId)
|
|
: null;
|
|
|
|
if (! $pressRelease) {
|
|
return $this->renderError(__('Die Pressemitteilung wurde nicht gefunden.'), 404);
|
|
}
|
|
|
|
return view('press-release-preview', [
|
|
'pressRelease' => $pressRelease,
|
|
'expiresAt' => $magicLink->expires_at,
|
|
]);
|
|
}
|
|
|
|
private function renderError(string $message, int $status): Response
|
|
{
|
|
return response()->view('press-release-preview-error', [
|
|
'message' => $message,
|
|
], $status);
|
|
}
|
|
}
|