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>
53 lines
1.6 KiB
PHP
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);
|
|
}
|
|
}
|