TenantAtlas/app/Support/References/Resolvers/AssignmentTargetReferenceResolver.php
2026-03-10 19:51:41 +01: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['tenant_id'] ?? null) ? (int) $context['tenant_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',
],
));
}
}