|
| 1 | +<?php |
| 2 | + |
| 3 | +namespace App\Sync; |
| 4 | + |
| 5 | +use App\Support\Defaults; |
| 6 | +use Illuminate\Console\OutputStyle; |
| 7 | +use Laravel\Forge\Resources\Server; |
| 8 | +use Laravel\Forge\Resources\Site; |
| 9 | +use Laravel\Forge\Resources\Worker; |
| 10 | + |
| 11 | +class WorkerSync extends BaseSync |
| 12 | +{ |
| 13 | + public function sync(string $environment, Server $server, Site $site, OutputStyle $output, bool $force = false): void |
| 14 | + { |
| 15 | + $workers = collect($this->config->get($environment, 'workers', [])); |
| 16 | + $forgeWorkers = collect($this->forge->workers($server->id, $site->id))->keyBy('id'); |
| 17 | + |
| 18 | + // Create workers that are defined locally but do not exist on Forge |
| 19 | + $workers->reject(function (array $worker) use (&$forgeWorkers, $server, $site) { |
| 20 | + if ($match = $forgeWorkers->first(fn (Worker $forge) => $this->equivalent($server, $forge, $worker))) { |
| 21 | + // Remove each found worker from the list of 'unmatched' workers on Forge |
| 22 | + $forgeWorkers->forget($match->id); |
| 23 | + |
| 24 | + return true; |
| 25 | + } |
| 26 | + })->map(function (array $worker) use ($server, $site, $output) { |
| 27 | + $data = $this->getWorkerPayload($server, $worker); |
| 28 | + |
| 29 | + $output->writeln("Creating {$data['queue']} queue worker on {$data['connection']} connection..."); |
| 30 | + |
| 31 | + $this->forge->createWorker($server->id, $site->id, $data); |
| 32 | + }); |
| 33 | + |
| 34 | + if ($forgeWorkers->isNotEmpty()) { |
| 35 | + if ($force) { |
| 36 | + $forgeWorkers->map(function (Worker $worker) use ($server, $site, $output) { |
| 37 | + $output->writeln("Deleting {$worker->queue} queue worker present on Forge but not listed locally..."); |
| 38 | + |
| 39 | + $this->forge->deleteWorker($server->id, $site->id, $worker->id); |
| 40 | + }); |
| 41 | + } else { |
| 42 | + $output->writeln("Found {$forgeWorkers->count()} queue workers present on Forge but not listed locally."); |
| 43 | + $output->writeln('Run the command again with the `--force` option to delete them.'); |
| 44 | + } |
| 45 | + } |
| 46 | + } |
| 47 | + |
| 48 | + protected function equivalent(Server $server, Worker $worker, array $config): bool |
| 49 | + { |
| 50 | + $cli = collect($this->forge->phpVersions($server->id))->firstWhere('usedOnCli', true)->version; |
| 51 | + |
| 52 | + $defaults = Defaults::worker($cli); |
| 53 | + |
| 54 | + $forgeWorker = [ |
| 55 | + 'queue' => $worker->queue, |
| 56 | + 'connection' => $worker->connection, |
| 57 | + 'timeout' => $worker->timeout, |
| 58 | + 'delay' => $worker->delay, |
| 59 | + 'sleep' => $worker->sleep, |
| 60 | + 'tries' => $worker->tries, |
| 61 | + 'environment' => $worker->environment, |
| 62 | + 'daemon' => (bool) $worker->daemon, |
| 63 | + 'force' => (bool) $worker->force, |
| 64 | + 'php_version' => str_replace('.', '', head(explode(' ', $worker->command))), |
| 65 | + 'processes' => $worker->processes, |
| 66 | + ]; |
| 67 | + |
| 68 | + foreach (array_merge($defaults, $config) as $key => $value) { |
| 69 | + if ($forgeWorker[$key] !== $value) { |
| 70 | + return false; |
| 71 | + } |
| 72 | + } |
| 73 | + |
| 74 | + return true; |
| 75 | + } |
| 76 | + |
| 77 | + protected function getWorkerPayload(Server $server, array $worker): array |
| 78 | + { |
| 79 | + $cli = collect($this->forge->phpVersions($server->id))->firstWhere('usedOnCli', true)->version; |
| 80 | + |
| 81 | + return array_merge(Defaults::worker($cli), $worker); |
| 82 | + } |
| 83 | +} |
0 commit comments