Перейти к содержимому

API: Библиотеки документов и файлы

Требуется авторизация. Права наследуются от узла-родителя (nodeId).

МетодПутьПраво на узелОписание
GET/libraries?nodeId={uuid}viewБиблиотеки узла
POST/librarieseditСоздать библиотеку
GET/libraries/{id}viewОдна библиотека
PATCH/libraries/{id}editОбновить
DELETE/libraries/{id}deleteУдалить в корзину узла (снимок библиотеки целиком)
POST/libraries/{id}/recycle-contentdeleteПереместить все корневые файлы/папки в корзину (библиотека остаётся)

DELETE /libraries/{id} — мягкое удаление: одна запись корзины с представлениями и текущим содержимым. Файлы этой библиотеки, уже лежавшие в корзине, purge. Восстановление — POST /nodes/{nodeId}/recycle-bin/{entryId}/restore. См. Корзина.

Тело создания:

{
"nodeId": "uuid",
"title": "Документы",
"slug": "dokumenty",
"description": ""
}

В ответе GET / после PATCH также: search_enabled (по умолчанию true) — участие библиотеки и файлов в глобальном поиске портала.

Настройки библиотеки → Общие → Участвует в поиске, либо:

PATCH /api/v1/libraries/{libraryId}
Content-Type: application/json
{ "searchEnabled": false }

Изменение searchEnabled — только администратор портала. При выключении библиотека и файлы сразу убираются из индекса. См. Поиск.

МетодПутьПравоОписание
GET/files?parentId={uuid}viewСодержимое папки (без parentId — корень)
POST/files/foldersaddСоздать папку
POST/files/uploadaddЗагрузить файл (multipart, поле file, опц. parentId)
PATCH/files/{fileId}editПереименовать / переместить
DELETE/files/{fileId}deleteУдалить файл или папку (рекурсивно)
GET/files/{fileRef}/permission-settingsviewНастройки наследования прав (inheritsPermissions, parentLabel)
PATCH/files/{fileRef}/permission-settingsadminВключить/отключить наследование: { "inheritFromParent": true|false }
GET / HEAD/files/{fileRef}/thumbnailviewМиниатюра изображения для сетки и колонки «Предпросмотр»

Для fileRef допускается числовой id или guid. Управление наследованием — только администратор портала. Явные права на файл/папку — через /api/v1/permissions с resourceType=file и libraryId.

Ответ GET /files включает meta.breadcrumb — цепочка папок до текущей. Каждый элемент содержит inherits_permissions и permissions (canEdit, canDelete, canManagePermissions).

GET /api/v1/libraries/{libraryId}/files?parentId={uuid}&page=1&limit=50&viewId={uuid}&sort=...&orderBy=...&filter=...&q=...
ПараметрОписание
parentIdUUID папки (без параметра — корень библиотеки)
pageНомер страницы (по умолчанию 1)
limitРазмер страницы (1500; иначе из pageSize представления)
viewIdUUID представления (иначе — default view)
sortOverride сортировки: JSON-массив или column:asc,column2:desc
orderByТо же, что sort (приоритет у orderBy, если указаны оба)
filterOverride фильтра (JSON); объединяется с фильтром представления через AND
qТекстовый поиск (OR по колонкам, без учёта регистра)

Ответ meta: page, limit, total, totalPages, totalInView, groups, columns, view, breadcrumb, officeEnabled.

Фильтрация и сортировка по поддерживаемым условиям выполняются на уровне PostgreSQL (library_files). Сценарии с groupBy используют in-memory fallback.

name, item_type, file_size, mime_type, updated_at, created_at, uploaded_by, version_number, item_number.

Формат фильтра — тот же JSON, что у списков:

{
"logic": "and",
"conditions": [
{ "column": "item_type", "operator": "eq", "value": "file" },
{ "column": "name", "operator": "contains", "value": "договор" }
]
}

Пример — только PDF в корне библиотеки:

GET /api/v1/libraries/{libraryId}/files?filter={"logic":"and","conditions":[{"column":"item_type","operator":"eq","value":"file"},{"column":"mime_type","operator":"eq","value":"application/pdf"}]}&limit=50

По умолчанию папки всегда отображаются выше файлов; внутри каждой группы — сортировка по алфавиту (name). Дополнительные правила сортировки из config.sort применяются после группировки по типу.

Дефолтный config представления библиотеки:

{
"columns": ["item_number", "name", "file_size", "updated_at"],
"sort": [
{ "column": "item_type", "direction": "desc" },
{ "column": "name", "direction": "asc" }
],
"selectionMode": "multiple",
"showActionsColumn": true,
"pageSize": 50
}

selectionMode: none | single | multiple — чекбоксы в табличном режиме и массовое удаление (клиент вызывает DELETE для каждого выбранного fileRef). При удалении папки весь вложенный subtree уходит в корзину узла одной операцией.

