2024-06-17 12:44:12 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace Appwrite\Platform\Tasks;
|
|
|
|
|
|
|
|
|
|
use Appwrite\Event\Func;
|
|
|
|
|
use Utopia\Database\Database;
|
|
|
|
|
use Utopia\Pools\Group;
|
|
|
|
|
|
|
|
|
|
class ScheduleExecutions extends ScheduleBase
|
|
|
|
|
{
|
|
|
|
|
public const UPDATE_TIMER = 3; // seconds
|
|
|
|
|
public const ENQUEUE_TIMER = 4; // seconds
|
|
|
|
|
|
|
|
|
|
public static function getName(): string
|
|
|
|
|
{
|
|
|
|
|
return 'schedule-executions';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function getSupportedResource(): string
|
|
|
|
|
{
|
|
|
|
|
return 'execution';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected function enqueueResources(Group $pools, Database $dbForConsole): void
|
|
|
|
|
{
|
2024-06-17 13:12:02 +00:00
|
|
|
$queue = $pools->get('queue')->pop();
|
|
|
|
|
$connection = $queue->getResource();
|
|
|
|
|
$queueForFunctions = new Func($connection);
|
2024-07-18 12:03:24 +00:00
|
|
|
$intervalEnd = (new \DateTime())->modify('+' . self::ENQUEUE_TIMER . ' seconds');
|
2024-06-17 13:12:02 +00:00
|
|
|
|
2024-06-17 12:44:12 +00:00
|
|
|
foreach ($this->schedules as $schedule) {
|
2024-06-17 13:12:02 +00:00
|
|
|
if (!$schedule['active']) {
|
2024-07-01 13:35:37 +00:00
|
|
|
$dbForConsole->deleteDocument(
|
|
|
|
|
'schedules',
|
|
|
|
|
$schedule['$id'],
|
|
|
|
|
);
|
|
|
|
|
|
2024-06-17 12:44:12 +00:00
|
|
|
unset($this->schedules[$schedule['resourceId']]);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$scheduledAt = new \DateTime($schedule['schedule']);
|
2024-07-18 12:03:24 +00:00
|
|
|
if ($scheduledAt <= $intervalEnd) {
|
2024-06-17 12:44:12 +00:00
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2024-07-18 12:03:24 +00:00
|
|
|
$delay = $scheduledAt->getTimestamp() - (new \DateTime())->getTimestamp();
|
|
|
|
|
|
|
|
|
|
\go(function () use ($queueForFunctions, $schedule, $delay) {
|
|
|
|
|
\sleep($delay);
|
|
|
|
|
|
|
|
|
|
$queueForFunctions
|
|
|
|
|
->setType('schedule')
|
|
|
|
|
// Set functionId instead of function as we don't have $dbForProject
|
|
|
|
|
// TODO: Refactor to use function instead of functionId
|
|
|
|
|
->setFunctionId($schedule['resource']['functionId'])
|
|
|
|
|
->setExecution($schedule['resource'])
|
|
|
|
|
->setMethod($schedule['data']['method'] ?? 'POST')
|
|
|
|
|
->setPath($schedule['data']['path'] ?? '/')
|
|
|
|
|
->setHeaders($schedule['data']['headers'] ?? [])
|
|
|
|
|
->setBody($schedule['data']['body'] ?? '')
|
|
|
|
|
->setProject($schedule['project'])
|
|
|
|
|
->trigger();
|
|
|
|
|
});
|
2024-06-17 12:44:12 +00:00
|
|
|
|
2024-06-17 13:12:02 +00:00
|
|
|
$dbForConsole->deleteDocument(
|
|
|
|
|
'schedules',
|
|
|
|
|
$schedule['$id'],
|
|
|
|
|
);
|
2024-06-17 12:44:12 +00:00
|
|
|
|
2024-06-17 13:12:02 +00:00
|
|
|
unset($this->schedules[$schedule['resourceId']]);
|
2024-06-17 12:44:12 +00:00
|
|
|
}
|
2024-06-17 13:12:02 +00:00
|
|
|
|
|
|
|
|
$queue->reclaim();
|
2024-06-17 12:44:12 +00:00
|
|
|
}
|
|
|
|
|
}
|