@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
28 lines (27 loc) • 1.31 kB
JavaScript
import { uniq, intersection, difference } from 'lodash-es';
import { fetchPolicies } from '../../lib/fetch-policies.js';
import { fetchPermissions } from '../../lib/fetch-permissions.js';
/**
* Fetch a field map for fields that may or may not be null based on item-by-item permissions.
*/
export async function fetchInconsistentFieldMap({ accountability, action }, { knex, schema }) {
const fieldMap = {};
if (!accountability || accountability.admin) {
for (const collection of Object.keys(schema.collections)) {
fieldMap[collection] = [];
}
return fieldMap;
}
const policies = await fetchPolicies(accountability, { knex, schema });
const permissions = await fetchPermissions({ action, policies, accountability }, { knex, schema });
const collections = uniq(permissions.map(({ collection }) => collection));
for (const collection of collections) {
const fields = permissions
.filter((permission) => permission.collection === collection)
.map((permission) => permission.fields ?? []);
const availableEverywhere = intersection(...fields);
const availableSomewhere = difference(uniq(fields.flat()), availableEverywhere);
fieldMap[collection] = availableSomewhere;
}
return fieldMap;
}