# Интеграция схем Pydantic с парсерами

## Обзор

Этот документ описывает решение для устранения дублирования логики между схемами Pydantic и парсерами. Теперь схемы Pydantic являются единым источником правды для определения параметров парсеров.

## Проблема

Ранее в парсерах дублировалась информация о параметрах:

```python
# В парсере
self.register_getter(
    name="single_og",
    method=self._get_single_og,
    required_params=["id", "codes", "columns"],  # Дублирование
    optional_params=["search"],                  # Дублирование
    description="Получение данных по одному ОГ"
)

# В схеме
class SvodkaPMSingleOGRequest(BaseModel):
    id: OGID = Field(...)           # Обязательное поле
    codes: List[int] = Field(...)   # Обязательное поле
    columns: List[str] = Field(...) # Обязательное поле
    search: Optional[str] = Field(None)  # Необязательное поле
```

## Решение

### 1. Утилиты для работы со схемами

Создан модуль `core/schema_utils.py` с функциями:

- `get_required_fields_from_schema()` - извлекает обязательные поля
- `get_optional_fields_from_schema()` - извлекает необязательные поля
- `register_getter_from_schema()` - регистрирует геттер с использованием схемы
- `validate_params_with_schema()` - валидирует параметры с помощью схемы

### 2. Обновленные парсеры

Теперь парсеры используют схемы как единый источник правды:

```python
def _register_default_getters(self):
    """Регистрация геттеров по умолчанию"""
    # Используем схемы Pydantic как единый источник правды
    register_getter_from_schema(
        parser_instance=self,
        getter_name="single_og",
        method=self._get_single_og,
        schema_class=SvodkaPMSingleOGRequest,
        description="Получение данных по одному ОГ"
    )
```

### 3. Валидация параметров

Методы геттеров теперь автоматически валидируют параметры:

```python
def _get_single_og(self, params: dict):
    """Получение данных по одному ОГ"""
    # Валидируем параметры с помощью схемы Pydantic
    validated_params = validate_params_with_schema(params, SvodkaPMSingleOGRequest)
    
    og_id = validated_params["id"]
    codes = validated_params["codes"]
    columns = validated_params["columns"]
    search = validated_params.get("search")
    
    # ... остальная логика
```

## Преимущества

1. **Единый источник правды** - информация о параметрах хранится только в схемах Pydantic
2. **Автоматическая валидация** - параметры автоматически валидируются с помощью Pydantic
3. **Синхронизация** - изменения в схемах автоматически отражаются в парсерах
4. **Типобезопасность** - использование типов Pydantic обеспечивает типобезопасность
5. **Документация** - Swagger документация автоматически генерируется из схем

## Совместимость

Решение работает с:
- Pydantic v1 (через `__fields__`)
- Pydantic v2 (через `model_fields` и `is_required()`)

## Использование

### Для новых парсеров

1. Создайте схему Pydantic с нужными полями
2. Используйте `register_getter_from_schema()` для регистрации геттера
3. Используйте `validate_params_with_schema()` в методах геттеров

### Для существующих парсеров

1. Убедитесь, что у вас есть соответствующая схема Pydantic
2. Замените ручную регистрацию геттеров на `register_getter_from_schema()`
3. Добавьте валидацию параметров в методы геттеров

## Примеры

### Схема с обязательными и необязательными полями

```python
class ExampleRequest(BaseModel):
    required_field: str = Field(..., description="Обязательное поле")
    optional_field: Optional[str] = Field(None, description="Необязательное поле")
```

### Регистрация геттера

```python
register_getter_from_schema(
    parser_instance=self,
    getter_name="example_getter",
    method=self._example_method,
    schema_class=ExampleRequest,
    description="Пример геттера"
)
```

### Валидация в методе

```python
def _example_method(self, params: dict):
    validated_params = validate_params_with_schema(params, ExampleRequest)
    # validated_params содержит валидированные данные
```

## Заключение

Это решение устраняет дублирование кода и обеспечивает единообразие между API схемами и парсерами. Теперь изменения в схемах автоматически отражаются в парсерах, что упрощает поддержку и развитие системы.