implement allOf to allow multiple verbs for one permission condition

This commit is contained in:
Mads Rasmussen
2024-04-09 13:17:10 +02:00
parent 7c910266d4
commit 004427dfe2
8 changed files with 32 additions and 22 deletions

View File

@@ -3,26 +3,26 @@ import type { CollectionBulkActionPermissionConditionConfig } from '../../collec
import type { UmbSectionUserPermissionConditionConfig } from '../../section/conditions/index.js';
import type { SectionAliasConditionConfig } from './section-alias.condition.js';
import type { SwitchConditionConfig } from './switch.condition.js';
import type { UserPermissionConditionConfig } from '@umbraco-cms/backoffice/user-permission';
import type { BlockWorkspaceHasSettingsConditionConfig } from '@umbraco-cms/backoffice/block';
import type {
WorkspaceAliasConditionConfig,
WorkspaceEntityTypeConditionConfig,
} from '@umbraco-cms/backoffice/workspace';
import type { UmbConditionConfigBase } from '@umbraco-cms/backoffice/extension-api';
import type { UmbDocumentUserPermissionConditionConfig } from '@umbraco-cms/backoffice/document';
/* TODO: in theory should't the core package import from other packages.
Are there any other way we can do this?
Niels: Sadly I don't see any other solutions currently. But are very open for ideas :-) now that I think about it maybe there is some ability to extend a global type, similar to the 'declare global' trick we use on Elements.
*/
export type ConditionTypes =
| BlockWorkspaceHasSettingsConditionConfig
| CollectionAliasConditionConfig
| CollectionBulkActionPermissionConditionConfig
| SectionAliasConditionConfig
| WorkspaceAliasConditionConfig
| BlockWorkspaceHasSettingsConditionConfig
| WorkspaceEntityTypeConditionConfig
| SwitchConditionConfig
| UserPermissionConditionConfig
| UmbDocumentUserPermissionConditionConfig
| UmbSectionUserPermissionConditionConfig
| WorkspaceAliasConditionConfig
| WorkspaceEntityTypeConditionConfig
| UmbConditionConfigBase;

View File

@@ -18,7 +18,7 @@ const entityActions: Array<ManifestTypes> = [
conditions: [
{
alias: 'Umb.Condition.UserPermission.Document',
match: UMB_USER_PERMISSION_DOCUMENT_CREATE,
allOf: [UMB_USER_PERMISSION_DOCUMENT_CREATE],
},
],
},

View File

@@ -1,4 +1,5 @@
import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js';
import { UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES } from '../../user-permissions/index.js';
import { UmbDocumentCultureAndHostnamesEntityAction } from './culture-and-hostnames.action.js';
import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
@@ -18,7 +19,7 @@ const entityActions: Array<ManifestTypes> = [
conditions: [
{
alias: 'Umb.Condition.UserPermission.Document',
match: UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES,
allOf: [UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES],
},
],
},

View File

@@ -2,7 +2,12 @@ import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS } from '../repository/index.js';
import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js';
import { UMB_DOCUMENT_PICKER_MODAL } from '../modals/index.js';
import {
UMB_USER_PERMISSION_DOCUMENT_CREATE_BLUEPRINT,
UMB_USER_PERMISSION_DOCUMENT_DELETE,
UMB_USER_PERMISSION_DOCUMENT_DUPLICATE,
UMB_USER_PERMISSION_DOCUMENT_MOVE,
UMB_USER_PERMISSION_DOCUMENT_NOTIFICATIONS,
UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS,
UMB_USER_PERMISSION_DOCUMENT_PUBLISH,
UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH,
} from '../user-permissions/constants.js';
@@ -28,7 +33,7 @@ const entityActions: Array<ManifestEntityAction> = [
conditions: [
{
alias: 'Umb.Condition.UserPermission.Document',
match: UMB_USER_PERMISSION_DOCUMENT_DELETE,
allOf: [UMB_USER_PERMISSION_DOCUMENT_DELETE],
},
],
},
@@ -47,7 +52,7 @@ const entityActions: Array<ManifestEntityAction> = [
conditions: [
{
alias: 'Umb.Condition.UserPermission.Document',
match: UMB_USER_PERMISSION_DOCUMENT_CREATE_BLUEPRINT,
allOf: [UMB_USER_PERMISSION_DOCUMENT_CREATE_BLUEPRINT],
},
],
},
@@ -66,7 +71,7 @@ const entityActions: Array<ManifestEntityAction> = [
conditions: [
{
alias: 'Umb.Condition.UserPermission.Document',
match: UMB_USER_PERMISSION_DOCUMENT_MOVE,
allOf: [UMB_USER_PERMISSION_DOCUMENT_MOVE],
},
],
},
@@ -85,7 +90,7 @@ const entityActions: Array<ManifestEntityAction> = [
conditions: [
{
alias: 'Umb.Condition.UserPermission.Document',
match: UMB_USER_PERMISSION_DOCUMENT_DUPLICATE,
allOf: [UMB_USER_PERMISSION_DOCUMENT_DUPLICATE],
},
],
},
@@ -104,7 +109,7 @@ const entityActions: Array<ManifestEntityAction> = [
conditions: [
{
alias: 'Umb.Condition.UserPermission.Document',
match: UMB_USER_PERMISSION_DOCUMENT_PUBLISH,
allOf: [UMB_USER_PERMISSION_DOCUMENT_PUBLISH],
},
],
},
@@ -123,7 +128,7 @@ const entityActions: Array<ManifestEntityAction> = [
conditions: [
{
alias: 'Umb.Condition.UserPermission.Document',
match: UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH,
allOf: [UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH],
},
],
},
@@ -142,7 +147,7 @@ const entityActions: Array<ManifestEntityAction> = [
conditions: [
{
alias: 'Umb.Condition.UserPermission.Document',
match: UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS,
allOf: [UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS],
},
],
},
@@ -161,7 +166,7 @@ const entityActions: Array<ManifestEntityAction> = [
conditions: [
{
alias: 'Umb.Condition.UserPermission.Document',
match: UMB_USER_PERMISSION_DOCUMENT_NOTIFICATIONS,
allOf: [UMB_USER_PERMISSION_DOCUMENT_NOTIFICATIONS],
},
],
},

