Merge pull request #1212 from coollabsio/next

v4.0.0-beta.29
This commit is contained in:
Andras Bacsai 2023-09-08 18:52:41 +02:00 committed by GitHub
commit a4cc406114
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 104 additions and 59 deletions

View File

@ -40,7 +40,7 @@ public function __invoke(Server $server, Team $team)
"echo ####### Restarting Docker Engine...", "echo ####### Restarting Docker Engine...",
"systemctl restart docker", "systemctl restart docker",
"echo ####### Creating default network...", "echo ####### Creating default network...",
"docker network create --attachable coolify", "docker network create --attachable coolify >/dev/null 2>&1 || true",
"echo ####### Done!" "echo ####### Done!"
], $server); ], $server);
$found = StandaloneDocker::where('server_id', $server->id); $found = StandaloneDocker::where('server_id', $server->id);

View File

@ -23,6 +23,7 @@
use Str; use Str;
use function Laravel\Prompts\select; use function Laravel\Prompts\select;
use function Laravel\Prompts\text;
class TestEmail extends Command class TestEmail extends Command
{ {
@ -44,9 +45,10 @@ class TestEmail extends Command
* Execute the console command. * Execute the console command.
*/ */
private ?MailMessage $mail = null; private ?MailMessage $mail = null;
private string $email = 'andras.bacsai@protonmail.com';
public function handle() public function handle()
{ {
$email = select( $type = select(
'Which Email should be sent?', 'Which Email should be sent?',
options: [ options: [
'emails-test' => 'Test', 'emails-test' => 'Test',
@ -60,15 +62,15 @@ public function handle()
'waitlist-confirmation' => 'Waitlist Confirmation', 'waitlist-confirmation' => 'Waitlist Confirmation',
], ],
); );
$type = set_transanctional_email_settings(); $this->email = text('Email Address to send to');
if (!$type) { set_transanctional_email_settings();
throw new Exception('No email settings found.');
}
$this->mail = new MailMessage(); $this->mail = new MailMessage();
$this->mail->subject("Test Email"); $this->mail->subject("Test Email");
switch ($email) { switch ($type) {
case 'emails-test': case 'emails-test':
$this->mail = (new Test())->toMail(); $this->mail = (new Test())->toMail();
$this->sendEmail();
break; break;
case 'application-deployment-success': case 'application-deployment-success':
$application = Application::all()->first(); $application = Application::all()->first();
@ -172,11 +174,7 @@ private function sendEmail()
[], [],
[], [],
fn (Message $message) => $message fn (Message $message) => $message
->from( ->to($this->email)
'internal@example.com',
'Test Email',
)
->to('test@example.com')
->subject($this->mail->subject) ->subject($this->mail->subject)
->html((string)$this->mail->render()) ->html((string)$this->mail->render())
); );

View File

@ -6,6 +6,7 @@
use App\Models\PrivateKey; use App\Models\PrivateKey;
use App\Models\Project; use App\Models\Project;
use App\Models\Server; use App\Models\Server;
use App\Models\Team;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Livewire\Component; use Livewire\Component;
@ -70,9 +71,10 @@ public function restartBoarding()
} }
public function skipBoarding() public function skipBoarding()
{ {
currentTeam()->update([ Team::find(currentTeam()->id)->update([
'show_boarding' => false 'show_boarding' => false
]); ]);
ray(currentTeam());
refreshSession(); refreshSession();
return redirect()->route('dashboard'); return redirect()->route('dashboard');
} }

View File

@ -60,7 +60,6 @@ public function submitResend() {
$this->validate([ $this->validate([
'settings.resend_api_key' => 'required' 'settings.resend_api_key' => 'required'
]); ]);
$this->settings->smtp_enabled = false;
$this->settings->save(); $this->settings->save();
$this->emit('success', 'Settings saved successfully.'); $this->emit('success', 'Settings saved successfully.');
} catch (\Exception $e) { } catch (\Exception $e) {
@ -68,9 +67,18 @@ public function submitResend() {
return general_error_handler($e, $this); return general_error_handler($e, $this);
} }
} }
public function instantSaveResend() {
try {
$this->settings->smtp_enabled = false;
$this->submitResend();
} catch (\Exception $e) {
return general_error_handler($e, $this);
}
}
public function instantSave() public function instantSave()
{ {
try { try {
$this->settings->resend_enabled = false;
$this->submit(); $this->submit();
} catch (\Exception $e) { } catch (\Exception $e) {
return general_error_handler($e, $this); return general_error_handler($e, $this);
@ -89,7 +97,6 @@ public function submit()
'settings.smtp_password' => 'nullable', 'settings.smtp_password' => 'nullable',
'settings.smtp_timeout' => 'nullable', 'settings.smtp_timeout' => 'nullable',
]); ]);
$this->settings->resend_enabled = false;
$this->settings->save(); $this->settings->save();
$this->emit('success', 'Settings saved successfully.'); $this->emit('success', 'Settings saved successfully.');
} catch (\Exception $e) { } catch (\Exception $e) {

View File

@ -23,7 +23,7 @@ public function switch_to($team_id)
if (!$team_to_switch_to) { if (!$team_to_switch_to) {
return; return;
} }
session(['currentTeam' => $team_to_switch_to]); refreshSession($team_to_switch_to);
return redirect(request()->header('Referer')); return redirect(request()->header('Referer'));
} }
} }

