Files
XC_VM/docs/ru/development/input-validation.md
T

144 lines
7.8 KiB
Markdown

# Стратегия валидации входных данных
Валидация в XC_VM сосредоточена в классе `InputValidator`. Он проверяет наличие обязательных полей перед тем, как API-обработчик начинает работу с данными.
---
## Принцип работы
`InputValidator::validate()` принимает имя действия и массив входных данных, возвращает `bool`. Если метод вернул `false` — запрос отклоняется до вызова бизнес-логики.
```php
if (!InputValidator::validate($rAction, $rData)) {
// вернуть ошибку клиенту
}
```
---
## Справочник действий и обязательных полей
### Контент — стримы и каналы
| Действие | Обязательные поля |
| ---------------------- | -------------------------------------------------- |
| `processStream` | `stream_display_name` (или `review`, или файл M3U) |
| `processChannel` | `stream_display_name` (или `review`, или файл M3U) |
| `processMovie` | `stream_display_name` (или `review`, или файл M3U) |
| `processRadio` | `stream_display_name` (или `review`, или файл M3U) |
### Контент — серии и эпизоды
| Действие | Обязательные поля |
| ----------------- | --------------------------------------------------------- |
| `processSeries` | `title` |
| `processEpisode` | `series`, числовой `season_num`, и `multi` или `episode` |
### Организация контента
| Действие | Обязательные поля |
| ------------------- | ------------------------------------------ |
| `processBouquet` | `bouquet_name` |
| `processGroup` | `group_name` |
| `processGroupLegacy`| `group_name` |
| `processCategory` | `category_name`, `category_type` |
| `processPackage` | `package_name` |
| `reorderBouquet` | `stream_order_array` (валидный JSON-массив)|
| `setChannelOrder` | `stream_order_array` (валидный JSON-массив)|
| `sortBouquets` | `bouquet_order_array` (валидный JSON-массив)|
| `orderCategories` | `categories` (валидный JSON-массив) |
| `orderServers` | `server_order` (валидный JSON-массив) |
### Массовые операции
| Действие | Обязательные поля |
| --------------------- | ---------------------------------------------------- |
| `massEditStreams` | `streams` (валидный JSON-массив) |
| `massEditChannels` | `streams` (валидный JSON-массив) |
| `massEditMovies` | `streams` (валидный JSON-массив) |
| `massEditRadios` | `streams` (валидный JSON-массив) |
| `massEditEpisodes` | `streams` (валидный JSON-массив) |
| `massDeleteStreams` | `streams` (валидный JSON-массив) |
| `massDeleteMovies` | `movies` (валидный JSON-массив) |
| `massDeleteLines` | `lines` (валидный JSON-массив) |
| `massDeleteUsers` | `users` (валидный JSON-массив) |
| `massDeleteStations` | `radios` (валидный JSON-массив) |
| `massDeleteMags` | `mags` (валидный JSON-массив) |
| `massDeleteEnigmas` | `enigmas` (валидный JSON-массив) |
| `massDeleteEpisodes` | `episodes` (валидный JSON-массив) |
| `massDeleteSeries` | `series` (валидный JSON-массив) |
| `massEditSeries` | `series` (валидный JSON-массив) |
| `massEditLines` | `users_selected` (валидный JSON-массив) |
| `massEditUsers` | `users_selected` (валидный JSON-массив) |
| `massEditMags` | `devices_selected` (валидный JSON-массив) |
| `massEditEnigmas` | `devices_selected` (валидный JSON-массив) |
### Серверы и инфраструктура
| Действие | Обязательные поля |
| ----------------- | ------------------------------------------ |
| `processServer` | `server_name`, `server_ip` |
| `processProxy` | `server_name`, `server_ip` |
| `installServer` | `ssh_port`, `root_password` |
| `moveStreams` | `content_type`, `source_server`, `replacement_server` |
| `replaceDNS` | `old_dns`, `new_dns` |
### Устройства
| Действие | Обязательные поля |
| --------------- | ----------------- |
| `processMAG` | `mac` |
| `processEnigma` | `mac` |
### Безопасность
| Действие | Обязательные поля |
| ---------------- | ----------------- |
| `blockIP` | `ip` |
| `processRTMPIP` | `ip` |
| `processISP` | `isp` |
| `processUA` | `user_agent` |
### Прочее
| Действие | Обязательные поля |
| --------------------- | ------------------------------------------------ |
| `scheduleRecording` | `title`, `source_id` |
| `processProvider` | `ip`, `port`, `username`, `password`, `name` |
| `processCode` | `code` |
| `processProfile` | `profile_name` |
| `processEPG` | `epg_name`, `epg_file` |
| `processWatchFolder` | `folder_type`, `selected_path`, `server_id` |
### Действия без дополнительной валидации
Следующие действия всегда возвращают `true` — их валидация выполняется на уровне бизнес-логики:
`processUser`, `processLine`, `processHMAC`, `editAdminProfile`
---
## Добавление валидации для нового действия
Добавьте `case` в метод `InputValidator::validate()` в файле `src/core/Validation/InputValidator.php`:
```php
case 'myNewAction':
return !empty($rData['required_field_one'])
&& !empty($rData['required_field_two']);
```
Правила:
- Проверяйте только **обязательные** поля — необязательные проверяются позже в сервисе
- Для JSON-массивов используйте: `is_array(json_decode($rData['field'] ?? '', true))`
- Для числовых значений: `is_numeric($rData['field'] ?? null)`
---
## Связанные файлы
| Файл | Назначение |
| --------------------------------------- | ----------------------------- |
| `src/core/Validation/InputValidator.php`| Основной класс валидации |
| `src/public/Controllers/` | Контроллеры, вызывающие validate() |