diff --git a/src/graphql/createTableType.js b/src/graphql/createTableType.js index 91c84527eb..ebdd731866 100644 --- a/src/graphql/createTableType.js +++ b/src/graphql/createTableType.js @@ -102,7 +102,9 @@ const createColumnField = column => ({ resolve: source => source[column.name], }) -const createForeignKeyField = ({ nativeTable, nativeColumns, foreignTable, foreignColumns }) => ({ +// TODO maybe move these ForeignKey methods to own file ? + +export const createForeignKeyField = ({ nativeTable, nativeColumns, foreignTable, foreignColumns }) => ({ type: createTableType(foreignTable), description: `Queries a single ${foreignTable.getMarkdownTypeName()} node related to ` + @@ -115,7 +117,7 @@ const createForeignKeyField = ({ nativeTable, nativeColumns, foreignTable, forei ), }) -const createForeignKeyReverseField = ({ nativeTable, nativeColumns, foreignTable, foreignColumns }) => ({ +export const createForeignKeyReverseField = ({ nativeTable, nativeColumns, foreignTable, foreignColumns }) => ({ type: createConnectionType(nativeTable), description: `Queries and returns a set of ${nativeTable.getMarkdownTypeName()} ` + diff --git a/src/graphql/mutation/createInsertMutationField.js b/src/graphql/mutation/createInsertMutationField.js index 71d3299191..2a43d1cffc 100644 --- a/src/graphql/mutation/createInsertMutationField.js +++ b/src/graphql/mutation/createInsertMutationField.js @@ -5,11 +5,11 @@ import { GraphQLInputObjectType, } from 'graphql' -import { fromPairs, identity, constant } from 'lodash' +import { fromPairs, identity, constant, camelCase } from 'lodash' import { $$rowTable } from '../../symbols.js' import SQLBuilder from '../../SQLBuilder.js' import getColumnType from '../getColumnType.js' -import createTableType from '../createTableType.js' +import createTableType, { createForeignKeyField, createForeignKeyReverseField } from '../createTableType.js' import { createTableEdgeType } from '../createConnectionType.js' import { createTableOrderingEnum } from '../createConnectionArgs.js' import getPayloadInterface from './getPayloadInterface.js' @@ -87,7 +87,14 @@ const createPayloadType = table => node: output, }), }, - + // Add foreign key field references. + ...fromPairs( + table.getForeignKeys().map(foreignKey => { + const columnNames = foreignKey.nativeColumns.map(({ name }) => name) + const name = `${foreignKey.foreignTable.name}_by_${columnNames.join('_and_')}` + return [camelCase(name), createForeignKeyField(foreignKey)] + }) + ), ...getPayloadFields(table.schema), }, })