Files
SonarDesk-Licencing-Server/app/Services/Accounts/PurchasedAccountProvisioner.php
T
2026-09-30 11:47:04 +01:00

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);
}
}