legacy: API-Key-Import löst E-Mail-gemergte User über legacy_import_map auf

Kunden, die in beiden Altportalen existierten, tragen nach dem Merge nur
das zuletzt importierte Portal in users.legacy_portal/legacy_id — der
Schlüssel des anderen Portals fand dadurch keinen Besitzer und wurde als
'Kein User-Mapping' übersprungen (Presseecho-Key → 410). Die Import-Map
kennt beide Zuordnungen und wird jetzt zuerst befragt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Kevin Adametz 2026-07-20 13:19:42 +00:00
parent c8a292eb8c
commit 622cd4e289
2 changed files with 56 additions and 4 deletions

View file

@ -2,6 +2,7 @@
namespace App\Services\Api;
use App\Models\LegacyImportMap;
use App\Models\User;
use Laravel\Sanctum\PersonalAccessToken;
@ -48,10 +49,7 @@ class LegacyApiKeyImporter
continue;
}
$user = User::query()
->where('legacy_portal', $portal)
->where('legacy_id', (int) $row['legacy_id'])
->first();
$user = $this->resolveUser($portal, (int) $row['legacy_id']);
if (! $user) {
$result['unknown_user']++;
@ -87,4 +85,29 @@ class LegacyApiKeyImporter
return $result;
}
/**
* Löst den Token-Besitzer über die legacy_import_map auf. Die Spalten
* users.legacy_portal/legacy_id reichen nicht: Bei E-Mail-Merges (gleicher
* Kunde in beiden Altportalen) trägt der User nur das zuletzt importierte
* Portal — die Import-Map kennt dagegen beide Zuordnungen, sodass auch der
* Schlüssel des "anderen" Portals seinen Besitzer findet.
*/
private function resolveUser(string $portal, int $legacyId): ?User
{
$mappedUserId = LegacyImportMap::query()
->where('legacy_portal', $portal)
->where('legacy_table', 'sf_guard_user')
->where('legacy_id', $legacyId)
->value('target_id');
if ($mappedUserId !== null) {
return User::query()->find($mappedUserId);
}
return User::query()
->where('legacy_portal', $portal)
->where('legacy_id', $legacyId)
->first();
}
}