- Added AllegroOrderSyncStateRepository for managing sync state with Allegro orders. - Introduced AllegroOrdersSyncService to handle the synchronization of orders from Allegro. - Created AllegroStatusDiscoveryService to discover and store order statuses from Allegro. - Developed AllegroStatusMappingRepository for managing status mappings between Allegro and OrderPro. - Implemented AllegroStatusSyncService to facilitate status synchronization. - Added CronSettingsController for managing cron job settings related to Allegro integration.
100 lines
2.7 KiB
PHP
100 lines
2.7 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Modules\Cron;
|
|
|
|
use App\Core\Support\Logger;
|
|
use DateTimeImmutable;
|
|
use RuntimeException;
|
|
use Throwable;
|
|
|
|
final class CronRunner
|
|
{
|
|
/**
|
|
* @param array<string, object> $handlers
|
|
*/
|
|
public function __construct(
|
|
private readonly CronRepository $repository,
|
|
private readonly Logger $logger,
|
|
private readonly array $handlers
|
|
) {
|
|
}
|
|
|
|
/**
|
|
* @return array<string, int>
|
|
*/
|
|
public function run(int $limit): array
|
|
{
|
|
$safeLimit = max(1, min(100, $limit));
|
|
$now = new DateTimeImmutable('now');
|
|
|
|
$dispatched = $this->dispatchDueSchedules($now);
|
|
$processed = 0;
|
|
$completed = 0;
|
|
$failed = 0;
|
|
|
|
while ($processed < $safeLimit) {
|
|
$job = $this->repository->claimNextPendingJob(new DateTimeImmutable('now'));
|
|
if ($job === null) {
|
|
break;
|
|
}
|
|
|
|
$processed++;
|
|
$jobId = (int) ($job['id'] ?? 0);
|
|
$jobType = (string) ($job['job_type'] ?? '');
|
|
|
|
try {
|
|
$result = $this->handleJob($jobType, is_array($job['payload'] ?? null) ? $job['payload'] : []);
|
|
$this->repository->markJobCompleted($jobId, $result);
|
|
$completed++;
|
|
} catch (Throwable $exception) {
|
|
$this->repository->markJobFailed($jobId, $exception->getMessage(), new DateTimeImmutable('now'), 60);
|
|
$this->logger->error('Cron job failed', [
|
|
'job_id' => $jobId,
|
|
'job_type' => $jobType,
|
|
'error' => $exception->getMessage(),
|
|
]);
|
|
$failed++;
|
|
}
|
|
}
|
|
|
|
return [
|
|
'dispatched' => $dispatched,
|
|
'processed' => $processed,
|
|
'completed' => $completed,
|
|
'failed' => $failed,
|
|
];
|
|
}
|
|
|
|
private function dispatchDueSchedules(DateTimeImmutable $now): int
|
|
{
|
|
$schedules = $this->repository->findDueSchedules($now);
|
|
$count = 0;
|
|
foreach ($schedules as $schedule) {
|
|
$this->repository->enqueueJobFromSchedule($schedule, $now);
|
|
$count++;
|
|
}
|
|
|
|
return $count;
|
|
}
|
|
|
|
/**
|
|
* @param array<string, mixed> $payload
|
|
* @return array<string, mixed>
|
|
*/
|
|
private function handleJob(string $jobType, array $payload): array
|
|
{
|
|
$handler = $this->handlers[$jobType] ?? null;
|
|
if ($handler === null || !method_exists($handler, 'handle')) {
|
|
throw new RuntimeException('Brak handlera dla typu joba: ' . $jobType);
|
|
}
|
|
|
|
$result = $handler->handle($payload);
|
|
if (!is_array($result)) {
|
|
return ['ok' => true];
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
}
|