54 lines
1.5 KiB
PHP
54 lines
1.5 KiB
PHP
<?php
|
|
|
|
namespace App\Services\Accounts;
|
|
|
|
use App\Models\User;
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\Password;
|
|
use Illuminate\Support\Str;
|
|
|
|
final class PurchasedAccountProvisioner
|
|
{
|
|
public function ensure(?string $email, ?string $name = null, bool $sendSetupLink = true): ?User
|
|
{
|
|
$email = strtolower(trim((string) $email));
|
|
if ($email === '' || ! filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
|
return null;
|
|
}
|
|
|
|
$user = User::query()->whereRaw('lower(email) = ?', [$email])->first();
|
|
if ($user) {
|
|
return $user;
|
|
}
|
|
|
|
$user = User::create([
|
|
'name' => $this->displayName($name, $email),
|
|
'email' => $email,
|
|
'email_verified_at' => now(),
|
|
'password' => Str::random(64),
|
|
'is_admin' => false,
|
|
]);
|
|
|
|
if ($sendSetupLink) {
|
|
DB::afterCommit(static function () use ($email): void {
|
|
Password::sendResetLink(['email' => $email]);
|
|
});
|
|
}
|
|
|
|
return $user;
|
|
}
|
|
|
|
private function displayName(?string $name, string $email): string
|
|
{
|
|
$name = trim((string) $name);
|
|
if ($name !== '') {
|
|
return mb_substr($name, 0, 120);
|
|
}
|
|
|
|
$localPart = strstr($email, '@', true) ?: 'SonarDesk Customer';
|
|
$localPart = trim(str_replace(['.', '_', '-'], ' ', $localPart));
|
|
|
|
return mb_substr($localPart !== '' ? ucwords($localPart) : 'SonarDesk Customer', 0, 120);
|
|
}
|
|
}
|