From a3e004205503ea36fac6671650da9dbca7bb8f0d Mon Sep 17 00:00:00 2001 From: Kevin Adametz Date: Tue, 15 Sep 2026 10:34:14 +0000 Subject: [PATCH] =?UTF-8?q?newsroom:=20Seite=20verschwindet=20mit=20der=20?= =?UTF-8?q?letzten=20ver=C3=B6ffentlichten=20Meldung=20(Roadmap=201b.1/1b.?= =?UTF-8?q?5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Sichtbarkeitsregel bestand bereits (Detailseite 404, Verzeichnis und Sitemap nur mit veröffentlichter Meldung). Neu: archive(), changeStatusFromAdmin() weg von published und deleteFromAdmin() einer veröffentlichten Meldung leeren den Seiten-Cache — vorher blieb die Newsroom-Seite bis zu eine Stunde stehen, während die Depublikation längst sofort griff. Co-Authored-By: Claude Opus 5 (1M context) --- .../PressRelease/PressReleaseService.php | 10 +++++ tests/Feature/Web/NewsroomPageTest.php | 45 +++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/app/Services/PressRelease/PressReleaseService.php b/app/Services/PressRelease/PressReleaseService.php index ae38bb07..c290f3c6 100644 --- a/app/Services/PressRelease/PressReleaseService.php +++ b/app/Services/PressRelease/PressReleaseService.php @@ -383,6 +383,11 @@ class PressReleaseService $previous = $pressRelease->status; $pressRelease->update(['status' => PressReleaseStatus::Archived->value]); + // Sichtbarkeitsregel (Roadmap 1b.1/1b.5): Ein Newsroom ist öffentlich + // nur mit mindestens einer veröffentlichten Meldung. Fällt die letzte + // weg, muss auch seine Seite sofort weg — nicht erst nach Ablauf des + // Seiten-Caches. + WebCaches::forgetPublicPages(); $this->logStatusChange($pressRelease, $previous, PressReleaseStatus::Archived, null, 'admin'); } @@ -439,6 +444,10 @@ class PressReleaseService if ($previous !== $status) { $this->logStatusChange($locked, $previous, $status, $reason, 'admin'); } + + if ($previous === PressReleaseStatus::Published && $status !== PressReleaseStatus::Published) { + WebCaches::forgetPublicPages(); + } }); $pressRelease->refresh(); @@ -457,6 +466,7 @@ class PressReleaseService 'backlink_url' => null, 'no_export' => true, ]); + WebCaches::forgetPublicPages(); return; } diff --git a/tests/Feature/Web/NewsroomPageTest.php b/tests/Feature/Web/NewsroomPageTest.php index 0190472a..2ad945fd 100644 --- a/tests/Feature/Web/NewsroomPageTest.php +++ b/tests/Feature/Web/NewsroomPageTest.php @@ -1,9 +1,11 @@ assertNotFound(); }); +test('the newsroom page disappears with its last published release, cache included', function () { + /** @var TestCase $this */ + // Roadmap 1b.1/1b.5: öffentlich nur mit veröffentlichter Meldung — und + // der Rückbau greift sofort, nicht erst nach Ablauf des Seiten-Caches. + $company = makeNewsroom('Einmalig AG'); + $release = publishForCompany($company, 'Die einzige Meldung'); + $url = 'https://businessportal24.test/de/newsroom/'.$company->slug; + + $this->get($url)->assertOk(); + $this->get('https://businessportal24.test/de/newsrooms')->assertSeeText('Einmalig AG'); + + app(PressReleaseService::class)->archive($release); + + $this->get($url)->assertNotFound(); + $this->get('https://businessportal24.test/de/newsrooms')->assertDontSeeText('Einmalig AG'); +}); + +test('an admin status change away from published takes the newsroom page down', function () { + /** @var TestCase $this */ + $company = makeNewsroom('Rückzug GmbH'); + $release = publishForCompany($company, 'Zurückgezogen'); + $url = 'https://businessportal24.test/de/newsroom/'.$company->slug; + + $this->get($url)->assertOk(); + + app(PressReleaseService::class)->changeStatusFromAdmin($release, PressReleaseStatus::Draft); + + $this->get($url)->assertNotFound(); +}); + +test('deleting the last published release from admin takes the newsroom page down', function () { + /** @var TestCase $this */ + $company = makeNewsroom('Gelöscht KG'); + $release = publishForCompany($company, 'Wird entfernt'); + $url = 'https://businessportal24.test/de/newsroom/'.$company->slug; + + $this->get($url)->assertOk(); + + app(PressReleaseService::class)->deleteFromAdmin($release); + + $this->get($url)->assertNotFound(); +}); + test('the newsrooms pages are available per edition and portal', function () { /** @var TestCase $this */ $this->get('https://businessportal24.test/en/newsrooms')->assertSuccessful();