diff --git a/app/Http/Controllers/Web/ReleaseDetailController.php b/app/Http/Controllers/Web/ReleaseDetailController.php new file mode 100644 index 00000000..af769bbd --- /dev/null +++ b/app/Http/Controllers/Web/ReleaseDetailController.php @@ -0,0 +1,18 @@ +build(WebPortalContext::fromRequest(), $slug)); + } +} diff --git a/app/Services/Web/ReleaseDetailPageData.php b/app/Services/Web/ReleaseDetailPageData.php new file mode 100644 index 00000000..49e151a6 --- /dev/null +++ b/app/Services/Web/ReleaseDetailPageData.php @@ -0,0 +1,88 @@ + + */ + public function build(WebPortalContext $context, string $slug): array + { + $portalValues = $context->portalValues; + $language = $context->language; + + $publishedScope = static fn (Builder $query): Builder => $query + ->forPortalValues($portalValues) + ->forLanguage($language) + ->visibleInArchive(); + + $release = PressRelease::query() + ->withoutGlobalScope(PortalScope::class) + ->tap($publishedScope) + ->where('slug', $slug) + ->with([ + 'company', + 'category.translations' => fn ($query) => $query->where('locale', $language), + 'category.parent.translations' => fn ($query) => $query->where('locale', $language), + 'images' => fn ($query) => $query->orderByDesc('is_preview')->orderBy('sort_order'), + 'contacts', + ]) + ->first(); + + if (! $release) { + abort(404); + } + + PressRelease::withoutGlobalScope(PortalScope::class) + ->whereKey($release->getKey()) + ->update(['hits' => ($release->hits ?? 0) + 1]); + + $with = [ + 'company', + 'category.translations' => fn ($query) => $query->where('locale', $language), + 'images' => fn ($query) => $query->orderByDesc('is_preview')->orderBy('sort_order')->limit(1), + ]; + + $companyReleases = $release->company_id + ? PressRelease::query() + ->withoutGlobalScope(PortalScope::class) + ->tap($publishedScope) + ->where('company_id', $release->company_id) + ->whereKeyNot($release->getKey()) + ->with($with) + ->orderByDesc('published_at') + ->limit(3) + ->get() + : collect(); + + $relatedReleases = $release->category_id + ? PressRelease::query() + ->withoutGlobalScope(PortalScope::class) + ->tap($publishedScope) + ->where('category_id', $release->category_id) + ->whereKeyNot($release->getKey()) + ->when($companyReleases->isNotEmpty(), fn (Builder $query) => $query->whereNotIn('id', $companyReleases->modelKeys())) + ->with($with) + ->orderByDesc('published_at') + ->limit(3) + ->get() + : collect(); + + return [ + 'release' => $release, + 'companyReleases' => $companyReleases, + 'relatedReleases' => $relatedReleases, + ]; + } +} diff --git a/routes/web.php b/routes/web.php index 64bd8465..e9e149be 100644 --- a/routes/web.php +++ b/routes/web.php @@ -6,6 +6,7 @@ use App\Http\Controllers\Web\CategoryController; use App\Http\Controllers\Web\NewsroomDetailController; use App\Http\Controllers\Web\NewsroomsController; use App\Http\Controllers\Web\PreiseController; +use App\Http\Controllers\Web\ReleaseDetailController; use App\Http\Controllers\Web\SucheController; use App\Http\Controllers\Web\VeroeffentlichenController; use App\Http\Middleware\SetEdition; @@ -16,7 +17,6 @@ use App\Models\PressRelease; use App\Scopes\PortalScope; use App\Support\DomainAssetContext; use App\Support\EditorialClock; -use App\Support\WebPortalContext; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Route; @@ -254,76 +254,6 @@ $webHomeData = static function (Portal $primaryPortal, string $language = 'de'): ]; }; -// Detailseite einer Pressemitteilung je Ausgabe. -$releaseDetailPage = static function (string $edition, string $slug) { - $context = WebPortalContext::fromRequest(); - $language = $context->language; - $portalValues = $context->portalValues; - - $publishedScope = static fn (Builder $query): Builder => $query - ->forPortalValues($portalValues) - ->forLanguage($language) - ->visibleInArchive(); - - $release = PressRelease::query() - ->withoutGlobalScope(PortalScope::class) - ->tap($publishedScope) - ->where('slug', $slug) - ->with([ - 'company', - 'category.translations' => fn ($query) => $query->where('locale', $language), - 'category.parent.translations' => fn ($query) => $query->where('locale', $language), - 'images' => fn ($query) => $query->orderByDesc('is_preview')->orderBy('sort_order'), - 'contacts', - ]) - ->first(); - - if (! $release) { - abort(404); - } - - PressRelease::withoutGlobalScope(PortalScope::class) - ->whereKey($release->getKey()) - ->update(['hits' => ($release->hits ?? 0) + 1]); - - $with = [ - 'company', - 'category.translations' => fn ($query) => $query->where('locale', $language), - 'images' => fn ($query) => $query->orderByDesc('is_preview')->orderBy('sort_order')->limit(1), - ]; - - $companyReleases = $release->company_id - ? PressRelease::query() - ->withoutGlobalScope(PortalScope::class) - ->tap($publishedScope) - ->where('company_id', $release->company_id) - ->whereKeyNot($release->getKey()) - ->with($with) - ->orderByDesc('published_at') - ->limit(3) - ->get() - : collect(); - - $relatedReleases = $release->category_id - ? PressRelease::query() - ->withoutGlobalScope(PortalScope::class) - ->tap($publishedScope) - ->where('category_id', $release->category_id) - ->whereKeyNot($release->getKey()) - ->when($companyReleases->isNotEmpty(), fn (Builder $query) => $query->whereNotIn('id', $companyReleases->modelKeys())) - ->with($with) - ->orderByDesc('published_at') - ->limit(3) - ->get() - : collect(); - - return view('web.release-detail', [ - 'release' => $release, - 'companyReleases' => $companyReleases, - 'relatedReleases' => $relatedReleases, - ]); -}; - // --------------------------------------------------------------------------- // Bare Root: Publisher-Hub (pressekonto) oder Redirect auf die Default-Ausgabe. // --------------------------------------------------------------------------- @@ -467,7 +397,7 @@ Route::get('{path}', function (string $path) use ($htmlRedirect) { // --------------------------------------------------------------------------- // Öffentliche Inhalte je Ausgabe (Sprache): /de/... und /en/... // --------------------------------------------------------------------------- -Route::prefix('{edition}')->whereIn('edition', SetEdition::EDITIONS)->group(function () use ($applyWebDomainConfig, $webHomeData, $releaseDetailPage) { +Route::prefix('{edition}')->whereIn('edition', SetEdition::EDITIONS)->group(function () use ($applyWebDomainConfig, $webHomeData) { // Startseite je Ausgabe Route::get('/', function (string $edition) use ($applyWebDomainConfig, $webHomeData) { $domain = request()->getHost(); @@ -490,7 +420,7 @@ Route::prefix('{edition}')->whereIn('edition', SetEdition::EDITIONS)->group(func Route::get('category/{slug}', CategoryController::class)->name('kategorie'); // Detailseite einer Pressemitteilung (z.B. /de/press-release/ki-revolution) - Route::get('press-release/{slug}', $releaseDetailPage)->name('release.detail'); + Route::get('press-release/{slug}', ReleaseDetailController::class)->name('release.detail'); // Preise / Tarife (datengetrieben: Plan + config/billing + config/credits) Route::get('preise', PreiseController::class)->name('preise');