option('name') ?: text( label: 'User name', placeholder: 'e.g. jane.doe', required: true, hint: '3 to 32 characters: letters, numbers, dots, hyphens, or underscores.', ))); $email = strtolower(trim((string) ($this->option('email') ?: text( label: 'Email address', placeholder: 'e.g. jane@example.com', required: true, )))); $role = (string) ($this->option('role') ?: select( label: 'Role', options: collect(UserRole::cases()) ->mapWithKeys(fn (UserRole $role): array => [$role->value => ucfirst($role->value)]) ->all(), default: UserRole::USER->value, hint: 'Choose the permissions granted to this user.', )); $locale = strtolower(trim((string) $this->option('locale'))); $attributesValidator = Validator::make([ 'name' => $name, 'email' => $email, 'role' => $role, 'locale' => $locale, ], [ 'name' => ['required', 'string', 'min:3', 'max:32', 'regex:/^[a-zA-Z0-9_.-]+$/', 'unique:users,name'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email'], 'role' => ['required', Rule::enum(UserRole::class)], 'locale' => ['required', Rule::in(config('app.supported_locales', ['fr', 'en']))], ]); if ($attributesValidator->fails()) { foreach ($attributesValidator->errors()->all() as $error) { error($error); } return self::FAILURE; } $password = password( label: 'Password', required: true, hint: 'At least 8 characters with uppercase, lowercase, number, and symbol.', ); $passwordConfirmation = password( label: 'Confirm password', required: true, ); $passwordValidator = Validator::make([ 'password' => $password, 'password_confirmation' => $passwordConfirmation, ], [ 'password' => [ 'required', 'confirmed', Password::min(8) ->mixedCase() ->letters() ->numbers() ->symbols(), ], ]); if ($passwordValidator->fails()) { foreach ($passwordValidator->errors()->all() as $error) { error($error); } return self::FAILURE; } $user = User::query()->create([ 'name' => $name, 'email' => $email, 'email_verified_at' => $this->option('verified') ? now() : null, 'locale' => $locale, 'password' => Hash::make($password), 'role' => UserRole::from($role), ]); outro("User {$user->email} created with ID {$user->getKey()} and role {$user->role->value}."); return self::SUCCESS; } }