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

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

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

  • Потоковую передачу больших объёмов данных (streaming)

  • Сжатие данных алгоритмом gzip

  • Вставку данных через механизм COPY PostgreSQL (высокая производительность)

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

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

  1. id_connector (строка)

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

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

  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. Content-Encoding (заголовок, опциональный)

    • Если значение "gzip" — данные в теле запроса сжаты алгоритмом gzip

    • По умолчанию: не сжато

    • Используется для оптимизации при передаче больших файлов

    • Пример: Content-Encoding: gzip

Тело запроса (обязательное):

  1. Бинарные данные

    • Формат: JSON или бинарные данные

    • Может быть обычные данные или gzip-сжатые (если Content-Encoding: gzip)

    • Максимальный размер зависит от конфигурации сервера

    • Данные передаются потоком (streaming) — обрабатываются по частям

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

ЭТАП 1: Инициализация и валидация

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

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

  • Генерируется новый UUID для уникального идентификатора записи

  • Извлекается заголовок Content-Encoding для определения нужна ли распаковка

  • Если Content-Encoding == "gzip" — создаётся декомпрессор zlib

ЭТАП 2: Подготовка данных для CSV формата

  • Все строковые значения (UUID, id_connector, type) экранируются для CSV:

    • Каждая кавычка (") заменяется на две кавычки ("")

    • Это необходимо для корректного парсинга CSV при вставке в БД

ЭТАП 3: Подключение к БД и создание потока COPY

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

  • Создаётся асинхронный COPY поток для таблицы configuration_metadata_entity

  • COPY используется вместо INSERT для высокой производительности

ЭТАП 4: Потоковая передача и обработка данных

  • Цикл async for chunk in request.stream():

    • Читает данные из тела запроса по частям (chunks)

    • Пропускает пустые chunks

    • Если gunzip активен — распаковывает каждый chunk

    • Экранирует кавычки в данных для CSV формата

    • Пишет в COPY поток

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

  • Если gunzip активен:

    • Вызывается gunzip.flush() для получения оставшихся распакованных данных

    • Также экранируются кавычки и пишутся в поток

ЭТАП 6: Завершение CSV строки и коммит

  • Закрывается CSV строка (добавляется закрывающая кавычка)

  • Добавляется символ новой строки (\n)

  • Выполняется conn.commit() для фиксации транзакции

Итоговая структура в БД:

Таблица: configuration_metadata_entity Столбцы:

  • id_configuration_metadata_entity: сгенерированный UUID

  • id_connector: переданный идентификатор коннектора

  • type: тип метаданных (в enum формате configurationmetadatatype)

  • data: содержимое потока (JSON или бинарные данные)

Успешный ответ (200 OK)

Формат ответа:

{ "success": true, "message": "Entity created successfully.", "data": { "id_configuration_metadata_entity": "550e8400-e29b-41d4-a716-446655440000" } }

Поля ответа:

  • success (boolean): всегда true при успехе

  • message (string): описательное сообщение

  • data (object):

    • id_configuration_metadata_entity: UUID новой созданной записи (используется для получения/обновления/удаления)