From fef6bbc9a6f3660455d3dce7188cd798507f7782 Mon Sep 17 00:00:00 2001 From: Kevin Adametz Date: Fri, 19 Jun 2026 12:03:34 +0000 Subject: [PATCH] Optimierung 4.3/4.4 (Veroeffentlichen): Page-Data-Service + Invokable Controller Veroeffentlichen-Closure in VeroeffentlichenPageData + Web\VeroeffentlichenController verschoben. Verhalten unveraendert, 92 Web-Tests gruen. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../Web/VeroeffentlichenController.php | 16 ++++ app/Services/Web/VeroeffentlichenPageData.php | 89 +++++++++++++++++++ routes/web.php | 74 +-------------- 3 files changed, 108 insertions(+), 71 deletions(-) create mode 100644 app/Http/Controllers/Web/VeroeffentlichenController.php create mode 100644 app/Services/Web/VeroeffentlichenPageData.php diff --git a/app/Http/Controllers/Web/VeroeffentlichenController.php b/app/Http/Controllers/Web/VeroeffentlichenController.php new file mode 100644 index 00000000..3b18e8b1 --- /dev/null +++ b/app/Http/Controllers/Web/VeroeffentlichenController.php @@ -0,0 +1,16 @@ +build(WebPortalContext::fromRequest())); + } +} diff --git a/app/Services/Web/VeroeffentlichenPageData.php b/app/Services/Web/VeroeffentlichenPageData.php new file mode 100644 index 00000000..f975ec33 --- /dev/null +++ b/app/Services/Web/VeroeffentlichenPageData.php @@ -0,0 +1,89 @@ + + */ + public function build(WebPortalContext $context): array + { + $portalValues = $context->portalValues; + $language = $context->language; + $referenceNow = EditorialClock::reference($portalValues, $language); + $recentSince = $referenceNow->copy()->subDays(30); + + $publishedBase = static fn (): Builder => PressRelease::query() + ->withoutGlobalScope(PortalScope::class) + ->forPortalValues($portalValues) + ->forLanguage($language) + ->visibleInArchive(); + + $archiveTotal = $publishedBase()->count(); + $publishedToday = $publishedBase()->whereDate('published_at', $referenceNow->toDateString())->count(); + $oldest = $publishedBase()->min('published_at'); + $oldestYear = $oldest ? (int) Carbon::parse($oldest)->format('Y') : null; + + $inReview = PressRelease::query() + ->withoutGlobalScope(PortalScope::class) + ->whereIn('portal', $portalValues) + ->where('status', PressReleaseStatus::Review) + ->where('language', $language) + ->count(); + + $exampleRelease = $publishedBase() + ->with([ + 'company', + 'category.translations' => fn ($query) => $query->where('locale', $language), + ]) + ->orderByDesc('published_at') + ->first(); + + $newsroomFilter = static function (Builder $query) use ($portalValues, $language, $recentSince): void { + $query + ->forPortalValues($portalValues) + ->forLanguage($language) + ->published() + ->where('published_at', '>=', $recentSince); + }; + + $newsroomQuery = Company::query() + ->withoutGlobalScope(PortalScope::class) + ->whereIn('portal', $portalValues) + ->where('is_active', true) + ->whereHas('pressReleases', fn (Builder $query) => $newsroomFilter($query)); + + $activeNewsroomsTotal = (clone $newsroomQuery)->count(); + $activeNewsroomNames = (clone $newsroomQuery) + ->withCount(['pressReleases as recent_count' => fn (Builder $query) => $newsroomFilter($query)]) + ->orderByDesc('recent_count') + ->limit(10) + ->pluck('name') + ->all(); + + return [ + 'referenceNow' => $referenceNow, + 'archiveTotal' => $archiveTotal, + 'publishedToday' => $publishedToday, + 'inReview' => $inReview, + 'oldestYear' => $oldestYear, + 'exampleRelease' => $exampleRelease, + 'activeNewsroomNames' => $activeNewsroomNames, + 'activeNewsroomsTotal' => $activeNewsroomsTotal, + ]; + } +} diff --git a/routes/web.php b/routes/web.php index db7c8643..afe16052 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,10 +1,10 @@ language; - $portalValues = $context->portalValues; - $referenceNow = EditorialClock::reference($portalValues, $language); - $recentSince = $referenceNow->copy()->subDays(30); - - $publishedBase = static fn (): Builder => PressRelease::query() - ->withoutGlobalScope(PortalScope::class) - ->forPortalValues($portalValues) - ->forLanguage($language) - ->visibleInArchive(); - - $archiveTotal = $publishedBase()->count(); - $publishedToday = $publishedBase()->whereDate('published_at', $referenceNow->toDateString())->count(); - $oldest = $publishedBase()->min('published_at'); - $oldestYear = $oldest ? (int) Carbon::parse($oldest)->format('Y') : null; - - $inReview = PressRelease::query() - ->withoutGlobalScope(PortalScope::class) - ->whereIn('portal', $portalValues) - ->where('status', PressReleaseStatus::Review) - ->where('language', $language) - ->count(); - - $exampleRelease = $publishedBase() - ->with([ - 'company', - 'category.translations' => fn ($query) => $query->where('locale', $language), - ]) - ->orderByDesc('published_at') - ->first(); - - $newsroomFilter = static function (Builder $query) use ($portalValues, $language, $recentSince): void { - $query - ->forPortalValues($portalValues) - ->forLanguage($language) - ->published() - ->where('published_at', '>=', $recentSince); - }; - - $newsroomQuery = Company::query() - ->withoutGlobalScope(PortalScope::class) - ->whereIn('portal', $portalValues) - ->where('is_active', true) - ->whereHas('pressReleases', fn (Builder $query) => $newsroomFilter($query)); - - $activeNewsroomsTotal = (clone $newsroomQuery)->count(); - $activeNewsroomNames = (clone $newsroomQuery) - ->withCount(['pressReleases as recent_count' => fn (Builder $query) => $newsroomFilter($query)]) - ->orderByDesc('recent_count') - ->limit(10) - ->pluck('name') - ->all(); - - return view('web.veroeffentlichen', [ - 'referenceNow' => $referenceNow, - 'archiveTotal' => $archiveTotal, - 'publishedToday' => $publishedToday, - 'inReview' => $inReview, - 'oldestYear' => $oldestYear, - 'exampleRelease' => $exampleRelease, - 'activeNewsroomNames' => $activeNewsroomNames, - 'activeNewsroomsTotal' => $activeNewsroomsTotal, - ]); -}; - // Newsrooms-Verzeichnis je Ausgabe: alle aktiven Unternehmen mit Meldungen. $newsroomsIndex = static function (string $edition) { $context = WebPortalContext::fromRequest(); @@ -898,7 +830,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, $categoryPage, $releaseDetailPage, $veroeffentlichenPage, $newsroomsIndex, $newsroomDetail) { +Route::prefix('{edition}')->whereIn('edition', SetEdition::EDITIONS)->group(function () use ($applyWebDomainConfig, $webHomeData, $categoryPage, $releaseDetailPage, $newsroomsIndex, $newsroomDetail) { // Startseite je Ausgabe Route::get('/', function (string $edition) use ($applyWebDomainConfig, $webHomeData) { $domain = request()->getHost(); @@ -930,7 +862,7 @@ Route::prefix('{edition}')->whereIn('edition', SetEdition::EDITIONS)->group(func Route::view('faq', 'web.faq')->name('faq'); Route::view('kontakt', 'web.kontakt')->name('kontakt'); Route::view('ueber-uns', 'web.ueber-uns')->name('ueber-uns'); - Route::get('veroeffentlichen', $veroeffentlichenPage)->name('veroeffentlichen'); + Route::get('veroeffentlichen', VeroeffentlichenController::class)->name('veroeffentlichen'); Route::get('suche', SucheController::class)->name('suche'); Route::get('newsrooms', $newsroomsIndex)->name('newsrooms'); Route::get('newsroom/{slug}', $newsroomDetail)->name('newsroom');