115 lines
3.5 KiB
PHP
115 lines
3.5 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Models\User;
|
|
use App\Models\Waitlist;
|
|
use Illuminate\Console\Command;
|
|
use Illuminate\Notifications\Messages\MailMessage;
|
|
use Illuminate\Support\Facades\Crypt;
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Illuminate\Support\Str;
|
|
|
|
class WaitlistInvite extends Command
|
|
{
|
|
public Waitlist|User|null $next_patient = null;
|
|
|
|
public ?string $password = null;
|
|
|
|
/**
|
|
* The name and signature of the console command.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $signature = 'waitlist:invite {--people=1} {--only-email} {email?}';
|
|
|
|
/**
|
|
* The console command description.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $description = 'Send invitation to the next user (or by email) in the waitlist';
|
|
|
|
/**
|
|
* Execute the console command.
|
|
*/
|
|
public function handle()
|
|
{
|
|
$people = $this->option('people');
|
|
for ($i = 0; $i < $people; $i++) {
|
|
$this->main();
|
|
}
|
|
}
|
|
|
|
private function main()
|
|
{
|
|
if ($this->argument('email')) {
|
|
if ($this->option('only-email')) {
|
|
$this->next_patient = User::whereEmail($this->argument('email'))->first();
|
|
$this->password = Str::password();
|
|
$this->next_patient->update([
|
|
'password' => Hash::make($this->password),
|
|
'force_password_reset' => true,
|
|
]);
|
|
} else {
|
|
$this->next_patient = Waitlist::where('email', $this->argument('email'))->first();
|
|
}
|
|
if (! $this->next_patient) {
|
|
$this->error("{$this->argument('email')} not found in the waitlist.");
|
|
|
|
return;
|
|
}
|
|
} else {
|
|
$this->next_patient = Waitlist::orderBy('created_at', 'asc')->where('verified', true)->first();
|
|
}
|
|
if ($this->next_patient) {
|
|
if ($this->option('only-email')) {
|
|
$this->send_email();
|
|
|
|
return;
|
|
}
|
|
$this->register_user();
|
|
$this->remove_from_waitlist();
|
|
$this->send_email();
|
|
} else {
|
|
$this->info('No verified user found in the waitlist. 👀');
|
|
}
|
|
}
|
|
|
|
private function register_user()
|
|
{
|
|
$already_registered = User::whereEmail($this->next_patient->email)->first();
|
|
if (! $already_registered) {
|
|
$this->password = Str::password();
|
|
User::create([
|
|
'name' => Str::of($this->next_patient->email)->before('@'),
|
|
'email' => $this->next_patient->email,
|
|
'password' => Hash::make($this->password),
|
|
'force_password_reset' => true,
|
|
]);
|
|
$this->info("User registered ({$this->next_patient->email}) successfully. 🎉");
|
|
} else {
|
|
throw new \Exception('User already registered');
|
|
}
|
|
}
|
|
|
|
private function remove_from_waitlist()
|
|
{
|
|
$this->next_patient->delete();
|
|
$this->info('User removed from waitlist successfully.');
|
|
}
|
|
|
|
private function send_email()
|
|
{
|
|
$token = Crypt::encryptString("{$this->next_patient->email}@@@$this->password");
|
|
$loginLink = route('auth.link', ['token' => $token]);
|
|
$mail = new MailMessage();
|
|
$mail->view('emails.waitlist-invitation', [
|
|
'loginLink' => $loginLink,
|
|
]);
|
|
$mail->subject('Congratulations! You are invited to join Coolify Cloud.');
|
|
send_user_an_email($mail, $this->next_patient->email);
|
|
$this->info('Email sent successfully. 📧');
|
|
}
|
|
}
|