Метод POST /api/v1/projects
Краткое описание
Создаёт новый проект или обновляет существующий проект в рамках указанного Коннектора.
Требуется аутентификация (Depends(check_login_pass)).
Аутентификация
Зависимость
check_login_pass: передавайте учётные данные в том виде, как настроено (например, Authorization header).
Тело запроса (JSON) — схема: ProjectCreateSchema
Основные поля (в проекте могут быть и другие поля, см. ProjectCreateSchema):
id_connector(string, обязательный) — идентификатор коннектора, в рамках которого создаётся проект.id_project(string, обязательный) — уникальный идентификатор проекта внутри коннектора.name(string, опционально) — имя проекта.parent_id_project(string | null, опционально) — ссылка на родительский проект.data(object | null, опционально) — содержимое проекта (хранится в ProjectData).template(object | null, опционально) — шаблон проекта (хранится в ProjectData).
Алгоритм работы метода
Что делает сервер:
Проверяет существование коннектора с id_connector. Если коннектор не найден — 404.
Ищет существующую запись Project по (id_connector, id_project):
Если есть — обновляет поля проекта (кроме data/template, они хранятся отдельно в ProjectData).
Если нет — создаёт новый объект Project.
Устанавливает project.ecc_dt = текущее локальное время.
Управляет версиями ProjectData:
Получает последнюю версию ProjectData для (id_connector, id_project).
Если переданы data или template и они отличаются от последней версии (или версии нет) — создаётся новая запись ProjectData с incremented version.
В ответе возвращается либо новые data/template, либо последние доступные версии (или null, если их нет).
Коммитит изменения (db_session.commit()) и возвращает ProjectReadSchema.
Успешный ответ (200)
Возвращается объект по схеме ProjectReadSchema, содержащий поля проекта и поля data/template (включены только если - - include logic выше создала или нашла их).
Пример:
{ "id_connector": "conn-001", "id_project": "proj-123", "name": "My Project", "parent_id_project": null, "ecc_dt": "2025-11-14T12:34:56+03:00", "data": { ... } | null, "template": { ... } | null }