Метод GET /api/v1/connector/{id_connector}/configuration-metadata/{configuration_metadata_type}

Краткое описание

Получает метаданные конфигурации 1С для объектов из базы данных. Эндпоинт:

  • Возвращает данные потоком (StreamingResponse) — не загружает весь объект в память

  • Автоматически распаковывает CSV формат из БД в JSON

  • Поддерживает получение больших объёмов данных без ограничений по памяти

Входные параметры

Параметры пути (обязательные):

  1. id_connector (строка, обязательный)

    • Уникальный идентификатор коннектора 1С

    • Пример: 8f4e5a2c-1234-5678-90ab-cdef12345678

    • Должна существовать запись с этим id_connector в БД

  2. configuration_metadata_type (enum, обязательный)

    • Тип метаданных конфигурации

    • Допустимые значения определены в enum ConfigurationMetadataType

    • Примеры: common, constants, catalogs, documents, document-journals, enumerations, reports, data-processors, charts-of-characteristic-types, charts-of-accounts, charts-of-calculation-types, information-registers, accumulation-registers, accounting-registers, calculation-registers, business-processes, tasks, external-data-sources, other.

    • При передаче неверного значения возвращается 400 с сообщением об ошибке

Алгоритм работы метода

ЭТАП 1: Валидация типа метаданных

  • Проверяется, что configuration_metadata_type является допустимым значением enum

  • Если нет — возвращается HTTPException(400)

  • Преобразуется enum значение в соответствующее имя типа в БД

ЭТАП 2: Поиск ID записи

  • Подключается к PostgreSQL через асинхронный коннектор psycopg

  • Выполняется SELECT для поиска записи: WHERE id_connector = {переданный_id} AND type = {переданный_тип}

  • Если запись не найдена — возвращается HTTPException(404, "Not found")

  • Если найдена — извлекается id_configuration_metadata_entity

ЭТАП 3: Подготовка потокового ответа

  • Создаётся асинхронный генератор body_gen() для потоковой передачи данных

  • Генератор использует COPY FROM STDOUT команду PostgreSQL:

    • Формирует JSON объект из записи

    • Передаёт его через COPY в CSV формате

    • Потоком читает и преобразует данные

ЭТАП 4: Обработка потока данных

Внутри генератора:

a) Чтение чанков из БД:

  • Цикл читает части (chunks) данных из COPY потока

  • Каждый chunk — это часть CSV строки

b) Обработка первого чанка:

  • Удаляется открывающая кавычка CSV (if buf[0:1] == b'"')

  • Это нужно потому что CSV оборачивает весь JSON в кавычки

c) Замена экранированных кавычек:

  • В CSV кавычки экранируются как "" (две кавычки)

  • Заменяются на одну кавычку: buf.replace(b'""', b'"')

  • Это восстанавливает исходный JSON формат

d) Обработка хвоста (tail):

  • Последние 2 байта каждого чанка сохраняются в tail_buf

  • Это нужно для корректной обработки границ чанков

  • Например, кавычка может быть разделена между чанками

e) Выход данных:

  • Все чанки кроме последних 2 байт отправляются клиенту

  • Предыдущие хвосты добавляются в начало

ЭТАП 5: Финализация потока

  • После прочтения всех чанков обрабатывается финальный хвост:

    • Удаляются символы конца строки (\r\n или \n)

    • Удаляется закрывающая кавычка CSV

    • Оставшиеся данные отправляются клиенту

Итоговый результат:

  • Клиент получает JSON объект в формате:

{ "id_configuration_metadata_entity": "uuid-string", "id_connector": "connector-id", "type": "document", "data": { ... содержимое метаданных ... } }