rector: arrrrr

This commit is contained in:
Andras Bacsai
2025-01-07 14:52:08 +01:00
parent c702ebff6d
commit 16c0cd10d8
349 changed files with 4204 additions and 3712 deletions

View File

@@ -5,6 +5,7 @@ namespace App\Livewire\Project;
use App\Models\Project;
use Livewire\Attributes\Validate;
use Livewire\Component;
use Throwable;
use Visus\Cuid2\Cuid2;
class AddEmpty extends Component
@@ -19,7 +20,7 @@ class AddEmpty extends Component
{
try {
$this->validate();
$project = Project::create([
$project = Project::query()->create([
'name' => $this->name,
'description' => $this->description,
'team_id' => currentTeam()->id,
@@ -27,7 +28,7 @@ class AddEmpty extends Component
]);
return redirect()->route('project.show', $project->uuid);
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
}

View File

@@ -5,6 +5,7 @@ namespace App\Livewire\Project\Application;
use App\Models\Application;
use Livewire\Attributes\Validate;
use Livewire\Component;
use Throwable;
class Advanced extends Component
{
@@ -71,9 +72,11 @@ class Advanced extends Component
{
try {
$this->syncData();
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function syncData(bool $toModel = false)
@@ -127,14 +130,12 @@ class Advanced extends Component
public function instantSave()
{
try {
if ($this->isLogDrainEnabled) {
if (! $this->application->destination->server->isLogDrainEnabled()) {
$this->isLogDrainEnabled = false;
$this->syncData(true);
$this->dispatch('error', 'Log drain is not enabled on this server.');
if ($this->isLogDrainEnabled && ! $this->application->destination->server->isLogDrainEnabled()) {
$this->isLogDrainEnabled = false;
$this->syncData(true);
$this->dispatch('error', 'Log drain is not enabled on this server.');
return;
}
return null;
}
if ($this->application->isForceHttpsEnabled() !== $this->isForceHttpsEnabled ||
$this->application->isGzipEnabled() !== $this->isGzipEnabled ||
@@ -151,9 +152,11 @@ class Advanced extends Component
$this->syncData(true);
$this->dispatch('success', 'Settings saved.');
$this->dispatch('configurationChanged');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function submit()
@@ -165,13 +168,15 @@ class Advanced extends Component
$this->gpuDeviceIds = null;
$this->syncData(true);
return;
return null;
}
$this->syncData(true);
$this->dispatch('success', 'Settings saved.');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function saveCustomName()

View File

@@ -49,6 +49,8 @@ class Index extends Component
$this->current_url = url()->current();
$this->show_pull_request_only();
$this->show_more();
return null;
}
private function show_pull_request_only()
@@ -78,9 +80,9 @@ class Index extends Component
public function previous_page(?int $take = null)
{
if ($take) {
$this->skip = $this->skip - $take;
$this->skip -= $take;
}
$this->skip = $this->skip - $this->default_take;
$this->skip -= $this->default_take;
if ($this->skip < 0) {
$this->show_prev = false;
$this->skip = 0;
@@ -91,7 +93,7 @@ class Index extends Component
public function next_page(?int $take = null)
{
if ($take) {
$this->skip = $this->skip + $take;
$this->skip += $take;
}
$this->show_prev = true;
$this->load_deployments();

View File

@@ -34,7 +34,7 @@ class Show extends Component
if (! $application) {
return redirect()->route('dashboard');
}
$application_deployment_queue = ApplicationDeploymentQueue::where('deployment_uuid', $deploymentUuid)->first();
$application_deployment_queue = ApplicationDeploymentQueue::query()->where('deployment_uuid', $deploymentUuid)->first();
if (! $application_deployment_queue) {
return redirect()->route('project.application.deployment.index', [
'project_uuid' => $project->uuid,
@@ -45,6 +45,8 @@ class Show extends Component
$this->application = $application;
$this->application_deployment_queue = $application_deployment_queue;
$this->deployment_uuid = $deploymentUuid;
return null;
}
public function refreshQueue()

View File

@@ -8,6 +8,7 @@ use App\Models\ApplicationDeploymentQueue;
use App\Models\Server;
use Illuminate\Support\Carbon;
use Livewire\Component;
use Throwable;
class DeploymentNavbar extends Component
{
@@ -45,9 +46,11 @@ class DeploymentNavbar extends Component
{
try {
force_start_deployment($this->application_deployment_queue);
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function cancel()
@@ -57,9 +60,9 @@ class DeploymentNavbar extends Component
$server_id = $this->application_deployment_queue->server_id ?? $this->application->destination->server_id;
try {
if ($this->application->settings->is_build_server_enabled) {
$server = Server::find($build_server_id);
$server = Server::query()->find($build_server_id);
} else {
$server = Server::find($server_id);
$server = Server::query()->find($server_id);
}
if ($this->application_deployment_queue->logs) {
$previous_logs = json_decode($this->application_deployment_queue->logs, associative: true, flags: JSON_THROW_ON_ERROR);
@@ -78,7 +81,7 @@ class DeploymentNavbar extends Component
]);
}
instant_remote_process([$kill_command], $server);
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
} finally {
$this->application_deployment_queue->update([
@@ -87,5 +90,7 @@ class DeploymentNavbar extends Component
]);
next_after_cancel($server);
}
return null;
}
}

View File

@@ -6,7 +6,9 @@ use App\Actions\Application\GenerateConfig;
use App\Models\Application;
use Illuminate\Support\Collection;
use Livewire\Component;
use Livewire\Features\SupportEvents\Event;
use Spatie\Url\Url;
use Throwable;
use Visus\Cuid2\Cuid2;
class General extends Component
@@ -141,7 +143,7 @@ class General extends Component
return;
}
} catch (\Throwable $e) {
} catch (Throwable $e) {
$this->dispatch('error', $e->getMessage());
}
if ($this->application->build_pack === 'dockercompose') {
@@ -179,13 +181,11 @@ class General extends Component
if ($this->ports_exposes !== $this->application->ports_exposes || $this->is_container_label_escape_enabled !== $this->application->settings->is_container_label_escape_enabled) {
$this->resetDefaultLabels(false);
}
if ($this->is_preserve_repository_enabled !== $this->application->settings->is_preserve_repository_enabled) {
if ($this->application->settings->is_preserve_repository_enabled === false) {
$this->application->fileStorages->each(function ($storage) {
$storage->is_based_on_git = $this->application->settings->is_preserve_repository_enabled;
$storage->save();
});
}
if ($this->is_preserve_repository_enabled !== $this->application->settings->is_preserve_repository_enabled && $this->application->settings->is_preserve_repository_enabled === false) {
$this->application->fileStorages->each(function ($storage) {
$storage->is_based_on_git = $this->application->settings->is_preserve_repository_enabled;
$storage->save();
});
}
}
@@ -193,7 +193,7 @@ class General extends Component
{
try {
if ($isInit && $this->application->docker_compose_raw) {
return;
return null;
}
// Must reload the application to get the latest database changes
@@ -204,14 +204,14 @@ class General extends Component
if (is_null($this->parsedServices)) {
$this->dispatch('error', 'Failed to parse your docker-compose file. Please check the syntax and try again.');
return;
return null;
}
$this->application->parse();
$this->dispatch('success', 'Docker compose file loaded.');
$this->dispatch('compose_loaded');
$this->dispatch('refreshStorages');
$this->dispatch('refreshEnvs');
} catch (\Throwable $e) {
} catch (Throwable $e) {
$this->application->docker_compose_location = $this->initialDockerComposeLocation;
$this->application->save();
@@ -219,12 +219,14 @@ class General extends Component
} finally {
$this->initLoadingCompose = false;
}
return null;
}
public function generateDomain(string $serviceName)
{
$uuid = new Cuid2;
$domain = generateFqdn($this->application->destination->server, $uuid);
$cuid2 = new Cuid2;
$domain = generateFqdn($this->application->destination->server, $cuid2);
$this->parsedServiceDomains[$serviceName]['domain'] = $domain;
$this->application->docker_compose_domains = json_encode($this->parsedServiceDomains);
$this->application->save();
@@ -295,7 +297,7 @@ class General extends Component
{
try {
if ($this->application->settings->is_container_label_readonly_enabled && ! $manualReset) {
return;
return null;
}
$this->customLabels = str(implode('|coolify|', generateLabelsApplication($this->application)))->replace('|coolify|', "\n");
$this->ports_exposes = $this->application->ports_exposes;
@@ -306,9 +308,11 @@ class General extends Component
$this->loadComposeFile();
}
$this->dispatch('configurationChanged');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function checkFqdns($showToaster = true)
@@ -334,14 +338,16 @@ class General extends Component
if ($has_www === 0 && $this->application->redirect === 'www') {
$this->dispatch('error', 'You want to redirect to www, but you do not have a www domain set.<br><br>Please add www to your domain list and as an A DNS record (if applicable).');
return;
return null;
}
$this->application->save();
$this->resetDefaultLabels();
$this->dispatch('success', 'Redirect updated.');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function submit($showToaster = true)
@@ -377,8 +383,8 @@ class General extends Component
if ($this->application->build_pack === 'dockercompose' && $this->initialDockerComposeLocation !== $this->application->docker_compose_location) {
$compose_return = $this->loadComposeFile();
if ($compose_return instanceof \Livewire\Features\SupportEvents\Event) {
return;
if ($compose_return instanceof Event) {
return null;
}
}
$this->validate();
@@ -410,8 +416,8 @@ class General extends Component
if ($this->application->build_pack === 'dockercompose') {
$this->application->docker_compose_domains = json_encode($this->parsedServiceDomains);
foreach ($this->parsedServiceDomains as $serviceName => $service) {
$domain = data_get($service, 'domain');
foreach ($this->parsedServiceDomains as $parsedServiceDomain) {
$domain = data_get($parsedServiceDomain, 'domain');
if ($domain) {
if (! validate_dns_entry($domain, $this->application->destination->server)) {
$showToaster && $this->dispatch('error', 'Validating DNS failed.', "Make sure you have added the DNS records correctly.<br><br>$domain->{$this->application->destination->server->ip}<br><br>Check this <a target='_blank' class='underline dark:text-white' href='https://coolify.io/docs/knowledge-base/dns-configuration'>documentation</a> for further help.");
@@ -425,8 +431,10 @@ class General extends Component
}
$this->application->custom_labels = base64_encode($this->customLabels);
$this->application->save();
$showToaster && ! $warning && $this->dispatch('success', 'Application settings updated!');
} catch (\Throwable $e) {
if ($showToaster && ! $warning) {
$this->dispatch('success', 'Application settings updated!');
}
} catch (Throwable $e) {
$originalFqdn = $this->application->getOriginal('fqdn');
if ($originalFqdn !== $this->application->fqdn) {
$this->application->fqdn = $originalFqdn;
@@ -436,6 +444,8 @@ class General extends Component
} finally {
$this->dispatch('configurationChanged');
}
return null;
}
public function downloadConfig()

View File

@@ -66,22 +66,22 @@ class Heading extends Component
if ($this->application->build_pack === 'dockercompose' && is_null($this->application->docker_compose_raw)) {
$this->dispatch('error', 'Failed to deploy', 'Please load a Compose file first.');
return;
return null;
}
if ($this->application->destination->server->isSwarm() && str($this->application->docker_registry_image_name)->isEmpty()) {
$this->dispatch('error', 'Failed to deploy.', 'To deploy to a Swarm cluster you must set a Docker image name first.');
return;
return null;
}
if (data_get($this->application, 'settings.is_build_server_enabled') && str($this->application->docker_registry_image_name)->isEmpty()) {
$this->dispatch('error', 'Failed to deploy.', 'To use a build server, you must first set a Docker image.<br>More information here: <a target="_blank" class="underline" href="https://coolify.io/docs/knowledge-base/server/build-server">documentation</a>');
return;
return null;
}
if ($this->application->additional_servers->count() > 0 && str($this->application->docker_registry_image_name)->isEmpty()) {
$this->dispatch('error', 'Failed to deploy.', 'Before deploying to multiple servers, you must first set a Docker image in the General tab.<br>More information here: <a target="_blank" class="underline" href="https://coolify.io/docs/knowledge-base/server/multiple-servers">documentation</a>');
return;
return null;
}
$this->setDeploymentUuid();
queue_application_deployment(
@@ -123,7 +123,7 @@ class Heading extends Component
if ($this->application->additional_servers->count() > 0 && str($this->application->docker_registry_image_name)->isEmpty()) {
$this->dispatch('error', 'Failed to deploy', 'Before deploying to multiple servers, you must first set a Docker image in the General tab.<br>More information here: <a target="_blank" class="underline" href="https://coolify.io/docs/knowledge-base/server/multiple-servers">documentation</a>');
return;
return null;
}
$this->setDeploymentUuid();
queue_application_deployment(

View File

@@ -6,6 +6,7 @@ use App\Models\Application;
use Livewire\Attributes\Validate;
use Livewire\Component;
use Spatie\Url\Url;
use Throwable;
class Form extends Component
{
@@ -19,9 +20,11 @@ class Form extends Component
try {
$this->previewUrlTemplate = $this->application->preview_url_template;
$this->generateRealUrl();
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function submit()
@@ -33,9 +36,11 @@ class Form extends Component
$this->application->save();
$this->dispatch('success', 'Preview url template updated.');
$this->generateRealUrl();
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function resetToDefault()
@@ -46,9 +51,11 @@ class Form extends Component
$this->application->save();
$this->generateRealUrl();
$this->dispatch('success', 'Preview url template updated.');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function generateRealUrl()

View File

@@ -6,11 +6,13 @@ use App\Actions\Docker\GetContainersStatus;
use App\Models\Application;
use App\Models\ApplicationPreview;
use Carbon\Carbon;
use Exception;
use Illuminate\Process\InvokedProcess;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Process;
use Livewire\Component;
use Spatie\Url\Url;
use Throwable;
use Visus\Cuid2\Cuid2;
class Previews extends Component
@@ -41,11 +43,13 @@ class Previews extends Component
['rate_limit_remaining' => $rate_limit_remaining, 'data' => $data] = githubApi(source: $this->application->source, endpoint: "/repos/{$this->application->git_repository}/pulls");
$this->rate_limit_remaining = $rate_limit_remaining;
$this->pull_requests = $data->sortBy('number')->values();
} catch (\Throwable $e) {
} catch (Throwable $e) {
$this->rate_limit_remaining = 0;
return handleError($e, $this);
}
return null;
}
public function save_preview($preview_id)
@@ -65,13 +69,19 @@ class Previews extends Component
}
if (! $preview) {
throw new \Exception('Preview not found');
throw new Exception('Preview not found');
}
$success && $preview->save();
$success && $this->dispatch('success', 'Preview saved.<br><br>Do not forget to redeploy the preview to apply the changes.');
} catch (\Throwable $e) {
if ($success) {
$preview->save();
}
if ($success) {
$this->dispatch('success', 'Preview saved.<br><br>Do not forget to redeploy the preview to apply the changes.');
}
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function generate_preview($preview_id)
@@ -95,8 +105,8 @@ class Previews extends Component
$template = $this->application->preview_url_template;
$host = $url->getHost();
$schema = $url->getScheme();
$random = new Cuid2;
$preview_fqdn = str_replace('{{random}}', $random, $template);
$cuid2 = new Cuid2;
$preview_fqdn = str_replace('{{random}}', $cuid2, $template);
$preview_fqdn = str_replace('{{domain}}', $host, $preview_fqdn);
$preview_fqdn = str_replace('{{pr_id}}', $preview->pull_request_id, $preview_fqdn);
$preview_fqdn = "$schema://$preview_fqdn";
@@ -110,9 +120,9 @@ class Previews extends Component
try {
if ($this->application->build_pack === 'dockercompose') {
$this->setDeploymentUuid();
$found = ApplicationPreview::where('application_id', $this->application->id)->where('pull_request_id', $pull_request_id)->first();
$found = ApplicationPreview::query()->where('application_id', $this->application->id)->where('pull_request_id', $pull_request_id)->first();
if (! $found && ! is_null($pull_request_html_url)) {
$found = ApplicationPreview::create([
$found = ApplicationPreview::query()->create([
'application_id' => $this->application->id,
'pull_request_id' => $pull_request_id,
'pull_request_html_url' => $pull_request_html_url,
@@ -123,9 +133,9 @@ class Previews extends Component
$this->application->refresh();
} else {
$this->setDeploymentUuid();
$found = ApplicationPreview::where('application_id', $this->application->id)->where('pull_request_id', $pull_request_id)->first();
$found = ApplicationPreview::query()->where('application_id', $this->application->id)->where('pull_request_id', $pull_request_id)->first();
if (! $found && ! is_null($pull_request_html_url)) {
$found = ApplicationPreview::create([
$found = ApplicationPreview::query()->create([
'application_id' => $this->application->id,
'pull_request_id' => $pull_request_id,
'pull_request_html_url' => $pull_request_html_url,
@@ -136,9 +146,11 @@ class Previews extends Component
$this->dispatch('update_links');
$this->dispatch('success', 'Preview added.');
}
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function add_and_deploy(int $pull_request_id, ?string $pull_request_html_url = null)
@@ -151,9 +163,9 @@ class Previews extends Component
{
try {
$this->setDeploymentUuid();
$found = ApplicationPreview::where('application_id', $this->application->id)->where('pull_request_id', $pull_request_id)->first();
$found = ApplicationPreview::query()->where('application_id', $this->application->id)->where('pull_request_id', $pull_request_id)->first();
if (! $found && ! is_null($pull_request_html_url)) {
ApplicationPreview::create([
ApplicationPreview::query()->create([
'application_id' => $this->application->id,
'pull_request_id' => $pull_request_id,
'pull_request_html_url' => $pull_request_html_url,
@@ -173,7 +185,7 @@ class Previews extends Component
'deployment_uuid' => $this->deployment_uuid,
'environment_uuid' => $this->parameters['environment_uuid'],
]);
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
}
@@ -201,9 +213,11 @@ class Previews extends Component
$this->application->refresh();
$this->dispatch('containerStatusUpdated');
$this->dispatch('success', 'Preview Deployment stopped.');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function delete(int $pull_request_id)
@@ -219,7 +233,7 @@ class Previews extends Component
$this->stopContainers($containers, $server, $timeout);
}
ApplicationPreview::where('application_id', $this->application->id)
ApplicationPreview::query()->where('application_id', $this->application->id)
->where('pull_request_id', $pull_request_id)
->first()
->delete();
@@ -227,9 +241,11 @@ class Previews extends Component
$this->application->refresh();
$this->dispatch('update_links');
$this->dispatch('success', 'Preview deleted.');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
private function stopContainers(array $containers, $server, int $timeout)
@@ -241,7 +257,7 @@ class Previews extends Component
}
$startTime = Carbon::now()->getTimestamp();
while (count($processes) > 0) {
while ($processes !== []) {
$finishedProcesses = array_filter($processes, function ($process) {
return ! $process->running();
});

View File

@@ -44,8 +44,8 @@ class PreviewsCompose extends Component
$template = $this->preview->application->preview_url_template;
$host = $url->getHost();
$schema = $url->getScheme();
$random = new Cuid2;
$preview_fqdn = str_replace('{{random}}', $random, $template);
$cuid2 = new Cuid2;
$preview_fqdn = str_replace('{{random}}', $cuid2, $template);
$preview_fqdn = str_replace('{{domain}}', $host, $preview_fqdn);
$preview_fqdn = str_replace('{{pr_id}}', $this->preview->pull_request_id, $preview_fqdn);
$preview_fqdn = "$schema://$preview_fqdn";

View File

@@ -4,6 +4,7 @@ namespace App\Livewire\Project\Application;
use App\Models\Application;
use Livewire\Component;
use Throwable;
use Visus\Cuid2\Cuid2;
class Rollback extends Component
@@ -23,11 +24,11 @@ class Rollback extends Component
public function rollbackImage($commit)
{
$deployment_uuid = new Cuid2;
$cuid2 = new Cuid2;
queue_application_deployment(
application: $this->application,
deployment_uuid: $deployment_uuid,
deployment_uuid: $cuid2,
commit: $commit,
rollback: true,
force_rebuild: false,
@@ -36,7 +37,7 @@ class Rollback extends Component
return redirect()->route('project.application.deployment.show', [
'project_uuid' => $this->parameters['project_uuid'],
'application_uuid' => $this->parameters['application_uuid'],
'deployment_uuid' => $deployment_uuid,
'deployment_uuid' => $cuid2,
'environment_uuid' => $this->parameters['environment_uuid'],
]);
}
@@ -73,7 +74,7 @@ class Rollback extends Component
$showToast && $this->dispatch('success', 'Images loaded.');
return [];
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
}

View File

@@ -7,6 +7,7 @@ use App\Models\PrivateKey;
use Livewire\Attributes\Locked;
use Livewire\Attributes\Validate;
use Livewire\Component;
use Throwable;
class Source extends Component
{
@@ -35,7 +36,7 @@ class Source extends Component
try {
$this->syncData();
$this->getPrivateKeys();
} catch (\Throwable $e) {
} catch (Throwable $e) {
handleError($e, $this);
}
}
@@ -75,9 +76,11 @@ class Source extends Component
$this->application->refresh();
$this->privateKeyName = $this->application->private_key->name;
$this->dispatch('success', 'Private key updated!');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function submit()
@@ -88,8 +91,10 @@ class Source extends Component
}
$this->syncData(true);
$this->dispatch('success', 'Application source updated!');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
}

View File

@@ -5,6 +5,7 @@ namespace App\Livewire\Project\Application;
use App\Models\Application;
use Livewire\Attributes\Validate;
use Livewire\Component;
use Throwable;
class Swarm extends Component
{
@@ -23,9 +24,11 @@ class Swarm extends Component
{
try {
$this->syncData();
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function syncData(bool $toModel = false)
@@ -53,9 +56,11 @@ class Swarm extends Component
try {
$this->syncData(true);
$this->dispatch('success', 'Swarm settings updated.');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function submit()
@@ -63,9 +68,11 @@ class Swarm extends Component
try {
$this->syncData(true);
$this->dispatch('success', 'Swarm settings updated.');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function render()

View File

@@ -5,6 +5,7 @@ namespace App\Livewire\Project;
use App\Models\Environment;
use App\Models\Project;
use App\Models\Server;
use Exception;
use Livewire\Component;
use Visus\Cuid2\Cuid2;
@@ -43,11 +44,11 @@ class CloneMe extends Component
public function mount($project_uuid)
{
$this->project_uuid = $project_uuid;
$this->project = Project::where('uuid', $project_uuid)->firstOrFail();
$this->project = Project::query()->where('uuid', $project_uuid)->firstOrFail();
$this->environment = $this->project->environments->where('uuid', $this->environment_uuid)->first();
$this->project_id = $this->project->id;
$this->servers = currentTeam()->servers;
$this->newName = str($this->project->name.'-clone-'.(string) new Cuid2)->slug();
$this->newName = str($this->project->name.'-clone-'.new Cuid2)->slug();
}
public function render()
@@ -77,11 +78,11 @@ class CloneMe extends Component
'newName' => 'required',
]);
if ($type === 'project') {
$foundProject = Project::where('name', $this->newName)->first();
$foundProject = Project::query()->where('name', $this->newName)->first();
if ($foundProject) {
throw new \Exception('Project with the same name already exists.');
throw new Exception('Project with the same name already exists.');
}
$project = Project::create([
$project = Project::query()->create([
'name' => $this->newName,
'team_id' => currentTeam()->id,
'description' => $this->project->description.' (clone)',
@@ -96,7 +97,7 @@ class CloneMe extends Component
} else {
$foundEnv = $this->project->environments()->where('name', $this->newName)->first();
if ($foundEnv) {
throw new \Exception('Environment with the same name already exists.');
throw new Exception('Environment with the same name already exists.');
}
$project = $this->project;
$environment = $this->project->environments()->create([
@@ -126,9 +127,9 @@ class CloneMe extends Component
$newEnvironmentVariable->save();
}
$persistentVolumes = $application->persistentStorages()->get();
foreach ($persistentVolumes as $volume) {
$newPersistentVolume = $volume->replicate()->fill([
'name' => $newApplication->uuid.'-'.str($volume->name)->afterLast('-'),
foreach ($persistentVolumes as $persistentVolume) {
$newPersistentVolume = $persistentVolume->replicate()->fill([
'name' => $newApplication->uuid.'-'.str($persistentVolume->name)->afterLast('-'),
'resource_id' => $newApplication->id,
]);
$newPersistentVolume->save();
@@ -178,7 +179,7 @@ class CloneMe extends Component
'project_uuid' => $project->uuid,
'environment_uuid' => $environment->uuid,
]);
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e, $this);
}
}

View File

@@ -39,6 +39,8 @@ class Execution extends Component
$this->backup = $backup;
$this->executions = $executions;
$this->s3s = currentTeam()->s3s;
return null;
}
public function render()

View File

@@ -2,6 +2,10 @@
namespace App\Livewire\Project\Database\Backup;
use App\Models\StandaloneClickhouse;
use App\Models\StandaloneDragonfly;
use App\Models\StandaloneKeydb;
use App\Models\StandaloneRedis;
use Livewire\Component;
class Index extends Component
@@ -24,10 +28,10 @@ class Index extends Component
}
// No backups
if (
$database->getMorphClass() === \App\Models\StandaloneRedis::class ||
$database->getMorphClass() === \App\Models\StandaloneKeydb::class ||
$database->getMorphClass() === \App\Models\StandaloneDragonfly::class ||
$database->getMorphClass() === \App\Models\StandaloneClickhouse::class
$database->getMorphClass() === StandaloneRedis::class ||
$database->getMorphClass() === StandaloneKeydb::class ||
$database->getMorphClass() === StandaloneDragonfly::class ||
$database->getMorphClass() === StandaloneClickhouse::class
) {
return redirect()->route('project.database.configuration', [
'project_uuid' => $project->uuid,
@@ -36,6 +40,8 @@ class Index extends Component
]);
}
$this->database = $database;
return null;
}
public function render()

View File

@@ -4,6 +4,7 @@ namespace App\Livewire\Project\Database;
use App\Models\InstanceSettings;
use App\Models\ScheduledDatabaseBackup;
use App\Models\ServiceDatabase;
use Exception;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
@@ -11,6 +12,7 @@ use Livewire\Attributes\Locked;
use Livewire\Attributes\Validate;
use Livewire\Component;
use Spatie\Url\Url;
use Throwable;
class BackupEdit extends Component
{
@@ -66,6 +68,8 @@ class BackupEdit extends Component
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function syncData(bool $toModel = false)
@@ -94,12 +98,10 @@ class BackupEdit extends Component
public function delete($password)
{
if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) {
if (! Hash::check($password, Auth::user()->password)) {
$this->addError('password', 'The provided password is incorrect.');
if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation') && ! Hash::check($password, Auth::user()->password)) {
$this->addError('password', 'The provided password is incorrect.');
return;
}
return null;
}
try {
@@ -112,7 +114,7 @@ class BackupEdit extends Component
$this->backup->delete();
if ($this->backup->database->getMorphClass() === \App\Models\ServiceDatabase::class) {
if ($this->backup->database->getMorphClass() === ServiceDatabase::class) {
$previousUrl = url()->previous();
$url = Url::fromString($previousUrl);
$url = $url->withoutQueryParameter('selectedBackupId');
@@ -120,10 +122,10 @@ class BackupEdit extends Component
$url = $url->getPath()."#{$url->getFragment()}";
return redirect($url);
} else {
return redirect()->route('project.database.backup.index', $this->parameters);
}
} catch (\Throwable $e) {
return redirect()->route('project.database.backup.index', $this->parameters);
} catch (Throwable $e) {
return handleError($e, $this);
}
}
@@ -133,7 +135,7 @@ class BackupEdit extends Component
try {
$this->syncData(true);
$this->dispatch('success', 'Backup updated successfully.');
} catch (\Throwable $e) {
} catch (Throwable $e) {
$this->dispatch('error', $e->getMessage());
}
}
@@ -145,7 +147,7 @@ class BackupEdit extends Component
}
$isValid = validate_cron_expression($this->backup->frequency);
if (! $isValid) {
throw new \Exception('Invalid Cron / Human expression');
throw new Exception('Invalid Cron / Human expression');
}
$this->validate();
}
@@ -155,7 +157,7 @@ class BackupEdit extends Component
try {
$this->syncData(true);
$this->dispatch('success', 'Backup updated successfully.');
} catch (\Throwable $e) {
} catch (Throwable $e) {
$this->dispatch('error', $e->getMessage());
}
}
@@ -166,7 +168,7 @@ class BackupEdit extends Component
$backupFolder = null;
foreach ($executions as $execution) {
if ($this->backup->database->getMorphClass() === \App\Models\ServiceDatabase::class) {
if ($this->backup->database->getMorphClass() === ServiceDatabase::class) {
$server = $this->backup->database->service->destination->server;
} else {
$server = $this->backup->database->destination->server;

View File

@@ -4,6 +4,10 @@ namespace App\Livewire\Project\Database;
use App\Models\InstanceSettings;
use App\Models\ScheduledDatabaseBackup;
use App\Models\ServiceDatabase;
use DateTime;
use DateTimeZone;
use Exception;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Livewire\Component;
@@ -33,7 +37,7 @@ class BackupExecutions extends Component
public function cleanupFailed()
{
if ($this->backup) {
if ($this->backup instanceof ScheduledDatabaseBackup) {
$this->backup->executions()->where('status', 'failed')->delete();
$this->refreshBackupExecutions();
$this->dispatch('success', 'Failed backups cleaned up.');
@@ -42,12 +46,10 @@ class BackupExecutions extends Component
public function deleteBackup($executionId, $password)
{
if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) {
if (! Hash::check($password, Auth::user()->password)) {
$this->addError('password', 'The provided password is incorrect.');
if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation') && ! Hash::check($password, Auth::user()->password)) {
$this->addError('password', 'The provided password is incorrect.');
return;
}
return;
}
$execution = $this->backup->executions()->where('id', $executionId)->first();
@@ -57,7 +59,7 @@ class BackupExecutions extends Component
return;
}
if ($execution->scheduledDatabaseBackup->database->getMorphClass() === \App\Models\ServiceDatabase::class) {
if ($execution->scheduledDatabaseBackup->database->getMorphClass() === ServiceDatabase::class) {
delete_backup_locally($execution->filename, $execution->scheduledDatabaseBackup->database->service->destination->server);
} else {
delete_backup_locally($execution->filename, $execution->scheduledDatabaseBackup->database->destination->server);
@@ -83,15 +85,15 @@ class BackupExecutions extends Component
public function refreshBackupExecutions(): void
{
if ($this->backup) {
if ($this->backup instanceof ScheduledDatabaseBackup) {
$this->executions = $this->backup->executions()->get();
}
}
public function mount(ScheduledDatabaseBackup $backup)
public function mount(ScheduledDatabaseBackup $scheduledDatabaseBackup)
{
$this->backup = $backup;
$this->database = $backup->database;
$this->backup = $scheduledDatabaseBackup;
$this->database = $scheduledDatabaseBackup->database;
$this->refreshBackupExecutions();
}
@@ -100,7 +102,7 @@ class BackupExecutions extends Component
if ($this->database) {
$server = null;
if ($this->database instanceof \App\Models\ServiceDatabase) {
if ($this->database instanceof ServiceDatabase) {
$server = $this->database->service->destination->server;
} elseif ($this->database->destination && $this->database->destination->server) {
$server = $this->database->destination->server;
@@ -126,11 +128,11 @@ class BackupExecutions extends Component
public function formatDateInServerTimezone($date)
{
$serverTimezone = $this->getServerTimezone();
$dateObj = new \DateTime($date);
$dateObj = new DateTime($date);
try {
$dateObj->setTimezone(new \DateTimeZone($serverTimezone));
} catch (\Exception) {
$dateObj->setTimezone(new \DateTimeZone('UTC'));
$dateObj->setTimezone(new DateTimeZone($serverTimezone));
} catch (Exception) {
$dateObj->setTimezone(new DateTimeZone('UTC'));
}
return $dateObj->format('Y-m-d H:i:s T');

View File

@@ -10,6 +10,7 @@ use Exception;
use Illuminate\Support\Facades\Auth;
use Livewire\Attributes\Validate;
use Livewire\Component;
use Throwable;
class General extends Component
{
@@ -67,9 +68,11 @@ class General extends Component
try {
$this->syncData();
$this->server = data_get($this->database, 'destination.server');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function syncData(bool $toModel = false)
@@ -113,7 +116,7 @@ class General extends Component
$this->isLogDrainEnabled = false;
$this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.');
return;
return null;
}
$this->syncData(true);
@@ -122,6 +125,8 @@ class General extends Component
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function instantSave()
@@ -131,14 +136,14 @@ class General extends Component
$this->dispatch('error', 'Public port is required.');
$this->isPublic = false;
return;
return null;
}
if ($this->isPublic) {
if (! str($this->database->status)->startsWith('running')) {
$this->dispatch('error', 'Database must be started to be publicly accessible.');
$this->isPublic = false;
return;
return null;
}
StartDatabaseProxy::run($this->database);
$this->dispatch('success', 'Database is now publicly accessible.');
@@ -148,12 +153,14 @@ class General extends Component
}
$this->dbUrlPublic = $this->database->external_db_url;
$this->syncData(true);
} catch (\Throwable $e) {
} catch (Throwable $e) {
$this->isPublic = ! $this->isPublic;
$this->syncData(true);
return handleError($e, $this);
}
return null;
}
public function databaseProxyStopped()
@@ -178,5 +185,7 @@ class General extends Component
$this->dispatch('configurationChanged');
}
}
return null;
}
}

View File

@@ -3,10 +3,12 @@
namespace App\Livewire\Project\Database;
use App\Models\ScheduledDatabaseBackup;
use App\Models\ServiceDatabase;
use Illuminate\Support\Collection;
use Livewire\Attributes\Locked;
use Livewire\Attributes\Validate;
use Livewire\Component;
use Throwable;
class CreateScheduledBackup extends Component
{
@@ -33,9 +35,11 @@ class CreateScheduledBackup extends Component
if ($this->definedS3s->count() > 0) {
$this->s3StorageId = $this->definedS3s->first()->id;
}
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function submit()
@@ -47,7 +51,7 @@ class CreateScheduledBackup extends Component
if (! $isValid) {
$this->dispatch('error', 'Invalid Cron / Human expression.');
return;
return null;
}
$payload = [
@@ -68,17 +72,19 @@ class CreateScheduledBackup extends Component
$payload['databases_to_backup'] = $this->database->mariadb_database;
}
$databaseBackup = ScheduledDatabaseBackup::create($payload);
if ($this->database->getMorphClass() === \App\Models\ServiceDatabase::class) {
$databaseBackup = ScheduledDatabaseBackup::query()->create($payload);
if ($this->database->getMorphClass() === ServiceDatabase::class) {
$this->dispatch('refreshScheduledBackups', $databaseBackup->id);
} else {
$this->dispatch('refreshScheduledBackups');
}
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
} finally {
$this->frequency = '';
}
return null;
}
}

View File

@@ -10,6 +10,7 @@ use Exception;
use Illuminate\Support\Facades\Auth;
use Livewire\Attributes\Validate;
use Livewire\Component;
use Throwable;
class General extends Component
{
@@ -64,9 +65,11 @@ class General extends Component
try {
$this->syncData();
$this->server = data_get($this->database, 'destination.server');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function syncData(bool $toModel = false)
@@ -108,7 +111,7 @@ class General extends Component
$this->isLogDrainEnabled = false;
$this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.');
return;
return null;
}
$this->syncData(true);
@@ -117,6 +120,8 @@ class General extends Component
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function instantSave()
@@ -126,14 +131,14 @@ class General extends Component
$this->dispatch('error', 'Public port is required.');
$this->isPublic = false;
return;
return null;
}
if ($this->isPublic) {
if (! str($this->database->status)->startsWith('running')) {
$this->dispatch('error', 'Database must be started to be publicly accessible.');
$this->isPublic = false;
return;
return null;
}
StartDatabaseProxy::run($this->database);
$this->dispatch('success', 'Database is now publicly accessible.');
@@ -143,12 +148,14 @@ class General extends Component
}
$this->dbUrlPublic = $this->database->external_db_url;
$this->syncData(true);
} catch (\Throwable $e) {
} catch (Throwable $e) {
$this->isPublic = ! $this->isPublic;
$this->syncData(true);
return handleError($e, $this);
}
return null;
}
public function databaseProxyStopped()
@@ -173,5 +180,7 @@ class General extends Component
$this->dispatch('configurationChanged');
}
}
return null;
}
}

View File

@@ -3,9 +3,18 @@
namespace App\Livewire\Project\Database;
use App\Models\Server;
use App\Models\StandaloneClickhouse;
use App\Models\StandaloneDragonfly;
use App\Models\StandaloneKeydb;
use App\Models\StandaloneMariadb;
use App\Models\StandaloneMongodb;
use App\Models\StandaloneMysql;
use App\Models\StandalonePostgresql;
use App\Models\StandaloneRedis;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
use Livewire\Component;
use Throwable;
class Import extends Component
{
@@ -72,7 +81,7 @@ class Import extends Component
public function updatedDumpAll($value)
{
switch ($this->resource->getMorphClass()) {
case \App\Models\StandaloneMariadb::class:
case StandaloneMariadb::class:
if ($value === true) {
$this->mariadbRestoreCommand = <<<'EOD'
for pid in $(mariadb -u root -p$MARIADB_ROOT_PASSWORD -N -e "SELECT id FROM information_schema.processlist WHERE user != 'root';"); do
@@ -87,7 +96,7 @@ EOD;
$this->mariadbRestoreCommand = 'mariadb -u $MARIADB_USER -p$MARIADB_PASSWORD $MARIADB_DATABASE';
}
break;
case \App\Models\StandaloneMysql::class:
case StandaloneMysql::class:
if ($value === true) {
$this->mysqlRestoreCommand = <<<'EOD'
for pid in $(mysql -u root -p$MYSQL_ROOT_PASSWORD -N -e "SELECT id FROM information_schema.processlist WHERE user != 'root';"); do
@@ -102,7 +111,7 @@ EOD;
$this->mysqlRestoreCommand = 'mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE';
}
break;
case \App\Models\StandalonePostgresql::class:
case StandalonePostgresql::class:
if ($value === true) {
$this->postgresqlRestoreCommand = <<<'EOD'
psql -U $POSTGRES_USER -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname IS NOT NULL AND pid <> pg_backend_pid()" && \
@@ -136,10 +145,10 @@ EOD;
}
if (
$this->resource->getMorphClass() === \App\Models\StandaloneRedis::class ||
$this->resource->getMorphClass() === \App\Models\StandaloneKeydb::class ||
$this->resource->getMorphClass() === \App\Models\StandaloneDragonfly::class ||
$this->resource->getMorphClass() === \App\Models\StandaloneClickhouse::class
$this->resource->getMorphClass() === StandaloneRedis::class ||
$this->resource->getMorphClass() === StandaloneKeydb::class ||
$this->resource->getMorphClass() === StandaloneDragonfly::class ||
$this->resource->getMorphClass() === StandaloneClickhouse::class
) {
$this->unsupported = true;
}
@@ -153,14 +162,16 @@ EOD;
if (blank($result)) {
$this->dispatch('error', 'The file does not exist or has been deleted.');
return;
return null;
}
$this->filename = $this->customLocation;
$this->dispatch('success', 'The file exists.');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
}
return null;
}
public function runImport()
@@ -168,7 +179,7 @@ EOD;
if ($this->filename === '') {
$this->dispatch('error', 'Please select a file to import.');
return;
return null;
}
try {
$this->importCommands = [];
@@ -182,7 +193,7 @@ EOD;
if (! Storage::exists($backupFileName)) {
$this->dispatch('error', 'The file does not exist or has been deleted.');
return;
return null;
}
$tmpPath = '/tmp/'.basename($backupFileName).'_'.$this->resource->uuid;
instant_scp($path, $tmpPath, $this->server);
@@ -194,7 +205,7 @@ EOD;
$scriptPath = "/tmp/restore_{$this->resource->uuid}.sh";
switch ($this->resource->getMorphClass()) {
case \App\Models\StandaloneMariadb::class:
case StandaloneMariadb::class:
$restoreCommand = $this->mariadbRestoreCommand;
if ($this->dumpAll) {
$restoreCommand .= " && (gunzip -cf {$tmpPath} 2>/dev/null || cat {$tmpPath}) | mariadb -u root -p\$MARIADB_ROOT_PASSWORD";
@@ -202,7 +213,7 @@ EOD;
$restoreCommand .= " < {$tmpPath}";
}
break;
case \App\Models\StandaloneMysql::class:
case StandaloneMysql::class:
$restoreCommand = $this->mysqlRestoreCommand;
if ($this->dumpAll) {
$restoreCommand .= " && (gunzip -cf {$tmpPath} 2>/dev/null || cat {$tmpPath}) | mysql -u root -p\$MYSQL_ROOT_PASSWORD";
@@ -210,7 +221,7 @@ EOD;
$restoreCommand .= " < {$tmpPath}";
}
break;
case \App\Models\StandalonePostgresql::class:
case StandalonePostgresql::class:
$restoreCommand = $this->postgresqlRestoreCommand;
if ($this->dumpAll) {
$restoreCommand .= " && (gunzip -cf {$tmpPath} 2>/dev/null || cat {$tmpPath}) | psql -U \$POSTGRES_USER postgres";
@@ -218,7 +229,7 @@ EOD;
$restoreCommand .= " {$tmpPath}";
}
break;
case \App\Models\StandaloneMongodb::class:
case StandaloneMongodb::class:
$restoreCommand = $this->mongodbRestoreCommand;
if ($this->dumpAll === false) {
$restoreCommand .= " {$tmpPath}";
@@ -234,7 +245,7 @@ EOD;
$this->importCommands[] = "docker exec {$this->container} sh -c '{$scriptPath}'";
$this->importCommands[] = "docker exec {$this->container} sh -c 'echo \"Import finished with exit code $?\"'";
if (! empty($this->importCommands)) {
if ($this->importCommands !== []) {
$activity = remote_process($this->importCommands, $this->server, ignore_errors: true, callEventOnFinish: 'RestoreJobFinished', callEventData: [
'scriptPath' => $scriptPath,
'tmpPath' => $tmpPath,
@@ -243,11 +254,13 @@ EOD;
]);
$this->dispatch('activityMonitor', $activity->id);
}
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
} finally {
$this->filename = null;
$this->importCommands = [];
}
return null;
}
}

View File

@@ -30,6 +30,8 @@ class InitScript extends Component
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function submit()
@@ -43,6 +45,8 @@ class InitScript extends Component
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function delete()
@@ -52,5 +56,7 @@ class InitScript extends Component
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
}

View File

@@ -10,6 +10,7 @@ use Exception;
use Illuminate\Support\Facades\Auth;
use Livewire\Attributes\Validate;
use Livewire\Component;
use Throwable;
class General extends Component
{
@@ -67,9 +68,11 @@ class General extends Component
try {
$this->syncData();
$this->server = data_get($this->database, 'destination.server');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function syncData(bool $toModel = false)
@@ -113,7 +116,7 @@ class General extends Component
$this->isLogDrainEnabled = false;
$this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.');
return;
return null;
}
$this->syncData(true);
@@ -122,6 +125,8 @@ class General extends Component
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function instantSave()
@@ -131,14 +136,14 @@ class General extends Component
$this->dispatch('error', 'Public port is required.');
$this->isPublic = false;
return;
return null;
}
if ($this->isPublic) {
if (! str($this->database->status)->startsWith('running')) {
$this->dispatch('error', 'Database must be started to be publicly accessible.');
$this->isPublic = false;
return;
return null;
}
StartDatabaseProxy::run($this->database);
$this->dispatch('success', 'Database is now publicly accessible.');
@@ -148,12 +153,14 @@ class General extends Component
}
$this->dbUrlPublic = $this->database->external_db_url;
$this->syncData(true);
} catch (\Throwable $e) {
} catch (Throwable $e) {
$this->isPublic = ! $this->isPublic;
$this->syncData(true);
return handleError($e, $this);
}
return null;
}
public function databaseProxyStopped()
@@ -178,5 +185,7 @@ class General extends Component
$this->dispatch('configurationChanged');
}
}
return null;
}
}

View File

@@ -8,6 +8,7 @@ use App\Models\Server;
use App\Models\StandaloneMariadb;
use Exception;
use Livewire\Component;
use Throwable;
class General extends Component
{
@@ -66,7 +67,7 @@ class General extends Component
$this->database->is_log_drain_enabled = false;
$this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.');
return;
return null;
}
$this->database->save();
$this->dispatch('success', 'Database updated.');
@@ -74,6 +75,8 @@ class General extends Component
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function submit()
@@ -94,6 +97,8 @@ class General extends Component
$this->dispatch('configurationChanged');
}
}
return null;
}
public function instantSave()
@@ -103,14 +108,14 @@ class General extends Component
$this->dispatch('error', 'Public port is required.');
$this->database->is_public = false;
return;
return null;
}
if ($this->database->is_public) {
if (! str($this->database->status)->startsWith('running')) {
$this->dispatch('error', 'Database must be started to be publicly accessible.');
$this->database->is_public = false;
return;
return null;
}
StartDatabaseProxy::run($this->database);
$this->dispatch('success', 'Database is now publicly accessible.');
@@ -120,11 +125,13 @@ class General extends Component
}
$this->db_url_public = $this->database->external_db_url;
$this->database->save();
} catch (\Throwable $e) {
} catch (Throwable $e) {
$this->database->is_public = ! $this->database->is_public;
return handleError($e, $this);
}
return null;
}
public function refresh(): void

View File

@@ -8,6 +8,7 @@ use App\Models\Server;
use App\Models\StandaloneMongodb;
use Exception;
use Livewire\Component;
use Throwable;
class General extends Component
{
@@ -64,7 +65,7 @@ class General extends Component
$this->database->is_log_drain_enabled = false;
$this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.');
return;
return null;
}
$this->database->save();
$this->dispatch('success', 'Database updated.');
@@ -72,6 +73,8 @@ class General extends Component
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function submit()
@@ -95,6 +98,8 @@ class General extends Component
$this->dispatch('configurationChanged');
}
}
return null;
}
public function instantSave()
@@ -104,14 +109,14 @@ class General extends Component
$this->dispatch('error', 'Public port is required.');
$this->database->is_public = false;
return;
return null;
}
if ($this->database->is_public) {
if (! str($this->database->status)->startsWith('running')) {
$this->dispatch('error', 'Database must be started to be publicly accessible.');
$this->database->is_public = false;
return;
return null;
}
StartDatabaseProxy::run($this->database);
$this->dispatch('success', 'Database is now publicly accessible.');
@@ -121,11 +126,13 @@ class General extends Component
}
$this->db_url_public = $this->database->external_db_url;
$this->database->save();
} catch (\Throwable $e) {
} catch (Throwable $e) {
$this->database->is_public = ! $this->database->is_public;
return handleError($e, $this);
}
return null;
}
public function refresh(): void

View File

@@ -8,6 +8,7 @@ use App\Models\Server;
use App\Models\StandaloneMysql;
use Exception;
use Livewire\Component;
use Throwable;
class General extends Component
{
@@ -66,7 +67,7 @@ class General extends Component
$this->database->is_log_drain_enabled = false;
$this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.');
return;
return null;
}
$this->database->save();
$this->dispatch('success', 'Database updated.');
@@ -74,6 +75,8 @@ class General extends Component
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function submit()
@@ -94,6 +97,8 @@ class General extends Component
$this->dispatch('configurationChanged');
}
}
return null;
}
public function instantSave()
@@ -103,14 +108,14 @@ class General extends Component
$this->dispatch('error', 'Public port is required.');
$this->database->is_public = false;
return;
return null;
}
if ($this->database->is_public) {
if (! str($this->database->status)->startsWith('running')) {
$this->dispatch('error', 'Database must be started to be publicly accessible.');
$this->database->is_public = false;
return;
return null;
}
StartDatabaseProxy::run($this->database);
$this->dispatch('success', 'Database is now publicly accessible.');
@@ -120,11 +125,13 @@ class General extends Component
}
$this->db_url_public = $this->database->external_db_url;
$this->database->save();
} catch (\Throwable $e) {
} catch (Throwable $e) {
$this->database->is_public = ! $this->database->is_public;
return handleError($e, $this);
}
return null;
}
public function refresh(): void

View File

@@ -8,6 +8,7 @@ use App\Models\Server;
use App\Models\StandalonePostgresql;
use Exception;
use Livewire\Component;
use Throwable;
class General extends Component
{
@@ -81,7 +82,7 @@ class General extends Component
$this->database->is_log_drain_enabled = false;
$this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.');
return;
return null;
}
$this->database->save();
$this->dispatch('success', 'Database updated.');
@@ -89,6 +90,8 @@ class General extends Component
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function instantSave()
@@ -98,14 +101,14 @@ class General extends Component
$this->dispatch('error', 'Public port is required.');
$this->database->is_public = false;
return;
return null;
}
if ($this->database->is_public) {
if (! str($this->database->status)->startsWith('running')) {
$this->dispatch('error', 'Database must be started to be publicly accessible.');
$this->database->is_public = false;
return;
return null;
}
StartDatabaseProxy::run($this->database);
$this->dispatch('success', 'Database is now publicly accessible.');
@@ -115,11 +118,13 @@ class General extends Component
}
$this->db_url_public = $this->database->external_db_url;
$this->database->save();
} catch (\Throwable $e) {
} catch (Throwable $e) {
$this->database->is_public = ! $this->database->is_public;
return handleError($e, $this);
}
return null;
}
public function save_init_script($script)
@@ -143,7 +148,7 @@ class General extends Component
$delete_command = "rm -f $old_file_path";
try {
instant_remote_process([$delete_command], $this->server);
} catch (\Exception $e) {
} catch (Exception $e) {
$this->dispatch('error', 'Failed to remove old init script from server: '.$e->getMessage());
return;
@@ -184,7 +189,7 @@ class General extends Component
$command = "rm -f $file_path";
try {
instant_remote_process([$command], $this->server);
} catch (\Exception $e) {
} catch (Exception $e) {
$this->dispatch('error', 'Failed to remove init script from server: '.$e->getMessage());
return;
@@ -223,7 +228,7 @@ class General extends Component
return;
}
if (! isset($this->database->init_scripts)) {
if (! property_exists($this->database, 'init_scripts') || $this->database->init_scripts === null) {
$this->database->init_scripts = [];
}
$this->database->init_scripts = array_merge($this->database->init_scripts, [
@@ -257,5 +262,7 @@ class General extends Component
$this->dispatch('configurationChanged');
}
}
return null;
}
}

View File

@@ -8,6 +8,7 @@ use App\Models\Server;
use App\Models\StandaloneRedis;
use Exception;
use Livewire\Component;
use Throwable;
class General extends Component
{
@@ -70,7 +71,7 @@ class General extends Component
$this->database->is_log_drain_enabled = false;
$this->dispatch('error', 'Log drain is not enabled on the server. Please enable it first.');
return;
return null;
}
$this->database->save();
$this->dispatch('success', 'Database updated.');
@@ -78,6 +79,8 @@ class General extends Component
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function submit()
@@ -103,6 +106,8 @@ class General extends Component
} finally {
$this->dispatch('refreshEnvs');
}
return null;
}
public function instantSave()
@@ -112,14 +117,14 @@ class General extends Component
$this->dispatch('error', 'Public port is required.');
$this->database->is_public = false;
return;
return null;
}
if ($this->database->is_public) {
if (! str($this->database->status)->startsWith('running')) {
$this->dispatch('error', 'Database must be started to be publicly accessible.');
$this->database->is_public = false;
return;
return null;
}
StartDatabaseProxy::run($this->database);
$this->dispatch('success', 'Database is now publicly accessible.');
@@ -129,11 +134,13 @@ class General extends Component
}
$this->db_url_public = $this->database->external_db_url;
$this->database->save();
} catch (\Throwable $e) {
} catch (Throwable $e) {
$this->database->is_public = ! $this->database->is_public;
return handleError($e, $this);
}
return null;
}
public function refresh(): void

View File

@@ -3,6 +3,7 @@
namespace App\Livewire\Project\Database;
use App\Models\ScheduledDatabaseBackup;
use App\Models\ServiceDatabase;
use Livewire\Component;
class ScheduledBackups extends Component
@@ -29,11 +30,7 @@ class ScheduledBackups extends Component
$this->setSelectedBackup($this->selectedBackupId, true);
}
$this->parameters = get_route_parameters();
if ($this->database->getMorphClass() === \App\Models\ServiceDatabase::class) {
$this->type = 'service-database';
} else {
$this->type = 'database';
}
$this->type = $this->database->getMorphClass() === ServiceDatabase::class ? 'service-database' : 'database';
$this->s3s = currentTeam()->s3s;
}

