@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
59 lines (57 loc) • 2.54 kB
JavaScript
import { getRelation, getRelationType } from "@directus/utils";
//#region src/services/graphql/utils/filter-replace-m2a.ts
function filterReplaceM2A(filter_arg, collection, schema, options) {
const filter = filter_arg;
for (const key in filter) {
const parts = key.split("__");
let field = parts[0];
const any_collection = parts[1];
if (!field) continue;
field = options?.aliasMap?.[field] ?? field;
const relation = getRelation(schema.relations, collection, field);
const type = relation ? getRelationType({
relation,
collection,
field,
useA2O: true
}) : null;
if (type === "o2m" && relation) filter[key] = filterReplaceM2A(filter[key], relation.collection, schema, options);
else if (type === "m2o" && relation) filter[key] = filterReplaceM2A(filter[key], relation.related_collection, schema, options);
else if (type === "a2o" && relation && any_collection && relation.meta?.one_allowed_collections?.includes(any_collection)) {
filter[`${field}:${any_collection}`] = filterReplaceM2A(filter[key], any_collection, schema, options);
delete filter[key];
} else if (Array.isArray(filter[key])) filter[key] = filter[key].map((item) => filterReplaceM2A(item, collection, schema, options));
else if (typeof filter[key] === "object") filter[key] = filterReplaceM2A(filter[key], collection, schema, options);
}
return filter;
}
function filterReplaceM2ADeep(deep_arg, collection, schema, options) {
const deep = deep_arg;
for (const key in deep) {
if (key.startsWith("_") === false) {
const parts = key.split("__");
let field = parts[0];
const any_collection = parts[1];
if (!field) continue;
field = options?.aliasMap?.[field] || deep._alias?.[field] || field;
const relation = getRelation(schema.relations, collection, field);
if (!relation) continue;
const type = getRelationType({
relation,
collection,
field,
useA2O: true
});
if (type === "o2m") deep[key] = filterReplaceM2ADeep(deep[key], relation.collection, schema);
else if (type === "m2o") deep[key] = filterReplaceM2ADeep(deep[key], relation.related_collection, schema);
else if (type === "a2o" && any_collection && relation.meta?.one_allowed_collections?.includes(any_collection)) {
deep[`${field}:${any_collection}`] = filterReplaceM2ADeep(deep[key], any_collection, schema);
delete deep[key];
}
}
if (key === "_filter") deep[key] = filterReplaceM2A(deep[key], collection, schema);
}
return deep;
}
//#endregion
export { filterReplaceM2A, filterReplaceM2ADeep };