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 d212230a39
commit 5011f28f88
2 changed files with 56 additions and 4 deletions

View file

@ -4,6 +4,7 @@ use App\Enums\Portal;
use App\Enums\UserPaymentOptionStatus;
use App\Models\Category;
use App\Models\Company;
use App\Models\LegacyImportMap;
use App\Models\PaymentOption;
use App\Models\PressRelease;
use App\Models\User;
@ -80,6 +81,34 @@ test('the importer turns legacy api keys into sanctum tokens idempotently', func
expect(PersonalAccessToken::query()->where('token', hash('sha256', 'legacy-key-abc123'))->count())->toBe(1);
});
test('the importer resolves email-merged users via the legacy import map', function () {
// E-Mail-Merge-Fall: Der Kunde existierte in beiden Altportalen; der
// User trägt nur das zuletzt importierte Portal (businessportal24) in
// legacy_portal/legacy_id. Der Presseecho-Schlüssel muss trotzdem über
// die legacy_import_map seinen Besitzer finden.
$user = eligibleLegacyApiUser();
LegacyImportMap::query()->create([
'legacy_portal' => 'presseecho',
'legacy_table' => 'sf_guard_user',
'legacy_id' => 555,
'target_table' => 'users',
'target_id' => $user->id,
'imported_at' => now(),
]);
$result = app(LegacyApiKeyImporter::class)->import('presseecho', [
['legacy_id' => 555, 'api_key' => 'legacy-key-presseecho'],
]);
expect($result['imported'])->toBe(1);
expect($result['unknown_user'])->toBe(0);
$token = PersonalAccessToken::findToken('legacy-key-presseecho');
expect($token)->not->toBeNull();
expect($token->tokenable_id)->toBe($user->id);
});
test('an imported legacy key authenticates only via legacy headers', function () {
/** @var TestCase $this */
eligibleLegacyApiUser();