presseportale/app/Services/Company/MergedNewsroomLookup.php
Kevin Adametz 0c1c072487 newsroom: Verwaltungszugang „Diesen Newsroom verwalten" (Roadmap 1b.2)
Neue Seite /newsroom/{slug}/verwalten auf den Web-Portalen: schickt den
Anmeldelink an die hinterlegte Firmen-E-Mail (sonst Pressekontakte), zeigt
sie nur maskiert, und funktioniert auch für Firmen ohne veröffentlichte
Meldung. Konto, Zuordnung und Login laufen durch ContactAccessService —
neu dort: Herkunft (profile_claim auf dem Token) und Ziel-Firma, auf deren
Kundenseite der Login landet. 410-entfernte bleiben Tombstone, aufgegangene
Slugs führen zum Überlebenden (MergedNewsroomLookup, geteilt mit der
Newsroom-Seite). 3 Links je Newsroom und Tag, 15 je IP und Stunde.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-15 10:42:20 +00:00

53 lines
1.6 KiB
PHP

<?php
namespace App\Services\Company;
use App\Enums\CompanyMergeSubject;
use App\Models\Company;
use App\Models\CompanyMergeMove;
use App\Scopes\PortalScope;
use Illuminate\Database\Eloquent\Builder;
/**
* Wohin ein Newsroom-Slug führt, dessen Firma in einer Zusammenführung
* (Roadmap 1a.3) aufgegangen ist: zum Überlebenden. Gebraucht von der
* öffentlichen Newsroom-Seite (301) und vom Verwaltungszugang (1b.2) — beide
* müssen dieselbe Antwort geben.
*/
class MergedNewsroomLookup
{
/**
* Der Überlebende zu einem aufgegangenen Slug, oder null, wenn der Slug
* nie aufgegangen ist oder die Zusammenführung rückabgewickelt wurde.
*
* @param list<string> $portalValues
*/
public function survivorFor(array $portalValues, string $slug): ?Company
{
$mergedIds = Company::onlyTrashed()
->withoutGlobalScope(PortalScope::class)
->whereIn('portal', $portalValues)
->where('slug', $slug)
->pluck('id');
if ($mergedIds->isEmpty()) {
return null;
}
$survivorId = CompanyMergeMove::query()
->where('subject', CompanyMergeSubject::Company->value)
->whereIn('subject_id', $mergedIds)
->whereHas('merge', fn (Builder $query) => $query->whereNull('reverted_at'))
->with('merge:id,survivor_company_id')
->latest('id')
->first()
?->merge
?->survivor_company_id;
if ($survivorId === null) {
return null;
}
return Company::query()->withoutGlobalScope(PortalScope::class)->find($survivorId);
}
}