From c67db4be48e47937c6f12df50f663b2dbcc22767 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 4 Oct 2023 15:45:45 +0200 Subject: [PATCH] mock document user permissions --- .../src/mocks/data/document.data.ts | 12 ++++ .../src/mocks/data/entity.data.ts | 4 ++ .../src/mocks/data/user-permission.data.ts | 50 ++++++++++++++++ .../src/mocks/handlers/document/index.ts | 9 ++- .../handlers/document/permission.handlers.ts | 14 +++++ .../permissions/permissions-modal.element.ts | 58 ++++++------------- .../documents/user-permissions/index.ts | 1 + .../documents/user-permissions/manifests.ts | 3 +- .../document-permission.repository.ts | 19 ++++++ .../document-permission.server.data.ts | 32 ++++++++++ .../user-permissions/repository/index.ts | 1 + .../user-permissions/repository/manifests.ts | 13 +++++ .../src/packages/documents/manifests.ts | 2 + .../packages/users/user-permission/index.ts | 13 +++++ 14 files changed, 188 insertions(+), 43 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/data/user-permission.data.ts create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/document/permission.handlers.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/document-permission.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/document-permission.server.data.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/document.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/document.data.ts index d7d2a183b3..5af8384cb4 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/document.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/document.data.ts @@ -1,4 +1,5 @@ import { umbDocumentTypeData } from './document-type.data.js'; +import { umbUserPermissionData } from './user-permission.data.js'; import { UmbEntityData } from './entity.data.js'; import { createDocumentTreeItem } from './utils.js'; import { @@ -10,6 +11,7 @@ import { PagedDocumentTypeResponseModel, PagedRecycleBinItemResponseModel, } from '@umbraco-cms/backoffice/backend-api'; +import { DOCUMENT_ENTITY_TYPE } from '@umbraco-cms/backoffice/document'; export const data: Array = [ { @@ -673,6 +675,16 @@ class UmbDocumentData extends UmbEntityData { const total = items.length; return { items: treeItems, total }; } + + // permissions + + getUserPermissionsForDocument(id: string): Array { + return umbUserPermissionData + .getAll() + .filter( + (permission) => permission.target.entityType === DOCUMENT_ENTITY_TYPE && permission.target.documentId === id, + ); + } } export const umbDocumentData = new UmbDocumentData(); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/entity.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/entity.data.ts index d6c442fe89..9da17cc4f2 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/entity.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/entity.data.ts @@ -8,6 +8,10 @@ export class UmbEntityData extends UmbData { super(data); } + getAll() { + return this.data; + } + getList(skip: number, take: number) { return this.data.slice(skip, skip + take); } diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-permission.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-permission.data.ts new file mode 100644 index 0000000000..84ce815969 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-permission.data.ts @@ -0,0 +1,50 @@ +import { UmbEntityData } from './entity.data.js'; +import { + DOCUMENT_ENTITY_TYPE, + UMB_USER_PERMISSION_DOCUMENT_CREATE, + UMB_USER_PERMISSION_DOCUMENT_READ, +} from '@umbraco-cms/backoffice/document'; + +export type UserPermissionModel = { + id: string; + target: unknown; + permissions: Array; +}; + +export const data: Array = [ + { + id: '408074bb-f776-485e-b85e-c2473e45663b', + target: { + entityType: DOCUMENT_ENTITY_TYPE, + documentId: 'simple-document-id', + userGroupId: '9d24dc47-a4bf-427f-8a4a-b900f03b8a12', + }, + permissions: [UMB_USER_PERMISSION_DOCUMENT_READ], + }, + { + id: 'b70b1453-a912-4157-ba62-20c2f0ab6a88', + target: { + entityType: DOCUMENT_ENTITY_TYPE, + documentId: 'simple-document-id', + userGroupId: 'f4626511-b0d7-4ab1-aebc-a87871a5dcfa', + }, + permissions: [UMB_USER_PERMISSION_DOCUMENT_READ, UMB_USER_PERMISSION_DOCUMENT_CREATE], + }, + { + id: 'b70b1453-a912-4157-ba62-20c2f0ab6a88', + target: { + entityType: DOCUMENT_ENTITY_TYPE, + documentId: 'c05da24d-7740-447b-9cdc-bd8ce2172e38', + userGroupId: '9d24dc47-a4bf-427f-8a4a-b900f03b8a12', + }, + permissions: [UMB_USER_PERMISSION_DOCUMENT_READ], + }, +]; + +class UmbUserPermissionData extends UmbEntityData { + constructor() { + super(data); + } +} + +export const umbUserPermissionData = new UmbUserPermissionData(); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/index.ts index e847bf2188..f02652bc13 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/index.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/index.ts @@ -2,5 +2,12 @@ import { handlers as recycleBinHandlers } from './recycle-bin.handlers.js'; import { handlers as treeHandlers } from './tree.handlers.js'; import { handlers as documentHandlers } from './document.handlers.js'; import { handlers as itemHandlers } from './item.handlers.js'; +import { handlers as permissionHandlers } from './permission.handlers.js'; -export const handlers = [...recycleBinHandlers, ...treeHandlers, ...itemHandlers, ...documentHandlers]; +export const handlers = [ + ...recycleBinHandlers, + ...permissionHandlers, + ...treeHandlers, + ...itemHandlers, + ...documentHandlers, +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/permission.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/permission.handlers.ts new file mode 100644 index 0000000000..b130b533f4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document/permission.handlers.ts @@ -0,0 +1,14 @@ +const { rest } = window.MockServiceWorker; +import { umbDocumentData } from '../../data/document.data.js'; +import { slug } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +// TODO: temp handlers until we have a real API +export const handlers = [ + rest.get(umbracoPath(`${slug}/:id/permissions`), (req, res, ctx) => { + const id = req.params.id as string; + if (!id) return; + const response = umbDocumentData.getUserPermissionsForDocument(id); + return res(ctx.status(200), ctx.json(response)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions-modal.element.ts index 467be649c3..d9ef6e0ad3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/permissions/permissions-modal.element.ts @@ -1,3 +1,4 @@ +import { UmbDocumentPermissionRepository } from '../../user-permissions/index.js'; import { UmbUserGroupRepository } from '@umbraco-cms/backoffice/user-group'; import { html, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -12,23 +13,6 @@ import { } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UmbSelectedEvent } from '@umbraco-cms/backoffice/events'; -import { UmbId } from '@umbraco-cms/backoffice/id'; -import { - UMB_USER_PERMISSION_DOCUMENT_CREATE, - UMB_USER_PERMISSION_DOCUMENT_READ, -} from '@umbraco-cms/backoffice/document'; - -type UserPermissionModel = { - id: string; - target: PermissionTargetType; - permissions: Array; -}; - -type DocumentGranularPermission = { - entityType: 'document'; - documentId: string; - userGroupId: string; -}; type UmbUserGroupRefData = { id: string; @@ -49,28 +33,10 @@ export class UmbPermissionsModalElement extends UmbLitElement { _userGroups: Array = []; @state() - _permissions: Array> = [ - { - id: new UmbId().toString(), - target: { - entityType: 'document', - documentId: '1234-1234-1234', - userGroupId: '9d24dc47-a4bf-427f-8a4a-b900f03b8a12', - }, - permissions: [UMB_USER_PERMISSION_DOCUMENT_CREATE], - }, - { - id: new UmbId().toString(), - target: { - entityType: 'document', - documentId: '1234-1234-1234', - userGroupId: 'f4626511-b0d7-4ab1-aebc-a87871a5dcfa', - }, - permissions: [UMB_USER_PERMISSION_DOCUMENT_READ], - }, - ]; + _userPermissions: Array = []; #userGroupRepository = new UmbUserGroupRepository(this); + #documentPermissionRepository = new UmbDocumentPermissionRepository(this); #modalManagerContext?: UmbModalManagerContext; #userGroupPickerModal?: UmbModalContext; @@ -91,15 +57,23 @@ export class UmbPermissionsModalElement extends UmbLitElement { }); } + protected async firstUpdated(): Promise { + if (!this.data?.unique) throw new Error('Could not load permissions, no unique was provided'); + const { data } = await this.#documentPermissionRepository.requestPermissions(this.data.unique); + if (data) { + this._userPermissions = data; + } + } + async connectedCallback(): Promise { super.connectedCallback(); - const userGroupIds = [...new Set(this._permissions.map((permission) => permission.target.userGroupId))]; + const userGroupIds = [...new Set(this._userPermissions.map((permission) => permission.target.userGroupId))]; const { data } = await this.#userGroupRepository.requestItems(userGroupIds); const userGroups = data ?? []; - this._userGroups = this._permissions.map((entry) => { + this._userGroups = this._userPermissions.map((entry) => { const userGroup = userGroups.find((userGroup) => userGroup.id == entry.target.userGroupId); return { id: entry.target.userGroupId, @@ -148,7 +122,9 @@ export class UmbPermissionsModalElement extends UmbLitElement { `, )} - Open + Select user group Cancel @@ -157,7 +133,7 @@ export class UmbPermissionsModalElement extends UmbLitElement { id="confirm" color="positive" look="primary" - label="Confirm" + label="Save" @click=${this._handleConfirm}> `; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/index.ts index 1e95b5d703..78c94f0582 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/index.ts @@ -1 +1,2 @@ export * from './manifests.js'; +export * from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts index 3b8dc13f4f..08f16fa720 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts @@ -1,3 +1,4 @@ +import { manifests as repositoryManifests } from './repository/manifests.js'; import type { ManifestUserGranularPermission, ManifestUserPermission, @@ -202,4 +203,4 @@ export const granularPermissions: Array = [ }, ]; -export const manifests = [...permissions, ...granularPermissions]; +export const manifests = [...repositoryManifests, ...permissions, ...granularPermissions]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/document-permission.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/document-permission.repository.ts new file mode 100644 index 0000000000..dd5c7bab41 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/document-permission.repository.ts @@ -0,0 +1,19 @@ +import { t } from 'msw/lib/glossary-de6278a9.js'; +import { UmbDocumentPermissionServerDataSource } from './document-permission.server.data.js'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; + +export class UmbDocumentPermissionRepository { + #host: UmbControllerHostElement; + + #permissionSource: UmbDocumentPermissionServerDataSource; + + constructor(host: UmbControllerHostElement) { + this.#host = host; + this.#permissionSource = new UmbDocumentPermissionServerDataSource(this.#host); + } + + async requestPermissions(id: string) { + if (!id) throw new Error(`id is required`); + return this.#permissionSource.requestPermissions(id); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/document-permission.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/document-permission.server.data.ts new file mode 100644 index 0000000000..2b093c3137 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/document-permission.server.data.ts @@ -0,0 +1,32 @@ +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +/** + * @export + * @class UmbUserGroupCollectionServerDataSource + * @implements {RepositoryDetailDataSource} + */ +export class UmbDocumentPermissionServerDataSource { + #host: UmbControllerHostElement; + + /** + * Creates an instance of UmbDocumentPermissionServerDataSource. + * @param {UmbControllerHostElement} host + * @memberof UmbDocumentPermissionServerDataSource + */ + constructor(host: UmbControllerHostElement) { + this.#host = host; + } + + requestPermissions(id: string) { + return tryExecuteAndNotify( + this.#host, + fetch(`/umbraco/management/api/v1/document/${id}/permissions`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }).then((res) => res.json()), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/index.ts new file mode 100644 index 0000000000..79337c7f92 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/index.ts @@ -0,0 +1 @@ +export * from './document-permission.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/manifests.ts new file mode 100644 index 0000000000..7f00473726 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/repository/manifests.ts @@ -0,0 +1,13 @@ +import { UmbDocumentPermissionRepository } from './document-permission.repository.js'; +import { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; + +export const UMB_DOCUMENT_PERMISSION_REPOSITORY_ALIAS = 'Umb.Repository.Document.Permission'; + +const repository: ManifestRepository = { + type: 'repository', + alias: UMB_DOCUMENT_PERMISSION_REPOSITORY_ALIAS, + name: 'Document Permission Repository', + class: UmbDocumentPermissionRepository, +}; + +export const manifests = [repository]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/manifests.ts index 17fc8e51b5..0ece551478 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/manifests.ts @@ -4,6 +4,7 @@ import { manifests as contentMenuManifest } from './menu.manifests.js'; import { manifests as documentBlueprintManifests } from './document-blueprints/manifests.js'; import { manifests as documentTypeManifests } from './document-types/manifests.js'; import { manifests as documentManifests } from './documents/manifests.js'; +import { manifests as documentPermissionManifests } from './documents/user-permissions/index.js'; export const manifests = [ ...dashboardManifests, @@ -12,4 +13,5 @@ export const manifests = [ ...documentBlueprintManifests, ...documentTypeManifests, ...documentManifests, + ...documentPermissionManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/users/user-permission/index.ts b/src/Umbraco.Web.UI.Client/src/packages/users/user-permission/index.ts index c66b5c4636..8eed47ad34 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/users/user-permission/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/users/user-permission/index.ts @@ -1,2 +1,15 @@ export * from './components/index.js'; export * from './conditions/index.js'; + +export type UserPermissionModel = { + id: string; + target: PermissionTargetType; + permissions: Array; +}; + +// TODO: this should only be known by the document +export type UmbDocumentGranularPermission = { + entityType: 'document'; + documentId: string; + userGroupId: string; +};