From a2179ea47f0d221e21b3b21f8bee191dbb25aebe Mon Sep 17 00:00:00 2001 From: Kevin Adametz Date: Fri, 19 Jun 2026 12:04:59 +0000 Subject: [PATCH] Optimierung 4.3/4.4 (Newsrooms): Page-Data-Service + Invokable Controller Newsrooms-Verzeichnis-Closure in NewsroomsPageData + Web\NewsroomsController verschoben. Verhalten unveraendert, 92 Web-Tests gruen. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../Controllers/Web/NewsroomsController.php | 16 ++++ app/Services/Web/NewsroomsPageData.php | 78 +++++++++++++++++++ routes/web.php | 64 +-------------- 3 files changed, 97 insertions(+), 61 deletions(-) create mode 100644 app/Http/Controllers/Web/NewsroomsController.php create mode 100644 app/Services/Web/NewsroomsPageData.php diff --git a/app/Http/Controllers/Web/NewsroomsController.php b/app/Http/Controllers/Web/NewsroomsController.php new file mode 100644 index 00000000..fde88874 --- /dev/null +++ b/app/Http/Controllers/Web/NewsroomsController.php @@ -0,0 +1,16 @@ +build(WebPortalContext::fromRequest())); + } +} diff --git a/app/Services/Web/NewsroomsPageData.php b/app/Services/Web/NewsroomsPageData.php new file mode 100644 index 00000000..235201b9 --- /dev/null +++ b/app/Services/Web/NewsroomsPageData.php @@ -0,0 +1,78 @@ + + */ + public function build(WebPortalContext $context): array + { + $portalValues = $context->portalValues; + $language = $context->language; + $referenceNow = EditorialClock::reference($portalValues, $language); + $recentSince = $referenceNow->copy()->subDays(30); + + $term = trim((string) request('q', '')); + + $published = static function (Builder $query) use ($portalValues, $language): void { + $query + ->forPortalValues($portalValues) + ->forLanguage($language) + ->visibleInArchive(); + }; + + $activeCompanies = static fn (): Builder => Company::query() + ->withoutGlobalScope(PortalScope::class) + ->whereIn('portal', $portalValues) + ->where('is_active', true) + ->whereHas('pressReleases', fn (Builder $query) => $published($query)); + + $newsrooms = $activeCompanies() + ->when($term !== '', fn (Builder $query) => $query->whereLike('name', '%'.$term.'%')) + ->withCount([ + 'pressReleases as releases_count' => fn (Builder $query) => $published($query), + 'pressReleases as recent_count' => function (Builder $query) use ($published, $recentSince): void { + $published($query); + $query->where('published_at', '>=', $recentSince); + }, + ]) + ->withMax(['pressReleases as latest_published_at' => fn (Builder $query) => $published($query)], 'published_at') + ->orderByDesc('recent_count') + ->orderByDesc('releases_count') + ->orderBy('name') + ->paginate(24) + ->withQueryString(); + + $archiveTotal = PressRelease::query() + ->withoutGlobalScope(PortalScope::class) + ->tap(fn (Builder $query) => $published($query)) + ->count(); + + return [ + 'newsrooms' => $newsrooms, + 'term' => $term, + 'referenceNow' => $referenceNow, + 'totalNewsrooms' => (clone $activeCompanies())->count(), + 'activeNewsroomsCount' => $activeCompanies() + ->whereHas('pressReleases', function (Builder $query) use ($published, $recentSince): void { + $published($query); + $query->where('published_at', '>=', $recentSince); + }) + ->count(), + 'archiveTotal' => $archiveTotal, + ]; + } +} diff --git a/routes/web.php b/routes/web.php index afe16052..f3de068e 100644 --- a/routes/web.php +++ b/routes/web.php @@ -2,6 +2,7 @@ use App\Enums\Portal; use App\Http\Controllers\PressReleasePreviewController; +use App\Http\Controllers\Web\NewsroomsController; use App\Http\Controllers\Web\PreiseController; use App\Http\Controllers\Web\SucheController; use App\Http\Controllers\Web\VeroeffentlichenController; @@ -519,65 +520,6 @@ $releaseDetailPage = static function (string $edition, string $slug) { ]); }; -// Newsrooms-Verzeichnis je Ausgabe: alle aktiven Unternehmen mit Meldungen. -$newsroomsIndex = static function (string $edition) { - $context = WebPortalContext::fromRequest(); - $language = $context->language; - $portalValues = $context->portalValues; - $referenceNow = EditorialClock::reference($portalValues, $language); - $recentSince = $referenceNow->copy()->subDays(30); - - $term = trim((string) request('q', '')); - - $published = static function (Builder $query) use ($portalValues, $language): void { - $query - ->forPortalValues($portalValues) - ->forLanguage($language) - ->visibleInArchive(); - }; - - $activeCompanies = static fn (): Builder => Company::query() - ->withoutGlobalScope(PortalScope::class) - ->whereIn('portal', $portalValues) - ->where('is_active', true) - ->whereHas('pressReleases', fn (Builder $query) => $published($query)); - - $newsrooms = $activeCompanies() - ->when($term !== '', fn (Builder $query) => $query->whereLike('name', '%'.$term.'%')) - ->withCount([ - 'pressReleases as releases_count' => fn (Builder $query) => $published($query), - 'pressReleases as recent_count' => function (Builder $query) use ($published, $recentSince): void { - $published($query); - $query->where('published_at', '>=', $recentSince); - }, - ]) - ->withMax(['pressReleases as latest_published_at' => fn (Builder $query) => $published($query)], 'published_at') - ->orderByDesc('recent_count') - ->orderByDesc('releases_count') - ->orderBy('name') - ->paginate(24) - ->withQueryString(); - - $archiveTotal = PressRelease::query() - ->withoutGlobalScope(PortalScope::class) - ->tap(fn (Builder $query) => $published($query)) - ->count(); - - return view('web.newsrooms', [ - 'newsrooms' => $newsrooms, - 'term' => $term, - 'referenceNow' => $referenceNow, - 'totalNewsrooms' => (clone $activeCompanies())->count(), - 'activeNewsroomsCount' => $activeCompanies() - ->whereHas('pressReleases', function (Builder $query) use ($published, $recentSince): void { - $published($query); - $query->where('published_at', '>=', $recentSince); - }) - ->count(), - 'archiveTotal' => $archiveTotal, - ]); -}; - // Newsroom-Markenseite eines Unternehmens je Ausgabe: alle Meldungen der Firma. $newsroomDetail = static function (string $edition, string $slug) { $context = WebPortalContext::fromRequest(); @@ -830,7 +772,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, $newsroomsIndex, $newsroomDetail) { +Route::prefix('{edition}')->whereIn('edition', SetEdition::EDITIONS)->group(function () use ($applyWebDomainConfig, $webHomeData, $categoryPage, $releaseDetailPage, $newsroomDetail) { // Startseite je Ausgabe Route::get('/', function (string $edition) use ($applyWebDomainConfig, $webHomeData) { $domain = request()->getHost(); @@ -864,7 +806,7 @@ Route::prefix('{edition}')->whereIn('edition', SetEdition::EDITIONS)->group(func Route::view('ueber-uns', 'web.ueber-uns')->name('ueber-uns'); Route::get('veroeffentlichen', VeroeffentlichenController::class)->name('veroeffentlichen'); Route::get('suche', SucheController::class)->name('suche'); - Route::get('newsrooms', $newsroomsIndex)->name('newsrooms'); + Route::get('newsrooms', NewsroomsController::class)->name('newsrooms'); Route::get('newsroom/{slug}', $newsroomDetail)->name('newsroom'); Route::view('api', 'web.api')->name('api'); Route::view('team', 'web.team')->name('team');