f1afcafa5d
Two-layer protection on MasterResource and UserResource: 1. Form validation via ->rules() with Rule::unique() scoped to company_id (prevents DB hit in normal flow, shows inline field error) 2. handleRecordCreation/handleRecordUpdate catches UniqueConstraintViolationException as fallback — shows a Filament danger notification and halts without showing an error page Also adds phone uniqueness validation (scoped per tenant). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
48 lines
1.5 KiB
PHP
48 lines
1.5 KiB
PHP
<?php
|
|
|
|
namespace App\Filament\Tenant\Resources\UserResource\Pages;
|
|
|
|
use App\Filament\Tenant\Resources\UserResource;
|
|
use Filament\Notifications\Notification;
|
|
use Filament\Resources\Pages\CreateRecord;
|
|
use Filament\Support\Exceptions\Halt;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\UniqueConstraintViolationException;
|
|
|
|
class CreateUser extends CreateRecord
|
|
{
|
|
protected static string $resource = UserResource::class;
|
|
|
|
/** @var array<string> */
|
|
protected array $_rolesPicked = [];
|
|
|
|
protected function handleRecordCreation(array $data): Model
|
|
{
|
|
try {
|
|
return parent::handleRecordCreation($data);
|
|
} catch (UniqueConstraintViolationException $e) {
|
|
$msg = str_contains($e->getMessage(), 'email')
|
|
? __('Acest email este deja folosit de un alt utilizator.')
|
|
: __('Acest număr de telefon este deja folosit de un alt utilizator.');
|
|
Notification::make()->danger()->title($msg)->send();
|
|
throw new Halt();
|
|
}
|
|
}
|
|
|
|
protected function mutateFormDataBeforeCreate(array $data): array
|
|
{
|
|
$this->_rolesPicked = $data['roles_picked'] ?? [];
|
|
unset($data['roles_picked']);
|
|
return $data;
|
|
}
|
|
|
|
protected function afterCreate(): void
|
|
{
|
|
$picked = $this->_rolesPicked;
|
|
if (! in_array($this->record->role, $picked, true)) {
|
|
$picked[] = $this->record->role;
|
|
}
|
|
$this->record->syncRoles(array_unique($picked));
|
|
}
|
|
}
|