Gebuendelt, da ueber gemeinsame lang-/Service-Dateien verschraenkt: - Kontakt-Nachrichten: contact_messages-Tabelle + Model/Enums/Factory, Admin-Queue (livewire/admin/contact-messages), ContactController persistiert das Anliegen zusaetzlich zur Brand-Mail - Page-Data-Cache (Services/Web/*PageData) + web-archive-Indizes auf press_releases - Validierungs-Feedback + Company-Portal-Restriction (Feature-Tests) - i18n-Auslagerung lang/de|en (auth, passwords, validation, static) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
47 lines
1.8 KiB
PHP
47 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Web;
|
|
|
|
use App\Enums\Portal;
|
|
use App\Models\PressRelease;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Illuminate\Support\Str;
|
|
|
|
/**
|
|
* Ad-Hoc-Ticker-Meldungen der Web-Frontends: die jüngsten veröffentlichten
|
|
* Pressemitteilungen des Portals. Zentral hier statt je Seite, damit der
|
|
* Ticker auf allen Unterseiten identisch gefüllt ist; kurz gecacht, weil
|
|
* der Header auf jeder Seite rendert.
|
|
*/
|
|
class TickerData
|
|
{
|
|
private const CACHE_TTL_SECONDS = 300;
|
|
|
|
/**
|
|
* @return list<array{time: string, text: string, href: ?string}>
|
|
*/
|
|
public function items(Portal $portal, string $language): array
|
|
{
|
|
$cacheKey = sprintf('web.ticker.%s.%s', $portal->value, $language);
|
|
|
|
return Cache::remember($cacheKey, self::CACHE_TTL_SECONDS, function () use ($portal, $language): array {
|
|
return PressRelease::query()
|
|
->forPortalValues([$portal->value, Portal::Both->value])
|
|
->forLanguage($language)
|
|
->visibleInArchive()
|
|
->orderByDesc('published_at')
|
|
->limit(8)
|
|
->get(['id', 'title', 'slug', 'published_at'])
|
|
->map(static fn (PressRelease $release): array => [
|
|
'time' => $release->published_at?->format('H:i') ?? '',
|
|
'text' => Str::limit((string) $release->title, 70),
|
|
// Relativ, damit der gecachte Eintrag host-unabhängig bleibt
|
|
// (der Header rendert auf allen Hosts des Portals identisch).
|
|
'href' => $release->slug
|
|
? route('release.detail', ['slug' => $release->slug, 'edition' => $language], absolute: false)
|
|
: null,
|
|
])
|
|
->all();
|
|
});
|
|
}
|
|
}
|