coolify/app/Jobs/RestartProxyJob.php
Andras Bacsai 340e42aefd Dispatch restarting status immediately when job starts
Set proxy status to 'restarting' and dispatch ProxyStatusChangedUI event
at the very beginning of handle() method, before StopProxy runs. This
notifies the UI immediately so users know a restart is in progress,
rather than waiting until after the stop operation completes.

Also simplified unit tests to focus on testable job configuration
(middleware, tries, timeout) without complex SchemalessAttributes mocking.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 16:18:13 +01:00

71 lines
2.3 KiB
PHP

<?php
namespace App\Jobs;
use App\Actions\Proxy\StartProxy;
use App\Actions\Proxy\StopProxy;
use App\Events\ProxyStatusChangedUI;
use App\Models\Server;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeEncrypted;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\Middleware\WithoutOverlapping;
use Illuminate\Queue\SerializesModels;
class RestartProxyJob implements ShouldBeEncrypted, ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $tries = 1;
public $timeout = 60;
public ?int $activity_id = null;
public function middleware(): array
{
return [(new WithoutOverlapping('restart-proxy-'.$this->server->uuid))->expireAfter(60)->dontRelease()];
}
public function __construct(public Server $server) {}
public function handle()
{
try {
// Set status to restarting and notify UI immediately
$this->server->proxy->status = 'restarting';
$this->server->save();
ProxyStatusChangedUI::dispatch($this->server->team_id);
// Stop proxy
StopProxy::run($this->server, restarting: true);
// Clear force_stop flag
$this->server->proxy->force_stop = false;
$this->server->save();
// Start proxy asynchronously - returns Activity immediately
// The ProxyStatusChanged event will be dispatched when the remote process completes,
// which triggers ProxyStatusChangedNotification listener
$activity = StartProxy::run($this->server, force: true, restarting: true);
// Dispatch event with activity ID immediately so UI can show logs in real-time
if ($activity && is_object($activity)) {
$this->activity_id = $activity->id;
ProxyStatusChangedUI::dispatch($this->server->team_id, $this->activity_id);
}
} catch (\Throwable $e) {
// Set error status
$this->server->proxy->status = 'error';
$this->server->save();
// Notify UI of error
ProxyStatusChangedUI::dispatch($this->server->team_id);
return handleError($e);
}
}
}