, * next_run_at: string|null, * last_run_at: string|null, * last_count: int|null * } */ final class JobPresenter { public function __construct( private readonly JobScheduler $scheduler, private readonly IsoTime $iso_time ) { } /** @return JobObject */ public function present( JobId $job, JobState $state ): array { $next_run_at = $this->scheduler->next_run_at( $job ); $iso_time = $this->iso_time; return array( 'id' => $job->value, 'enabled' => $state->enabled, 'frequency' => $state->frequency->value, 'frequencies' => $this->frequency_names( $job ), 'next_run_at' => $iso_time->from_timestamp( $next_run_at ), 'last_run_at' => $iso_time->from_timestamp( $state->last_run_at ), 'last_count' => $state->last_count, ); } /** @return list */ private function frequency_names( JobId $job ): array { $names = array(); foreach ( $job->frequencies() as $frequency ) { $names[] = $frequency->value; } return $names; } }