UNPKG

@directus/api

Version:

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

49 lines (47 loc) 1.7 kB
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 };