coolify/app/Console/Commands/TestEmail.php

210 lines
8.1 KiB
PHP
Raw Normal View History

2023-09-01 15:52:18 +02:00
<?php
namespace App\Console\Commands;
use App\Jobs\SendConfirmationForWaitlistJob;
2023-09-01 15:52:18 +02:00
use App\Models\Application;
use App\Models\ApplicationPreview;
use App\Models\ScheduledDatabaseBackup;
use App\Models\StandalonePostgresql;
2023-09-12 12:03:17 +02:00
use App\Models\Team;
2023-09-01 15:52:18 +02:00
use App\Models\TeamInvitation;
use App\Models\User;
use App\Models\Waitlist;
2023-09-01 15:52:18 +02:00
use App\Notifications\Application\DeploymentFailed;
use App\Notifications\Application\DeploymentSuccess;
use App\Notifications\Application\StatusChanged;
use App\Notifications\Database\BackupFailed;
use App\Notifications\Database\BackupSuccess;
use App\Notifications\Test;
use App\Notifications\TransactionalEmails\InvitationLink;
use Exception;
use Illuminate\Console\Command;
use Illuminate\Mail\Message;
use Illuminate\Notifications\Messages\MailMessage;
use Mail;
use Str;
use function Laravel\Prompts\select;
2023-09-08 17:42:08 +02:00
use function Laravel\Prompts\text;
2023-09-01 15:52:18 +02:00
class TestEmail extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
2023-09-08 17:42:08 +02:00
protected $signature = 'email:test';
2023-09-01 15:52:18 +02:00
/**
* The console command description.
*
* @var string
*/
protected $description = 'Send a test email to the admin';
/**
* Execute the console command.
*/
private ?MailMessage $mail = null;
2023-09-08 17:42:08 +02:00
private string $email = 'andras.bacsai@protonmail.com';
2023-09-01 15:52:18 +02:00
public function handle()
{
2023-09-08 17:42:08 +02:00
$type = select(
2023-09-01 15:52:18 +02:00
'Which Email should be sent?',
options: [
'emails-test' => 'Test',
'application-deployment-success' => 'Application - Deployment Success',
'application-deployment-failed' => 'Application - Deployment Failed',
'application-status-changed' => 'Application - Status Changed',
'backup-success' => 'Database - Backup Success',
'backup-failed' => 'Database - Backup Failed',
'invitation-link' => 'Invitation Link',
'waitlist-invitation-link' => 'Waitlist Invitation Link',
'waitlist-confirmation' => 'Waitlist Confirmation',
2023-09-12 12:03:17 +02:00
'realusers-before-trial' => 'REAL - Registered Users Before Trial without Subscription',
2023-09-01 15:52:18 +02:00
],
);
2023-09-12 12:03:17 +02:00
$emailsGathered = ['realusers-before-trial'];
if (!in_array($type, $emailsGathered)) {
$this->email = text('Email Address to send to');
}
2023-09-08 17:42:08 +02:00
set_transanctional_email_settings();
2023-09-01 15:52:18 +02:00
$this->mail = new MailMessage();
$this->mail->subject("Test Email");
2023-09-08 17:42:08 +02:00
switch ($type) {
2023-09-01 15:52:18 +02:00
case 'emails-test':
$this->mail = (new Test())->toMail();
2023-09-08 17:42:08 +02:00
$this->sendEmail();
2023-09-01 15:52:18 +02:00
break;
case 'application-deployment-success':
$application = Application::all()->first();
$this->mail = (new DeploymentSuccess($application, 'test'))->toMail();
$this->sendEmail();
break;
case 'application-deployment-failed':
$application = Application::all()->first();
$preview = ApplicationPreview::all()->first();
if (!$preview) {
$preview = ApplicationPreview::create([
'application_id' => $application->id,
'pull_request_id' => 1,
'pull_request_html_url' => 'http://example.com',
'fqdn' => $application->fqdn,
]);
}
$this->mail = (new DeploymentFailed($application, 'test'))->toMail();
$this->sendEmail();
$this->mail = (new DeploymentFailed($application, 'test', $preview))->toMail();
$this->sendEmail();
break;
case 'application-status-changed':
$application = Application::all()->first();
$this->mail = (new StatusChanged($application))->toMail();
$this->sendEmail();
break;
case 'backup-failed':
$backup = ScheduledDatabaseBackup::all()->first();
$db = StandalonePostgresql::all()->first();
if (!$backup) {
$backup = ScheduledDatabaseBackup::create([
'enabled' => true,
'frequency' => 'daily',
'save_s3' => false,
'database_id' => $db->id,
'database_type' => $db->getMorphClass(),
'team_id' => 0,
]);
}
$output = 'Because of an error, the backup of the database ' . $db->name . ' failed.';
$this->mail = (new BackupFailed($backup, $db, $output))->toMail();
$this->sendEmail();
break;
case 'backup-success':
$backup = ScheduledDatabaseBackup::all()->first();
$db = StandalonePostgresql::all()->first();
if (!$backup) {
$backup = ScheduledDatabaseBackup::create([
'enabled' => true,
'frequency' => 'daily',
'save_s3' => false,
'database_id' => $db->id,
'database_type' => $db->getMorphClass(),
'team_id' => 0,
]);
}
$this->mail = (new BackupSuccess($backup, $db))->toMail();
$this->sendEmail();
break;
case 'invitation-link':
$user = User::all()->first();
$invitation = TeamInvitation::whereEmail($user->email)->first();
if (!$invitation) {
$invitation = TeamInvitation::create([
'uuid' => Str::uuid(),
'email' => $user->email,
'team_id' => 1,
'link' => 'http://example.com',
]);
}
$this->mail = (new InvitationLink($user))->toMail();
$this->sendEmail();
break;
case 'waitlist-invitation-link':
$this->mail = new MailMessage();
$this->mail->view('emails.waitlist-invitation', [
'loginLink' => 'https://coolify.io',
2023-09-01 15:52:18 +02:00
]);
$this->mail->subject('Congratulations! You are invited to join Coolify Cloud.');
$this->sendEmail();
break;
case 'waitlist-confirmation':
$found = Waitlist::where('email', $this->email)->first();
if ($found) {
SendConfirmationForWaitlistJob::dispatch($this->email, $found->uuid);
} else {
throw new Exception('Waitlist not found');
}
2023-09-01 15:52:18 +02:00
break;
2023-09-12 12:03:17 +02:00
case 'realusers-before-trial':
$this->mail = new MailMessage();
$this->mail->view('emails.before-trial-conversion');
$this->mail->subject('Trial period has been added for all subscription plans.');
$teams = Team::doesntHave('subscription')->where('id', '!=', 0)->get();
if (!$teams || $teams->isEmpty()) {
echo 'No teams found.' . PHP_EOL;
return;
}
$emails = [];
foreach ($teams as $team) {
foreach($team->members as $member) {
if ($member->email) {
$emails[] = $member->email;
}
}
}
$emails = array_unique($emails);
foreach ($emails as $email) {
$this->sendEmail($email);
}
2023-09-01 15:52:18 +02:00
}
}
2023-09-12 12:03:17 +02:00
private function sendEmail(string $email = null)
2023-09-01 15:52:18 +02:00
{
2023-09-12 12:03:17 +02:00
if ($email) {
$this->email = $email;
}
2023-09-01 15:52:18 +02:00
Mail::send(
[],
[],
fn (Message $message) => $message
2023-09-08 17:42:08 +02:00
->to($this->email)
2023-09-01 15:52:18 +02:00
->subject($this->mail->subject)
->html((string)$this->mail->render())
);
}
}