@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
37 lines (36 loc) • 1.56 kB
JavaScript
import { sanitizeQuery } from '../../../utils/sanitize-query.js';
import { validateQuery } from '../../../utils/validate-query.js';
import { filterReplaceM2A } from './filter-replace-m2a.js';
import { replaceFuncs } from './replace-funcs.js';
/**
* Resolve the aggregation query based on the requested aggregated fields
*/
export async function getAggregateQuery(rawQuery, selections, schema, accountability, collection) {
const query = await sanitizeQuery(rawQuery, schema, accountability);
query.aggregate = {};
for (let aggregationGroup of selections) {
if ((aggregationGroup.kind === 'Field') !== true)
continue;
aggregationGroup = aggregationGroup;
// filter out graphql pointers, like __typename
if (aggregationGroup.name.value.startsWith('__'))
continue;
const aggregateProperty = aggregationGroup.name.value;
query.aggregate[aggregateProperty] =
aggregationGroup.selectionSet?.selections
// filter out graphql pointers, like __typename
.filter((selectionNode) => !selectionNode?.name.value.startsWith('__'))
.map((selectionNode) => {
selectionNode = selectionNode;
return selectionNode.name.value;
}) ?? [];
}
if (query.filter) {
query.filter = replaceFuncs(query.filter);
}
if (collection && query.filter) {
query.filter = filterReplaceM2A(query.filter, collection, schema);
}
validateQuery(query);
return query;
}