showActionsColumn: true | false — показывать колонку контекстного меню (⋮) в таблице (по умолчанию true). Порядок колонок: при выборе — чекбокс → действия → …; без выбора — действия → ….

Если в папке есть изображения, доступен режим сетки (?display=grid|table в URL): картинки — превью, папки и остальные файлы — крупные иконки по типу. Чекбоксы и массовое удаление — только в табличном режиме (display=table). Превью картинок в сетке и таблице запрашивает /files/{fileRef}/thumbnail (маленький JPEG), а не оригинал.

Прокси через API. Клиент не получает прямых URL S3.

Максимальный размер файла: 4 ГБ.

По умолчанию ответ отдаётся с Content-Disposition: attachment (сохранение файла). Для встроенного превью/плеера передайте ?inline=1 — тогда Content-Disposition: inline. Без inline аудио и видео тоже скачиваются как вложение (как пункт Скачать в меню библиотеки), а не открываются как превью.

Миниатюры — /api/v1/libraries/{libraryId}/files/{fileRef}/thumbnail

Заголовок раздела «Миниатюры — /api/v1/libraries/{libraryId}/files/{fileRef}/thumbnail»

Для сетки и колонки «Предпросмотр» клиент запрашивает этот маршрут, а не /download. Полноразмерный файл открывается только в просмотрщике по клику (/download).

МетодПутьПравоОписание
GET / HEAD/libraries/{libraryId}/files/{fileRef}/thumbnailviewJPEG-миниатюра (длинная сторона 320px) или оригинал SVG

Поведение:

  • те же права, что у скачивания (view на библиотеку и файл);
  • ответ Content-Disposition: inline, Cache-Control: private, max-age=86400;
  • SVG отдаётся как есть (без растеризации);
  • не-изображение, слишком большой растр (>40 Мп) или неподдерживаемый формат — 404;
  • миниатюра кэшируется в объектном хранилище рядом с оригиналом (…/_thumb.jpg) и строится при загрузке файла (и при новой версии / restore);
  • если миниатюры ещё нет (старые файлы, сбой при загрузке), GET /thumbnail строит её при первом открытии папки.

Версионирование — /api/v1/libraries/{libraryId}/files/{fileId}/versions

Заголовок раздела «Версионирование — /api/v1/libraries/{libraryId}/files/{fileId}/versions»
МетодПутьПравоОписание
GET/files/{fileId}/versionsviewТекущая версия и история
POST/files/{fileId}/versionseditЗагрузить новую версию (multipart: file, опц. comment)
GET/files/{fileId}/versions/{versionId}/downloadviewСкачать архивную версию
POST/files/{fileId}/versions/{versionId}/restoreeditВосстановить версию как текущую

При загрузке новой версии предыдущее содержимое сохраняется в library_file_versions. Текущая версия — в library_files.version_number.

Portal Office (WOPI) — онлайн-просмотр и редактирование

Заголовок раздела «Portal Office (WOPI) — онлайн-просмотр и редактирование»

Требуется PORTAL_OFFICE_ENABLED=true и запущенный Portal Office (portal/office, см. Portal Office).

МетодПутьПравоОписание
GET/libraries/{libraryId}/files/{fileId}/office/session?mode=view|editview / editURL iframe Portal Office + WOPI token (accessToken, accessTokenTtl)
POST/libraries/{libraryId}/files/{fileId}/office/session/refresh?mode=view|editview / editНовый WOPI token для открытой сессии (фронт → Reset_Access_Token)
GET/wopi/files/{fileId}?access_token=...WOPICheckFileInfo
GET/wopi/files/{fileId}/contents?access_token=...WOPIGetFile
POST/wopi/files/{fileId}/contents?access_token=...WOPIPutFile (сохранение)
POST/wopi/files/{fileId}?access_token=...WOPILOCK / UNLOCK / REFRESH_LOCK

WOPI JWT живёт 8 часов; пока открыт редактор, frontend периодически вызывает session/refresh и передаёт новый токен в iframe через postMessage Reset_Access_Token, поэтому сессия может длиться дольше (пока жива cookie Portal).

Ответ GET /files для каждого файла включает:

{
"is_office_file": true,
"permissions": { "canEdit": true, "canDelete": false }
}

В metaofficeEnabled (глобальный флаг Portal Office).

При сохранении из редактора создаётся новая версия через UploadVersionAsync с комментарием "Portal Office".

Поддерживаемые расширения: .docx, .xlsx, .pptx, .doc, .xls, .ppt, .odt, .ods, .odp, .csv, .rtf, .txt и др. (см. OfficeDocumentTypes).

  • file.uploaded
  • file.versionCreated
  • file.versionRestored
  • file.folderCreated
  • file.deleted

Подписчики (Event Receivers) — в фазе 6.