-
-
Notifications
You must be signed in to change notification settings - Fork 3.7k
/
use-permissions.ts
94 lines (74 loc) · 2.64 KB
/
use-permissions.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import { usePermissionsStore, useUserStore } from '@/stores';
import { Field } from '@directus/shared/types';
import { computed, ComputedRef, Ref } from 'vue';
import { cloneDeep } from 'lodash';
import { isAllowed } from '../utils/is-allowed';
import { useCollection } from '@directus/shared/composables';
type UsablePermissions = {
deleteAllowed: ComputedRef<boolean>;
saveAllowed: ComputedRef<boolean>;
archiveAllowed: ComputedRef<boolean>;
updateAllowed: ComputedRef<boolean>;
fields: ComputedRef<Field[]>;
revisionsAllowed: ComputedRef<boolean>;
};
export function usePermissions(collection: Ref<string>, item: Ref<any>, isNew: Ref<boolean>): UsablePermissions {
const userStore = useUserStore();
const permissionsStore = usePermissionsStore();
const { info: collectionInfo, fields: rawFields } = useCollection(collection);
const deleteAllowed = computed(() => isAllowed(collection.value, 'delete', item.value));
const saveAllowed = computed(() => {
if (isNew.value) {
return true;
}
return isAllowed(collection.value, 'update', item.value);
});
const updateAllowed = computed(() => isAllowed(collection.value, 'update', item.value));
const archiveAllowed = computed(() => {
if (!collectionInfo.value?.meta?.archive_field) return false;
return isAllowed(
collection.value,
'update',
{
[collectionInfo.value.meta.archive_field]: collectionInfo.value.meta.archive_value,
},
true
);
});
const fields = computed(() => {
let fields = cloneDeep(rawFields.value);
if (userStore.currentUser?.role?.admin_access === true) return fields;
const permissions = permissionsStore.getPermissionsForUser(collection.value, isNew.value ? 'create' : 'update');
if (!permissions) return fields;
if (permissions.fields?.includes('*') === false) {
fields = fields.map((field: Field) => {
if (permissions.fields?.includes(field.field) === false) {
field.meta = {
...(field.meta || {}),
readonly: true,
} as any;
}
return field;
});
}
if (permissions.presets) {
fields = fields.map((field: Field) => {
if (field.field in permissions.presets!) {
field.schema = {
...(field.schema || {}),
default_value: permissions.presets![field.field],
} as any;
}
return field;
});
}
return fields;
});
const revisionsAllowed = computed(() => {
if (userStore.currentUser?.role?.admin_access === true) return true;
return !!permissionsStore.permissions.find(
(permission) => permission.collection === 'directus_revisions' && permission.action === 'read'
);
});
return { deleteAllowed, saveAllowed, archiveAllowed, updateAllowed, fields, revisionsAllowed };
}