diff --git a/src/services/fields.ts b/src/services/fields.ts index 93f44348d9..4050d68737 100644 --- a/src/services/fields.ts +++ b/src/services/fields.ts @@ -1,5 +1,15 @@ import database, { schemaInspector } from '../database'; import { Field } from '../types/field'; +import { uniq } from 'lodash'; + +export const fieldsInCollection = async (collection: string) => { + const [fields, columns] = await Promise.all([ + database.select('field').from('directus_fields').where({ collection }), + schemaInspector.columns(collection), + ]); + + return uniq([...fields.map(({ field }) => field), ...columns.map(({ column }) => column)]); +}; export const readAll = async (collection?: string) => { const fieldsQuery = database.select('*').from('directus_fields'); diff --git a/src/utils/get-ast.ts b/src/utils/get-ast.ts index 82a8adec68..132b69746b 100644 --- a/src/utils/get-ast.ts +++ b/src/utils/get-ast.ts @@ -6,6 +6,7 @@ import { Query } from '../types/query'; import { Relation } from '../types/relation'; import { AST, NestedCollectionAST, FieldAST } from '../types/ast'; import database from '../database'; +import * as FieldsService from '../services/fields'; export default async function getAST(collection: string, query: Query): Promise { const ast: AST = { @@ -40,8 +41,6 @@ export default async function getAST(collection: string, query: Query): Promise< ast.children = await parseFields(collection, query.fields); - console.log(JSON.stringify(ast, null, 2)); - return ast; async function parseFields(parentCollection: string, fields: string[]) { @@ -49,6 +48,27 @@ export default async function getAST(collection: string, query: Query): Promise< const relationalStructure: Record = {}; + // Swap *.* case for *,.* + for (let i = 0; i < fields.length; i++) { + const fieldKey = fields[i]; + + if (fieldKey.includes('.') === false) continue; + + const parts = fieldKey.split('.'); + + if (parts[0] === '*') { + const availableFields = await FieldsService.fieldsInCollection(parentCollection); + fields.splice( + i, + 1, + ...availableFields + .filter((field) => !!getRelation(parentCollection, field)) + .map((field) => `${field}.${parts.slice(1).join('.')}`) + ); + fields.push('*'); + } + } + for (const field of fields) { if (field.includes('.') === false) { children.push({ type: 'field', name: field });