Метод GET /api/v1/get_projects

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

Метод позволяет:

  • получить список проектов по указанному Коннектору с поддержкой фильтрации, пагинации и опциональным включением данных проекта (data);

  • получить шаблоны проектов (внутренний xml-формат «Экстрактора 1С»);

  • получить метаданные проектов (json);

  • Обязательный параметр: ?idConnector={idConnector};

Требуется аутентификация (Depends(check_login_pass)).

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

Параметры запроса (query):

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

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

    • Проект должен принадлежать этому коннектору

    • Пример: "conn-prod-001"

  2. id_project (string, опционально)

    • Фильтр по идентификатору проекта (точное совпадение)

    • Если указано — вернёт только проект с этим id

    • Пример: "proj-123"

  3. include_data (boolean, опционально, default=False)

    • Если True — включить в ответ поле data (содержимое проекта)

    • Если False — поле data будет null

    • Используйте False для быстрого получения списка без нагрузки на БД

  4. include_template (boolean, опционально, default=False)

    • Если True — включить в ответ поле template (шаблон проекта)

    • Если False — поле template будет null

    • Используйте в зависимости от необходимости

  5. dt_from (datetime, опционально)

    • Вернуть только проекты с ecc_dt > dt_from

    • Формат: ISO 8601 (например "2025-01-01T00:00:00")

    • Пример: "2025-01-01T00:00:00"

  6. dt_to (datetime, опционально)

    • Вернуть только проекты с ecc_dt < dt_to

    • Формат: ISO 8601

    • Пример: "2025-12-31T23:59:59"

  7. project_name (string, опционально)

    • Фильтр по имени проекта (точное совпадение)

    • Пример: "My Project"

  8. parent_id_project (string, опционально)

    • Фильтр по идентификатору родительского проекта

    • Специальное значение "null" (строковый литерал) вернёт проекты без родителя (NULL в БД)

    • Пример: "null" или "parent-proj-001"

  9. page_size (int, опционально, default=100)

    • Размер страницы (LIMIT)

    • Максимальное количество проектов в ответе

    • Пример: 50

  10. offset (int, опционально, default=0)

    • Смещение для пагинации (OFFSET)

    • Пример: 100 (пропустить первые 100 проектов)

  11. Authorization (обязательный)

    • Токен аутентификации

    • Требуется при наличии зависимости check_login_pass

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

ЭТАП 1: Валидация Коннектора

  • Проверяется существование коннектора с id_connector

  • Если коннектор не найден — возвращается HTTP 404

ЭТАП 2: Формирование базового SQL запроса

  • Создаются два statement-а:

    • count_statement: SELECT COUNT(*) для получения общего количества проектов

    • statement: SELECT Project для выборки проектов

  • Базовый WHERE условие: Project.id_connector == id_connector

ЭТАП 3: Применение фильтров

Каждый фильтр применяется как к statement, так и к count_statement:

  • Если id_project указан:

  • Если dt_from указана:

    • Добавляется WHERE Project.ecc_dt > dt_from

  • Если dt_to указана:

    • Добавляется WHERE Project.ecc_dt < dt_to

  • Если project_name указано:

  • Если parent_id_project == "null" (строка):

    • Добавляется WHERE Project.parent_id_project IS NULL

    • Возвращаются проекты без родителя

  • Если parent_id_project — любое другое значение:

    • Добавляется WHERE Project.parent_id_project == parent_id_project

ЭТАП 4: Получение общего количества

  • Выполняется count_statement и получается total_count

  • Это число записей, удовлетворяющих всем фильтрам

ЭТАП 5: Применение пагинации

  • К statement добавляется ORDER BY Project.ecc_dt

  • Применяется LIMIT page_size

  • Применяется OFFSET offset

  • Выполняется запрос и получается список projects_db

ЭТАП 6: Обработка data и template

Если projects_db не пуст и (include_data или include_template):

a) Собираются PK (id_connector, id_project) для всех полученных проектов b) Выполняется запрос на получение всех версий ProjectData для этих проектов c) Результаты сортируются по (id_project, version DESC) d) Для каждого проекта сохраняется ПОСЛЕДНЯЯ (MAX version) запись ProjectData

ЭТАП 7: Формирование ответа

Для каждого проекта из projects_db:

  • Берётся базовая информация проекта (Project fields)

  • Если проект найден в latest_project_data_map:

    • Если include_data == True — берётся data из ProjectData

    • Если include_template == True — берётся template из ProjectData

  • Если проект не найден в карте или флаги False:

    • data = null и/или template = null

  • Объект преобразуется в ProjectReadSchema

  • Добавляется в результирующий список

ЭТАП 8: Возврат результата

  • Возвращается ProjectsListPageResponse с полями:

    • count: общее количество записей (без учёта paging)

    • limit: размер страницы

    • offset: смещение

    • data: список ProjectReadSchema

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

Формат: JSON, схема ProjectsListPageResponse

Пример:

{ "count": 250, "limit": 100, "offset": 0, "data": [ { "id_connector": "conn-prod-001", "id_project": "proj-123", "name": "My Project", "parent_id_project": null, "ecc_dt": "2025-11-14T12:34:56+03:00", "data": { "config": "...", "settings": { ... } }, "template": { "sections": [ ... ] } }, { "id_connector": "conn-prod-001", "id_project": "proj-124", "name": "Child Project", "parent_id_project": "proj-123", "ecc_dt": "2025-11-13T10:20:30+03:00", "data": null, "template": null } // ... больше проектов до page_size ] }

Метаданные будут выгружаться в разделе json «data».