*/ private const ALLOWED_PHONE_COUNTRIES = [ Country::france, Country::belgium, ]; /** @var list */ private const COMMUNITIES = [ 'amont', 'aval', 'transformateurs', 'scientifique', 'autres', ]; public function authorize(): bool { return true; } #[\Override] public function prepareForValidation(): void { $this->merge([ 'supportsManifesto' => $this->boolean('supportsManifesto'), ]); } /** * @return array */ public function rules(): array { ToolboxHelper::validateRecaptcha($this); $allowedIso2 = array_map( static fn(Country $c): string => $c->iso2(), self::ALLOWED_PHONE_COUNTRIES ); return [ 'lastName' => ['required', 'string', 'min:3', 'max:50'], 'firstName' => ['required', 'string', 'min:3', 'max:50'], 'email' => ['required', 'string', 'email:strict,rfc,spoof', 'max:255'], 'role' => ['required', 'string', 'min:3', 'max:30'], 'company' => ['required', 'string', 'min:3', 'max:60'], 'community' => ['required', 'string', Rule::in(self::COMMUNITIES)], 'phone' => ['required', 'phone:' . implode(',', $allowedIso2)], 'message' => ['required', 'string', 'min:30', 'max:255'], 'supportsManifesto' => ['boolean'], 'acceptsUsage' => ['required', 'accepted'], ]; } /** * @return array */ #[\Override] public function messages(): array { $phoneCountryLabels = implode(', ', array_map( static fn(Country $country): string => $country->label('fr'), self::ALLOWED_PHONE_COUNTRIES )); return [ 'community.in' => 'Veuillez sélectionner une communauté valide.', 'phone.phone' => "Le numéro de téléphone doit être un numéro valide pour : {$phoneCountryLabels}.", 'acceptsUsage.accepted' => "Vous devez accepter l'utilisation de vos données personnelles.", 'g-recaptcha-response.required' => 'Veuillez valider le reCAPTCHA.', ]; } #[\Override] public function attributes(): array { return [ 'lastName' => 'nom', 'firstName' => 'prénom', 'email' => 'adresse e-mail', 'role' => 'fonction', 'company' => 'société', 'community' => 'communauté', 'phone' => 'numéro de téléphone', 'message' => 'message', 'supportsManifesto' => 'soutien au manifeste', 'acceptsUsage' => 'conditions d\'utilisation', 'g-recaptcha-response' => 'reCAPTCHA', ]; } protected function rateLimitPrefix(): string { return 'join-group'; } protected function rateLimitMaxAttempts(): int { return 3; } protected function rateLimitMessageKey(): string { return 'validation.rate_limit.too_many_attempts'; } public function withValidator(Validator $validator): void { $validator->after(fn(Validator $v) => $this->applyEmailRateLimit($v)); } }