From 13fda50aac5868c471be526afbee963133528a7f Mon Sep 17 00:00:00 2001 From: Joao Patricio Date: Fri, 19 May 2023 18:01:56 +0100 Subject: [PATCH 1/7] Starts Notifications feature. Missing to send email with runtime configs. --- .gitignore | 6 +- .../Settings/DiscordNotifications.php | 38 ++++++++++++ .../Livewire/Settings/EmailNotifications.php | 49 +++++++++++++++ app/Jobs/SendMessageToDiscordJob.php | 45 ++++++++++++++ app/Models/InstanceSettings.php | 11 ++++ app/Notifications/Channels/DiscordChannel.php | 25 ++++++++ app/Notifications/TestMessage.php | 60 +++++++++++++++++++ app/Providers/AppServiceProvider.php | 6 ++ ..._112813_create_instance_settings_table.php | 3 + docker-compose.dev.yml | 7 +++ .../views/components/inputs/button.blade.php | 34 +++++------ .../settings/discord-notifications.blade.php | 15 +++++ .../settings/email-notifications.blade.php | 24 ++++++++ resources/views/settings.blade.php | 8 +++ resources/views/team.blade.php | 5 +- routes/console.php | 33 ++++++---- 16 files changed, 334 insertions(+), 35 deletions(-) create mode 100644 app/Http/Livewire/Settings/DiscordNotifications.php create mode 100644 app/Http/Livewire/Settings/EmailNotifications.php create mode 100644 app/Jobs/SendMessageToDiscordJob.php create mode 100644 app/Notifications/Channels/DiscordChannel.php create mode 100644 app/Notifications/TestMessage.php create mode 100644 resources/views/livewire/settings/discord-notifications.blade.php create mode 100644 resources/views/livewire/settings/email-notifications.blade.php diff --git a/.gitignore b/.gitignore index b666520a4..cdbd7bf66 100644 --- a/.gitignore +++ b/.gitignore @@ -20,10 +20,8 @@ yarn-error.log /.npm /.bash_history /_data - -# Temp while developing Proxy deployment -resources/recipes - +_testing_hosts/ +_volumes/ .lesshst psysh_history .psql_history diff --git a/app/Http/Livewire/Settings/DiscordNotifications.php b/app/Http/Livewire/Settings/DiscordNotifications.php new file mode 100644 index 000000000..01388a238 --- /dev/null +++ b/app/Http/Livewire/Settings/DiscordNotifications.php @@ -0,0 +1,38 @@ + 'nullable|url', + ]; + protected $validationAttributes = [ + 'settings.extra_attributes.discord_webhook' => 'Discord Webhook', + ]; + public function mount($settings) + { + // + } + public function submit() + { + $this->resetErrorBag(); + $this->validate(); + $this->settings->save(); + } + public function sentTestMessage() + { + // @TODO figure out how to do it in runtime + } + public function render() + { + return view('livewire.settings.discord-notifications'); + } +} diff --git a/app/Http/Livewire/Settings/EmailNotifications.php b/app/Http/Livewire/Settings/EmailNotifications.php new file mode 100644 index 000000000..639fb11cd --- /dev/null +++ b/app/Http/Livewire/Settings/EmailNotifications.php @@ -0,0 +1,49 @@ + 'nullable', + 'settings.extra_attributes.smtp_port' => 'nullable', + 'settings.extra_attributes.smtp_encryption' => 'nullable', + 'settings.extra_attributes.smtp_username' => 'nullable', + 'settings.extra_attributes.smtp_password' => 'nullable', + 'settings.extra_attributes.smtp_timeout' => 'nullable', + ]; + protected $validationAttributes = [ + 'settings.extra_attributes.smtp_host' => 'Host', + 'settings.extra_attributes.smtp_port' => 'Port', + 'settings.extra_attributes.smtp_encryption' => 'Encryption', + 'settings.extra_attributes.smtp_username' => 'Username', + 'settings.extra_attributes.smtp_password' => 'Password', + 'settings.extra_attributes.smtp_timeout' => 'Timeout', + ]; + public function mount($settings) + { + ray($settings); + // + } + public function submit() + { + $this->resetErrorBag(); + $this->validate(); + $this->settings->save(); + } + public function sentTestMessage() + { + Notification::send(auth()->user(), new TestMessage); + } + public function render() + { + return view('livewire.settings.email-notifications'); + } +} diff --git a/app/Jobs/SendMessageToDiscordJob.php b/app/Jobs/SendMessageToDiscordJob.php new file mode 100644 index 000000000..8f1962829 --- /dev/null +++ b/app/Jobs/SendMessageToDiscordJob.php @@ -0,0 +1,45 @@ + $this->text, + ]; + + Http::post($this->webhookUrl, $payload); + } +} diff --git a/app/Models/InstanceSettings.php b/app/Models/InstanceSettings.php index c2394a008..445d07477 100644 --- a/app/Models/InstanceSettings.php +++ b/app/Models/InstanceSettings.php @@ -2,10 +2,21 @@ namespace App\Models; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; +use Spatie\SchemalessAttributes\Casts\SchemalessAttributes; class InstanceSettings extends Model { + public $casts = [ + 'extra_attributes' => SchemalessAttributes::class, + ]; + + public function scopeWithExtraAttributes(): Builder + { + return $this->extra_attributes->modelScope(); + } + public static function get() { return InstanceSettings::findOrFail(0); diff --git a/app/Notifications/Channels/DiscordChannel.php b/app/Notifications/Channels/DiscordChannel.php new file mode 100644 index 000000000..77709ec0b --- /dev/null +++ b/app/Notifications/Channels/DiscordChannel.php @@ -0,0 +1,25 @@ +toDiscord($notifiable); + + $webhookUrl = data_get( + InstanceSettings::get(), + 'extra_attributes.discord_webhook' + ); + + dispatch(new SendMessageToDiscordJob($message, $webhookUrl)); + } +} diff --git a/app/Notifications/TestMessage.php b/app/Notifications/TestMessage.php new file mode 100644 index 000000000..8e8929f10 --- /dev/null +++ b/app/Notifications/TestMessage.php @@ -0,0 +1,60 @@ + + */ + public function via(object $notifiable): array + { + return ['mail', DiscordChannel::class]; + } + + /** + * Get the mail representation of the notification. + */ + public function toMail(object $notifiable): MailMessage + { + return (new MailMessage) + ->line('Welcome to Coolify!') + ->action('Go to dashboard', url('/')) + ->line('We need your attention for disk usage.'); + } + + public function toDiscord(object $notifiable): string + { + return 'Welcome to Coolify! We need your attention for disk usage. [Go to dashboard]('.url('/').')'; + } + + /** + * Get the array representation of the notification. + * + * @return array + */ + public function toArray(object $notifiable): array + { + return [ + // + ]; + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index be599237a..3129c24ce 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -3,11 +3,13 @@ namespace App\Providers; use App\Jobs\CoolifyTask; +use Illuminate\Mail\MailManager; use Illuminate\Queue\Events\JobProcessed; use Illuminate\Support\Facades\Process; use Illuminate\Support\Facades\Queue; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Str; +use Symfony\Component\Mailer\Transport\Smtp\SmtpTransport; class AppServiceProvider extends ServiceProvider { @@ -26,6 +28,10 @@ class AppServiceProvider extends ServiceProvider */ public function boot(): void { + if (! $this->app->environment('production')) { + \Illuminate\Support\Facades\Mail::alwaysTo('noone@example.com'); + } + Queue::after(function (JobProcessed $event) { // @TODO: Remove `coolify-builder` container after the remoteProcess job is finishged and remoteProcess->type == `deployment`. if ($event->job->resolveName() === CoolifyTask::class) { diff --git a/database/migrations/2023_03_20_112813_create_instance_settings_table.php b/database/migrations/2023_03_20_112813_create_instance_settings_table.php index d68649e7a..2d1826d30 100644 --- a/database/migrations/2023_03_20_112813_create_instance_settings_table.php +++ b/database/migrations/2023_03_20_112813_create_instance_settings_table.php @@ -27,6 +27,9 @@ return new class extends Migration // $table->boolean('is_dns_check_enabled')->default(true); $table->boolean('is_registration_enabled')->default(true); $table->boolean('is_https_forced')->default(true); + + $table->schemalessAttributes('extra_attributes'); + $table->timestamps(); }); } diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index a59dd6abd..76065370c 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -64,3 +64,10 @@ services: volumes: - /var/run/docker.sock:/var/run/docker.sock - "./_data/coolify/proxy/testing-host-2:/data/coolify/proxy" + mailpit: + image: 'axllent/mailpit:latest' + ports: + - '${FORWARD_MAILPIT_PORT:-1025}:1025' + - '${FORWARD_MAILPIT_DASHBOARD_PORT:-8025}:8025' + networks: + - coolify diff --git a/resources/views/components/inputs/button.blade.php b/resources/views/components/inputs/button.blade.php index a323d620f..d09fb0cd7 100644 --- a/resources/views/components/inputs/button.blade.php +++ b/resources/views/components/inputs/button.blade.php @@ -5,26 +5,26 @@ 'confirmAction' => null, ]) @if ($type === 'submit') - @elseif($type === 'button') - @endif diff --git a/resources/views/livewire/settings/discord-notifications.blade.php b/resources/views/livewire/settings/discord-notifications.blade.php new file mode 100644 index 000000000..d13e26e27 --- /dev/null +++ b/resources/views/livewire/settings/discord-notifications.blade.php @@ -0,0 +1,15 @@ +
+
+
+ +
+
+ + Submit + + + Send test message + +
+
+
diff --git a/resources/views/livewire/settings/email-notifications.blade.php b/resources/views/livewire/settings/email-notifications.blade.php new file mode 100644 index 000000000..6bfc53506 --- /dev/null +++ b/resources/views/livewire/settings/email-notifications.blade.php @@ -0,0 +1,24 @@ +
+
+
+
+ + + +
+
+ + + +
+
+
+ + Submit + + + Send test message + +
+
+
diff --git a/resources/views/settings.blade.php b/resources/views/settings.blade.php index 389f8be41..f0155603d 100644 --- a/resources/views/settings.blade.php +++ b/resources/views/settings.blade.php @@ -1,4 +1,12 @@

