TenantAtlas/app/Support/Onboarding/OnboardingTaskCatalog.php
2026-02-01 12:20:18 +01:00

87 lines
2.5 KiB
PHP

<?php
namespace App\Support\Onboarding;
final class OnboardingTaskCatalog
{
/**
* @return array<int, array{task_type: string, title: string, step: int, prerequisites: array<int, string>}>
*/
public static function all(): array
{
return [
[
'task_type' => OnboardingTaskType::VerifyPermissions,
'title' => 'Verify permissions',
'step' => 4,
'prerequisites' => [],
],
[
'task_type' => OnboardingTaskType::ConsentStatus,
'title' => 'Check consent status',
'step' => 4,
'prerequisites' => [OnboardingTaskType::VerifyPermissions],
],
[
'task_type' => OnboardingTaskType::ConnectionDiagnostics,
'title' => 'Run connection diagnostics',
'step' => 4,
'prerequisites' => [OnboardingTaskType::VerifyPermissions],
],
[
'task_type' => OnboardingTaskType::InitialSync,
'title' => 'Initial sync',
'step' => 5,
'prerequisites' => [OnboardingTaskType::VerifyPermissions],
],
];
}
/**
* @return array{task_type: string, title: string, step: int, prerequisites: array<int, string>}|null
*/
public static function find(string $taskType): ?array
{
foreach (self::all() as $task) {
if ($task['task_type'] === $taskType) {
return $task;
}
}
return null;
}
/**
* @param array<string, string> $latestEvidenceStatusByTaskType
*/
public static function prerequisitesMet(string $taskType, array $latestEvidenceStatusByTaskType): bool
{
return count(self::unmetPrerequisites($taskType, $latestEvidenceStatusByTaskType)) === 0;
}
/**
* @param array<string, string> $latestEvidenceStatusByTaskType
* @return array<int, string>
*/
public static function unmetPrerequisites(string $taskType, array $latestEvidenceStatusByTaskType): array
{
$task = self::find($taskType);
if (! $task) {
return [];
}
$unmet = [];
foreach ($task['prerequisites'] as $requiredTaskType) {
$status = $latestEvidenceStatusByTaskType[$requiredTaskType] ?? 'unknown';
if ($status !== 'ok') {
$unmet[] = $requiredTaskType;
}
}
return $unmet;
}
}