mirror of
https://github.com/Vateron-Media/XC_VM.git
synced 2026-10-08 04:02:39 +02:00
144 lines
7.8 KiB
Markdown
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() |
|