Settings

+ +

General

+ +
+ +

Notifications

+ +
diff --git a/resources/views/team.blade.php b/resources/views/team.blade.php index c6265e32c..135c131d8 100644 --- a/resources/views/team.blade.php +++ b/resources/views/team.blade.php @@ -1,7 +1,8 @@

Current Team

-

Name: {{ session('currentTeam')->name }}

- +

Name: {{ session('currentTeam.name') }}

+ +
diff --git a/routes/console.php b/routes/console.php index d2977bec5..34f661adb 100644 --- a/routes/console.php +++ b/routes/console.php @@ -2,6 +2,7 @@ use Illuminate\Foundation\Inspiring; use Illuminate\Support\Facades\Artisan; +use Symfony\Component\Mailer\Mailer; /* |-------------------------------------------------------------------------- @@ -14,19 +15,27 @@ use Illuminate\Support\Facades\Artisan; | */ -// Artisan::command('inspire', function () { +Artisan::command('inspire', function () { -// $activity = Spatie\Activitylog\Models\Activity::latest()->first(); + $smtp = [ + "transport" => "smtp", + "host" => "mailpit", + "port" => 1025, + "encryption" => 'tls', + "username" => null, + "password" => null, + "timeout" => null, + "local_domain" => null, + ]; + config()->set('mail.mailers.smtp', $smtp); -// $this->info( -// collect( -// json_decode(data_get($activity, 'description'), associative: true, flags: JSON_THROW_ON_ERROR) -// ) -// ->sortBy('order') -// ->map(fn($i) => $i['output']) -// ->implode("\n") -// ); +// \Illuminate\Support\Facades\Mail::mailer('smtp') +// ->to('ask@me.com') +// ->send(new \App\Mail\TestMail); + \Illuminate\Support\Facades\Notification::send( + \App\Models\User::find(1), + new \App\Notifications\TestMessage + ); - -// })->purpose('Display an inspiring quote'); +})->purpose('Display an inspiring quote'); From aea6bced69c0aa79156305075b968591605a6dbb Mon Sep 17 00:00:00 2001 From: Joao Patricio Date: Tue, 23 May 2023 12:32:11 +0100 Subject: [PATCH 2/7] wip --- .../Settings/DiscordNotifications.php | 2 +- .../Livewire/Settings/EmailNotifications.php | 2 +- app/Mail/ExampleMail.php | 53 +++++++++++++++++++ app/Notifications/TestMessage.php | 19 +++++++ docker-compose.dev.yml | 2 - resources/views/emails/example.blade.php | 1 + .../settings/email-notifications.blade.php | 5 +- resources/views/settings.blade.php | 4 +- routes/console.php | 17 +++--- 9 files changed, 92 insertions(+), 13 deletions(-) create mode 100644 app/Mail/ExampleMail.php create mode 100644 resources/views/emails/example.blade.php diff --git a/app/Http/Livewire/Settings/DiscordNotifications.php b/app/Http/Livewire/Settings/DiscordNotifications.php index 01388a238..4227c2276 100644 --- a/app/Http/Livewire/Settings/DiscordNotifications.php +++ b/app/Http/Livewire/Settings/DiscordNotifications.php @@ -29,7 +29,7 @@ class DiscordNotifications extends Component } public function sentTestMessage() { - // @TODO figure out how to do it in runtime + Notification::send(auth()->user(), new TestMessage); } public function render() { diff --git a/app/Http/Livewire/Settings/EmailNotifications.php b/app/Http/Livewire/Settings/EmailNotifications.php index 639fb11cd..b1bca81c8 100644 --- a/app/Http/Livewire/Settings/EmailNotifications.php +++ b/app/Http/Livewire/Settings/EmailNotifications.php @@ -40,7 +40,7 @@ class EmailNotifications extends Component } public function sentTestMessage() { - Notification::send(auth()->user(), new TestMessage); + } public function render() { diff --git a/app/Mail/ExampleMail.php b/app/Mail/ExampleMail.php new file mode 100644 index 000000000..0167b26e1 --- /dev/null +++ b/app/Mail/ExampleMail.php @@ -0,0 +1,53 @@ + + */ + public function attachments(): array + { + return []; + } +} diff --git a/app/Notifications/TestMessage.php b/app/Notifications/TestMessage.php index 8e8929f10..717f6ce08 100644 --- a/app/Notifications/TestMessage.php +++ b/app/Notifications/TestMessage.php @@ -35,6 +35,24 @@ class TestMessage extends Notification */ public function toMail(object $notifiable): MailMessage { + $smtp = [ + "transport" => "smtp", + "host" => "mailpit", + "port" => 1025, + "encryption" => 'tls', + "username" => null, + "password" => null, + "timeout" => null, + "local_domain" => null, + ]; + config()->set('mail.mailers.smtp', $smtp); + + \Illuminate\Support\Facades\Mail::mailer('smtp') + ->to('ask@me.com') + ->send(new \App\Mail\ExampleMail); + + + return (new MailMessage) ->line('Welcome to Coolify!') ->action('Go to dashboard', url('/')) @@ -43,6 +61,7 @@ class TestMessage extends Notification public function toDiscord(object $notifiable): string { + ray('1111'); return 'Welcome to Coolify! We need your attention for disk usage. [Go to dashboard]('.url('/').')'; } diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 76065370c..4a9b3c0f9 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -21,8 +21,6 @@ services: SSL_MODE: "off" AUTORUN_LARAVEL_STORAGE_LINK: "false" AUTORUN_LARAVEL_MIGRATION: "false" - env_file: - - .env volumes: - .:/var/www/html/:cached postgres: diff --git a/resources/views/emails/example.blade.php b/resources/views/emails/example.blade.php new file mode 100644 index 000000000..bbfbe24b1 --- /dev/null +++ b/resources/views/emails/example.blade.php @@ -0,0 +1 @@ +Hello I am an example diff --git a/resources/views/livewire/settings/email-notifications.blade.php b/resources/views/livewire/settings/email-notifications.blade.php index 6bfc53506..4f3af4156 100644 --- a/resources/views/livewire/settings/email-notifications.blade.php +++ b/resources/views/livewire/settings/email-notifications.blade.php @@ -12,10 +12,13 @@ -
+
Submit +
+
+ Send test message diff --git a/resources/views/settings.blade.php b/resources/views/settings.blade.php index f0155603d..dbd8588f1 100644 --- a/resources/views/settings.blade.php +++ b/resources/views/settings.blade.php @@ -4,9 +4,11 @@

