UNPKG

@directus/api

Version:

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

57 lines (55 loc) 3.12 kB
import { applyFunctionToColumnName } from "./apply-function-to-column-name.js"; import { toArray } from "@directus/utils"; import { cloneDeep, pick } from "lodash-es"; //#region src/database/run-ast/utils/remove-temporary-fields.ts function removeTemporaryFields(schema, rawItem, ast, primaryKeyField, parentItem) { const rawItems = cloneDeep(toArray(rawItem)); const items = []; if (ast.type === "a2o") { const fields = {}; const nestedCollectionNodes = {}; for (const relatedCollection of ast.names) { if (!fields[relatedCollection]) fields[relatedCollection] = []; if (!nestedCollectionNodes[relatedCollection]) nestedCollectionNodes[relatedCollection] = []; for (const child of ast.children[relatedCollection]) if (child.type === "field" || child.type === "functionField") fields[relatedCollection].push(child.name); else { fields[relatedCollection].push(child.fieldKey); nestedCollectionNodes[relatedCollection].push(child); } } for (const rawItem$1 of rawItems) { const relatedCollection = parentItem?.[ast.relation.meta.one_collection_field]; if (rawItem$1 === null || rawItem$1 === void 0) return rawItem$1; let item = rawItem$1; for (const nestedNode of nestedCollectionNodes[relatedCollection]) item[nestedNode.fieldKey] = removeTemporaryFields(schema, item[nestedNode.fieldKey], nestedNode, schema.collections[nestedNode.relation.collection].primary, item); const fieldsWithFunctionsApplied = fields[relatedCollection].map((field) => applyFunctionToColumnName(field)); item = fields[relatedCollection].length > 0 ? pick(rawItem$1, fieldsWithFunctionsApplied) : rawItem$1[primaryKeyField]; items.push(item); } } else { const fields = []; const aliasFields = []; const nestedCollectionNodes = []; for (const child of ast.children) { if ("alias" in child && child.alias === true) aliasFields.push(child.fieldKey); else fields.push(child.fieldKey); if (child.type !== "field" && child.type !== "functionField") nestedCollectionNodes.push(child); } if (ast.query?.aggregate) for (const [operation, aggregateFields] of Object.entries(ast.query.aggregate)) { if (!fields) continue; if (operation === "count" && aggregateFields.includes("*")) fields.push("count"); fields.push(...aggregateFields.map((field) => `${operation}.${field}`)); } for (const rawItem$1 of rawItems) { if (rawItem$1 === null || rawItem$1 === void 0) return rawItem$1; let item = rawItem$1; for (const nestedNode of nestedCollectionNodes) item[nestedNode.fieldKey] = removeTemporaryFields(schema, item[nestedNode.fieldKey], nestedNode, nestedNode.type === "m2o" ? schema.collections[nestedNode.relation.related_collection].primary : schema.collections[nestedNode.relation.collection].primary, item); const fieldsWithFunctionsApplied = fields.map((field) => applyFunctionToColumnName(field)); item = fields.length > 0 ? pick(rawItem$1, fieldsWithFunctionsApplied, aliasFields) : rawItem$1[primaryKeyField]; items.push(item); } } return Array.isArray(rawItem) ? items : items[0]; } //#endregion export { removeTemporaryFields };