Загрузить изображение для проекта: 'Citeck Community'
  1. Citeck Community
  2. ECOSCOM-5572

Add workspaces support to ecos-data

    XMLWordДля печати

Детали задачи

    • Icon: История История
    • Решение: Нет решения
    • Icon: Medium Medium
    • Community 2024.10
    • Не заполнено
    • Не заполнено
    • Не заполнено

    Описание

      1. Добавить в настройку типа (на форме, в TypeDef и в TypeInfo) поле workspaceScope: WorkspaceScope с возможными значениями PUBLIC/PRIVATE/DEFAULT. По умолчанию должно быть DEFAULT. Для doclib-file/doclib-directory/case устанавливаем workspaceScope = PRIVATE.
      2. Добавить в ecos-model -> TypeDefResolver логику наследования workspaceScope. Если у типа стоит настройка DEFAULT, то следует взять значение из родительского типа.
      3. Добавить в RecordsQuery параметр workspaces: List<String>. По умолчанию emptyList()
      4. В ecos-model-lib добавить сервис WorkspaceService с методом для получения списка рабочих пространств по user: String и authorities: Collection<String>. Реализацию в первой итерации можно сделать на базе RecordsAPI после выполнения https://jira.citeck.ru/browse/ECOSCOM-5571. В результат нужно всегда добавлять user$[username_пользователя] (это персональное рабочее пространство). Функция должна возвращать только локальные id пространств (не ссылки). 
      5. В ecos-data -> DbEntity добавить поле workspace с типом Long (по аналогии с полем type, но workspace может быть null). В этом поле будет id рефа на workspace. Например: emodel/workspace@contracts-workspace.
      6. В ecos-data при мутации добавить обработку поля _workspace с типом EntityRef. При этом проверить что пользователь админ/система или через WorkspaceService убедиться что пользователь добавлен в workspace, в котором пытается создать новую запись. Если тип создаваемой сущности имеет workspaceScope: PRIVATE, то поле _workspace должно обязательно присутствовать при создании. Изменение этого поля не предусмотрено на первом этапе. Если у типа workspaceScope не PRIVATE, то значение поля _workspace игнорируется и не сохраняется в БД.
      7. В ecos-data -> DbRecordsQueryDao после вычисления ECOS типа для запроса проверить его workspaceScope. Если он не PRIVATE, то выполняем запрос как и раньше
        1. Если workspaceScope == PRIVATE, то получаем через WorkspaceService все рабочие пространства текущего пользователя.
        2. Берем workspaces из RecordsQuery. Если они пустые, то в итоговый query отправляем все рабочие пространства пользователя + пустой WS. Если workspaces в query не пустые, то берем их, но при этом фильтруем оставив только пространства к которым пользователь относится и пустой WS если он есть.
        3. В итоговый query через И добавляем критерий поиска по пространствам (workspace IN [...]). Если среди пространств для поиска есть пустая строка, то делаем условие (workspace IN [...] OR EMPTY: workspace)
      8. В ecos-data -> DbRecord добавить атрибут _workspace с типом EntityRef
      9. в ecos-webapp-commons -> ModelRecordPermsComponent добавить в проверку прав на чтение workspaceScope. Если он PRIVATE, то при проверке прав на чтение дополнительно проверить что запись не относится ни к одному из пространств или пользователь состоит в пространстве к которому относится запись. 

      Вложенные файлы

        Активность

          Люди

            alexey.shlaikov@citeck.ru Alexey Shlaikov
            pavel.simonov@citeck.ru Pavel Simonov
            Голоса:
            0 Голосовать за эту задачу
            Наблюдатели:
            1 Начать наблюдение за этой задачей

            Даты

              Создано:
              Обновленo:

              Учет времени

                Оценка:
                Первоначальная оценка - 3 дни
                3d
                Осталось:
                Оставшееся время - 3 дни
                3d
                Затрачено:
                Затраченное время - Не определено
                Не определено