ldc-boutique-cnc-sable/app/Console/Commands/UserCreate.php
Jérémy Munsch 85f3896337
fix(commands): update command signatures to include 'uwil' prefix
Updated command signatures for MailTest, SyncProductIncosCommand, and UserCreate to maintain consistency in naming conventions.
2026-10-27 09:59:00 +01:00

139 lines
4 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Console\Commands;
use App\Models\User;
use Domain\Enums\UserRole;
use Illuminate\Console\Attributes\Description;
use Illuminate\Console\Attributes\Signature;
use Illuminate\Console\Command;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rules\Password;
#[Description('creates an admin user upon password entry')]
#[Signature('uwil:user:create')]
class UserCreate extends Command
{
/**
* Execute the console command.
*/
public function handle(): int
{
$firstname = $this->askString('What is the firstname?', 'Equipe');
$lastname = $this->askString('What is the lastname?', 'Web');
$email = $this->askEmail('What is the email?', 'equipe.web@ldc.fr');
$pwd = $this->askPassword('What is the password?');
$role = $this->askRole();
$user = new User();
$user->firstname = $firstname;
$user->lastname = $lastname;
$user->email = $email;
$user->password = Hash::make($pwd);
$user->email_verified_at = now();
$user->role = $role;
$user->save();
$this->info('User created.');
return self::SUCCESS;
}
private function askString(
string $wants,
?string $default
): string {
$response = $this->ask($wants, $default);
$response = is_string($response) ? $response : '';
$strlen = mb_strlen(trim($response));
if ($strlen >= 3 && $strlen <= 255) {
return $response;
}
$this->warn('Answer has to be between 3 and 255 chars');
return $this->askString($wants, $default);
}
private function askEmail(
string $wants,
?string $default
): string {
$response = $this->ask($wants, $default);
$response = is_string($response) ? $response : '';
$validator = Validator::make([
'email' => $response,
], [
'email' => ['required', 'email:rfc,strict,spoof', 'unique:users,email'],
]);
if ($validator->passes()) {
return $response;
}
$this->warn($validator->messages()->first('email'));
return $this->askEmail($wants, $default);
}
private function askPassword(
string $wants
): string {
$response = $this->secret($wants);
$responseConfirmed = $this->secret("Confirm : {$wants}");
$response = is_string($response) ? $response : '';
$responseConfirmed = is_string($responseConfirmed) ? $responseConfirmed : '';
$validator = Validator::make([
'password' => $response,
'password_confirmation' => $responseConfirmed,
], [
'password' => ['required', 'confirmed', Password::min(8)->letters()->mixedCase()->numbers()->symbols()],
]);
if ($validator->passes()) {
return $response;
}
$this->warn($validator->messages()->first('password'));
return $this->askPassword($wants);
}
private function askRole(): UserRole
{
$role = null;
$possibles = collect(UserRole::cases())
->map(fn ($role) => $this->roleToString($role))
->all();
$response = Arr::wrap(
$this->choice(
question: 'What is the role ?',
choices: $possibles,
default: $this->roleToString(UserRole::Admin),
multiple: false
)
);
$role = UserRole::tryFrom(
intval(mb_strcut((string) $response[0], 0, 1))
);
if (! is_null($role)) {
return $role;
}
$this->warn('Need a valid role, try again');
return $this->askRole();
}
private function roleToString(UserRole $role): string
{
return "{$role->value()} : {$role->label()}";
}
}