TenantAtlas/apps/platform/app/Support/References/Resolvers/AssignmentTargetReferenceResolver.php
ahmido e64bae9cfc feat: cut over tenant core to managed environments (#335)
## Summary
- replace the legacy Tenant and TenantMembership core models with ManagedEnvironment and ManagedEnvironmentMembership
- propagate the managed environment naming and key changes across Filament resources, pages, controllers, jobs, models, and supporting runtime paths
- add feature 279 spec artifacts and focused managed-environment test coverage for model behavior, route binding, panel context, authorization, and legacy guardrails

## Validation
- `cd apps/platform && ./vendor/bin/sail artisan test --compact tests/Feature/ManagedEnvironment/LegacyTenantCoreGuardTest.php tests/Feature/ManagedEnvironment/ManagedEnvironmentAuthorizationTest.php tests/Feature/ManagedEnvironment/ManagedEnvironmentPanelContextTest.php tests/Feature/ManagedEnvironment/ManagedEnvironmentRouteBindingTest.php tests/Unit/ManagedEnvironment/ManagedEnvironmentContextResolverTest.php tests/Unit/ManagedEnvironment/ManagedEnvironmentModelTest.php`
- `cd apps/platform && ./vendor/bin/sail bin pint --dirty --format agent`

## Notes
- branch pushed from commit `1123b122`
- browser smoke test file was added but not run in this pass

Co-authored-by: Ahmed Darrazi <ahmed.darrazi@live.de>
Reviewed-on: #335
2026-05-07 06:38:14 +00:00

98 lines
4.4 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Support\References\Resolvers;
use App\Support\References\ReferenceClass;
use App\Support\References\ReferenceDescriptor;
use App\Support\References\ReferenceResolutionState;
use App\Support\References\ReferenceResolverRegistry;
use App\Support\References\ReferenceTechnicalDetail;
use App\Support\References\ResolvedReference;
final class AssignmentTargetReferenceResolver
{
public function __construct(
private readonly ReferenceResolverRegistry $registry,
) {}
/**
* @param array<string, mixed> $target
* @param array<string, mixed> $context
*/
public function resolve(array $target, array $context = []): ResolvedReference
{
$targetType = strtolower((string) ($context['target_type'] ?? ($target['@odata.type'] ?? '')));
$targetId = (string) ($context['target_id'] ?? ($target['groupId'] ?? $target['collectionId'] ?? ''));
if (str_contains($targetType, 'alldevicesassignmenttarget')) {
return new ResolvedReference(
referenceClass: ReferenceClass::TenantExternalObject,
rawIdentifier: $targetId !== '' ? $targetId : 'all_devices',
primaryLabel: 'All devices',
secondaryLabel: 'Assignment target',
state: ReferenceResolutionState::Resolved,
stateLabel: null,
linkTarget: null,
technicalDetail: ReferenceTechnicalDetail::forIdentifier($targetId !== '' ? $targetId : 'all_devices', 'Captured from assignment evidence'),
);
}
if (str_contains($targetType, 'allusersassignmenttarget') || str_contains($targetType, 'alllicensedusersassignmenttarget')) {
return new ResolvedReference(
referenceClass: ReferenceClass::TenantExternalObject,
rawIdentifier: $targetId !== '' ? $targetId : 'all_users',
primaryLabel: 'All users',
secondaryLabel: 'Assignment target',
state: ReferenceResolutionState::Resolved,
stateLabel: null,
linkTarget: null,
technicalDetail: ReferenceTechnicalDetail::forIdentifier($targetId !== '' ? $targetId : 'all_users', 'Captured from assignment evidence'),
);
}
if (str_contains($targetType, 'groupassignmenttarget')) {
$groupDescriptions = is_array($context['group_descriptions'] ?? null) ? $context['group_descriptions'] : [];
$groupDescription = is_array($groupDescriptions[$targetId] ?? null) ? $groupDescriptions[$targetId] : [];
return $this->registry->resolve(new ReferenceDescriptor(
referenceClass: ReferenceClass::Group,
rawIdentifier: $targetId,
tenantId: is_numeric($context['managed_environment_id'] ?? null) ? (int) $context['managed_environment_id'] : null,
fallbackLabel: is_string($groupDescription['display_name'] ?? null)
? $groupDescription['display_name']
: (is_string($target['group_display_name'] ?? null) ? $target['group_display_name'] : null),
context: [
'cached_display_name' => $groupDescription['display_name'] ?? null,
'resolved_from_cache' => $groupDescription['resolved'] ?? null,
'source_hint' => 'Captured from assignment evidence',
],
));
}
if ($targetId !== '') {
return $this->registry->resolve(new ReferenceDescriptor(
referenceClass: ReferenceClass::Principal,
rawIdentifier: $targetId,
fallbackLabel: is_string($context['fallback_label'] ?? null) ? $context['fallback_label'] : null,
context: [
'principal_type' => $context['principal_type'] ?? $targetType,
'secondary_label' => 'Assignment target',
'source_hint' => 'Captured from assignment evidence',
],
));
}
return $this->registry->resolve(new ReferenceDescriptor(
referenceClass: ReferenceClass::Unsupported,
rawIdentifier: 'assignment_target',
fallbackLabel: 'Assignment target',
context: [
'secondary_label' => 'Assignment target',
'source_hint' => 'Captured from assignment evidence',
],
));
}
}