UNPKG

@directus/api

Version:

Directus is a real-time API and App dashboard for managing SQL database content

41 lines (40 loc) 1.56 kB
import { fetchPermissions } from '../permissions/lib/fetch-permissions.js'; import { fetchPolicies } from '../permissions/lib/fetch-policies.js'; import { createDefaultAccountability } from '../permissions/utils/create-default-accountability.js'; /** * Check if the read permissions for a collection contain the dynamic variable $NOW. * If they do, the permissions are not cacheable. */ export async function permissionsCacheable(collection, context, accountability) { if (!collection) { return true; } if (!accountability) { accountability = createDefaultAccountability(); } const policies = await fetchPolicies(accountability, context); const permissions = await fetchPermissions({ action: 'read', policies, collections: [collection], accountability, bypassDynamicVariableProcessing: true }, context); const has_now = permissions.some((permission) => { if (!permission.permissions) { return false; } return filterHasNow(permission.permissions); }); return !has_now; } export function filterHasNow(filter) { if (filter === null) return false; return Object.entries(filter).some(([key, value]) => { if (key === '_and' || key === '_or') { return value.some((sub_filter) => filterHasNow(sub_filter)); } else if (typeof value === 'object') { return filterHasNow(value); } else if (typeof value === 'string') { return value.startsWith('$NOW'); } return false; }); }