View File

@@ -1,4 +1,5 @@
import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js';
import { UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS } from '../../user-permissions/index.js';
import { UmbDocumentPublicAccessEntityAction } from './public-access.action.js';
import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
@@ -18,7 +19,7 @@ const entityActions: Array<ManifestTypes> = [
conditions: [
{
alias: 'Umb.Condition.UserPermission.Document',
match: UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS,
allOf: [UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS],
},
],
},

View File

@@ -1,6 +1,7 @@
import { UMB_DOCUMENT_ENTITY_TYPE, UMB_DOCUMENT_ROOT_ENTITY_TYPE } from '../../entity.js';
import { UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js';
import { UMB_DOCUMENT_TREE_REPOSITORY_ALIAS } from '../../tree/index.js';
import { UMB_USER_PERMISSION_DOCUMENT_SORT } from '../../user-permissions/index.js';
import { UMB_SORT_CHILDREN_OF_DOCUMENT_REPOSITORY_ALIAS } from './repository/constants.js';
import { manifests as repositoryManifests } from './repository/manifests.js';
import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
@@ -21,7 +22,7 @@ export const manifests: Array<ManifestTypes> = [
conditions: [
{
alias: 'Umb.Condition.UserPermission.Document',
match: UMB_USER_PERMISSION_DOCUMENT_SORT,
allOf: [UMB_USER_PERMISSION_DOCUMENT_SORT],
},
],
},

View File

@@ -3,6 +3,7 @@ import type { UmbVariantModel, UmbVariantOptionModel, UmbVariantPublishModel } f
import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models';
import { DocumentVariantStateModel as UmbDocumentVariantState } from '@umbraco-cms/backoffice/external/backend-api';
export { UmbDocumentVariantState };
export type { UmbDocumentUserPermissionConditionConfig } from './user-permissions/document-user-permission.condition.js';
export interface UmbDocumentDetailModel {
documentType: {

View File

@@ -58,17 +58,18 @@ export class UmbDocumentUserPermissionCondition
if (!this.#entityType) return;
if (this.#unique === undefined) return;
let verbs: Array<string> = [];
let verbs: Array<string> = this.#fallbackPermissions;
if (this.#documentPermissions) {
const permissionsForCurrentDocument = this.#documentPermissions.find(
(permission) => permission.document.id === this.#unique,
);
const currentDocumentVerbs = permissionsForCurrentDocument ? permissionsForCurrentDocument.verbs : [];
verbs = this.#fallbackPermissions.concat(currentDocumentVerbs);
verbs = verbs.concat(currentDocumentVerbs);
}
this.permitted = verbs.includes(this.config.match);
const uniqueVerbs = [...new Set(verbs)];
this.permitted = this.config.allOf.every((verb) => uniqueVerbs.includes(verb));
}
}
@@ -78,9 +79,9 @@ export type UmbDocumentUserPermissionConditionConfig =
*
*
* @example
* "Umb.Document.Create"
* ["Umb.Document.Save", "Umb.Document.Publish"]
*/
match: string;
allOf: Array<string>;
};
export const manifest: ManifestCondition = {