ADN Open CIS
Сообщество программистов Autodesk в СНГ

18/04/2017

Правильный способ получения списка пользовательских папок при помощи DataManagement API

Вот ошибка, которую я делал при попытке перечислить папки в проекте аутентифицированного пользователя с помощью API Forge DataManagement:

  • Получение доступа к деталям проекта
  • Захват идентификатора корневой папки
  • ... и перечисление содержимого этой папки.

Этот подход работает только до тех пор, пока пользователь является администратором проекта, поэтому у меня не было проблем при тестировании с моей учетной записью.

Код выглядел следующим образом:

Код - JavaScript: [Выделить]
  1. this.dmAPI.getProject(
  2.   node.hubId, node.projectId).then((project) => {
  3.       const rootId = project.data.relationships.rootFolder.data.id
  4.       this.dmAPI.getFolderContent(
  5.          node.projectId, rootId).then((folderItemsRes) => {
  6.       // Перечислить все элементы папок
  7.   })

Однако для другого пользователя, которому был предоставлен доступ к проекту или определенной папке, который не является администратором, этот подход неверен. Самый верный способ сделать это - использовать конкретную конечную точку, которая была добавлена чуть позже: GET hubs/:hub_id/projects/:project_id/topFolders

Как указано в документации, эта конечная точка

Возвращает сведения о папках самого высокого уровня, к которым у пользователя есть доступ для данного проекта. Пользователь должен иметь как минимум доступ для чтения к папкам.

Если пользователь имеет доступ к корневой папке проекта, это вернёт только сведения о корневой папке. Если пользователь не имеет доступа к корневой папке, это вернёт сведения обо всех папках самого высокого уровня в иерархии папок, к которой пользователь имеет доступ.

Обратите внимание: когда пользователи имеют доступ к папке, доступ автоматически предоставляется и ее подпапкам.

Правильный код теперь выглядит следующим образом, где я обернул запрос REST при помощи пользовательского объекта API:

Код - JavaScript: [Выделить]
  1. this.dmAPI.getProjectTopFolders(
  2.   node.hubId, node.projectId).then((folderItemsRes) => {
  3.   // Перечислить элементы папок рекурсивно ...
  4. })

Это просто сокращенная версия фактического кода, который запускается в моем демонстрационном приложении. Полный код может асинхронно и рекурсивно загружать все папки, подпапки и элементы под каждой учетной записью пользователя и отображать их в виде дерева. Это один из самых сложных асинхронных кодов, которые мне пришлось написать ... Вы можете посмотреть на это здесь

Полный код проекта расположен здесь и живая демонстрация находится здесь: https://dm.autodesk.io

Снимок экрана 2017-04-07 в 11.43.10.png

Источник: https://forge.autodesk.com/blog/right-way-list-user-folders-datamanagement-api

Автор перевода: Дмитрий Емельянов

Обсуждение: http://adn-cis.org/forum/index.php?topic=

Опубликовано 18.04.2017