914b7f97f3
Two-step flow: request a one-time code by email/phone (RegistrationVerification, mailed via RegistrationCodeMail, rate-limited by the new api-otp limiter keyed to the identifier), then verify the code and register with RegistrationController. User gains a phone column/fillable.
58 lines
1.4 KiB
PHP
58 lines
1.4 KiB
PHP
<?php
|
|
|
|
namespace Modules\Identity\Database\Factories;
|
|
|
|
use Illuminate\Database\Eloquent\Factories\Factory;
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Modules\Identity\Models\RegistrationVerification;
|
|
|
|
/**
|
|
* @extends Factory<RegistrationVerification>
|
|
*/
|
|
class RegistrationVerificationFactory extends Factory
|
|
{
|
|
protected $model = RegistrationVerification::class;
|
|
|
|
/**
|
|
* Define the model's default state.
|
|
*
|
|
* @return array<string, mixed>
|
|
*/
|
|
public function definition(): array
|
|
{
|
|
return [
|
|
'identifier' => fake()->unique()->safeEmail(),
|
|
'type' => 'email',
|
|
'code' => Hash::make('123456'),
|
|
'attempts' => 0,
|
|
'verified_at' => null,
|
|
'verification_token' => null,
|
|
'consumed_at' => null,
|
|
'expires_at' => now()->addMinutes(10),
|
|
];
|
|
}
|
|
|
|
public function phone(): self
|
|
{
|
|
return $this->state(fn (array $attributes) => [
|
|
'identifier' => fake()->numerify('+959#########'),
|
|
'type' => 'phone',
|
|
]);
|
|
}
|
|
|
|
public function verified(): self
|
|
{
|
|
return $this->state(fn (array $attributes) => [
|
|
'verified_at' => now(),
|
|
'verification_token' => str()->random(64),
|
|
]);
|
|
}
|
|
|
|
public function expired(): self
|
|
{
|
|
return $this->state(fn (array $attributes) => [
|
|
'expires_at' => now()->subMinute(),
|
|
]);
|
|
}
|
|
}
|