@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
73 lines (72 loc) • 3.5 kB
JavaScript
import { useEnv } from '@directus/env';
import { getSimpleHash } from '@directus/utils';
import { getCache, getCacheValue, setCacheValue } from '../../cache.js';
import {} from './extract-required-dynamic-variable-context.js';
export async function fetchDynamicVariableData(options, context) {
const { UsersService } = await import('../../services/users.js');
const { RolesService } = await import('../../services/roles.js');
const { PoliciesService } = await import('../../services/policies.js');
const contextData = {};
if (options.accountability.user && (options.dynamicVariableContext.$CURRENT_USER?.size ?? 0) > 0) {
contextData['$CURRENT_USER'] = await fetchContextData('$CURRENT_USER', options.dynamicVariableContext, { user: options.accountability.user }, async (fields) => {
const usersService = new UsersService(context);
return await usersService.readOne(options.accountability.user, {
fields,
});
});
}
if (options.accountability.role && (options.dynamicVariableContext.$CURRENT_ROLE?.size ?? 0) > 0) {
contextData['$CURRENT_ROLE'] = await fetchContextData('$CURRENT_ROLE', options.dynamicVariableContext, { role: options.accountability.role }, async (fields) => {
const rolesService = new RolesService(context);
return await rolesService.readOne(options.accountability.role, {
fields,
});
});
}
if (options.accountability.roles &&
options.accountability.roles.length > 0 &&
(options.dynamicVariableContext.$CURRENT_ROLES?.size ?? 0) > 0) {
contextData['$CURRENT_ROLES'] = await fetchContextData('$CURRENT_ROLES', options.dynamicVariableContext, { roles: options.accountability.roles }, async (fields) => {
const rolesService = new RolesService(context);
return await rolesService.readMany(options.accountability.roles, {
fields,
});
});
}
if (options.policies.length > 0) {
if ((options.dynamicVariableContext.$CURRENT_POLICIES?.size ?? 0) > 0) {
// Always add the id field
options.dynamicVariableContext.$CURRENT_POLICIES.add('id');
contextData['$CURRENT_POLICIES'] = await fetchContextData('$CURRENT_POLICIES', options.dynamicVariableContext, { policies: options.policies }, async (fields) => {
const policiesService = new PoliciesService(context);
return await policiesService.readMany(options.policies, {
fields,
});
});
}
else {
// Always create entries for the policies with the `id` field present
contextData['$CURRENT_POLICIES'] = options.policies.map((id) => ({ id }));
}
}
return contextData;
}
async function fetchContextData(key, permissionContext, cacheContext, fetch) {
const { cache } = getCache();
const env = useEnv();
const fields = Array.from(permissionContext[key]);
const cacheKey = cache
? `filter-context-${key.slice(1)}-${getSimpleHash(JSON.stringify({ ...cacheContext, fields }))}`
: '';
let data = undefined;
if (cache) {
data = await getCacheValue(cache, cacheKey);
}
if (!data) {
data = await fetch(fields);
if (cache && env['CACHE_ENABLED'] !== false) {
await setCacheValue(cache, cacheKey, data);
}
}
return data;
}