133 lines
3.4 KiB
PHP
133 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace App\Livewire\Server;
|
|
|
|
use App\Models\DockerCleanupExecution;
|
|
use App\Models\Server;
|
|
use Illuminate\Support\Collection;
|
|
use Livewire\Component;
|
|
|
|
class DockerCleanupExecutions extends Component
|
|
{
|
|
public Server $server;
|
|
|
|
public Collection $executions;
|
|
|
|
public ?int $selectedKey = null;
|
|
|
|
public $selectedExecution = null;
|
|
|
|
public bool $isPollingActive = false;
|
|
|
|
public $currentPage = 1;
|
|
|
|
public $logsPerPage = 100;
|
|
|
|
public function getListeners()
|
|
{
|
|
$teamId = auth()->user()->currentTeam()->id;
|
|
|
|
return [
|
|
"echo-private:team.{$teamId},DockerCleanupDone" => 'refreshExecutions',
|
|
];
|
|
}
|
|
|
|
public function mount(Server $server)
|
|
{
|
|
$this->server = $server;
|
|
$this->refreshExecutions();
|
|
}
|
|
|
|
public function refreshExecutions(): void
|
|
{
|
|
$this->executions = $this->server->dockerCleanupExecutions()
|
|
->orderBy('created_at', 'desc')
|
|
->take(20)
|
|
->get();
|
|
|
|
if ($this->selectedKey) {
|
|
$this->selectedExecution = DockerCleanupExecution::find($this->selectedKey);
|
|
if ($this->selectedExecution && $this->selectedExecution->status !== 'running') {
|
|
$this->isPollingActive = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
public function selectExecution($key): void
|
|
{
|
|
if ($key == $this->selectedKey) {
|
|
$this->selectedKey = null;
|
|
$this->selectedExecution = null;
|
|
$this->currentPage = 1;
|
|
$this->isPollingActive = false;
|
|
|
|
return;
|
|
}
|
|
$this->selectedKey = $key;
|
|
$this->selectedExecution = DockerCleanupExecution::find($key);
|
|
$this->currentPage = 1;
|
|
|
|
if ($this->selectedExecution && $this->selectedExecution->status === 'running') {
|
|
$this->isPollingActive = true;
|
|
}
|
|
}
|
|
|
|
public function polling()
|
|
{
|
|
if ($this->selectedExecution && $this->isPollingActive) {
|
|
$this->selectedExecution->refresh();
|
|
if ($this->selectedExecution->status !== 'running') {
|
|
$this->isPollingActive = false;
|
|
}
|
|
}
|
|
$this->refreshExecutions();
|
|
}
|
|
|
|
public function loadMoreLogs()
|
|
{
|
|
$this->currentPage++;
|
|
}
|
|
|
|
public function getLogLinesProperty()
|
|
{
|
|
if (! $this->selectedExecution) {
|
|
return collect();
|
|
}
|
|
|
|
if (! $this->selectedExecution->message) {
|
|
return collect(['Waiting for execution output...']);
|
|
}
|
|
|
|
$lines = collect(explode("\n", $this->selectedExecution->message));
|
|
|
|
return $lines->take($this->currentPage * $this->logsPerPage);
|
|
}
|
|
|
|
public function downloadLogs(int $executionId)
|
|
{
|
|
$execution = $this->executions->firstWhere('id', $executionId);
|
|
if (! $execution) {
|
|
return;
|
|
}
|
|
|
|
return response()->streamDownload(function () use ($execution) {
|
|
echo $execution->message;
|
|
}, "docker-cleanup-{$execution->uuid}.log");
|
|
}
|
|
|
|
public function hasMoreLogs()
|
|
{
|
|
if (! $this->selectedExecution || ! $this->selectedExecution->message) {
|
|
return false;
|
|
}
|
|
$lines = collect(explode("\n", $this->selectedExecution->message));
|
|
|
|
return $lines->count() > ($this->currentPage * $this->logsPerPage);
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
return view('livewire.server.docker-cleanup-executions');
|
|
}
|
|
}
|