General

-
+

Notifications

+ +
diff --git a/routes/console.php b/routes/console.php index 34f661adb..2de1715be 100644 --- a/routes/console.php +++ b/routes/console.php @@ -1,6 +1,7 @@ set('mail.mailers.smtp', $smtp); -// \Illuminate\Support\Facades\Mail::mailer('smtp') -// ->to('ask@me.com') -// ->send(new \App\Mail\TestMail); + // For testing custom SMTP Mailer + \Illuminate\Support\Facades\Mail::mailer('smtp') + ->to('ask@me.com') + ->send(new \App\Mail\ExampleMail); - \Illuminate\Support\Facades\Notification::send( - \App\Models\User::find(1), - new \App\Notifications\TestMessage - ); + // For sending a notification +// \Illuminate\Support\Facades\Notification::send( +// \App\Models\User::find(1), +// new \App\Notifications\TestMessage +// ); })->purpose('Display an inspiring quote'); From f23a760aac980a1da1cabad74687fc116c73dd04 Mon Sep 17 00:00:00 2001 From: Joao Patricio Date: Thu, 25 May 2023 17:27:52 +0100 Subject: [PATCH 3/7] Sending e-mails and settings on Team. --- app/Console/Commands/NotifyDemo.php | 75 +++++++++++++++++++ .../Notifications/DiscordSettings.php | 43 +++++++++++ .../Livewire/Notifications/EmailSettings.php | 53 +++++++++++++ .../Settings/DiscordNotifications.php | 38 ---------- .../Livewire/Settings/EmailNotifications.php | 49 ------------ app/Mail/ExampleMail.php | 53 ------------- app/Models/InstanceSettings.php | 11 --- app/Models/Team.php | 35 ++++++++- .../Channels/CoolifyEmailChannel.php | 41 ++++++++++ app/Notifications/Channels/DiscordChannel.php | 8 +- .../Channels/SendsCoolifyEmail.php | 8 ++ app/Notifications/Channels/SendsDiscord.php | 8 ++ .../{TestMessage.php => DemoNotification.php} | 29 ++----- app/Providers/AppServiceProvider.php | 6 -- .../2023_03_20_112811_create_teams_table.php | 1 + ..._112813_create_instance_settings_table.php | 5 -- .../notifications/discord-settings.blade.php | 23 ++++++ .../notifications/email-settings.blade.php | 43 +++++++++++ .../settings/discord-notifications.blade.php | 15 ---- .../settings/email-notifications.blade.php | 27 ------- resources/views/settings.blade.php | 7 -- resources/views/team.blade.php | 6 +- routes/console.php | 27 +------ 23 files changed, 344 insertions(+), 267 deletions(-) create mode 100644 app/Console/Commands/NotifyDemo.php create mode 100644 app/Http/Livewire/Notifications/DiscordSettings.php create mode 100644 app/Http/Livewire/Notifications/EmailSettings.php delete mode 100644 app/Http/Livewire/Settings/DiscordNotifications.php delete mode 100644 app/Http/Livewire/Settings/EmailNotifications.php delete mode 100644 app/Mail/ExampleMail.php create mode 100644 app/Notifications/Channels/CoolifyEmailChannel.php create mode 100644 app/Notifications/Channels/SendsCoolifyEmail.php create mode 100644 app/Notifications/Channels/SendsDiscord.php rename app/Notifications/{TestMessage.php => DemoNotification.php} (69%) create mode 100644 resources/views/livewire/notifications/discord-settings.blade.php create mode 100644 resources/views/livewire/notifications/email-settings.blade.php delete mode 100644 resources/views/livewire/settings/discord-notifications.blade.php delete mode 100644 resources/views/livewire/settings/email-notifications.blade.php diff --git a/app/Console/Commands/NotifyDemo.php b/app/Console/Commands/NotifyDemo.php new file mode 100644 index 000000000..1d5906bd0 --- /dev/null +++ b/app/Console/Commands/NotifyDemo.php @@ -0,0 +1,75 @@ +argument('channel'); + + if (blank($channel)) { + $this->showHelp(); + return; + } + + ray($channel); + } + + private function showHelp() + { + style('coolify')->color('#9333EA'); + style('title-box')->apply('mt-1 px-2 py-1 bg-coolify'); + + render(<<<'HTML' +
+
+ Coolify +
+

