2023-05-16 11:11:05 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Http\Livewire\Project\Application;
|
|
|
|
|
2023-06-02 13:15:12 +00:00
|
|
|
use App\Jobs\ApplicationContainerStatusJob;
|
2023-05-16 11:11:05 +00:00
|
|
|
use App\Models\Application;
|
2023-05-30 13:52:17 +00:00
|
|
|
use App\Models\ApplicationPreview;
|
|
|
|
use Illuminate\Support\Collection;
|
2023-05-16 11:11:05 +00:00
|
|
|
use Livewire\Component;
|
2023-05-30 13:52:17 +00:00
|
|
|
use Visus\Cuid2\Cuid2;
|
2023-05-16 11:11:05 +00:00
|
|
|
|
|
|
|
class Previews extends Component
|
|
|
|
{
|
|
|
|
public Application $application;
|
2023-05-30 13:52:17 +00:00
|
|
|
public string $deployment_uuid;
|
|
|
|
public array $parameters;
|
|
|
|
public Collection $pull_requests;
|
|
|
|
public int $rate_limit_remaining;
|
|
|
|
|
|
|
|
public function mount()
|
|
|
|
{
|
|
|
|
$this->pull_requests = collect();
|
|
|
|
$this->parameters = get_parameters();
|
|
|
|
}
|
|
|
|
public function loadStatus($pull_request_id)
|
|
|
|
{
|
2023-06-02 13:15:12 +00:00
|
|
|
dispatch(new ApplicationContainerStatusJob(
|
2023-05-30 13:52:17 +00:00
|
|
|
application: $this->application,
|
|
|
|
container_name: generate_container_name($this->application->uuid, $pull_request_id),
|
|
|
|
pull_request_id: $pull_request_id
|
|
|
|
));
|
|
|
|
}
|
|
|
|
protected function set_deployment_uuid()
|
|
|
|
{
|
|
|
|
$this->deployment_uuid = new Cuid2(7);
|
|
|
|
$this->parameters['deployment_uuid'] = $this->deployment_uuid;
|
|
|
|
}
|
|
|
|
public function load_prs()
|
|
|
|
{
|
2023-06-02 10:34:45 +00:00
|
|
|
try {
|
2023-06-13 13:01:11 +00:00
|
|
|
['rate_limit_remaining' => $rate_limit_remaining, 'data' => $data] = git_api(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/pulls");
|
2023-06-02 10:34:45 +00:00
|
|
|
$this->rate_limit_remaining = $rate_limit_remaining;
|
|
|
|
$this->pull_requests = $data->sortBy('number')->values();
|
2023-06-09 13:55:21 +00:00
|
|
|
} catch (\Throwable $e) {
|
2023-06-02 10:34:45 +00:00
|
|
|
$this->rate_limit_remaining = 0;
|
2023-06-09 13:55:21 +00:00
|
|
|
return general_error_handler(err: $e, that: $this);
|
2023-06-02 10:34:45 +00:00
|
|
|
}
|
2023-05-30 13:52:17 +00:00
|
|
|
}
|
2023-05-31 12:57:42 +00:00
|
|
|
public function deploy(int $pull_request_id, string|null $pull_request_html_url = null)
|
2023-05-30 13:52:17 +00:00
|
|
|
{
|
|
|
|
try {
|
|
|
|
$this->set_deployment_uuid();
|
2023-05-30 15:00:11 +00:00
|
|
|
$found = ApplicationPreview::where('application_id', $this->application->id)->where('pull_request_id', $pull_request_id)->first();
|
2023-05-31 12:57:42 +00:00
|
|
|
if (!$found && !is_null($pull_request_html_url)) {
|
2023-05-30 15:00:11 +00:00
|
|
|
ApplicationPreview::create([
|
|
|
|
'application_id' => $this->application->id,
|
|
|
|
'pull_request_id' => $pull_request_id,
|
2023-05-31 08:19:29 +00:00
|
|
|
'pull_request_html_url' => $pull_request_html_url
|
2023-05-30 15:00:11 +00:00
|
|
|
]);
|
|
|
|
}
|
2023-05-30 13:52:17 +00:00
|
|
|
queue_application_deployment(
|
|
|
|
application_id: $this->application->id,
|
|
|
|
deployment_uuid: $this->deployment_uuid,
|
|
|
|
force_rebuild: true,
|
|
|
|
pull_request_id: $pull_request_id,
|
|
|
|
);
|
2023-05-31 12:42:37 +00:00
|
|
|
return redirect()->route('project.application.deployment', [
|
2023-05-31 08:19:29 +00:00
|
|
|
'project_uuid' => $this->parameters['project_uuid'],
|
|
|
|
'application_uuid' => $this->parameters['application_uuid'],
|
2023-05-31 12:42:37 +00:00
|
|
|
'deployment_uuid' => $this->deployment_uuid,
|
2023-05-31 08:19:29 +00:00
|
|
|
'environment_name' => $this->parameters['environment_name'],
|
|
|
|
]);
|
2023-06-09 13:55:21 +00:00
|
|
|
} catch (\Throwable $e) {
|
|
|
|
return general_error_handler(err: $e, that: $this);
|
2023-05-30 13:52:17 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
public function stop(int $pull_request_id)
|
|
|
|
{
|
|
|
|
try {
|
|
|
|
$container_name = generate_container_name($this->application->uuid, $pull_request_id);
|
|
|
|
ray('Stopping container: ' . $container_name);
|
|
|
|
|
|
|
|
instant_remote_process(["docker rm -f $container_name"], $this->application->destination->server, throwError: false);
|
2023-05-31 09:24:02 +00:00
|
|
|
ApplicationPreview::where('application_id', $this->application->id)->where('pull_request_id', $pull_request_id)->delete();
|
2023-05-30 15:05:27 +00:00
|
|
|
$this->application->refresh();
|
2023-06-09 13:55:21 +00:00
|
|
|
} catch (\Throwable $e) {
|
|
|
|
return general_error_handler(err: $e, that: $this);
|
2023-05-30 13:52:17 +00:00
|
|
|
}
|
|
|
|
}
|
2023-05-16 11:11:05 +00:00
|
|
|
}
|