diff --git a/app/Http/Requests/ParticipateRequest.php b/app/Http/Requests/ParticipateRequest.php index 0a98982..d65a3c1 100644 --- a/app/Http/Requests/ParticipateRequest.php +++ b/app/Http/Requests/ParticipateRequest.php @@ -7,6 +7,7 @@ use App\Models\CodeEan; use App\Models\Participation; use App\Models\Settings; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Support\Facades\Validator; use Illuminate\Support\Str; use Kwaadpepper\Serial\Exceptions\SerialCasterException; @@ -18,40 +19,60 @@ class ParticipateRequest extends FormRequest * @return boolean */ public function authorize() + { + return auth()->check(); + } + + /** + * Prepare the data for validation. + * + * @return void + */ + protected function prepareForValidation() { /** * * Check si les codes ean sont utilisés, auquel cas * * on test celui envoyé pour savoir s'il est correct. * Modif demande vincent : * Tester code ean existe avec 13, puis 8 puis 7 chars + * Si le code EAN est trouvé dans la liste, alors on prend l'objet correspondant, + * sinon on prend le premier objet qui contient les 7 1er chiffres (cas des EAN pds) + * + * Dans la base chaque code ean doit être rentré dans sa valeur absolue + * càd que les code ean 8 sont de longueur 8, 7 de longueur7 et 13 de longueur 13. */ + if (app(Settings::class)->use_ean_codes) { - $this->merge([ - 'code_ean' => \in_array(Str::length($this->code_ean), [13, 8, 7]) ? - CodeEan::where('code', $this->code_ean) - ->orWhere('code', 'LIKE', Str::limit($this->code_ean, 13, '') . '%') - ->orWhere('code', 'LIKE', Str::limit($this->code_ean, 8, '') . '%') - ->orWhere('code', 'LIKE', Str::limit($this->code_ean, 7, '') . '%') - ->first() : null - ]); - } + // ! We need to validate ean is 13 before resolving ean code. + /** @throws \Illuminate\Validation\ValidationException */ + Validator::validate($this->all(), [ + 'code_ean' => 'required|digits:13' + ], $this->attributes()); + + // * Union pour faire des recherches séparée en une seule requête. + /** @var \App\Models\CodeEan|null */ + $codeEan = CodeEan::where('code', $this->code_ean) + ->union(CodeEan::where('code', Str::limit($this->code_ean, 8, ''))) + ->union(CodeEan::where('code', Str::limit($this->code_ean, 7, ''))) + ->first() ?? false; + + $this->merge(['code_ean' => $codeEan]); + } //end if try { - if (is_string($this->code)) { - $this->merge([ - 'serial' => $this->code, - 'code' => Code::whereId(Code::serialToInt(Str::upper($this->code)))->first() ?? false, - ]); - } - // phpcs:ignore Generic.CodeAnalysis.EmptyStatement.DetectedCatch + $this->merge([ + 'serial' => $this->code, + 'code' => Code::whereId(Code::serialToInt(Str::upper(\strval($this->code))))->first() ?? false, + ]); } catch (SerialCasterException $e) { - // Ignore. + // * Provoquer l'affichage code incorrect. + $this->merge([ + 'code' => false, + ]); } finally { $this->merge([ 'accept_rules' => $this->accept_rules ? true : false ]); } - - return auth()->check(); } /** @@ -62,15 +83,7 @@ class ParticipateRequest extends FormRequest public function rules() { $rules = [ - 'accept_rules' => [ - 'required', 'boolean', - // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed - function ($attribute, $value, $fail) { - if (!$value) { - $fail('Pour participer, vous devez accepter le règlement du jeu.'); - } - } - ], + 'accept_rules' => 'required|boolean|accepted', 'code' => [ 'required', // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundInExtendedClassBeforeLastUsed @@ -80,10 +93,10 @@ class ParticipateRequest extends FormRequest !\is_object($value) or \get_class($value) !== Code::class ) { - $fail('Code incorrect, veuillez réessayer.'); + $fail('Code unique incorrect, veuillez réessayer.'); return false; } elseif ($value->code_used === 1) { - $fail('Ce code n\'est plus utilisable.'); + $fail('Ce code unique n\'est plus utilisable.'); return false; } @@ -93,7 +106,7 @@ class ParticipateRequest extends FormRequest ['user_id', auth()->user()->id] ]); if ($query->exists()) { - $fail('Vous avez déjà utilisé ce code.'); + $fail('Vous avez déjà utilisé ce code unique.'); } /** @var \App\Models\Settings $settings */ @@ -105,13 +118,13 @@ class ParticipateRequest extends FormRequest // * Gestion du nombre d'utilisation d'un code. if ($codeNbUsage >= $settings->nb_unique_code_use) { $this->code->code_used = 1; - return back()->withErrors("Ce code n'est plus utilisable."); + return back()->withErrors("Ce code unique n'est plus utilisable."); } else { if ($codeNbUsage + 1 >= $settings->nb_unique_code_use) { $this->code->code_used = 1; } } - $this->code->save(); + $this->code->saveOrFail(); } ] ]; @@ -132,4 +145,18 @@ class ParticipateRequest extends FormRequest } return $rules; } + + /** + * Get custom attributes for validator errors. + * + * @return array + */ + public function attributes() + { + return [ + 'code_ean' => \trans('code barre'), + 'accept_rules' => \trans('règlements du jeu'), + 'code' => \trans('code unique'), + ]; + } }