From bd36149f09b7bc916e0dc27afb623b8f697013d6 Mon Sep 17 00:00:00 2001 From: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com> Date: Mon, 9 Dec 2024 12:33:27 +0100 Subject: [PATCH] feat: use new notification stuff inside team model - Use new notification relationships - Use trait - Make sure that when a new team is created, notification settings are also created - reorder team model for better readability --- app/Models/Team.php | 177 ++++++++++++++++++++------------------------ 1 file changed, 81 insertions(+), 96 deletions(-) diff --git a/app/Models/Team.php b/app/Models/Team.php index 29c469b3b..07424a55f 100644 --- a/app/Models/Team.php +++ b/app/Models/Team.php @@ -5,6 +5,7 @@ namespace App\Models; use App\Notifications\Channels\SendsDiscord; use App\Notifications\Channels\SendsEmail; use App\Notifications\Channels\SendsSlack; +use App\Traits\HasNotificationSettings; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Model; use Illuminate\Notifications\Notifiable; @@ -20,49 +21,8 @@ use OpenApi\Attributes as OA; 'personal_team' => ['type' => 'boolean', 'description' => 'Whether the team is personal or not.'], 'created_at' => ['type' => 'string', 'description' => 'The date and time the team was created.'], 'updated_at' => ['type' => 'string', 'description' => 'The date and time the team was last updated.'], - 'smtp_enabled' => ['type' => 'boolean', 'description' => 'Whether SMTP is enabled or not.'], - 'smtp_from_address' => ['type' => 'string', 'description' => 'The email address to send emails from.'], - 'smtp_from_name' => ['type' => 'string', 'description' => 'The name to send emails from.'], - 'smtp_recipients' => ['type' => 'string', 'description' => 'The email addresses to send emails to.'], - 'smtp_host' => ['type' => 'string', 'description' => 'The SMTP host.'], - 'smtp_port' => ['type' => 'string', 'description' => 'The SMTP port.'], - 'smtp_encryption' => ['type' => 'string', 'description' => 'The SMTP encryption.'], - 'smtp_username' => ['type' => 'string', 'description' => 'The SMTP username.'], - 'smtp_password' => ['type' => 'string', 'description' => 'The SMTP password.'], - 'smtp_timeout' => ['type' => 'string', 'description' => 'The SMTP timeout.'], - 'smtp_notifications_test' => ['type' => 'boolean', 'description' => 'Whether to send test notifications via SMTP.'], - 'smtp_notifications_deployments' => ['type' => 'boolean', 'description' => 'Whether to send deployment notifications via SMTP.'], - 'smtp_notifications_status_changes' => ['type' => 'boolean', 'description' => 'Whether to send status change notifications via SMTP.'], - 'smtp_notifications_scheduled_tasks' => ['type' => 'boolean', 'description' => 'Whether to send scheduled task notifications via SMTP.'], - 'smtp_notifications_database_backups' => ['type' => 'boolean', 'description' => 'Whether to send database backup notifications via SMTP.'], - 'smtp_notifications_server_disk_usage' => ['type' => 'boolean', 'description' => 'Whether to send server disk usage notifications via SMTP.'], - 'discord_enabled' => ['type' => 'boolean', 'description' => 'Whether Discord is enabled or not.'], - 'discord_webhook_url' => ['type' => 'string', 'description' => 'The Discord webhook URL.'], - 'discord_notifications_test' => ['type' => 'boolean', 'description' => 'Whether to send test notifications via Discord.'], - 'discord_notifications_deployments' => ['type' => 'boolean', 'description' => 'Whether to send deployment notifications via Discord.'], - 'discord_notifications_status_changes' => ['type' => 'boolean', 'description' => 'Whether to send status change notifications via Discord.'], - 'discord_notifications_database_backups' => ['type' => 'boolean', 'description' => 'Whether to send database backup notifications via Discord.'], - 'discord_notifications_scheduled_tasks' => ['type' => 'boolean', 'description' => 'Whether to send scheduled task notifications via Discord.'], - 'discord_notifications_server_disk_usage' => ['type' => 'boolean', 'description' => 'Whether to send server disk usage notifications via Discord.'], 'show_boarding' => ['type' => 'boolean', 'description' => 'Whether to show the boarding screen or not.'], - 'resend_enabled' => ['type' => 'boolean', 'description' => 'Whether to enable resending or not.'], - 'resend_api_key' => ['type' => 'string', 'description' => 'The resending API key.'], - 'use_instance_email_settings' => ['type' => 'boolean', 'description' => 'Whether to use instance email settings or not.'], - 'telegram_enabled' => ['type' => 'boolean', 'description' => 'Whether Telegram is enabled or not.'], - 'telegram_token' => ['type' => 'string', 'description' => 'The Telegram token.'], - 'telegram_chat_id' => ['type' => 'string', 'description' => 'The Telegram chat ID.'], - 'telegram_notifications_test' => ['type' => 'boolean', 'description' => 'Whether to send test notifications via Telegram.'], - 'telegram_notifications_deployments' => ['type' => 'boolean', 'description' => 'Whether to send deployment notifications via Telegram.'], - 'telegram_notifications_status_changes' => ['type' => 'boolean', 'description' => 'Whether to send status change notifications via Telegram.'], - 'telegram_notifications_database_backups' => ['type' => 'boolean', 'description' => 'Whether to send database backup notifications via Telegram.'], - 'telegram_notifications_test_message_thread_id' => ['type' => 'string', 'description' => 'The Telegram test message thread ID.'], - 'telegram_notifications_deployments_message_thread_id' => ['type' => 'string', 'description' => 'The Telegram deployment message thread ID.'], - 'telegram_notifications_status_changes_message_thread_id' => ['type' => 'string', 'description' => 'The Telegram status change message thread ID.'], - 'telegram_notifications_database_backups_message_thread_id' => ['type' => 'string', 'description' => 'The Telegram database backup message thread ID.'], - 'custom_server_limit' => ['type' => 'string', 'description' => 'The custom server limit.'], - 'telegram_notifications_scheduled_tasks' => ['type' => 'boolean', 'description' => 'Whether to send scheduled task notifications via Telegram.'], - 'telegram_notifications_scheduled_tasks_thread_id' => ['type' => 'string', 'description' => 'The Telegram scheduled task message thread ID.'], 'members' => new OA\Property( property: 'members', type: 'array', @@ -71,20 +31,26 @@ use OpenApi\Attributes as OA; ), ] )] + class Team extends Model implements SendsDiscord, SendsEmail, SendsSlack { - use Notifiable; + use HasNotificationSettings, Notifiable; protected $guarded = []; protected $casts = [ 'personal_team' => 'boolean', - 'smtp_password' => 'encrypted', - 'resend_api_key' => 'encrypted', ]; protected static function booted() { + static::created(function ($team) { + $team->emailNotificationSettings()->create(); + $team->discordNotificationSettings()->create(); + $team->slackNotificationSettings()->create(); + $team->telegramNotificationSettings()->create(); + }); + static::saving(function ($team) { if (auth()->user()?->isMember()) { throw new \Exception('You are not allowed to update this team.'); @@ -115,34 +81,6 @@ class Team extends Model implements SendsDiscord, SendsEmail, SendsSlack }); } - public function routeNotificationForDiscord() - { - return data_get($this, 'discord_webhook_url', null); - } - - public function routeNotificationForTelegram() - { - return [ - 'token' => data_get($this, 'telegram_token', null), - 'chat_id' => data_get($this, 'telegram_chat_id', null), - ]; - } - - public function routeNotificationForSlack() - { - return data_get($this, 'slack_webhook_url', null); - } - - public function getRecepients($notification) - { - $recipients = data_get($notification, 'emails', null); - if (is_null($recipients)) { - return $this->members()->pluck('email')->toArray(); - } - - return explode(',', $recipients); - } - public static function serverLimitReached() { $serverLimit = Team::serverLimit(); @@ -167,7 +105,7 @@ class Team extends Model implements SendsDiscord, SendsEmail, SendsSlack return 9999999; } $team = Team::find(currentTeam()->id); - if (!$team) { + if (! $team) { return 0; } @@ -196,10 +134,66 @@ class Team extends Model implements SendsDiscord, SendsEmail, SendsSlack return $serverLimit ?? 2; } - ); } + public function routeNotificationForDiscord() + { + return data_get($this, 'discord_webhook_url', null); + } + + public function routeNotificationForTelegram() + { + return [ + 'token' => data_get($this, 'telegram_token', null), + 'chat_id' => data_get($this, 'telegram_chat_id', null), + ]; + } + + public function routeNotificationForSlack() + { + return data_get($this, 'slack_webhook_url', null); + } + + public function getRecipients($notification) + { + $recipients = data_get($notification, 'emails', null); + if (is_null($recipients)) { + return $this->members()->pluck('email')->toArray(); + } + + return explode(',', $recipients); + } + + public function isAnyNotificationEnabled() + { + if (isCloud()) { + return true; + } + + return $this->getNotificationSettings('email')?->isEnabled() || + $this->getNotificationSettings('discord')?->isEnabled() || + $this->getNotificationSettings('slack')?->isEnabled() || + $this->getNotificationSettings('telegram')?->isEnabled(); + } + + public function subscriptionEnded() + { + $this->subscription->update([ + 'stripe_subscription_id' => null, + 'stripe_plan_id' => null, + 'stripe_cancel_at_period_end' => false, + 'stripe_invoice_paid' => false, + 'stripe_trial_already_ended' => false, + ]); + foreach ($this->servers as $server) { + $server->settings()->update([ + 'is_usable' => false, + 'is_reachable' => false, + ]); + } + } + public function environment_variables() { return $this->hasMany(SharedEnvironmentVariable::class)->whereNull('project_id')->whereNull('environment_id'); @@ -263,32 +257,23 @@ class Team extends Model implements SendsDiscord, SendsEmail, SendsSlack return $this->hasMany(S3Storage::class)->where('is_usable', true); } - public function subscriptionEnded() + public function emailNotificationSettings() { - $this->subscription->update([ - 'stripe_subscription_id' => null, - 'stripe_plan_id' => null, - 'stripe_cancel_at_period_end' => false, - 'stripe_invoice_paid' => false, - 'stripe_trial_already_ended' => false, - ]); - foreach ($this->servers as $server) { - $server->settings()->update([ - 'is_usable' => false, - 'is_reachable' => false, - ]); - } + return $this->hasOne(EmailNotificationSettings::class); } - public function isAnyNotificationEnabled() + public function discordNotificationSettings() { - if (isCloud()) { - return true; - } - if ($this->smtp_enabled || $this->resend_enabled || $this->discord_enabled || $this->telegram_enabled || $this->use_instance_email_settings) { - return true; - } + return $this->hasOne(DiscordNotificationSettings::class); + } - return false; + public function telegramNotificationSettings() + { + return $this->hasOne(TelegramNotificationSettings::class); + } + + public function slackNotificationSettings() + { + return $this->hasOne(SlackNotificationSettings::class); } }