diff --git a/app/Actions/Fortify/CreateNewUser.php b/app/Actions/Fortify/CreateNewUser.php index a9cba15..d4dfdf7 100644 --- a/app/Actions/Fortify/CreateNewUser.php +++ b/app/Actions/Fortify/CreateNewUser.php @@ -4,6 +4,7 @@ namespace App\Actions\Fortify; use App\Models\Customer; use App\Models\User; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; @@ -39,23 +40,25 @@ class CreateNewUser implements CreatesNewUsers 'password' => $this->passwordRules(), ])->validate(); - $user = User::create([ - 'name' => $input['name'], - 'email' => $input['email'], - 'password' => Hash::make($input['password']), - ]); + // Create the user and its linked customer atomically — a public signup is + // a customer, and the portal (Billing::purchase, Settings, …) needs one. + // Either both exist or neither, so a failure never orphans a user. + return DB::transaction(function () use ($input) { + $user = User::create([ + 'name' => $input['name'], + 'email' => $input['email'], + 'password' => Hash::make($input['password']), + ]); - // A public signup is a customer — create and link the record now so the - // portal (Billing::purchase, Settings, …) has a customer to work with - // before they buy a package. - Customer::query()->create([ - 'user_id' => $user->id, - 'name' => $input['name'], - 'email' => $input['email'], - 'locale' => app()->getLocale(), - 'status' => 'active', - ]); + Customer::query()->create([ + 'user_id' => $user->id, + 'name' => $input['name'], + 'email' => $input['email'], + 'locale' => app()->getLocale(), + 'status' => 'active', + ]); - return $user; + return $user; + }); } } diff --git a/app/Livewire/Admin/Datacenters.php b/app/Livewire/Admin/Datacenters.php index 0df7d61..3003204 100644 --- a/app/Livewire/Admin/Datacenters.php +++ b/app/Livewire/Admin/Datacenters.php @@ -3,6 +3,7 @@ namespace App\Livewire\Admin; use App\Models\Datacenter; +use Illuminate\Validation\Rule; use Livewire\Attributes\Layout; use Livewire\Attributes\Validate; use Livewire\Component; @@ -32,7 +33,7 @@ class Datacenters extends Component $data = $this->validate([ 'code' => 'required|string|max:8|alpha_dash|unique:datacenters,code', 'name' => 'required|string|max:255', - 'location' => 'nullable|in:'.implode(',', array_keys((array) config('countries'))), + 'location' => ['nullable', Rule::in(array_keys((array) config('countries')))], ]); Datacenter::create([ diff --git a/app/Livewire/Admin/EditDatacenter.php b/app/Livewire/Admin/EditDatacenter.php index a11a3cd..72c5241 100644 --- a/app/Livewire/Admin/EditDatacenter.php +++ b/app/Livewire/Admin/EditDatacenter.php @@ -3,6 +3,7 @@ namespace App\Livewire\Admin; use App\Models\Datacenter; +use Illuminate\Validation\Rule; use Livewire\Attributes\Validate; use LivewireUI\Modal\ModalComponent; @@ -51,7 +52,7 @@ class EditDatacenter extends ModalComponent } $data = $this->validate([ 'name' => 'required|string|max:255', - 'location' => 'nullable|in:'.implode(',', $allowed), + 'location' => ['nullable', Rule::in($allowed)], // array form — a legacy value may contain commas ]); Datacenter::query()->where('uuid', $this->uuid)->update([