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