View File

@@ -3,6 +3,7 @@
namespace App\Livewire\Project;
use App\Models\Environment;
use Exception;
use Livewire\Component;
class DeleteEnvironment extends Component
@@ -18,11 +19,13 @@ class DeleteEnvironment extends Component
public function mount()
{
try {
$this->environmentName = Environment::findOrFail($this->environment_id)->name;
$this->environmentName = Environment::query()->findOrFail($this->environment_id)->name;
$this->parameters = get_route_parameters();
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function delete()
@@ -30,7 +33,7 @@ class DeleteEnvironment extends Component
$this->validate([
'environment_id' => 'required|int',
]);
$environment = Environment::findOrFail($this->environment_id);
$environment = Environment::query()->findOrFail($this->environment_id);
if ($environment->isEmpty()) {
$environment->delete();

View File

@@ -18,7 +18,7 @@ class DeleteProject extends Component
public function mount()
{
$this->parameters = get_route_parameters();
$this->projectName = Project::findOrFail($this->project_id)->name;
$this->projectName = Project::query()->findOrFail($this->project_id)->name;
}
public function delete()
@@ -26,7 +26,7 @@ class DeleteProject extends Component
$this->validate([
'project_id' => 'required|int',
]);
$project = Project::findOrFail($this->project_id);
$project = Project::query()->findOrFail($this->project_id);
if ($project->isEmpty()) {
$project->delete();

View File

@@ -5,6 +5,7 @@ namespace App\Livewire\Project;
use App\Models\Project;
use Livewire\Attributes\Validate;
use Livewire\Component;
use Throwable;
class Edit extends Component
{
@@ -19,11 +20,13 @@ class Edit extends Component
public function mount(string $project_uuid)
{
try {
$this->project = Project::where('team_id', currentTeam()->id)->where('uuid', $project_uuid)->firstOrFail();
$this->project = Project::query()->where('team_id', currentTeam()->id)->where('uuid', $project_uuid)->firstOrFail();
$this->syncData();
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function syncData(bool $toModel = false)
@@ -45,8 +48,10 @@ class Edit extends Component
try {
$this->syncData(true);
$this->dispatch('success', 'Project updated.');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
}

View File

@@ -7,6 +7,7 @@ use App\Models\Project;
use Livewire\Attributes\Locked;
use Livewire\Attributes\Validate;
use Livewire\Component;
use Throwable;
class EnvironmentEdit extends Component
{
@@ -29,9 +30,11 @@ class EnvironmentEdit extends Component
$this->project = Project::ownedByCurrentTeam()->where('uuid', $project_uuid)->firstOrFail();
$this->environment = $this->project->environments()->where('uuid', $environment_uuid)->firstOrFail();
$this->syncData();
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function syncData(bool $toModel = false)
@@ -56,9 +59,11 @@ class EnvironmentEdit extends Component
'environment_uuid' => $this->environment->uuid,
'project_uuid' => $this->project->uuid,
]);
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function render()

View File

@@ -34,7 +34,7 @@ class Index extends Component
public function navigateToProject($projectUuid)
{
$project = Project::where('uuid', $projectUuid)->first();
$project = Project::query()->where('uuid', $projectUuid)->first();
if ($project && $project->environments->count() === 1) {
return Redirect::route('project.resource.index', [

View File

@@ -7,9 +7,11 @@ use App\Models\Project;
use App\Models\Service;
use App\Models\StandaloneDocker;
use App\Models\SwarmDocker;
use Exception;
use Illuminate\Support\Str;
use Livewire\Component;
use Symfony\Component\Yaml\Yaml;
use Throwable;
class DockerCompose extends Component
{
@@ -58,20 +60,20 @@ class DockerCompose extends Component
return $this->dispatch('error', "Invalid docker-compose file.\n$isValid");
}
$project = Project::where('uuid', $this->parameters['project_uuid'])->first();
$project = Project::query()->where('uuid', $this->parameters['project_uuid'])->first();
$environment = $project->load(['environments'])->environments->where('uuid', $this->parameters['environment_uuid'])->first();
$destination_uuid = $this->query['destination'];
$destination = StandaloneDocker::where('uuid', $destination_uuid)->first();
$destination = StandaloneDocker::query()->where('uuid', $destination_uuid)->first();
if (! $destination) {
$destination = SwarmDocker::where('uuid', $destination_uuid)->first();
$destination = SwarmDocker::query()->where('uuid', $destination_uuid)->first();
}
if (! $destination) {
throw new \Exception('Destination not found. What?!');
throw new Exception('Destination not found. What?!');
}
$destination_class = $destination->getMorphClass();
$service = Service::create([
$service = Service::query()->create([
'name' => 'service'.Str::random(10),
'docker_compose_raw' => $this->dockerComposeRaw,
'environment_id' => $environment->id,
@@ -82,7 +84,7 @@ class DockerCompose extends Component
$variables = parseEnvFormatToArray($this->envFile);
foreach ($variables as $key => $variable) {
EnvironmentVariable::create([
EnvironmentVariable::query()->create([
'key' => $key,
'value' => $variable,
'is_build_time' => false,
@@ -100,7 +102,7 @@ class DockerCompose extends Component
'environment_uuid' => $environment->uuid,
'project_uuid' => $project->uuid,
]);
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
}

View File

@@ -6,6 +6,7 @@ use App\Models\Application;
use App\Models\Project;
use App\Models\StandaloneDocker;
use App\Models\SwarmDocker;
use Exception;
use Livewire\Component;
use Visus\Cuid2\Cuid2;
@@ -28,32 +29,28 @@ class DockerImage extends Component
$this->validate([
'dockerImage' => 'required',
]);
$image = str($this->dockerImage)->before(':');
if (str($this->dockerImage)->contains(':')) {
$tag = str($this->dockerImage)->after(':');
} else {
$tag = 'latest';
}
$stringable = str($this->dockerImage)->before(':');
$tag = str($this->dockerImage)->contains(':') ? str($this->dockerImage)->after(':') : 'latest';
$destination_uuid = $this->query['destination'];
$destination = StandaloneDocker::where('uuid', $destination_uuid)->first();
$destination = StandaloneDocker::query()->where('uuid', $destination_uuid)->first();
if (! $destination) {
$destination = SwarmDocker::where('uuid', $destination_uuid)->first();
$destination = SwarmDocker::query()->where('uuid', $destination_uuid)->first();
}
if (! $destination) {
throw new \Exception('Destination not found. What?!');
throw new Exception('Destination not found. What?!');
}
$destination_class = $destination->getMorphClass();
$project = Project::where('uuid', $this->parameters['project_uuid'])->first();
$project = Project::query()->where('uuid', $this->parameters['project_uuid'])->first();
$environment = $project->load(['environments'])->environments->where('uuid', $this->parameters['environment_uuid'])->first();
$application = Application::create([
$application = Application::query()->create([
'name' => 'docker-image-'.new Cuid2,
'repository_project_id' => 0,
'git_repository' => 'coollabsio/coolify',
'git_branch' => 'main',
'build_pack' => 'dockerimage',
'ports_exposes' => 80,
'docker_registry_image_name' => $image,
'docker_registry_image_name' => $stringable,
'docker_registry_image_tag' => $tag,
'environment_id' => $environment->id,
'destination_id' => $destination->id,

View File

@@ -10,7 +10,7 @@ class EmptyProject extends Component
{
public function createEmptyProject()
{
$project = Project::create([
$project = Project::query()->create([
'name' => generate_random_name(),
'team_id' => currentTeam()->id,
'uuid' => (string) new Cuid2,

View File

@@ -7,9 +7,11 @@ use App\Models\GithubApp;
use App\Models\Project;
use App\Models\StandaloneDocker;
use App\Models\SwarmDocker;
use Exception;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Route;
use Livewire\Component;
use Throwable;
class GithubPrivateRepository extends Component
{
@@ -104,7 +106,7 @@ class GithubPrivateRepository extends Component
$this->repositories = collect();
$this->page = 1;
$this->selected_github_app_id = $github_app_id;
$this->github_app = GithubApp::where('id', $github_app_id)->first();
$this->github_app = GithubApp::query()->where('id', $github_app_id)->first();
$this->token = generate_github_installation_token($this->github_app);
$this->loadRepositoryByPage();
if ($this->repositories->count() < $this->total_repositories_count) {
@@ -129,10 +131,12 @@ class GithubPrivateRepository extends Component
}
if ($json['total_count'] === 0) {
return;
return null;
}
$this->total_repositories_count = $json['total_count'];
$this->repositories = $this->repositories->concat(collect($json['repositories']));
return null;
}
public function loadBranches()
@@ -161,25 +165,27 @@ class GithubPrivateRepository extends Component
$this->total_branches_count = count($json);
$this->branches = $this->branches->concat(collect($json));
return null;
}
public function submit()
{
try {
$destination_uuid = $this->query['destination'];
$destination = StandaloneDocker::where('uuid', $destination_uuid)->first();
$destination = StandaloneDocker::query()->where('uuid', $destination_uuid)->first();
if (! $destination) {
$destination = SwarmDocker::where('uuid', $destination_uuid)->first();
$destination = SwarmDocker::query()->where('uuid', $destination_uuid)->first();
}
if (! $destination) {
throw new \Exception('Destination not found. What?!');
throw new Exception('Destination not found. What?!');
}
$destination_class = $destination->getMorphClass();
$project = Project::where('uuid', $this->parameters['project_uuid'])->first();
$project = Project::query()->where('uuid', $this->parameters['project_uuid'])->first();
$environment = $project->load(['environments'])->environments->where('uuid', $this->parameters['environment_uuid'])->first();
$application = Application::create([
$application = Application::query()->create([
'name' => generate_application_name($this->selected_repository_owner.'/'.$this->selected_repository_repo, $this->selected_branch_name),
'repository_project_id' => $this->selected_repository_id,
'git_repository' => "{$this->selected_repository_owner}/{$this->selected_repository_repo}",
@@ -214,7 +220,7 @@ class GithubPrivateRepository extends Component
'environment_uuid' => $environment->uuid,
'project_uuid' => $project->uuid,
]);
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
}

View File

@@ -9,9 +9,11 @@ use App\Models\PrivateKey;
use App\Models\Project;
use App\Models\StandaloneDocker;
use App\Models\SwarmDocker;
use Exception;
use Illuminate\Support\Str;
use Livewire\Component;
use Spatie\Url\Url;
use Throwable;
class GithubPrivateRepositoryDeployKey extends Component
{
@@ -81,9 +83,9 @@ class GithubPrivateRepositoryDeployKey extends Component
$this->parameters = get_route_parameters();
$this->query = request()->query();
if (isDev()) {
$this->private_keys = PrivateKey::where('team_id', currentTeam()->id)->get();
$this->private_keys = PrivateKey::query()->where('team_id', currentTeam()->id)->get();
} else {
$this->private_keys = PrivateKey::where('team_id', currentTeam()->id)->where('id', '!=', 0)->get();
$this->private_keys = PrivateKey::query()->where('team_id', currentTeam()->id)->where('id', '!=', 0)->get();
}
}
@@ -124,18 +126,18 @@ class GithubPrivateRepositoryDeployKey extends Component
$this->validate();
try {
$destination_uuid = $this->query['destination'];
$destination = StandaloneDocker::where('uuid', $destination_uuid)->first();
$destination = StandaloneDocker::query()->where('uuid', $destination_uuid)->first();
if (! $destination) {
$destination = SwarmDocker::where('uuid', $destination_uuid)->first();
$destination = SwarmDocker::query()->where('uuid', $destination_uuid)->first();
}
if (! $destination) {
throw new \Exception('Destination not found. What?!');
throw new Exception('Destination not found. What?!');
}
$destination_class = $destination->getMorphClass();
$this->get_git_source();
$project = Project::where('uuid', $this->parameters['project_uuid'])->first();
$project = Project::query()->where('uuid', $this->parameters['project_uuid'])->first();
$environment = $project->load(['environments'])->environments->where('uuid', $this->parameters['environment_uuid'])->first();
if ($this->git_source === 'other') {
$application_init = [
@@ -173,7 +175,7 @@ class GithubPrivateRepositoryDeployKey extends Component
$application_init['docker_compose_location'] = $this->docker_compose_location;
$application_init['base_directory'] = $this->base_directory;
}
$application = Application::create($application_init);
$application = Application::query()->create($application_init);
$application->settings->is_static = $this->is_static;
$application->settings->save();
@@ -187,7 +189,7 @@ class GithubPrivateRepositoryDeployKey extends Component
'environment_uuid' => $environment->uuid,
'project_uuid' => $project->uuid,
]);
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
}
@@ -199,7 +201,7 @@ class GithubPrivateRepositoryDeployKey extends Component
$this->git_repository = $this->repository_url_parsed->getSegment(1).'/'.$this->repository_url_parsed->getSegment(2);
if ($this->git_host === 'github.com') {
$this->git_source = GithubApp::where('name', 'Public GitHub')->first();
$this->git_source = GithubApp::query()->where('name', 'Public GitHub')->first();
return;
}

View File

@@ -10,8 +10,10 @@ use App\Models\Service;
use App\Models\StandaloneDocker;
use App\Models\SwarmDocker;
use Carbon\Carbon;
use Exception;
use Livewire\Component;
use Spatie\Url\Url;
use Throwable;
class PublicGitRepository extends Component
{
@@ -93,7 +95,7 @@ class PublicGitRepository extends Component
public function updatedBaseDirectory()
{
if ($this->base_directory) {
if ($this->base_directory !== '' && $this->base_directory !== '0') {
$this->base_directory = rtrim($this->base_directory, '/');
if (! str($this->base_directory)->startsWith('/')) {
$this->base_directory = '/'.$this->base_directory;
@@ -153,12 +155,12 @@ class PublicGitRepository extends Component
(! str($this->repository_url)->contains('github.com') ||
! str($this->repository_url)->contains('git.sr.ht'))
) {
$this->repository_url = $this->repository_url.'.git';
$this->repository_url .= '.git';
}
if (str($this->repository_url)->contains('github.com') && str($this->repository_url)->endsWith('.git')) {
$this->repository_url = str($this->repository_url)->beforeLast('.git')->value();
}
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
try {
@@ -166,24 +168,26 @@ class PublicGitRepository extends Component
$this->getGitSource();
$this->getBranch();
$this->selectedBranch = $this->git_branch;
} catch (\Throwable $e) {
} catch (Throwable $e) {
if ($this->rate_limit_remaining == 0) {
$this->selectedBranch = $this->git_branch;
$this->branchFound = true;
return;
return null;
}
if (! $this->branchFound && $this->git_branch === 'main') {
try {
$this->git_branch = 'master';
$this->getBranch();
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
} else {
return handleError($e, $this);
}
}
return null;
}
private function getGitSource()
@@ -197,7 +201,7 @@ class PublicGitRepository extends Component
$this->git_branch = 'main';
}
if ($this->git_host === 'github.com') {
$this->git_source = GithubApp::where('name', 'Public GitHub')->first();
$this->git_source = GithubApp::query()->where('name', 'Public GitHub')->first();
return;
}
@@ -212,7 +216,7 @@ class PublicGitRepository extends Component
return;
}
if ($this->git_source->getMorphClass() === \App\Models\GithubApp::class) {
if ($this->git_source->getMorphClass() === GithubApp::class) {
['rate_limit_remaining' => $this->rate_limit_remaining, 'rate_limit_reset' => $this->rate_limit_reset] = githubApi(source: $this->git_source, endpoint: "/repos/{$this->git_repository}/branches/{$this->git_branch}");
$this->rate_limit_reset = Carbon::parse((int) $this->rate_limit_reset)->format('Y-M-d H:i:s');
$this->branchFound = true;
@@ -227,16 +231,16 @@ class PublicGitRepository extends Component
$project_uuid = $this->parameters['project_uuid'];
$environment_uuid = $this->parameters['environment_uuid'];
$destination = StandaloneDocker::where('uuid', $destination_uuid)->first();
$destination = StandaloneDocker::query()->where('uuid', $destination_uuid)->first();
if (! $destination) {
$destination = SwarmDocker::where('uuid', $destination_uuid)->first();
$destination = SwarmDocker::query()->where('uuid', $destination_uuid)->first();
}
if (! $destination) {
throw new \Exception('Destination not found. What?!');
throw new Exception('Destination not found. What?!');
}
$destination_class = $destination->getMorphClass();
$project = Project::where('uuid', $project_uuid)->first();
$project = Project::query()->where('uuid', $project_uuid)->first();
$environment = $project->load(['environments'])->environments->where('uuid', $environment_uuid)->first();
if ($this->build_pack === 'dockercompose' && isDev() && $this->new_compose_services) {
@@ -256,15 +260,13 @@ class PublicGitRepository extends Component
$new_service['source_id'] = $this->git_source->id;
$new_service['source_type'] = $this->git_source->getMorphClass();
}
$service = Service::create($new_service);
$service = Service::query()->create($new_service);
return redirect()->route('project.service.configuration', [
'service_uuid' => $service->uuid,
'environment_uuid' => $environment->uuid,
'project_uuid' => $project->uuid,
]);
return;
}
if ($this->git_source === 'other') {
$application_init = [
@@ -303,7 +305,7 @@ class PublicGitRepository extends Component
$application_init['docker_compose_location'] = $this->docker_compose_location;
$application_init['base_directory'] = $this->base_directory;
}
$application = Application::create($application_init);
$application = Application::query()->create($application_init);
$application->settings->is_static = $this->isStatic;
$application->settings->save();
@@ -322,7 +324,7 @@ class PublicGitRepository extends Component
'environment_uuid' => $environment->uuid,
'project_uuid' => $project->uuid,
]);
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
}

View File

@@ -205,12 +205,10 @@ class Select extends Component
{
if ($this->includeSwarm) {
$this->servers = $this->allServers;
} elseif ($this->allServers instanceof Collection) {
$this->servers = $this->allServers->where('settings.is_swarm_worker', false)->where('settings.is_swarm_manager', false)->where('settings.is_build_server', false);
} else {
if ($this->allServers instanceof Collection) {
$this->servers = $this->allServers->where('settings.is_swarm_worker', false)->where('settings.is_swarm_manager', false)->where('settings.is_build_server', false);
} else {
$this->servers = $this->allServers;
}
$this->servers = $this->allServers;
}
}
@@ -218,7 +216,7 @@ class Select extends Component
{
$type = str($type)->lower()->slug()->value();
if ($this->loading) {
return;
return null;
}
$this->loading = true;
$this->type = $type;
@@ -252,7 +250,7 @@ class Select extends Component
if ($type === 'existing-postgresql') {
$this->current_step = $type;
return;
return null;
}
if (count($this->servers) === 1) {
$server = $this->servers->first();
@@ -267,6 +265,8 @@ class Select extends Component
}
}
$this->current_step = 'servers';
return null;
}
public function setServer(Server $server)
@@ -285,6 +285,8 @@ class Select extends Component
}
}
$this->current_step = 'destinations';
return null;
}
public function setDestination(string $destination_uuid)
@@ -321,6 +323,8 @@ class Select extends Component
'server_id' => $this->server_id,
]);
}
return null;
}
public function loadServers()

View File

@@ -7,6 +7,7 @@ use App\Models\GithubApp;
use App\Models\Project;
use App\Models\StandaloneDocker;
use App\Models\SwarmDocker;
use Exception;
use Livewire\Component;
use Visus\Cuid2\Cuid2;
@@ -36,23 +37,23 @@ CMD ["nginx", "-g", "daemon off;"]
'dockerfile' => 'required',
]);
$destination_uuid = $this->query['destination'];
$destination = StandaloneDocker::where('uuid', $destination_uuid)->first();
$destination = StandaloneDocker::query()->where('uuid', $destination_uuid)->first();
if (! $destination) {
$destination = SwarmDocker::where('uuid', $destination_uuid)->first();
$destination = SwarmDocker::query()->where('uuid', $destination_uuid)->first();
}
if (! $destination) {
throw new \Exception('Destination not found. What?!');
throw new Exception('Destination not found. What?!');
}
$destination_class = $destination->getMorphClass();
$project = Project::where('uuid', $this->parameters['project_uuid'])->first();
$project = Project::query()->where('uuid', $this->parameters['project_uuid'])->first();
$environment = $project->load(['environments'])->environments->where('uuid', $this->parameters['environment_uuid'])->first();
$port = get_port_from_dockerfile($this->dockerfile);
if (! $port) {
$port = 80;
}
$application = Application::create([
$application = Application::query()->create([
'name' => 'dockerfile-'.new Cuid2,
'repository_project_id' => 0,
'git_repository' => 'coollabsio/coolify',

View File

@@ -67,7 +67,7 @@ class Create extends Component
$oneClickDotEnvs = data_get($services, "$oneClickServiceName.envs", null);
if ($oneClickDotEnvs) {
$oneClickDotEnvs = str(base64_decode($oneClickDotEnvs))->split('/\r\n|\r|\n/')->filter(function ($value) {
return ! empty($value);
return $value !== '' && $value !== '0';
});
}
if ($oneClickService) {
@@ -84,7 +84,7 @@ class Create extends Component
if ($oneClickServiceName === 'cloudflared') {
data_set($service_payload, 'connect_to_docker_network', true);
}
$service = Service::create($service_payload);
$service = Service::query()->create($service_payload);
$service->name = "$oneClickServiceName-".$service->uuid;
$service->save();
if ($oneClickDotEnvs?->count() > 0) {
@@ -92,7 +92,7 @@ class Create extends Component
$key = str()->before($value, '=');
$value = str(str()->after($value, '='));
if ($value) {
EnvironmentVariable::create([
EnvironmentVariable::query()->create([
'key' => $key,
'value' => $value,
'resourceable_id' => $service->id,
@@ -114,6 +114,8 @@ class Create extends Component
}
$this->type = $type->value();
}
return null;
}
public function render()

View File

@@ -25,11 +25,11 @@ class EnvironmentSelect extends Component
return redirect()->route('project.show', [
'project_uuid' => $this->project_uuid,
]);
} else {
return redirect()->route('project.resource.index', [
'project_uuid' => $this->project_uuid,
'environment_uuid' => $value,
]);
}
return redirect()->route('project.resource.index', [
'project_uuid' => $this->project_uuid,
'environment_uuid' => $value,
]);
}
}

View File

@@ -4,6 +4,7 @@ namespace App\Livewire\Project\Service;
use App\Actions\Docker\GetContainersStatus;
use App\Models\Service;
use Exception;
use Illuminate\Support\Facades\Auth;
use Livewire\Component;
@@ -71,9 +72,11 @@ class Configuration extends Component
$application->restart();
$this->dispatch('success', 'Service application restarted successfully.');
}
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function restartDatabase($id)
@@ -84,9 +87,11 @@ class Configuration extends Component
$database->restart();
$this->dispatch('success', 'Service database restarted successfully.');
}
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function check_status()
@@ -100,8 +105,10 @@ class Configuration extends Component
$database->refresh();
});
$this->dispatch('$refresh');
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
}

View File

@@ -6,6 +6,7 @@ use App\Actions\Database\StartDatabaseProxy;
use App\Actions\Database\StopDatabaseProxy;
use App\Models\ServiceDatabase;
use Livewire\Component;
use Throwable;
class Database extends Component
{
@@ -95,7 +96,7 @@ class Database extends Component
$this->database->save();
updateCompose($this->database);
$this->dispatch('success', 'Database saved.');
} catch (\Throwable) {
} catch (Throwable) {
} finally {
$this->dispatch('generateDockerCompose');
}

View File

@@ -31,12 +31,12 @@ class EditCompose extends Component
public function refreshEnvs()
{
$this->service = Service::find($this->serviceId);
$this->service = Service::query()->find($this->serviceId);
}
public function mount()
{
$this->service = Service::find($this->serviceId);
$this->service = Service::query()->find($this->serviceId);
}
public function saveEditedCompose()

View File

@@ -5,6 +5,7 @@ namespace App\Livewire\Project\Service;
use App\Models\ServiceApplication;
use Livewire\Component;
use Spatie\Url\Url;
use Throwable;
class EditDomain extends Component
{
@@ -19,7 +20,7 @@ class EditDomain extends Component
public function mount()
{
$this->application = ServiceApplication::find($this->applicationId);
$this->application = ServiceApplication::query()->find($this->applicationId);
}
public function submit()
@@ -43,13 +44,13 @@ class EditDomain extends Component
updateCompose($this->application);
if (str($this->application->fqdn)->contains(',')) {
$this->dispatch('warning', 'Some services do not support multiple domains, which can lead to problems and is NOT RECOMMENDED.<br><br>Only use multiple domains if you know what you are doing.');
} else {
! $warning && $this->dispatch('success', 'Service saved.');
} elseif (! $warning) {
$this->dispatch('success', 'Service saved.');
}
$this->application->service->parse();
$this->dispatch('refresh');
$this->dispatch('configurationChanged');
} catch (\Throwable $e) {
} catch (Throwable $e) {
$originalFqdn = $this->application->getOriginal('fqdn');
if ($originalFqdn !== $this->application->fqdn) {
$this->application->fqdn = $originalFqdn;
@@ -57,6 +58,8 @@ class EditDomain extends Component
return handleError($e, $this);
}
return null;
}
public function render()

View File

@@ -18,6 +18,7 @@ use App\Models\StandaloneRedis;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Livewire\Component;
use Throwable;
class FileStorage extends Component
{
@@ -61,11 +62,13 @@ class FileStorage extends Component
$this->fileStorage->is_based_on_git = false;
$this->fileStorage->save();
$this->fileStorage->saveStorageOnServer();
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
} finally {
$this->dispatch('refreshStorages');
}
return null;
}
public function convertToFile()
@@ -79,21 +82,21 @@ class FileStorage extends Component
}
$this->fileStorage->save();
$this->fileStorage->saveStorageOnServer();
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
} finally {
$this->dispatch('refreshStorages');
}
return null;
}
public function delete($password)
{
if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) {
if (! Hash::check($password, Auth::user()->password)) {
$this->addError('password', 'The provided password is incorrect.');
if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation') && ! Hash::check($password, Auth::user()->password)) {
$this->addError('password', 'The provided password is incorrect.');
return;
}
return null;
}
try {
@@ -107,11 +110,13 @@ class FileStorage extends Component
}
$this->fileStorage->delete();
$this->dispatch('success', $message);
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
} finally {
$this->dispatch('refreshStorages');
}
return null;
}
public function submit()
@@ -125,12 +130,14 @@ class FileStorage extends Component
$this->fileStorage->save();
$this->fileStorage->saveStorageOnServer();
$this->dispatch('success', 'File updated.');
} catch (\Throwable $e) {
} catch (Throwable $e) {
$this->fileStorage->setRawAttributes($original);
$this->fileStorage->save();
return handleError($e, $this);
}
return null;
}
public function instantSave()

View File

@@ -7,6 +7,7 @@ use App\Models\ServiceApplication;
use App\Models\ServiceDatabase;
use Illuminate\Support\Collection;
use Livewire\Component;
use Throwable;
class Index extends Component
{
@@ -45,9 +46,11 @@ class Index extends Component
$this->serviceDatabase->getFilesFromServer();
}
$this->s3s = currentTeam()->s3s;
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function generateDockerCompose()

View File

@@ -10,6 +10,7 @@ use App\Models\Service;
use Illuminate\Support\Facades\Auth;
use Livewire\Component;
use Spatie\Activitylog\Models\Activity;
use Throwable;
class Navbar extends Component
{
@@ -70,14 +71,10 @@ class Navbar extends Component
try {
// TODO: This is a temporary solution. We need to refactor this.
// We need to delete null bytes somehow.
$activity = Activity::where('properties->type_uuid', $this->service->uuid)->latest()->first();
$activity = Activity::query()->where('properties->type_uuid', $this->service->uuid)->latest()->first();
$status = data_get($activity, 'properties.status');
if ($status === 'queued' || $status === 'in_progress') {
$this->isDeploymentProgress = true;
} else {
$this->isDeploymentProgress = false;
}
} catch (\Throwable) {
$this->isDeploymentProgress = $status === 'queued' || $status === 'in_progress';
} catch (Throwable) {
$this->isDeploymentProgress = false;
}
}

View File

@@ -8,6 +8,7 @@ use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Livewire\Component;
use Spatie\Url\Url;
use Throwable;
class ServiceApplicationView extends Component
{
@@ -50,12 +51,10 @@ class ServiceApplicationView extends Component
public function delete($password)
{
if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) {
if (! Hash::check($password, Auth::user()->password)) {
$this->addError('password', 'The provided password is incorrect.');
if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation') && ! Hash::check($password, Auth::user()->password)) {
$this->addError('password', 'The provided password is incorrect.');
return;
}
return null;
}
try {
@@ -63,7 +62,7 @@ class ServiceApplicationView extends Component
$this->dispatch('success', 'Application deleted.');
return redirect()->route('project.service.configuration', $this->parameters);
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
}
@@ -94,11 +93,11 @@ class ServiceApplicationView extends Component
updateCompose($this->application);
if (str($this->application->fqdn)->contains(',')) {
$this->dispatch('warning', 'Some services do not support multiple domains, which can lead to problems and is NOT RECOMMENDED.<br><br>Only use multiple domains if you know what you are doing.');
} else {
! $warning && $this->dispatch('success', 'Service saved.');
} elseif (! $warning) {
$this->dispatch('success', 'Service saved.');
}
$this->dispatch('generateDockerCompose');
} catch (\Throwable $e) {
} catch (Throwable $e) {
$originalFqdn = $this->application->getOriginal('fqdn');
if ($originalFqdn !== $this->application->fqdn) {
$this->application->fqdn = $originalFqdn;
@@ -106,6 +105,8 @@ class ServiceApplicationView extends Component
return handleError($e, $this);
}
return null;
}
public function render()

View File

@@ -3,8 +3,10 @@
namespace App\Livewire\Project\Service;
use App\Models\Service;
use Exception;
use Illuminate\Support\Collection;
use Livewire\Component;
use Throwable;
class StackForm extends Component
{
@@ -78,7 +80,7 @@ class StackForm extends Component
$this->validate();
$isValid = validateComposeFile($this->service->docker_compose_raw, $this->service->server->id);
if ($isValid !== 'OK') {
throw new \Exception("Invalid docker-compose file.\n$isValid");
throw new Exception("Invalid docker-compose file.\n$isValid");
}
$this->service->save();
$this->service->saveExtraFields($this->fields);
@@ -87,7 +89,7 @@ class StackForm extends Component
$this->service->saveComposeConfigs();
$this->dispatch('refreshEnvs');
$notify && $this->dispatch('success', 'Service saved.');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
} finally {
if (is_null($this->service->config_hash)) {
@@ -96,6 +98,8 @@ class StackForm extends Component
$this->dispatch('configurationChanged');
}
}
return null;
}
public function render()

View File

@@ -4,6 +4,7 @@ namespace App\Livewire\Project\Service;
use App\Models\LocalPersistentVolume;
use Livewire\Component;
use Throwable;
class Storage extends Component
{
@@ -42,7 +43,7 @@ class Storage extends Component
public function addNewVolume($data)
{
try {
LocalPersistentVolume::create([
LocalPersistentVolume::query()->create([
'name' => $data['name'],
'mount_path' => $data['mount_path'],
'host_path' => $data['host_path'],
@@ -53,9 +54,11 @@ class Storage extends Component
$this->dispatch('success', 'Storage added successfully');
$this->dispatch('clearAddStorage');
$this->dispatch('refreshStorages');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function render()

View File

@@ -10,6 +10,7 @@ use App\Models\ServiceDatabase;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Livewire\Component;
use Throwable;
use Visus\Cuid2\Cuid2;
class Danger extends Component
@@ -43,10 +44,10 @@ class Danger extends Component
if ($this->resource === null) {
if (isset($parameters['service_uuid'])) {
$this->resource = Service::where('uuid', $parameters['service_uuid'])->first();
$this->resource = Service::query()->where('uuid', $parameters['service_uuid'])->first();
} elseif (isset($parameters['stack_service_uuid'])) {
$this->resource = ServiceApplication::where('uuid', $parameters['stack_service_uuid'])->first()
?? ServiceDatabase::where('uuid', $parameters['stack_service_uuid'])->first();
$this->resource = ServiceApplication::query()->where('uuid', $parameters['stack_service_uuid'])->first()
?? ServiceDatabase::query()->where('uuid', $parameters['stack_service_uuid'])->first();
}
}
@@ -81,18 +82,16 @@ class Danger extends Component
public function delete($password)
{
if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) {
if (! Hash::check($password, Auth::user()->password)) {
$this->addError('password', 'The provided password is incorrect.');
if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation') && ! Hash::check($password, Auth::user()->password)) {
$this->addError('password', 'The provided password is incorrect.');
return;
}
return null;
}
if (! $this->resource) {
$this->addError('resource', 'Resource not found.');
return;
return null;
}
try {
@@ -109,7 +108,7 @@ class Danger extends Component
'project_uuid' => $this->projectUuid,
'environment_uuid' => $this->environmentUuid,
]);
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
}

View File

@@ -8,6 +8,7 @@ use App\Events\ApplicationStatusChanged;
use App\Models\InstanceSettings;
use App\Models\Server;
use App\Models\StandaloneDocker;
use Exception;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
@@ -63,9 +64,11 @@ class Destination extends Component
$server = Server::ownedByCurrentTeam()->findOrFail($serverId);
StopApplicationOneServer::run($this->resource, $server);
$this->refreshServers();
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function redeploy(int $network_id, int $server_id)
@@ -74,13 +77,13 @@ class Destination extends Component
if ($this->resource->additional_servers->count() > 0 && str($this->resource->docker_registry_image_name)->isEmpty()) {
$this->dispatch('error', 'Failed to deploy.', 'Before deploying to multiple servers, you must first set a Docker image in the General tab.<br>More information here: <a target="_blank" class="underline" href="https://coolify.io/docs/knowledge-base/server/multiple-servers">documentation</a>');
return;
return null;
}
$deployment_uuid = new Cuid2;
$cuid2 = new Cuid2;
$server = Server::ownedByCurrentTeam()->findOrFail($server_id);
$destination = $server->standaloneDockers->where('id', $network_id)->firstOrFail();
queue_application_deployment(
deployment_uuid: $deployment_uuid,
deployment_uuid: $cuid2,
application: $this->resource,
server: $server,
destination: $destination,
@@ -91,10 +94,10 @@ class Destination extends Component
return redirect()->route('project.application.deployment.show', [
'project_uuid' => data_get($this->resource, 'environment.project.uuid'),
'application_uuid' => data_get($this->resource, 'uuid'),
'deployment_uuid' => $deployment_uuid,
'deployment_uuid' => $cuid2,
'environment_uuid' => data_get($this->resource, 'environment.uuid'),
]);
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e, $this);
}
}
@@ -130,26 +133,26 @@ class Destination extends Component
public function removeServer(int $network_id, int $server_id, $password)
{
try {
if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) {
if (! Hash::check($password, Auth::user()->password)) {
$this->addError('password', 'The provided password is incorrect.');
if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation') && ! Hash::check($password, Auth::user()->password)) {
$this->addError('password', 'The provided password is incorrect.');
return;
}
return null;
}
if ($this->resource->destination->server->id == $server_id && $this->resource->destination->id == $network_id) {
$this->dispatch('error', 'You cannot remove this destination server.', 'You are trying to remove the main server.');
return;
return null;
}
$server = Server::ownedByCurrentTeam()->findOrFail($server_id);
StopApplicationOneServer::run($this->resource, $server);
$this->resource->additional_networks()->detach($network_id, ['server_id' => $server_id]);
$this->loadData();
ApplicationStatusChanged::dispatch(data_get($this->resource, 'environment.project.team.id'));
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
}

View File

@@ -2,8 +2,10 @@
namespace App\Livewire\Project\Shared\EnvironmentVariable;
use App\Models\Application;
use App\Models\EnvironmentVariable;
use Livewire\Component;
use Throwable;
class All extends Component
{
@@ -31,7 +33,7 @@ class All extends Component
{
$this->is_env_sorting_enabled = data_get($this->resource, 'settings.is_env_sorting_enabled', false);
$this->resourceClass = get_class($this->resource);
$resourceWithPreviews = [\App\Models\Application::class];
$resourceWithPreviews = [Application::class];
$simpleDockerfile = filled(data_get($this->resource, 'dockerfile'));
if (str($this->resourceClass)->contains($resourceWithPreviews) && ! $simpleDockerfile) {
$this->showPreview = true;
@@ -101,11 +103,13 @@ class All extends Component
$this->updateOrder();
$this->sortEnvironmentVariables();
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
} finally {
$this->refreshEnvs();
}
return null;
}
private function updateOrder()
@@ -167,17 +171,17 @@ class All extends Component
private function createEnvironmentVariable($data)
{
$environment = new EnvironmentVariable;
$environment->key = $data['key'];
$environment->value = $data['value'];
$environment->is_build_time = $data['is_build_time'] ?? false;
$environment->is_multiline = $data['is_multiline'] ?? false;
$environment->is_literal = $data['is_literal'] ?? false;
$environment->is_preview = $data['is_preview'] ?? false;
$environment->resourceable_id = $this->resource->id;
$environment->resourceable_type = $this->resource->getMorphClass();
$environmentVariable = new EnvironmentVariable;
$environmentVariable->key = $data['key'];
$environmentVariable->value = $data['value'];
$environmentVariable->is_build_time = $data['is_build_time'] ?? false;
$environmentVariable->is_multiline = $data['is_multiline'] ?? false;
$environmentVariable->is_literal = $data['is_literal'] ?? false;
$environmentVariable->is_preview = $data['is_preview'] ?? false;
$environmentVariable->resourceable_id = $this->resource->id;
$environmentVariable->resourceable_type = $this->resource->getMorphClass();
return $environment;
return $environmentVariable;
}
private function deleteRemovedVariables($isPreview, $variables)

View File

@@ -4,6 +4,7 @@ namespace App\Livewire\Project\Shared\EnvironmentVariable;
use App\Models\EnvironmentVariable as ModelsEnvironmentVariable;
use App\Models\SharedEnvironmentVariable;
use Exception;
use Livewire\Component;
class Show extends Component
@@ -60,7 +61,7 @@ class Show extends Component
public function mount()
{
$this->syncData();
if ($this->env->getMorphClass() === \App\Models\SharedEnvironmentVariable::class) {
if ($this->env->getMorphClass() === SharedEnvironmentVariable::class) {
$this->isSharedVariable = true;
}
$this->parameters = get_route_parameters();
@@ -116,7 +117,7 @@ class Show extends Component
public function serialize()
{
data_forget($this->env, 'real_value');
if ($this->env->getMorphClass() === \App\Models\SharedEnvironmentVariable::class) {
if ($this->env->getMorphClass() === SharedEnvironmentVariable::class) {
data_forget($this->env, 'is_build_time');
}
}
@@ -156,7 +157,7 @@ class Show extends Component
$this->value = $oldValue;
$this->dispatch('error', 'Required environment variable cannot be empty.');
return;
return null;
}
$this->serialize();
@@ -168,9 +169,11 @@ class Show extends Component
$this->syncData(true);
$this->dispatch('success', 'Environment variable updated.');
$this->dispatch('envsUpdated');
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e);
}
return null;
}
public function delete()
@@ -179,8 +182,10 @@ class Show extends Component
$this->env->delete();
$this->dispatch('environmentVariableDeleted');
$this->dispatch('success', 'Environment variable deleted successfully.');
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e);
}
return null;
}
}

View File

@@ -6,8 +6,11 @@ use App\Models\Application;
use App\Models\Server;
use App\Models\Service;
use Illuminate\Support\Collection;
use InvalidArgumentException;
use Livewire\Attributes\On;
use Livewire\Component;
use RuntimeException;
use Throwable;
class ExecuteContainerCommand extends Component
{
@@ -43,7 +46,7 @@ class ExecuteContainerCommand extends Component
$this->servers = collect();
if (data_get($this->parameters, 'application_uuid')) {
$this->type = 'application';
$this->resource = Application::where('uuid', $this->parameters['application_uuid'])->firstOrFail();
$this->resource = Application::query()->where('uuid', $this->parameters['application_uuid'])->firstOrFail();
if ($this->resource->destination->server->isFunctional()) {
$this->servers = $this->servers->push($this->resource->destination->server);
}
@@ -66,14 +69,14 @@ class ExecuteContainerCommand extends Component
$this->loadContainers();
} elseif (data_get($this->parameters, 'service_uuid')) {
$this->type = 'service';
$this->resource = Service::where('uuid', $this->parameters['service_uuid'])->firstOrFail();
$this->resource = Service::query()->where('uuid', $this->parameters['service_uuid'])->firstOrFail();
if ($this->resource->server->isFunctional()) {
$this->servers = $this->servers->push($this->resource->server);
}
$this->loadContainers();
} elseif (data_get($this->parameters, 'server_uuid')) {
$this->type = 'server';
$this->resource = Server::where('uuid', $this->parameters['server_uuid'])->firstOrFail();
$this->resource = Server::query()->where('uuid', $this->parameters['server_uuid'])->firstOrFail();
$this->server = $this->resource;
}
}
@@ -146,7 +149,7 @@ class ExecuteContainerCommand extends Component
{
try {
if ($this->server->isForceDisabled()) {
throw new \RuntimeException('Server is disabled.');
throw new RuntimeException('Server is disabled.');
}
$this->dispatch(
'send-terminal-command',
@@ -154,9 +157,11 @@ class ExecuteContainerCommand extends Component
data_get($this->server, 'name'),
data_get($this->server, 'uuid')
);
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
#[On('connectToContainer')]
@@ -165,28 +170,28 @@ class ExecuteContainerCommand extends Component
if ($this->selected_container === 'default') {
$this->dispatch('error', 'Please select a container.');
return;
return null;
}
try {
// Validate container name format
if (! preg_match('/^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/', $this->selected_container)) {
throw new \InvalidArgumentException('Invalid container name format');
throw new InvalidArgumentException('Invalid container name format');
}
// Verify container exists in our allowed list
$container = collect($this->containers)->firstWhere('container.Names', $this->selected_container);
if (is_null($container)) {
throw new \RuntimeException('Container not found.');
throw new RuntimeException('Container not found.');
}
// Verify server ownership and status
$server = data_get($container, 'server');
if (! $server || ! $server instanceof Server) {
throw new \RuntimeException('Invalid server configuration.');
throw new RuntimeException('Invalid server configuration.');
}
if ($server->isForceDisabled()) {
throw new \RuntimeException('Server is disabled.');
throw new RuntimeException('Server is disabled.');
}
// Additional ownership verification based on resource type
@@ -194,11 +199,11 @@ class ExecuteContainerCommand extends Component
'application' => $this->resource->destination->server,
'database' => $this->resource->destination->server,
'service' => $this->resource->server,
default => throw new \RuntimeException('Invalid resource type.')
default => throw new RuntimeException('Invalid resource type.')
};
if ($server->id !== $resourceServer->id && ! $this->resource->additional_servers->contains('id', $server->id)) {
throw new \RuntimeException('Server ownership verification failed.');
throw new RuntimeException('Server ownership verification failed.');
}
$this->dispatch(
@@ -207,9 +212,11 @@ class ExecuteContainerCommand extends Component
data_get($container, 'container.Names'),
data_get($container, 'server.uuid')
);
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function render()

View File

@@ -44,19 +44,15 @@ class GetLogs extends Component
public function mount()
{
if (! is_null($this->resource)) {
if ($this->resource->getMorphClass() === \App\Models\Application::class) {
if ($this->resource->getMorphClass() === Application::class) {
$this->showTimeStamps = $this->resource->settings->is_include_timestamps;
} elseif ($this->servicesubtype) {
$this->showTimeStamps = $this->servicesubtype->is_include_timestamps;
} else {
if ($this->servicesubtype) {
$this->showTimeStamps = $this->servicesubtype->is_include_timestamps;
} else {
$this->showTimeStamps = $this->resource->is_include_timestamps;
}
$this->showTimeStamps = $this->resource->is_include_timestamps;
}
if ($this->resource?->getMorphClass() === \App\Models\Application::class) {
if (str($this->container)->contains('-pr-')) {
$this->pull_request = 'Pull Request: '.str($this->container)->afterLast('-pr-')->beforeLast('_')->value();
}
if ($this->resource?->getMorphClass() === Application::class && str($this->container)->contains('-pr-')) {
$this->pull_request = 'Pull Request: '.str($this->container)->afterLast('-pr-')->beforeLast('_')->value();
}
}
}
@@ -69,11 +65,11 @@ class GetLogs extends Component
public function instantSave()
{
if (! is_null($this->resource)) {
if ($this->resource->getMorphClass() === \App\Models\Application::class) {
if ($this->resource->getMorphClass() === Application::class) {
$this->resource->settings->is_include_timestamps = $this->showTimeStamps;
$this->resource->settings->save();
}
if ($this->resource->getMorphClass() === \App\Models\Service::class) {
if ($this->resource->getMorphClass() === Service::class) {
$serviceName = str($this->container)->beforeLast('-')->value();
$subType = $this->resource->applications()->where('name', $serviceName)->first();
if ($subType) {
@@ -95,7 +91,7 @@ class GetLogs extends Component
if (! $this->server->isFunctional()) {
return;
}
if (! $refresh && ($this->resource?->getMorphClass() === \App\Models\Service::class || str($this->container)->contains('-pr-'))) {
if (! $refresh && ($this->resource?->getMorphClass() === Service::class || str($this->container)->contains('-pr-'))) {
return;
}
if ($this->numberOfLines <= 0 || is_null($this->numberOfLines)) {
@@ -118,22 +114,20 @@ class GetLogs extends Component
}
$sshCommand = SshMultiplexingHelper::generateSshCommand($this->server, $command);
}
} else {
if ($this->server->isSwarm()) {
$command = "docker service logs -n {$this->numberOfLines} {$this->container}";
if ($this->server->isNonRoot()) {
$command = parseCommandsByLineForSudo(collect($command), $this->server);
$command = $command[0];
}
$sshCommand = SshMultiplexingHelper::generateSshCommand($this->server, $command);
} else {
$command = "docker logs -n {$this->numberOfLines} {$this->container}";
if ($this->server->isNonRoot()) {
$command = parseCommandsByLineForSudo(collect($command), $this->server);
$command = $command[0];
}
$sshCommand = SshMultiplexingHelper::generateSshCommand($this->server, $command);
} elseif ($this->server->isSwarm()) {
$command = "docker service logs -n {$this->numberOfLines} {$this->container}";
if ($this->server->isNonRoot()) {
$command = parseCommandsByLineForSudo(collect($command), $this->server);
$command = $command[0];
}
$sshCommand = SshMultiplexingHelper::generateSshCommand($this->server, $command);
} else {
$command = "docker logs -n {$this->numberOfLines} {$this->container}";
if ($this->server->isNonRoot()) {
$command = parseCommandsByLineForSudo(collect($command), $this->server);
$command = $command[0];
}
$sshCommand = SshMultiplexingHelper::generateSshCommand($this->server, $command);
}
if ($refresh) {
$this->outputs = '';

View File

@@ -3,6 +3,7 @@
namespace App\Livewire\Project\Shared;
use Livewire\Component;
use Throwable;
class HealthChecks extends Component
{
@@ -37,9 +38,11 @@ class HealthChecks extends Component
$this->validate();
$this->resource->save();
$this->dispatch('success', 'Health check updated.');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function render()

View File

@@ -12,6 +12,7 @@ use App\Models\StandaloneMongodb;
use App\Models\StandaloneMysql;
use App\Models\StandalonePostgresql;
use App\Models\StandaloneRedis;
use Exception;
use Illuminate\Support\Collection;
use Livewire\Component;
@@ -42,7 +43,7 @@ class Logs extends Component
try {
$server = $this->servers->firstWhere('id', $server_id);
if (! $server->isFunctional()) {
return;
return null;
}
if ($server->isSwarm()) {
$containers = collect([
@@ -54,9 +55,11 @@ class Logs extends Component
$containers = getCurrentApplicationContainerStatus($server, $this->resource->id, includePullrequests: true);
}
$server->containers = $containers->sort();
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function mount()
@@ -68,7 +71,7 @@ class Logs extends Component
$this->query = request()->query();
if (data_get($this->parameters, 'application_uuid')) {
$this->type = 'application';
$this->resource = Application::where('uuid', $this->parameters['application_uuid'])->firstOrFail();
$this->resource = Application::query()->where('uuid', $this->parameters['application_uuid'])->firstOrFail();
$this->status = $this->resource->status;
if ($this->resource->destination->server->isFunctional()) {
$this->servers = $this->servers->push($this->resource->destination->server);
@@ -93,7 +96,7 @@ class Logs extends Component
$this->containers->push($this->container);
} elseif (data_get($this->parameters, 'service_uuid')) {
$this->type = 'service';
$this->resource = Service::where('uuid', $this->parameters['service_uuid'])->firstOrFail();
$this->resource = Service::query()->where('uuid', $this->parameters['service_uuid'])->firstOrFail();
$this->resource->applications()->get()->each(function ($application) {
$this->containers->push(data_get($application, 'name').'-'.data_get($this->resource, 'uuid'));
});
@@ -110,9 +113,11 @@ class Logs extends Component
return str_contains($container, $this->query['pull_request_id']);
});
}
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function render()

View File

@@ -3,6 +3,7 @@
namespace App\Livewire\Project\Shared;
use Livewire\Component;
use Throwable;
class Metrics extends Component
{
@@ -39,9 +40,11 @@ class Metrics extends Component
$this->dispatch("refreshChartData-{$this->chartId}-memory", [
'seriesData' => $memoryMetrics,
]);
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function setInterval()

View File

@@ -3,6 +3,7 @@
namespace App\Livewire\Project\Shared;
use Livewire\Component;
use Throwable;
class ResourceLimits extends Component
{
@@ -55,8 +56,10 @@ class ResourceLimits extends Component
$this->validate();
$this->resource->save();
$this->dispatch('success', 'Resource limits updated.');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
}

View File

@@ -2,11 +2,21 @@
namespace App\Livewire\Project\Shared;
use App\Models\Application;
use App\Models\Environment;
use App\Models\Project;
use App\Models\StandaloneClickhouse;
use App\Models\StandaloneDocker;
use App\Models\StandaloneDragonfly;
use App\Models\StandaloneKeydb;
use App\Models\StandaloneMariadb;
use App\Models\StandaloneMongodb;
use App\Models\StandaloneMysql;
use App\Models\StandalonePostgresql;
use App\Models\StandaloneRedis;
use App\Models\SwarmDocker;
use Livewire\Component;
use Throwable;
use Visus\Cuid2\Cuid2;
class ResourceOperations extends Component
@@ -32,18 +42,17 @@ class ResourceOperations extends Component
public function cloneTo($destination_id)
{
$new_destination = StandaloneDocker::find($destination_id);
$new_destination = StandaloneDocker::query()->find($destination_id);
if (! $new_destination) {
$new_destination = SwarmDocker::find($destination_id);
$new_destination = SwarmDocker::query()->find($destination_id);
}
if (! $new_destination) {
return $this->addError('destination_id', 'Destination not found.');
}
$uuid = (string) new Cuid2;
$server = $new_destination->server;
if ($this->resource->getMorphClass() === \App\Models\Application::class) {
if ($this->resource->getMorphClass() === Application::class) {
$name = 'clone-of-'.str($this->resource->name)->limit(20).'-'.$uuid;
$new_resource = $this->resource->replicate()->fill([
'uuid' => $uuid,
'name' => $name,
@@ -66,12 +75,12 @@ class ResourceOperations extends Component
$newEnvironmentVariable->save();
}
$persistentVolumes = $this->resource->persistentStorages()->get();
foreach ($persistentVolumes as $volume) {
$volumeName = str($volume->name)->replace($this->resource->uuid, $new_resource->uuid)->value();
if ($volumeName === $volume->name) {
$volumeName = $new_resource->uuid.'-'.str($volume->name)->afterLast('-');
foreach ($persistentVolumes as $persistentVolume) {
$volumeName = str($persistentVolume->name)->replace($this->resource->uuid, $new_resource->uuid)->value();
if ($volumeName === $persistentVolume->name) {
$volumeName = $new_resource->uuid.'-'.str($persistentVolume->name)->afterLast('-');
}
$newPersistentVolume = $volume->replicate()->fill([
$newPersistentVolume = $persistentVolume->replicate()->fill([
'name' => $volumeName,
'resource_id' => $new_resource->id,
]);
@@ -84,16 +93,15 @@ class ResourceOperations extends Component
]).'#resource-operations';
return redirect()->to($route);
} elseif (
$this->resource->getMorphClass() === \App\Models\StandalonePostgresql::class ||
$this->resource->getMorphClass() === \App\Models\StandaloneMongodb::class ||
$this->resource->getMorphClass() === \App\Models\StandaloneMysql::class ||
$this->resource->getMorphClass() === \App\Models\StandaloneMariadb::class ||
$this->resource->getMorphClass() === \App\Models\StandaloneRedis::class ||
$this->resource->getMorphClass() === \App\Models\StandaloneKeydb::class ||
$this->resource->getMorphClass() === \App\Models\StandaloneDragonfly::class ||
$this->resource->getMorphClass() === \App\Models\StandaloneClickhouse::class
) {
}
if ($this->resource->getMorphClass() === StandalonePostgresql::class ||
$this->resource->getMorphClass() === StandaloneMongodb::class ||
$this->resource->getMorphClass() === StandaloneMysql::class ||
$this->resource->getMorphClass() === StandaloneMariadb::class ||
$this->resource->getMorphClass() === StandaloneRedis::class ||
$this->resource->getMorphClass() === StandaloneKeydb::class ||
$this->resource->getMorphClass() === StandaloneDragonfly::class ||
$this->resource->getMorphClass() === StandaloneClickhouse::class) {
$uuid = (string) new Cuid2;
$new_resource = $this->resource->replicate()->fill([
'uuid' => $uuid,
@@ -127,7 +135,8 @@ class ResourceOperations extends Component
]).'#resource-operations';
return redirect()->to($route);
} elseif ($this->resource->type() === 'service') {
}
if ($this->resource->type() === 'service') {
$uuid = (string) new Cuid2;
$new_resource = $this->resource->replicate()->fill([
'uuid' => $uuid,
@@ -154,12 +163,14 @@ class ResourceOperations extends Component
return redirect()->to($route);
}
return null;
}
public function moveTo($environment_id)
{
try {
$new_environment = Environment::findOrFail($environment_id);
$new_environment = Environment::query()->findOrFail($environment_id);
$this->resource->update([
'environment_id' => $environment_id,
]);
@@ -171,7 +182,8 @@ class ResourceOperations extends Component
]).'#resource-operations';
return redirect()->to($route);
} elseif (str($this->resource->type())->startsWith('standalone-')) {
}
if (str($this->resource->type())->startsWith('standalone-')) {
$route = route('project.database.configuration', [
'project_uuid' => $new_environment->project->uuid,
'environment_uuid' => $new_environment->uuid,
@@ -179,7 +191,8 @@ class ResourceOperations extends Component
]).'#resource-operations';
return redirect()->to($route);
} elseif ($this->resource->type() === 'service') {
}
if ($this->resource->type() === 'service') {
$route = route('project.service.configuration', [
'project_uuid' => $new_environment->project->uuid,
'environment_uuid' => $new_environment->uuid,
@@ -188,9 +201,11 @@ class ResourceOperations extends Component
return redirect()->to($route);
}
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function render()

View File

@@ -2,6 +2,7 @@
namespace App\Livewire\Project\Shared\ScheduledTask;
use Exception;
use Illuminate\Support\Collection;
use Livewire\Component;
@@ -53,12 +54,10 @@ class Add extends Component
if (! $isValid) {
$this->dispatch('error', 'Invalid Cron / Human expression.');
return;
return null;
}
if (empty($this->container) || $this->container === 'null') {
if ($this->type === 'service') {
$this->container = $this->subServiceName;
}
if (($this->container === null || $this->container === '' || $this->container === '0' || $this->container === 'null') && $this->type === 'service') {
$this->container = $this->subServiceName;
}
$this->dispatch('saveScheduledTask', [
'name' => $this->name,
@@ -67,9 +66,11 @@ class Add extends Component
'container' => $this->container,
]);
$this->clear();
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function clear()

View File

@@ -5,6 +5,7 @@ namespace App\Livewire\Project\Shared\ScheduledTask;
use App\Models\ScheduledTask;
use Illuminate\Support\Collection;
use Livewire\Component;
use Throwable;
class All extends Component
{
@@ -43,29 +44,31 @@ class All extends Component
public function submit($data)
{
try {
$task = new ScheduledTask;
$task->name = $data['name'];
$task->command = $data['command'];
$task->frequency = $data['frequency'];
$task->container = $data['container'];
$task->team_id = currentTeam()->id;
$scheduledTask = new ScheduledTask;
$scheduledTask->name = $data['name'];
$scheduledTask->command = $data['command'];
$scheduledTask->frequency = $data['frequency'];
$scheduledTask->container = $data['container'];
$scheduledTask->team_id = currentTeam()->id;
switch ($this->resource->type()) {
case 'application':
$task->application_id = $this->resource->id;
$scheduledTask->application_id = $this->resource->id;
break;
case 'standalone-postgresql':
$task->standalone_postgresql_id = $this->resource->id;
$scheduledTask->standalone_postgresql_id = $this->resource->id;
break;
case 'service':
$task->service_id = $this->resource->id;
$scheduledTask->service_id = $this->resource->id;
break;
}
$task->save();
$scheduledTask->save();
$this->refreshTasks();
$this->dispatch('success', 'Scheduled task added.');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
}

View File

@@ -3,6 +3,9 @@
namespace App\Livewire\Project\Shared\ScheduledTask;
use App\Models\ScheduledTask;
use DateTime;
use DateTimeZone;
use Exception;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth;
use Livewire\Attributes\Locked;
@@ -28,7 +31,7 @@ class Executions extends Component
public $logsPerPage = 100;
public $selectedExecution = null;
public $selectedExecution;
public $isPollingActive = false;
@@ -45,7 +48,7 @@ class Executions extends Component
{
try {
$this->taskId = $taskId;
$this->task = ScheduledTask::findOrFail($taskId);
$this->task = ScheduledTask::query()->findOrFail($taskId);
$this->executions = $this->task->executions()->take(20)->get();
$this->serverTimezone = data_get($this->task, 'application.destination.server.settings.server_timezone');
if (! $this->serverTimezone) {
@@ -54,9 +57,11 @@ class Executions extends Component
if (! $this->serverTimezone) {
$this->serverTimezone = 'UTC';
}
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e);
}
return null;
}
public function refreshExecutions(): void
@@ -124,7 +129,7 @@ class Executions extends Component
{
$execution = $this->executions->firstWhere('id', $executionId);
if (! $execution) {
return;
return null;
}
return response()->streamDownload(function () use ($execution) {
@@ -145,11 +150,11 @@ class Executions extends Component
public function formatDateInServerTimezone($date)
{
$serverTimezone = $this->serverTimezone;
$dateObj = new \DateTime($date);
$dateObj = new DateTime($date);
try {
$dateObj->setTimezone(new \DateTimeZone($serverTimezone));
} catch (\Exception) {
$dateObj->setTimezone(new \DateTimeZone('UTC'));
$dateObj->setTimezone(new DateTimeZone($serverTimezone));
} catch (Exception) {
$dateObj->setTimezone(new DateTimeZone('UTC'));
}
return $dateObj->format('Y-m-d H:i:s T');

View File

@@ -6,6 +6,7 @@ use App\Jobs\ScheduledTaskJob;
use App\Models\Application;
use App\Models\ScheduledTask;
use App\Models\Service;
use Exception;
use Livewire\Attributes\Locked;
use Livewire\Attributes\Validate;
use Livewire\Component;
@@ -68,9 +69,11 @@ class Show extends Component
$this->task = $this->resource->scheduled_tasks()->where('uuid', $task_uuid)->firstOrFail();
$this->syncData();
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e);
}
return null;
}
public function syncData(bool $toModel = false)
@@ -98,9 +101,11 @@ class Show extends Component
$this->syncData(true);
$this->dispatch('success', 'Scheduled task updated.');
$this->refreshTasks();
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e);
}
return null;
}
public function submit()
@@ -108,18 +113,22 @@ class Show extends Component
try {
$this->syncData(true);
$this->dispatch('success', 'Scheduled task updated.');
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e);
}
return null;
}
public function refreshTasks()
{
try {
$this->task->refresh();
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e);
}
return null;
}
public function delete()
@@ -129,10 +138,10 @@ class Show extends Component
if ($this->type === 'application') {
return redirect()->route('project.application.configuration', $this->parameters, $this->task->name);
} else {
return redirect()->route('project.service.configuration', $this->parameters, $this->task->name);
}
} catch (\Exception $e) {
return redirect()->route('project.service.configuration', $this->parameters, $this->task->name);
} catch (Exception $e) {
return handleError($e);
}
}
@@ -142,8 +151,10 @@ class Show extends Component
try {
ScheduledTaskJob::dispatch($this->task);
$this->dispatch('success', 'Scheduled task executed.');
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e);
}
return null;
}
}

View File

@@ -5,6 +5,7 @@ namespace App\Livewire\Project\Shared\Storages;
use App\Models\Application;
use App\Models\LocalFileVolume;
use Livewire\Component;
use Throwable;
class Add extends Component
{
@@ -63,7 +64,7 @@ class Add extends Component
$this->parameters = get_route_parameters();
if (data_get($this->parameters, 'application_uuid')) {
$applicationUuid = $this->parameters['application_uuid'];
$application = Application::where('uuid', $applicationUuid)->first();
$application = Application::query()->where('uuid', $applicationUuid)->first();
if (! $application) {
abort(404);
}
@@ -83,23 +84,23 @@ class Add extends Component
]);
$this->file_storage_path = trim($this->file_storage_path);
$this->file_storage_path = str($this->file_storage_path)->start('/')->value();
if ($this->resource->getMorphClass() === \App\Models\Application::class) {
if ($this->resource->getMorphClass() === Application::class) {
$fs_path = application_configuration_dir().'/'.$this->resource->uuid.$this->file_storage_path;
}
LocalFileVolume::create(
[
'fs_path' => $fs_path,
'mount_path' => $this->file_storage_path,
'content' => $this->file_storage_content,
'is_directory' => false,
'resource_id' => $this->resource->id,
'resource_type' => get_class($this->resource),
],
);
LocalFileVolume::query()->create([
'fs_path' => $fs_path,
'mount_path' => $this->file_storage_path,
'content' => $this->file_storage_content,
'is_directory' => false,
'resource_id' => $this->resource->id,
'resource_type' => get_class($this->resource),
]);
$this->dispatch('refreshStorages');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function submitFileStorageDirectory()
@@ -113,19 +114,19 @@ class Add extends Component
$this->file_storage_directory_source = str($this->file_storage_directory_source)->start('/')->value();
$this->file_storage_directory_destination = trim($this->file_storage_directory_destination);
$this->file_storage_directory_destination = str($this->file_storage_directory_destination)->start('/')->value();
LocalFileVolume::create(
[
'fs_path' => $this->file_storage_directory_source,
'mount_path' => $this->file_storage_directory_destination,
'is_directory' => true,
'resource_id' => $this->resource->id,
'resource_type' => get_class($this->resource),
],
);
LocalFileVolume::query()->create([
'fs_path' => $this->file_storage_directory_source,
'mount_path' => $this->file_storage_directory_destination,
'is_directory' => true,
'resource_id' => $this->resource->id,
'resource_type' => get_class($this->resource),
]);
$this->dispatch('refreshStorages');
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function submitPersistentVolume()
@@ -142,9 +143,11 @@ class Add extends Component
'mount_path' => $this->mount_path,
'host_path' => $this->host_path,
]);
} catch (\Throwable $e) {
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function clear()

View File

@@ -41,12 +41,10 @@ class Show extends Component
public function delete($password)
{
if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation')) {
if (! Hash::check($password, Auth::user()->password)) {
$this->addError('password', 'The provided password is incorrect.');
if (! data_get(InstanceSettings::get(), 'disable_two_step_confirmation') && ! Hash::check($password, Auth::user()->password)) {
$this->addError('password', 'The provided password is incorrect.');
return;
}
return;
}
$this->storage->delete();

View File

@@ -3,13 +3,14 @@
namespace App\Livewire\Project\Shared;
use App\Models\Tag;
use Exception;
use Livewire\Attributes\Validate;
use Livewire\Component;
// Refactored ✅
class Tags extends Component
{
public $resource = null;
public $resource;
#[Validate('required|string|min:2')]
public string $newTags;
@@ -50,7 +51,7 @@ class Tags extends Component
}
$found = Tag::ownedByCurrentTeam()->where(['name' => $tag])->exists();
if (! $found) {
$found = Tag::create([
$found = Tag::query()->create([
'name' => $tag,
'team_id' => currentTeam()->id,
]);
@@ -58,9 +59,11 @@ class Tags extends Component
$this->resource->tags()->attach($found->id);
}
$this->refresh();
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function addTag(string $id, string $name)
@@ -70,14 +73,16 @@ class Tags extends Component
if ($this->resource->tags()->where('id', $id)->exists()) {
$this->dispatch('error', 'Duplicate tags.', "Tag <span class='dark:text-warning'>$name</span> already added.");
return;
return null;
}
$this->resource->tags()->attach($id);
$this->refresh();
$this->dispatch('success', 'Tag added.');
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function deleteTag(string $id)
@@ -90,9 +95,11 @@ class Tags extends Component
}
$this->refresh();
$this->dispatch('success', 'Tag deleted.');
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
public function refresh()

View File

@@ -4,6 +4,7 @@ namespace App\Livewire\Project\Shared;
use App\Helpers\SshMultiplexingHelper;
use App\Models\Server;
use InvalidArgumentException;
use Livewire\Attributes\On;
use Livewire\Component;
@@ -31,7 +32,7 @@ class Terminal extends Component
if ($isContainer) {
// Validate container identifier format (alphanumeric, dashes, and underscores only)
if (! preg_match('/^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/', $identifier)) {
throw new \InvalidArgumentException('Invalid container identifier format');
throw new InvalidArgumentException('Invalid container identifier format');
}
// Verify container exists and belongs to the user's team

View File

@@ -3,6 +3,7 @@
namespace App\Livewire\Project\Shared;
use App\Models\Application;
use Exception;
use Livewire\Component;
class UploadConfig extends Component
@@ -29,10 +30,10 @@ class UploadConfig extends Component
public function uploadConfig()
{
try {
$application = Application::findOrFail($this->applicationId);
$application = Application::query()->findOrFail($this->applicationId);
$application->setConfig($this->config);
$this->dispatch('success', 'Application settings updated');
} catch (\Exception $e) {
} catch (Exception $e) {
$this->dispatch('error', $e->getMessage());
return;

View File

@@ -2,6 +2,7 @@
namespace App\Livewire\Project\Shared;
use Exception;
use Livewire\Component;
// Refactored ✅
@@ -57,8 +58,10 @@ class Webhooks extends Component
'manual_webhook_secret_gitea' => $this->giteaManualWebhookSecret,
]);
$this->dispatch('success', 'Secret Saved.');
} catch (\Exception $e) {
} catch (Exception $e) {
return handleError($e, $this);
}
return null;
}
}

View File

@@ -6,6 +6,7 @@ use App\Models\Environment;
use App\Models\Project;
use Livewire\Attributes\Validate;
use Livewire\Component;
use Throwable;
use Visus\Cuid2\Cuid2;
class Show extends Component
@@ -21,17 +22,19 @@ class Show extends Component
public function mount(string $project_uuid)
{
try {
$this->project = Project::where('team_id', currentTeam()->id)->where('uuid', $project_uuid)->firstOrFail();
} catch (\Throwable $e) {
$this->project = Project::query()->where('team_id', currentTeam()->id)->where('uuid', $project_uuid)->firstOrFail();
} catch (Throwable $e) {
return handleError($e, $this);
}
return null;
}
public function submit()
{
try {
$this->validate();
$environment = Environment::create([
$environment = Environment::query()->create([
'name' => $this->name,
'project_id' => $this->project->id,
'uuid' => (string) new Cuid2,
@@ -41,9 +44,11 @@ class Show extends Component
'project_uuid' => $this->project->uuid,
'environment_uuid' => $environment->uuid,
]);
} catch (\Throwable $e) {
} catch (Throwable $e) {
handleError($e, $this);
}
return null;
}
public function navigateToEnvironment($projectUuid, $environmentUuid)