44a1b21421
- app/Rules/SignalIdentifier/DomainIdentifier.php — regex
^[a-z0-9-]+(\.[a-z0-9-]+)+$ (нижний регистр, без протокола/пути).
- app/Rules/SignalIdentifier/PhoneIdentifier.php — regex ^7\d{10}$
(11 цифр, начинается с 7).
- app/Rules/SignalIdentifier/SmsSenderRule.php — 1-30 символов
[A-Za-z0-9_-]; отвергает 11-значные номера (поставщик блокирует
физический телефон в роли отправителя — alert "Важно!" в форме
создания SMS-проекта).
- tests/Feature/Rules/SignalValidatorsTest.php — 24 теста с datasets:
• Domain: 4 valid + 6 invalid (case, no-TLD, spaces, protocol, path, double-dot)
• Phone: 3 valid + 6 invalid (8-prefix, length, plus, spaces, letters)
• SmsSender: alpha+numeric short, 11-digit blocked, length>30 blocked,
empty (с required), special chars blocked
Quirk: Laravel skips non-implicit rules для пустых строк. Тест empty
использует связку 'required' + правило (как в реальном FormRequest).
Pest: 499 / 497 passed / 2 skipped (473 + 24 новых = 497).
Larastan: 0 errors. Pint passed.
Spec: §3.1
Plan: Task 12
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
41 lines
1.4 KiB
PHP
41 lines
1.4 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace App\Rules\SignalIdentifier;
|
||
|
||
use Closure;
|
||
use Illuminate\Contracts\Validation\ValidationRule;
|
||
|
||
/**
|
||
* Валидатор имени отправителя для signal_type=sms.
|
||
*
|
||
* Поставщик crm.bp-gr.ru блокирует 11-значные физические номера в роли
|
||
* "имени отправителя" (см. tooltip в форме создания SMS-проекта).
|
||
* Допустимы: буквенный alpha-sender (TINKOFF) или короткий числовой код (900, 1234).
|
||
*
|
||
* Spec: docs/superpowers/specs/2026-05-10-supplier-integration-design.md §3.1
|
||
*/
|
||
class SmsSenderRule implements ValidationRule
|
||
{
|
||
public function validate(string $attribute, mixed $value, Closure $fail): void
|
||
{
|
||
if (! is_string($value) || $value === '' || strlen($value) > 30) {
|
||
$fail('SMS sender must be 1–30 characters.');
|
||
|
||
return;
|
||
}
|
||
|
||
if (! preg_match('/^[A-Za-z0-9_-]+$/', $value)) {
|
||
$fail('SMS sender must contain only letters, digits, underscore or hyphen.');
|
||
|
||
return;
|
||
}
|
||
|
||
// Поставщик блокирует 11-значные номера (физический телефон в роли отправителя).
|
||
if (preg_match('/^\d{11}$/', $value)) {
|
||
$fail('SMS sender cannot be an 11-digit phone number (supplier rejection).');
|
||
}
|
||
}
|
||
}
|