@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
49 lines (47 loc) • 1.7 kB
JavaScript
import { parseJsonFunction } from "../../../../database/helpers/fn/json/parse-function.js";
import { extractFunctionName } from "../../../../utils/extract-function-name.js";
import { flattenFilter } from "./flatten-filter.js";
import { isEqual, uniqWith } from "lodash-es";
//#region src/permissions/modules/process-ast/utils/extract-paths-from-query.ts
/**
* Converts the passed Query object into a unique list of path arrays, for example:
*
* ```
* [
* ['author', 'age'],
* ['category']
* ]
* ```
*/
function extractPathsFromQuery(query) {
/**
* All nested paths used in the current query scope.
* This is generated by flattening the filters and adding in the used sort/aggregate fields.
*/
const paths = [];
const readOnlyPaths = [];
if (query.filter) flattenFilter(readOnlyPaths, query.filter);
if (query.sort) for (const field of query.sort) {
const stripped = field.startsWith("-") ? field.substring(1) : field;
const resolved = query.alias?.[stripped] ?? stripped;
if (extractFunctionName(resolved) === "json") {
const { field: jsonField } = parseJsonFunction(resolved);
readOnlyPaths.push([jsonField]);
continue;
}
const parts = resolved.split(".");
if (query.aggregate && parts.length > 0 && parts[0] in query.aggregate) continue;
readOnlyPaths.push(parts);
}
if (query.aggregate) for (const fields of Object.values(query.aggregate)) for (const field of fields) {
if (field === "*") continue;
paths.push(field.split("."));
}
if (query.group) for (const field of query.group) paths.push(field.split("."));
return {
paths: uniqWith(paths, isEqual),
readOnlyPaths: uniqWith(readOnlyPaths, isEqual)
};
}
//#endregion
export { extractPathsFromQuery };