+ Demo Notify => Send a demo notification to a given channel. +

+

+ php artisan app:demo-notify {channel} +

+
+
Channels:
+
    +
  • email
  • +
  • slack
  • +
  • discord
  • +
  • telegram
  • +
+
+
+ HTML); + + ask(<<<'HTML' +
+ In which manner you wish a coolified notification? +
+ HTML, ['email', 'slack', 'discord', 'telegram']); + } +} diff --git a/app/Http/Livewire/Notifications/DiscordSettings.php b/app/Http/Livewire/Notifications/DiscordSettings.php new file mode 100644 index 000000000..fe689d4b2 --- /dev/null +++ b/app/Http/Livewire/Notifications/DiscordSettings.php @@ -0,0 +1,43 @@ + 'nullable|url', + 'model.extra_attributes.discord_active' => 'nullable|boolean', + ]; + protected $validationAttributes = [ + 'model.extra_attributes.discord_webhook' => 'Discord Webhook', + ]; + public function mount($model) + { + // + } + public function submit() + { + $this->resetErrorBag(); + $this->validate(); + $this->model->save(); + if ( is_a($this->model, Team::class)) { + session(['currentTeam' => $this->model]); + } + } + public function sentTestMessage() + { + Notification::send($this->model, new DemoNotification); + } + public function render() + { + return view('livewire.notifications.discord-settings'); + } +} diff --git a/app/Http/Livewire/Notifications/EmailSettings.php b/app/Http/Livewire/Notifications/EmailSettings.php new file mode 100644 index 000000000..caeeca2b8 --- /dev/null +++ b/app/Http/Livewire/Notifications/EmailSettings.php @@ -0,0 +1,53 @@ + 'nullable|boolean', + 'model.extra_attributes.recipients' => 'nullable', + 'model.extra_attributes.smtp_host' => 'nullable', + 'model.extra_attributes.smtp_port' => 'nullable', + 'model.extra_attributes.smtp_encryption' => 'nullable', + 'model.extra_attributes.smtp_username' => 'nullable', + 'model.extra_attributes.smtp_password' => 'nullable', + 'model.extra_attributes.smtp_timeout' => 'nullable', + ]; + protected $validationAttributes = [ + 'model.extra_attributes.recipients' => 'Recipients', + 'model.extra_attributes.smtp_host' => 'Host', + 'model.extra_attributes.smtp_port' => 'Port', + 'model.extra_attributes.smtp_encryption' => 'Encryption', + 'model.extra_attributes.smtp_username' => 'Username', + 'model.extra_attributes.smtp_password' => 'Password', + 'model.extra_attributes.smtp_timeout' => 'Timeout', + ]; + public function mount($model) + { + // + } + public function submit() + { + $this->resetErrorBag(); + $this->validate(); + $this->model->save(); + if ( is_a($this->model, Team::class)) { + session(['currentTeam' => $this->model]); + } + } + public function sendTestNotification() + { + + } + public function render() + { + return view('livewire.notifications.email-settings'); + } +} diff --git a/app/Http/Livewire/Settings/DiscordNotifications.php b/app/Http/Livewire/Settings/DiscordNotifications.php deleted file mode 100644 index 4227c2276..000000000 --- a/app/Http/Livewire/Settings/DiscordNotifications.php +++ /dev/null @@ -1,38 +0,0 @@ - 'nullable|url', - ]; - protected $validationAttributes = [ - 'settings.extra_attributes.discord_webhook' => 'Discord Webhook', - ]; - public function mount($settings) - { - // - } - public function submit() - { - $this->resetErrorBag(); - $this->validate(); - $this->settings->save(); - } - public function sentTestMessage() - { - Notification::send(auth()->user(), new TestMessage); - } - public function render() - { - return view('livewire.settings.discord-notifications'); - } -} diff --git a/app/Http/Livewire/Settings/EmailNotifications.php b/app/Http/Livewire/Settings/EmailNotifications.php deleted file mode 100644 index b1bca81c8..000000000 --- a/app/Http/Livewire/Settings/EmailNotifications.php +++ /dev/null @@ -1,49 +0,0 @@ - 'nullable', - 'settings.extra_attributes.smtp_port' => 'nullable', - 'settings.extra_attributes.smtp_encryption' => 'nullable', - 'settings.extra_attributes.smtp_username' => 'nullable', - 'settings.extra_attributes.smtp_password' => 'nullable', - 'settings.extra_attributes.smtp_timeout' => 'nullable', - ]; - protected $validationAttributes = [ - 'settings.extra_attributes.smtp_host' => 'Host', - 'settings.extra_attributes.smtp_port' => 'Port', - 'settings.extra_attributes.smtp_encryption' => 'Encryption', - 'settings.extra_attributes.smtp_username' => 'Username', - 'settings.extra_attributes.smtp_password' => 'Password', - 'settings.extra_attributes.smtp_timeout' => 'Timeout', - ]; - public function mount($settings) - { - ray($settings); - // - } - public function submit() - { - $this->resetErrorBag(); - $this->validate(); - $this->settings->save(); - } - public function sentTestMessage() - { - - } - public function render() - { - return view('livewire.settings.email-notifications'); - } -} diff --git a/app/Mail/ExampleMail.php b/app/Mail/ExampleMail.php deleted file mode 100644 index 0167b26e1..000000000 --- a/app/Mail/ExampleMail.php +++ /dev/null @@ -1,53 +0,0 @@ - - */ - public function attachments(): array - { - return []; - } -} diff --git a/app/Models/InstanceSettings.php b/app/Models/InstanceSettings.php index 445d07477..c2394a008 100644 --- a/app/Models/InstanceSettings.php +++ b/app/Models/InstanceSettings.php @@ -2,21 +2,10 @@ namespace App\Models; -use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; -use Spatie\SchemalessAttributes\Casts\SchemalessAttributes; class InstanceSettings extends Model { - public $casts = [ - 'extra_attributes' => SchemalessAttributes::class, - ]; - - public function scopeWithExtraAttributes(): Builder - { - return $this->extra_attributes->modelScope(); - } - public static function get() { return InstanceSettings::findOrFail(0); diff --git a/app/Models/Team.php b/app/Models/Team.php index aaadcbb5a..fd5a0f06e 100644 --- a/app/Models/Team.php +++ b/app/Models/Team.php @@ -2,28 +2,59 @@ namespace App\Models; -class Team extends BaseModel +use App\Notifications\Channels\SendsCoolifyEmail; +use App\Notifications\Channels\SendsDiscord; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Notifications\Notifiable; +use Spatie\SchemalessAttributes\Casts\SchemalessAttributes; + +class Team extends BaseModel implements SendsDiscord, SendsCoolifyEmail { + use Notifiable; + protected $casts = [ + 'extra_attributes' => SchemalessAttributes::class, 'personal_team' => 'boolean', ]; protected $fillable = [ 'id', 'name', - 'personal_team' + 'personal_team', + 'extra_attributes', ]; + + public function routeNotificationForDiscord() + { + return $this->extra_attributes->get('discord_webhook'); + } + + public function routeNotificationForCoolifyEmail() + { + $recipients = $this->extra_attributes->get('recipients', ''); + + return explode(PHP_EOL, $recipients); + } + + public function scopeWithExtraAttributes(): Builder + { + return $this->extra_attributes->modelScope(); + } + public function projects() { return $this->hasMany(Project::class); } + public function servers() { return $this->hasMany(Server::class); } + public function applications() { return $this->hasManyThrough(Application::class, Project::class); } + public function privateKeys() { return $this->hasMany(PrivateKey::class); diff --git a/app/Notifications/Channels/CoolifyEmailChannel.php b/app/Notifications/Channels/CoolifyEmailChannel.php new file mode 100644 index 000000000..a32b58381 --- /dev/null +++ b/app/Notifications/Channels/CoolifyEmailChannel.php @@ -0,0 +1,41 @@ +bootConfigs($notifiable); + $bcc = $notifiable->routeNotificationForCoolifyEmail(); + $mailMessage = $notification->toMail($notifiable); + + Mail::send([], [], fn(Message $message) => $message + ->from('ask@me.com', 'My Coolify Instance') + ->bcc($bcc) + ->subject($mailMessage->subject) + ->html((string) $mailMessage->render()) + ); + } + + private function bootConfigs($notifiable): void + { + config()->set('mail.mailers.smtp', [ + "transport" => "smtp", + "host" => $notifiable->extra_attributes?->get('smtp_host'), + "port" => $notifiable->extra_attributes?->get('smtp_port'), + "encryption" => $notifiable->extra_attributes?->get('smtp_encryption'), + "username" => $notifiable->extra_attributes?->get('smtp_username'), + "password" => $notifiable->extra_attributes?->get('smtp_password'), + "timeout" => $notifiable->extra_attributes?->get('smtp_timeout'), + "local_domain" => null, + ]); + } +} diff --git a/app/Notifications/Channels/DiscordChannel.php b/app/Notifications/Channels/DiscordChannel.php index 77709ec0b..06c8c0130 100644 --- a/app/Notifications/Channels/DiscordChannel.php +++ b/app/Notifications/Channels/DiscordChannel.php @@ -3,7 +3,6 @@ namespace App\Notifications\Channels; use App\Jobs\SendMessageToDiscordJob; -use App\Models\InstanceSettings; use Illuminate\Notifications\Notification; class DiscordChannel @@ -11,14 +10,11 @@ class DiscordChannel /** * Send the given notification. */ - public function send(object $notifiable, Notification $notification): void + public function send(SendsDiscord $notifiable, Notification $notification): void { $message = $notification->toDiscord($notifiable); - $webhookUrl = data_get( - InstanceSettings::get(), - 'extra_attributes.discord_webhook' - ); + $webhookUrl = $notifiable->routeNotificationForDiscord(); dispatch(new SendMessageToDiscordJob($message, $webhookUrl)); } diff --git a/app/Notifications/Channels/SendsCoolifyEmail.php b/app/Notifications/Channels/SendsCoolifyEmail.php new file mode 100644 index 000000000..e1698a1fe --- /dev/null +++ b/app/Notifications/Channels/SendsCoolifyEmail.php @@ -0,0 +1,8 @@ +extra_attributes?->get('smtp_active') && $channels[] = CoolifyEmailChannel::class; + $notifiable->extra_attributes?->get('discord_active') && $channels[] = DiscordChannel::class; + return $channels; } /** @@ -35,33 +39,16 @@ class TestMessage extends Notification */ public function toMail(object $notifiable): MailMessage { - $smtp = [ - "transport" => "smtp", - "host" => "mailpit", - "port" => 1025, - "encryption" => 'tls', - "username" => null, - "password" => null, - "timeout" => null, - "local_domain" => null, - ]; - config()->set('mail.mailers.smtp', $smtp); - - \Illuminate\Support\Facades\Mail::mailer('smtp') - ->to('ask@me.com') - ->send(new \App\Mail\ExampleMail); - - - return (new MailMessage) + ->subject('Coolify demo notification') ->line('Welcome to Coolify!') + ->error() ->action('Go to dashboard', url('/')) ->line('We need your attention for disk usage.'); } public function toDiscord(object $notifiable): string { - ray('1111'); return 'Welcome to Coolify! We need your attention for disk usage. [Go to dashboard]('.url('/').')'; } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 3129c24ce..be599237a 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -3,13 +3,11 @@ namespace App\Providers; use App\Jobs\CoolifyTask; -use Illuminate\Mail\MailManager; use Illuminate\Queue\Events\JobProcessed; use Illuminate\Support\Facades\Process; use Illuminate\Support\Facades\Queue; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Str; -use Symfony\Component\Mailer\Transport\Smtp\SmtpTransport; class AppServiceProvider extends ServiceProvider { @@ -28,10 +26,6 @@ class AppServiceProvider extends ServiceProvider */ public function boot(): void { - if (! $this->app->environment('production')) { - \Illuminate\Support\Facades\Mail::alwaysTo('noone@example.com'); - } - Queue::after(function (JobProcessed $event) { // @TODO: Remove `coolify-builder` container after the remoteProcess job is finishged and remoteProcess->type == `deployment`. if ($event->job->resolveName() === CoolifyTask::class) { diff --git a/database/migrations/2023_03_20_112811_create_teams_table.php b/database/migrations/2023_03_20_112811_create_teams_table.php index 77e7b840f..4396c8db7 100644 --- a/database/migrations/2023_03_20_112811_create_teams_table.php +++ b/database/migrations/2023_03_20_112811_create_teams_table.php @@ -16,6 +16,7 @@ return new class extends Migration $table->string('uuid')->unique(); $table->string('name'); $table->boolean('personal_team')->default(false); + $table->schemalessAttributes('extra_attributes'); $table->timestamps(); }); } diff --git a/database/migrations/2023_03_20_112813_create_instance_settings_table.php b/database/migrations/2023_03_20_112813_create_instance_settings_table.php index 2d1826d30..a09288e21 100644 --- a/database/migrations/2023_03_20_112813_create_instance_settings_table.php +++ b/database/migrations/2023_03_20_112813_create_instance_settings_table.php @@ -20,16 +20,11 @@ return new class extends Migration $table->integer('public_port_min')->default(9000); $table->integer('public_port_max')->default(9100); // $table->string('custom_dns_servers')->default('1.1.1.1,8.8.8.8'); - $table->boolean('do_not_track')->default(false); - $table->boolean('is_auto_update_enabled')->default(true); // $table->boolean('is_dns_check_enabled')->default(true); $table->boolean('is_registration_enabled')->default(true); $table->boolean('is_https_forced')->default(true); - - $table->schemalessAttributes('extra_attributes'); - $table->timestamps(); }); } diff --git a/resources/views/livewire/notifications/discord-settings.blade.php b/resources/views/livewire/notifications/discord-settings.blade.php new file mode 100644 index 000000000..730293f2d --- /dev/null +++ b/resources/views/livewire/notifications/discord-settings.blade.php @@ -0,0 +1,23 @@ +
+
Discord
+
+
+
+ +
+
+ +
+
+ + Submit + + + Send test message + +
+
+
diff --git a/resources/views/livewire/notifications/email-settings.blade.php b/resources/views/livewire/notifications/email-settings.blade.php new file mode 100644 index 000000000..a87b10abb --- /dev/null +++ b/resources/views/livewire/notifications/email-settings.blade.php @@ -0,0 +1,43 @@ +
+
E-mail - SMTP
+
+
+
+ +
+
+
+ +
+
+
+
+ + + +
+
+ + + +
+
+ +
+
+
+ + Submit + + + Send test message + +
+
+
diff --git a/resources/views/livewire/settings/discord-notifications.blade.php b/resources/views/livewire/settings/discord-notifications.blade.php deleted file mode 100644 index d13e26e27..000000000 --- a/resources/views/livewire/settings/discord-notifications.blade.php +++ /dev/null @@ -1,15 +0,0 @@ -
-
-
- -
-
- - Submit - - - Send test message - -
-
-
diff --git a/resources/views/livewire/settings/email-notifications.blade.php b/resources/views/livewire/settings/email-notifications.blade.php deleted file mode 100644 index 4f3af4156..000000000 --- a/resources/views/livewire/settings/email-notifications.blade.php +++ /dev/null @@ -1,27 +0,0 @@ -
-
-
-
- - - -
-
- - - -
-
-
- - Submit - -
-
- - - Send test message - -
-
-
diff --git a/resources/views/settings.blade.php b/resources/views/settings.blade.php index dbd8588f1..847b84673 100644 --- a/resources/views/settings.blade.php +++ b/resources/views/settings.blade.php @@ -4,11 +4,4 @@

General

-
- -

Notifications

- - - -
diff --git a/resources/views/team.blade.php b/resources/views/team.blade.php index 135c131d8..0cc1cf511 100644 --- a/resources/views/team.blade.php +++ b/resources/views/team.blade.php @@ -3,6 +3,10 @@

Current Team

Name: {{ session('currentTeam.name') }}

- +
+

Notifications

+ + +
diff --git a/routes/console.php b/routes/console.php index 2de1715be..e05f4c9a1 100644 --- a/routes/console.php +++ b/routes/console.php @@ -1,9 +1,7 @@ "smtp", - "host" => "mailpit", - "port" => 1025, - "encryption" => 'tls', - "username" => null, - "password" => null, - "timeout" => null, - "local_domain" => null, - ]; - config()->set('mail.mailers.smtp', $smtp); - - // For testing custom SMTP Mailer - \Illuminate\Support\Facades\Mail::mailer('smtp') - ->to('ask@me.com') - ->send(new \App\Mail\ExampleMail); - - // For sending a notification -// \Illuminate\Support\Facades\Notification::send( -// \App\Models\User::find(1), -// new \App\Notifications\TestMessage -// ); - + $this->comment(Inspiring::quote()); })->purpose('Display an inspiring quote'); From ec867335d51ebdfeaeb19dacbd81a9448e18530a Mon Sep 17 00:00:00 2001 From: Joao Patricio Date: Thu, 25 May 2023 17:32:23 +0100 Subject: [PATCH 4/7] Sending e-mails and settings on Team. --- app/Http/Livewire/Notifications/EmailSettings.php | 4 ++++ app/Notifications/Channels/CoolifyEmailChannel.php | 7 +++++-- .../views/livewire/notifications/email-settings.blade.php | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/Http/Livewire/Notifications/EmailSettings.php b/app/Http/Livewire/Notifications/EmailSettings.php index caeeca2b8..4fe67c24e 100644 --- a/app/Http/Livewire/Notifications/EmailSettings.php +++ b/app/Http/Livewire/Notifications/EmailSettings.php @@ -12,6 +12,8 @@ class EmailSettings extends Component protected $rules = [ 'model.extra_attributes.smtp_active' => 'nullable|boolean', + 'model.extra_attributes.from_address' => 'nullable', + 'model.extra_attributes.from_name' => 'nullable', 'model.extra_attributes.recipients' => 'nullable', 'model.extra_attributes.smtp_host' => 'nullable', 'model.extra_attributes.smtp_port' => 'nullable', @@ -21,6 +23,8 @@ class EmailSettings extends Component 'model.extra_attributes.smtp_timeout' => 'nullable', ]; protected $validationAttributes = [ + 'model.extra_attributes.from_address' => 'From Address', + 'model.extra_attributes.from_name' => 'From Name', 'model.extra_attributes.recipients' => 'Recipients', 'model.extra_attributes.smtp_host' => 'Host', 'model.extra_attributes.smtp_port' => 'Port', diff --git a/app/Notifications/Channels/CoolifyEmailChannel.php b/app/Notifications/Channels/CoolifyEmailChannel.php index a32b58381..3f122070f 100644 --- a/app/Notifications/Channels/CoolifyEmailChannel.php +++ b/app/Notifications/Channels/CoolifyEmailChannel.php @@ -18,10 +18,13 @@ class CoolifyEmailChannel $mailMessage = $notification->toMail($notifiable); Mail::send([], [], fn(Message $message) => $message - ->from('ask@me.com', 'My Coolify Instance') + ->from( + $notifiable->extra_attributes?->get('from_address'), + $notifiable->extra_attributes?->get('from_name') + ) ->bcc($bcc) ->subject($mailMessage->subject) - ->html((string) $mailMessage->render()) + ->html((string)$mailMessage->render()) ); } diff --git a/resources/views/livewire/notifications/email-settings.blade.php b/resources/views/livewire/notifications/email-settings.blade.php index a87b10abb..dbcf16c3b 100644 --- a/resources/views/livewire/notifications/email-settings.blade.php +++ b/resources/views/livewire/notifications/email-settings.blade.php @@ -25,6 +25,8 @@
+ +
From af9240240db99d6955b2606a8ceb20d7d4d20504 Mon Sep 17 00:00:00 2001 From: Joao Patricio Date: Thu, 25 May 2023 17:32:49 +0100 Subject: [PATCH 5/7] Sending e-mails and settings on Team. --- app/Notifications/DemoNotification.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Notifications/DemoNotification.php b/app/Notifications/DemoNotification.php index 264245458..7e5c14bcf 100644 --- a/app/Notifications/DemoNotification.php +++ b/app/Notifications/DemoNotification.php @@ -42,7 +42,6 @@ class DemoNotification extends Notification implements ShouldQueue return (new MailMessage) ->subject('Coolify demo notification') ->line('Welcome to Coolify!') - ->error() ->action('Go to dashboard', url('/')) ->line('We need your attention for disk usage.'); } From 18c69d731ce7e68748afe1dad5547d1c39019a0e Mon Sep 17 00:00:00 2001 From: Joao Patricio Date: Thu, 25 May 2023 17:44:24 +0100 Subject: [PATCH 6/7] Sending e-mails and settings on Team. --- app/Http/Livewire/Notifications/DiscordSettings.php | 2 +- app/Http/Livewire/Notifications/EmailSettings.php | 4 +++- .../views/livewire/notifications/discord-settings.blade.php | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/Http/Livewire/Notifications/DiscordSettings.php b/app/Http/Livewire/Notifications/DiscordSettings.php index fe689d4b2..239d080a6 100644 --- a/app/Http/Livewire/Notifications/DiscordSettings.php +++ b/app/Http/Livewire/Notifications/DiscordSettings.php @@ -32,7 +32,7 @@ class DiscordSettings extends Component session(['currentTeam' => $this->model]); } } - public function sentTestMessage() + public function sendTestNotification() { Notification::send($this->model, new DemoNotification); } diff --git a/app/Http/Livewire/Notifications/EmailSettings.php b/app/Http/Livewire/Notifications/EmailSettings.php index 4fe67c24e..26f955925 100644 --- a/app/Http/Livewire/Notifications/EmailSettings.php +++ b/app/Http/Livewire/Notifications/EmailSettings.php @@ -4,6 +4,8 @@ namespace App\Http\Livewire\Notifications; use App\Models\Server; use App\Models\Team; +use App\Notifications\DemoNotification; +use Illuminate\Support\Facades\Notification; use Livewire\Component; class EmailSettings extends Component @@ -48,7 +50,7 @@ class EmailSettings extends Component } public function sendTestNotification() { - + Notification::send($this->model, new DemoNotification); } public function render() { diff --git a/resources/views/livewire/notifications/discord-settings.blade.php b/resources/views/livewire/notifications/discord-settings.blade.php index 730293f2d..9a1980d6f 100644 --- a/resources/views/livewire/notifications/discord-settings.blade.php +++ b/resources/views/livewire/notifications/discord-settings.blade.php @@ -14,7 +14,7 @@ Send test message From 7138eb4b691f1e0b5f905929bec1b5517e76ae67 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Thu, 1 Jun 2023 08:22:13 +0200 Subject: [PATCH 7/7] merge --- .../views/components/inputs/button.blade.php | 30 ------------------- 1 file changed, 30 deletions(-) delete mode 100644 resources/views/components/inputs/button.blade.php diff --git a/resources/views/components/inputs/button.blade.php b/resources/views/components/inputs/button.blade.php deleted file mode 100644 index d09fb0cd7..000000000 --- a/resources/views/components/inputs/button.blade.php +++ /dev/null @@ -1,30 +0,0 @@ -@props([ - 'type' => $attributes->get('type') ?? 'button', - 'disabled' => null, - 'confirm' => null, - 'confirmAction' => null, -]) -@if ($type === 'submit') - -@elseif($type === 'button') - -@endif