diff --git a/app/Auth/CrmUserProvider.php b/app/Auth/CrmUserProvider.php index 43dabcc..8c5b737 100644 --- a/app/Auth/CrmUserProvider.php +++ b/app/Auth/CrmUserProvider.php @@ -143,7 +143,13 @@ class CrmUserProvider extends EloquentUserProvider implements UserProviderContra ]); $model->hashcode = $crmCustomer->hashcode; $model->email_verified_at = $crmCustomer->status ? now() : null; - $model->saveOrFail(); + // Check if model is in local databse. + $exists = $model::query()->where('email', $model->email)->exists(); + if (!$exists) { + $model->saveOrFail(); + } else { + throw new \Exception('Le modèle existe déjà dans la base locale.'); + } return $model; } diff --git a/app/Http/Controllers/Fo/Auth/RegisterController.php b/app/Http/Controllers/Fo/Auth/RegisterController.php index 148ef06..61c04fc 100644 --- a/app/Http/Controllers/Fo/Auth/RegisterController.php +++ b/app/Http/Controllers/Fo/Auth/RegisterController.php @@ -18,6 +18,7 @@ use LDC\LDCCRM\Enums\ApiError; use LDC\LDCCRM\Exceptions\ApiErrorException; use LDC\LDCCRM\Exceptions\ValidationException as CrmValidationException; use LDC\LDCCRM\Models\Customer as CrmCustomer; +use Illuminate\Database\QueryException; class RegisterController extends Controller { @@ -81,6 +82,7 @@ class RegisterController extends Controller * @return \App\Models\Customer * @throws IlluminateValidationException If there are validation errors. * @throws \RuntimeException On unhandled api Error. + * @throws IlluminateValidationException If there are already an email. */ protected function create(array $data): Customer { @@ -138,7 +140,16 @@ class RegisterController extends Controller throw IlluminateValidationException::withMessages([ 'error' => $e->getMessage() ]); - } //end try + } catch (QueryException $e) { + if ($e->getCode() === '23000') { + throw IlluminateValidationException::withMessages([ + 'error' => trans('Un compte existe déjà avec cette adresse.') + ]); + } + report($e); + Log::error(__CLASS__ . '::create reached end of possibilities.'); + throw new \RuntimeException(__CLASS__ . '::create reached end of possibilities.'); + }//end try } /** diff --git a/app/Http/Requests/Fo/Customers/CreateAccountRequest.php b/app/Http/Requests/Fo/Customers/CreateAccountRequest.php index beb4ab9..dc00553 100644 --- a/app/Http/Requests/Fo/Customers/CreateAccountRequest.php +++ b/app/Http/Requests/Fo/Customers/CreateAccountRequest.php @@ -10,6 +10,7 @@ use Illuminate\Support\Arr; use Illuminate\Support\Facades\Auth; use Illuminate\Validation\Rule; use Illuminate\Validation\Rules\Password; +use Illuminate\Validation\Validator; use Kwaadpepper\Enum\Rules\EnumIsValidRule; use LDC\LDCCRM\Enums\Country; use LDC\LDCCRM\Models\Customer as CrmCustomer; @@ -99,13 +100,6 @@ class CreateAccountRequest extends FormRequest 'required', 'email:rfc,dns,spoof', 'max:255', - // * Does email already exists in CRM ? - // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundBeforeLastUsed - function (string $attribute, $value, \Closure $fail) { - if (CrmCustomer::findWithEmail(\strval($value))) { - $fail('Un compte existe déjà avec cette adresse.'); - } - }, 'unique:customers,email', ], 'password' => [ @@ -119,6 +113,26 @@ class CreateAccountRequest extends FormRequest ]; } + /** + * Get the "after" validation callables for the request. + * + * @return array + */ + public function after(): array + { + return [ + function (Validator $validator) { + if (CrmCustomer::findWithEmail((string) $this->input('email'))) { + $validator->errors()->add( + 'email', + 'Un compte existe déjà avec cette adresse dans la CRM.' + ); + } + }, + ]; + } + + /** * Get custom attributes for validator errors. * diff --git a/app/Models/Customer.php b/app/Models/Customer.php index 6f1d817..b9bfa70 100644 --- a/app/Models/Customer.php +++ b/app/Models/Customer.php @@ -264,7 +264,7 @@ class Customer extends Authenticatable implements MustVerifyEmail } $this->forceDelete(); throw ValidationException::withMessages([ - 'error' => trans('Le compte \'existe pas.') + 'error' => trans('Le compte n\'existe pas.') ]); }