Files
portal/app/app/Rules/SignalIdentifier/SmsSenderRule.php
T
Дмитрий 44a1b21421 feat(rules): add Signal validators (Domain, Phone, SmsSender) with comprehensive datasets
- 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>
2026-05-10 17:05:19 +03:00

41 lines
1.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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 130 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).');
}
}
}