<?php
namespace App\Values\User;
use App\Enums\Acl\Role;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Support\Facades\Hash;
final readonly class UserCreateData implements Arrayable
{
public string $password;
public function __construct(
public string $name,
public string $email,
?string $plainTextPassword,
public Role $role,
public ?string $avatar = null,
public ?string $ssoId = null,
public ?string $ssoProvider = null,
) {
if ($ssoProvider) {
SsoUser::assertValidProvider($ssoProvider);
}
$this->password = $plainTextPassword ? Hash::make($plainTextPassword) : '';
}
public static function fromSsoUser(SsoUser $ssoUser): self
{
return new self(
name: $ssoUser->name,
email: $ssoUser->email,
plainTextPassword: '',
role: Role::default(),
avatar: $ssoUser->avatar,
ssoId: $ssoUser->id,
ssoProvider: $ssoUser->provider,
);
}
public static function make(
string $name,
string $email,
?string $plainTextPassword = null,
?Role $role = null,
?string $avatar = null,
?string $ssoId = null,
?string $ssoProvider = null,
): self {
return new self(
name: $name,
email: $email,
plainTextPassword: $plainTextPassword,
role: $role ?? Role::default(),
avatar: $avatar,
ssoId: $ssoId,
ssoProvider: $ssoProvider,
);
}
public function toArray(): array
{
return [
'name' => $this->name,
'email' => $this->email,
'password' => $this->password,
'role' => $this->role->value,
'avatar' => $this->avatar,
'sso_id' => $this->ssoId,
'sso_provider' => $this->ssoProvider,
];
}
}