web: RSS-Feed je Newsroom, RSS-Übersichtsseite, „RSS" in der Topleiste (Roadmap 3.1, Nachtrag)

- /{edition}/newsroom/{slug}/feed: Sichtbarkeit wie die Newsroom-Seite
  (aktiv, nicht entfernt, mindestens eine Meldung), Prüfung vor dem Cache,
  301 bei zusammengeführter Firma; Autodiscovery und Link „RSS-Feed" auf
  der Newsroom-Seite; Hub leitet auf das Portal der Firma.
- /{edition}/rss (RssPageController, static.rss DE/EN): Was RSS ist, wie
  ein Reader funktioniert, Hauptfeed, alle Branchen-Feeds mit Adresse,
  Muster des Newsroom-Feeds, Hinweise. Portalseite mit Portal-Kontext,
  Hub → presseecho, in Sitemap und llms.txt.
- Topleiste, Burger-Menü und Footer verlinken RSS neben FAQ/Hilfe/API.
- FeedController in portal/category/newsroom aufgeteilt; Panel
  „Auslieferung" nennt zusätzlich den Newsroom-Feed.
- Tests: FeedTest (+3), RssPageTest (4), StaticPagesTest, VisibilityStatsTest.
- dev/2026-09-01: Nachtrag in Protokoll Teil 11 und Roadmap 3.1.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-09-21 08:27:14 +00:00
parent 9d5e5a0b54
commit ff75159b8f
22 changed files with 577 additions and 55 deletions

View file

@ -20,6 +20,7 @@ use App\Http\Controllers\Web\PressReleaseReportController;
use App\Http\Controllers\Web\ReleaseDetailController;
use App\Http\Controllers\Web\ReleaseShareTrackingController;
use App\Http\Controllers\Web\ReportFormController;
use App\Http\Controllers\Web\RssPageController;
use App\Http\Controllers\Web\SitemapController;
use App\Http\Controllers\Web\SucheController;
use App\Http\Controllers\Web\TerminationController;
@ -162,7 +163,7 @@ $htmlRedirect = static function (string $edition, string $path) {
$staticPages = [
'preise', 'faq', 'veroeffentlichen',
'suche', 'newsrooms', 'api',
'hilfe', 'gute-pressemitteilung', 'impressum', 'datenschutz', 'agb',
'hilfe', 'gute-pressemitteilung', 'rss', 'impressum', 'datenschutz', 'agb',
'was-kostet-eine-pressemitteilung', 'pressemitteilung-veroeffentlichen-ohne-abo', 'pressemitteilung-loeschen-oder-aendern-lassen', 'pressemitteilung-kostenlos-veroeffentlichen',
];
@ -231,8 +232,8 @@ Route::prefix('{edition}')->whereIn('edition', SetEdition::EDITIONS)->group(func
// RSS-Feeds (Roadmap 3.1): alle Meldungen der Ausgabe und je Branche
// (inkl. Unterkategorien). Der Hub leitet auf das Portal weiter.
Route::get('feed', FeedController::class)->name('feed');
Route::get('category/{slug}/feed', FeedController::class)->name('kategorie.feed');
Route::get('feed', [FeedController::class, 'portal'])->name('feed');
Route::get('category/{slug}/feed', [FeedController::class, 'category'])->name('kategorie.feed');
// Detailseite einer Pressemitteilung (z.B. /de/press-release/ki-revolution)
Route::get('press-release/{slug}', ReleaseDetailController::class)->name('release.detail');
@ -266,6 +267,8 @@ Route::prefix('{edition}')->whereIn('edition', SetEdition::EDITIONS)->group(func
Route::get('suche', SucheController::class)->name('suche');
Route::get('newsrooms', NewsroomsController::class)->name('newsrooms');
Route::get('newsroom/{slug}', NewsroomDetailController::class)->name('newsroom');
// RSS-Feed eines Newsrooms (Roadmap 3.1), gleiche Sichtbarkeitsregel wie die Seite.
Route::get('newsroom/{slug}/feed', [FeedController::class, 'newsroom'])->name('newsroom.feed');
// „Diesen Newsroom verwalten" (Roadmap 1b.2): Anmeldelink an die
// hinterlegte Firmen-E-Mail, unabhängig von der öffentlichen Sichtbarkeit.
Route::get('newsroom/{slug}/verwalten', [NewsroomClaimController::class, 'show'])->name('newsroom.claim');
@ -274,6 +277,8 @@ Route::prefix('{edition}')->whereIn('edition', SetEdition::EDITIONS)->group(func
->name('newsroom.claim.store');
Route::view('api', 'web.api')->name('api');
Route::view('hilfe', 'web.hilfe')->name('hilfe');
// RSS-Übersicht (Roadmap 3.1): was Feeds sind, wie man sie abonniert, welche es hier gibt.
Route::get('rss', RssPageController::class)->name('rss');
// Roadmap 1d.1: Hilfeseite ohne kommerziellen Anteil — Ziel des
// Textbausteins in der Ablehnungsmail (1d.2).
Route::view('gute-pressemitteilung', 'web.gute-pressemitteilung')->name('gute-pressemitteilung');