View File

@ -15,7 +15,7 @@ class IsBoardingFlow
*/ */
public function handle(Request $request, Closure $next): Response public function handle(Request $request, Closure $next): Response
{ {
// ray()->showQueries()->color('orange'); ray()->showQueries()->color('orange');
if (showBoarding() && !in_array($request->path(), allowedPathsForBoardingAccounts())) { if (showBoarding() && !in_array($request->path(), allowedPathsForBoardingAccounts())) {
return redirect('boarding'); return redirect('boarding');
} }

View File

@ -4,6 +4,7 @@
use App\Notifications\Channels\SendsEmail; use App\Notifications\Channels\SendsEmail;
use App\Notifications\TransactionalEmails\ResetPassword as TransactionalEmailsResetPassword; use App\Notifications\TransactionalEmails\ResetPassword as TransactionalEmailsResetPassword;
use Cache;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
@ -94,7 +95,9 @@ public function isInstanceAdmin()
public function currentTeam() public function currentTeam()
{ {
return Cache::remember('team:' . auth()->user()->id, 3600, function() {
return Team::find(session('currentTeam')->id); return Team::find(session('currentTeam')->id);
});
} }
public function otherTeams() public function otherTeams()

View File

@ -16,6 +16,7 @@ class DeploymentFailed extends Notification implements ShouldQueue
{ {
use Queueable; use Queueable;
public $tries = 5;
public Application $application; public Application $application;
public string $deployment_uuid; public string $deployment_uuid;
public ?ApplicationPreview $preview = null; public ?ApplicationPreview $preview = null;

View File

@ -16,6 +16,7 @@ class DeploymentSuccess extends Notification implements ShouldQueue
{ {
use Queueable; use Queueable;
public $tries = 5;
public Application $application; public Application $application;
public string $deployment_uuid; public string $deployment_uuid;
public ApplicationPreview|null $preview = null; public ApplicationPreview|null $preview = null;

View File

@ -14,6 +14,7 @@ class StatusChanged extends Notification implements ShouldQueue
{ {
use Queueable; use Queueable;
public $tries = 5;
public $application; public $application;
public string $application_name; public string $application_name;

View File

@ -14,6 +14,7 @@ class BackupFailed extends Notification implements ShouldQueue
{ {
use Queueable; use Queueable;
public $tries = 5;
public string $name; public string $name;
public string $frequency; public string $frequency;

View File

@ -14,6 +14,7 @@ class BackupSuccess extends Notification implements ShouldQueue
{ {
use Queueable; use Queueable;
public $tries = 5;
public string $name; public string $name;
public string $frequency; public string $frequency;

View File

@ -12,6 +12,7 @@ class GeneralNotification extends Notification implements ShouldQueue
{ {
use Queueable; use Queueable;
public $tries = 5;
public function __construct(public string $message) public function __construct(public string $message)
{ {
} }

View File

@ -15,6 +15,7 @@ class NotReachable extends Notification implements ShouldQueue
{ {
use Queueable; use Queueable;
public $tries = 5;
public function __construct(public Server $server) public function __construct(public Server $server)
{ {

View File

@ -14,6 +14,7 @@ class Test extends Notification implements ShouldQueue
{ {
use Queueable; use Queueable;
public $tries = 5;
public function __construct(public string|null $emails = null) public function __construct(public string|null $emails = null)
{ {
} }

View File

@ -15,6 +15,7 @@ class InvitationLink extends Notification implements ShouldQueue
{ {
use Queueable; use Queueable;
public $tries = 5;
public function via(): array public function via(): array
{ {
return [TransactionalEmailChannel::class]; return [TransactionalEmailChannel::class];

View File

@ -12,6 +12,7 @@ class Test extends Notification implements ShouldQueue
{ {
use Queueable; use Queueable;
public $tries = 5;
public function __construct(public string $emails) public function __construct(public string $emails)
{ {
} }

View File

@ -57,9 +57,15 @@ function showBoarding(): bool
{ {
return currentTeam()->show_boarding ?? false; return currentTeam()->show_boarding ?? false;
} }
function refreshSession(): void function refreshSession(?Team $team = null): void
{ {
if (!$team) {
$team = Team::find(currentTeam()->id); $team = Team::find(currentTeam()->id);
}
Cache::forget('team:' . auth()->user()->id);
Cache::remember('team:' . auth()->user()->id, 3600, function() use ($team) {
return $team;
});
session(['currentTeam' => $team]); session(['currentTeam' => $team]);
} }
function general_error_handler(Throwable | null $err = null, $that = null, $isJson = false, $customErrorMessage = null): mixed function general_error_handler(Throwable | null $err = null, $that = null, $isJson = false, $customErrorMessage = null): mixed

View File

@ -3,11 +3,11 @@
return [ return [
// @see https://docs.sentry.io/product/sentry-basics/dsn-explainer/ // @see https://docs.sentry.io/product/sentry-basics/dsn-explainer/
'dsn' => 'https://abe219b6573947128ecf523c835f5f38@o1082494.ingest.sentry.io/4505347448045568', 'dsn' => 'https://62de992090e4e0cb28f18231835ea006@o1082494.ingest.sentry.io/4505347448045568',
// The release version of your application // The release version of your application
// Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD')) // Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD'))
'release' => '4.0.0-beta.28', 'release' => '4.0.0-beta.29',
'server_name' => env('APP_ID', 'coolify'), 'server_name' => env('APP_ID', 'coolify'),
// When left empty or `null` the Laravel environment will be used // When left empty or `null` the Laravel environment will be used
'environment' => config('app.env'), 'environment' => config('app.env'),

View File

@ -1,3 +1,3 @@
<?php <?php
return '4.0.0-beta.28'; return '4.0.0-beta.29';

View File

@ -20,20 +20,31 @@
id="team.discord_webhook_url" label="Webhook" /> id="team.discord_webhook_url" label="Webhook" />
</form> </form>
@if (data_get($team, 'discord_enabled')) @if (data_get($team, 'discord_enabled'))
<h3 class="mt-4">Subscribe to events</h3> <h2 class="mt-4">Subscribe to events</h2>
<div class="w-64"> <div class="w-64">
@if (isDev()) @if (isDev())
<x-forms.checkbox instantSave="saveModel" id="team.discord_notifications_test" label="Test" /> <h3 class="mt-4">Test</h3>
<div class="flex items-end gap-10">
<x-forms.checkbox instantSave="saveModel" id="team.discord_notifications_test" label="Enabled" />
</div>
@endif @endif
<h4 class="mt-4">General</h4> <h3 class="mt-4">Container Status Changes</h3>
<div class="flex items-end gap-10">
<x-forms.checkbox instantSave="saveModel" id="team.discord_notifications_status_changes" <x-forms.checkbox instantSave="saveModel" id="team.discord_notifications_status_changes"
label="Container Status Changes" /> label="Enabled" />
<h4 class="mt-4">Applications</h4> </div>
<h3 class="mt-4">Application Deployments</h3>
<div class="flex items-end gap-10">
<x-forms.checkbox instantSave="saveModel" id="team.discord_notifications_deployments" <x-forms.checkbox instantSave="saveModel" id="team.discord_notifications_deployments"
label="Deployments" /> label="Enabled" />
<h4 class="mt-4">Databases</h4> </div>
<h3 class="mt-4">Backup Status</h3>
<div class="flex items-end gap-10">
<x-forms.checkbox instantSave="saveModel" id="team.discord_notifications_database_backups" <x-forms.checkbox instantSave="saveModel" id="team.discord_notifications_database_backups"
label="Backup Statuses" /> label="Enabled" />
</div>
</div> </div>
@endif @endif
</div> </div>

View File

@ -21,7 +21,7 @@
Copy from Instance Settings Copy from Instance Settings
</x-forms.button> </x-forms.button>
@endif @endif
@if (isEmailEnabled($team) || data_get($team, 'use_instance_email_settings')) @if (isEmailEnabled($team) && auth()->user()->isAdminFromSession())
<x-forms.button onclick="sendTestEmail.showModal()" <x-forms.button onclick="sendTestEmail.showModal()"
class="text-white normal-case btn btn-xs no-animation btn-primary"> class="text-white normal-case btn btn-xs no-animation btn-primary">
Send Test Email Send Test Email
@ -41,7 +41,6 @@ class="text-white normal-case btn btn-xs no-animation btn-primary">
label="Use hosted email service (Pro+ subscription required)" /> label="Use hosted email service (Pro+ subscription required)" />
</div> </div>
@endif @endif
<h3 class="pb-4">Custom Email Service</h3>
@if (!$team->use_instance_email_settings) @if (!$team->use_instance_email_settings)
<form class="flex flex-col items-end gap-2 pb-4 xl:flex-row" wire:submit.prevent='submitFromFields'> <form class="flex flex-col items-end gap-2 pb-4 xl:flex-row" wire:submit.prevent='submitFromFields'>
<x-forms.input required id="team.smtp_from_name" helper="Name used in emails." label="From Name" /> <x-forms.input required id="team.smtp_from_name" helper="Name used in emails." label="From Name" />
@ -110,19 +109,27 @@ class="text-white normal-case btn btn-xs no-animation btn-primary">
</div> </div>
@endif @endif
@if (isEmailEnabled($team) || data_get($team, 'use_instance_email_settings')) @if (isEmailEnabled($team) || data_get($team, 'use_instance_email_settings'))
<h3 class="mt-4">Subscribe to events</h3> <h2 class="mt-4">Subscribe to events</h2>
<div class="w-64"> <div class="w-64">
@if (isDev()) @if (isDev())
<x-forms.checkbox instantSave="saveModel" id="team.smtp_notifications_test" label="Test" /> <h3 class="mt-4">Test</h3>
<div class="flex items-end gap-10">
<x-forms.checkbox instantSave="saveModel" id="team.smtp_notifications_test" label="Enabled" />
</div>
@endif @endif
<h4 class="mt-4">General</h4> <h3 class="mt-4">Container Status Changes</h3>
<x-forms.checkbox instantSave="saveModel" id="team.smtp_notifications_status_changes" <div class="flex items-end gap-10">
label="Container Status Changes" /> <x-forms.checkbox instantSave="saveModel" id="team.smtp_notifications_status_changes" label="Enabled" />
<h4 class="mt-4">Applications</h4> </div>
<x-forms.checkbox instantSave="saveModel" id="team.smtp_notifications_deployments" label="Deployments" /> <h3 class="mt-4">Application Deployments</h3>
<h4 class="mt-4">Databases</h4> <div class="flex items-end gap-10">
<x-forms.checkbox instantSave="saveModel" id="team.smtp_notifications_deployments" label="Enabled" />
</div>
<h3 class="mt-4">Backup Status</h3>
<div class="flex items-end gap-10">
<x-forms.checkbox instantSave="saveModel" id="team.smtp_notifications_database_backups" <x-forms.checkbox instantSave="saveModel" id="team.smtp_notifications_database_backups"
label="Backup Statuses" /> label="Enabled" />
</div>
</div> </div>
@endif @endif
</div> </div>

View File

@ -22,7 +22,7 @@
<x-forms.button type="submit"> <x-forms.button type="submit">
Save Save
</x-forms.button> </x-forms.button>
@if ($settings->resend_enabled || $settings->smtp_enabled) @if (isEmailEnabled($settings))
<x-forms.button onclick="sendTestEmail.showModal()" <x-forms.button onclick="sendTestEmail.showModal()"
class="text-white normal-case btn btn-xs no-animation btn-primary"> class="text-white normal-case btn btn-xs no-animation btn-primary">
Send Test Email Send Test Email
@ -67,14 +67,15 @@ class="text-white normal-case btn btn-xs no-animation btn-primary">
<summary class="text-xl collapse-title"> <summary class="text-xl collapse-title">
<div>Resend</div> <div>Resend</div>
<div class="w-32"> <div class="w-32">
<x-forms.checkbox instantSave='submitResend' id="settings.resend_enabled" label="Enabled" /> <x-forms.checkbox instantSave='instantSaveResend' id="settings.resend_enabled" label="Enabled" />
</div> </div>
</summary> </summary>
<div class="collapse-content"> <div class="collapse-content">
<form wire:submit.prevent='submitResend' class="flex flex-col"> <form wire:submit.prevent='submitResend' class="flex flex-col">
<div class="flex flex-col gap-4"> <div class="flex flex-col gap-4">
<div class="flex flex-col w-full gap-2 xl:flex-row"> <div class="flex flex-col w-full gap-2 xl:flex-row">
<x-forms.input type="password" id="settings.resend_api_key" placeholder="API key" label="Host" /> <x-forms.input type="password" id="settings.resend_api_key" placeholder="API key"
label="Host" />
</div> </div>
</div> </div>
<div class="flex justify-end gap-4 pt-6"> <div class="flex justify-end gap-4 pt-6">

View File

@ -4,7 +4,7 @@
"version": "3.12.36" "version": "3.12.36"
}, },
"v4": { "v4": {
"version": "4.0.0-beta.28" "version": "4.0.0-beta.29"
} }
} }
} }