has('dominio')) { $rawDomain = $this->input('dominio'); $normalizedDomain = TenantDomainNormalizer::normalize($rawDomain); $this->hasInvalidDomain = TenantDomainNormalizer::hasValue($rawDomain) && $normalizedDomain === null; $this->merge([ 'dominio' => $normalizedDomain, ]); } } /** * @return array */ public function rules(): array { /** @var Tenant|null $tenant */ $tenant = $this->route('tenant'); $logoRule = ['nullable', new ImageOrBase64Rule()]; return [ 'codigo' => [ 'nullable', 'string', 'max:255', Rule::unique('tenants', 'codigo')->ignore($tenant?->id), ], 'nombre' => ['nullable', 'string', 'max:255'], 'dominio' => [ 'bail', function (string $attribute, mixed $value, Closure $fail): void { if ($this->hasInvalidDomain) { $fail("The {$attribute} field must contain a valid domain or URL."); } }, 'nullable', 'string', 'max:255', Rule::unique('tenants', 'dominio')->ignore($tenant?->id), ], 'primary_color' => ['nullable', 'string', 'regex:/^#([a-fA-F0-9]{3,4}|[a-fA-F0-9]{6}|[a-fA-F0-9]{8})$/'], 'secondary_color' => ['nullable', 'string', 'regex:/^#([a-fA-F0-9]{3,4}|[a-fA-F0-9]{6}|[a-fA-F0-9]{8})$/'], 'danger_color' => ['nullable', 'string', 'regex:/^#([a-fA-F0-9]{3,4}|[a-fA-F0-9]{6}|[a-fA-F0-9]{8})$/'], 'success_color' => ['nullable', 'string', 'regex:/^#([a-fA-F0-9]{3,4}|[a-fA-F0-9]{6}|[a-fA-F0-9]{8})$/'], 'header_bg_color' => ['nullable', 'string', 'regex:/^#([a-fA-F0-9]{3,4}|[a-fA-F0-9]{6}|[a-fA-F0-9]{8})$/'], 'footer_bg_color' => ['nullable', 'string', 'regex:/^#([a-fA-F0-9]{3,4}|[a-fA-F0-9]{6}|[a-fA-F0-9]{8})$/'], 'header_logo' => $logoRule, 'footer_logo' => $logoRule, 'hero_bg_image' => ['nullable', new ImageOrBase64Rule()], 'hero_config' => ['nullable', 'array'], 'hero_config.title_html' => ['nullable', 'string'], 'hero_config.description_html' => ['nullable', 'string'], 'hero_config.button_text' => ['nullable', 'string'], 'hero_config.button_href' => ['nullable', 'string'], 'event_config' => ['nullable', 'array'], 'event_config.title' => ['nullable', 'string'], 'event_config.location' => ['nullable', 'string'], 'event_config.dates' => ['nullable', 'array'], 'event_config.dates.*' => ['required', 'string'], ]; } }