From c78097bb75b34a2c05f8bee8a978c2ff36b41ea2 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Tue, 11 Feb 2025 12:46:21 +0530 Subject: [PATCH] fix: add foreign keys to the generated query types output --- .../utils/src/dml/helpers/create-graphql.ts | 23 +++++++++++++++++++ .../entity-builder/define-relationship.ts | 14 ++++------- .../src/dml/helpers/entity-builder/index.ts | 1 + .../entity-builder/relationship-helpers.ts | 12 ++++++++++ 4 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 packages/core/utils/src/dml/helpers/entity-builder/relationship-helpers.ts diff --git a/packages/core/utils/src/dml/helpers/create-graphql.ts b/packages/core/utils/src/dml/helpers/create-graphql.ts index 915a53babd13c..226ffb4b8fb26 100644 --- a/packages/core/utils/src/dml/helpers/create-graphql.ts +++ b/packages/core/utils/src/dml/helpers/create-graphql.ts @@ -3,6 +3,7 @@ import { DmlEntity } from "../entity" import { parseEntityName } from "./entity-builder/parse-entity-name" import { setGraphQLRelationship } from "./graphql-builder/set-relationship" import { getGraphQLAttributeFromDMLPropety } from "./graphql-builder/get-attribute" +import { getForeignKey } from "./entity-builder" export function generateGraphQLFromEntity>( entity: T @@ -29,6 +30,28 @@ export function generateGraphQLFromEntity>( gqlSchema.push(`${prop.attribute}`) } else { + if (["belongsTo", "hasOneWithFK"].includes(field.type)) { + const foreignKeyName = getForeignKey(field) + const fkProp = getGraphQLAttributeFromDMLPropety( + modelName, + field.name, + { + $dataType: "", + parse() { + return { + fieldName: foreignKeyName, + computed: false, + dataType: { name: "text" as const }, + nullable: field.nullable || false, + indexes: [], + relationships: [], + } + }, + } + ) + gqlSchema.push(`${fkProp.attribute}`) + } + const prop = setGraphQLRelationship(modelName, field) if (prop.extra) { extra.push(prop.extra) diff --git a/packages/core/utils/src/dml/helpers/entity-builder/define-relationship.ts b/packages/core/utils/src/dml/helpers/entity-builder/define-relationship.ts index 947d724e9c8cc..d33fccb9bd8d3 100644 --- a/packages/core/utils/src/dml/helpers/entity-builder/define-relationship.ts +++ b/packages/core/utils/src/dml/helpers/entity-builder/define-relationship.ts @@ -27,6 +27,7 @@ import { HasOneWithForeignKey } from "../../relations/has-one-fk" import { ManyToMany as DmlManyToMany } from "../../relations/many-to-many" import { applyEntityIndexes } from "../mikro-orm/apply-indexes" import { parseEntityName } from "./parse-entity-name" +import { getForeignKey } from "./relationship-helpers" type Context = { MANY_TO_MANY_TRACKED_RELATIONS: Record @@ -183,10 +184,7 @@ export function defineHasOneWithFKRelationship( { relatedModelName }: { relatedModelName: string }, cascades: EntityCascades ) { - const foreignKeyName = - relationship.options.foreignKeyName ?? - camelToSnakeCase(`${relationship.name}Id`) - + const foreignKeyName = getForeignKey(relationship) const shouldRemoveRelated = !!cascades.delete?.includes(relationship.name) let mappedBy: string | undefined = camelToSnakeCase(MikroORMEntity.name) @@ -428,9 +426,7 @@ export function defineBelongsToRelationship( HasMany.isHasMany(otherSideRelation) || DmlManyToMany.isManyToMany(otherSideRelation) ) { - const foreignKeyName = - relationship.options.foreignKeyName ?? - camelToSnakeCase(`${relationship.name}Id`) + const foreignKeyName = getForeignKey(relationship) const detachCascade = !!relationship.mappedBy && relationCascades.detach?.includes(relationship.mappedBy) @@ -491,9 +487,7 @@ export function defineBelongsToRelationship( HasOne.isHasOne(otherSideRelation) || HasOneWithForeignKey.isHasOneWithForeignKey(otherSideRelation) ) { - const foreignKeyName = - relationship.options.foreignKeyName ?? - camelToSnakeCase(`${relationship.name}Id`) + const foreignKeyName = getForeignKey(relationship) Property({ columnType: "text", type: "string", diff --git a/packages/core/utils/src/dml/helpers/entity-builder/index.ts b/packages/core/utils/src/dml/helpers/entity-builder/index.ts index fb8783bd9bc27..bd0c97a83498c 100644 --- a/packages/core/utils/src/dml/helpers/entity-builder/index.ts +++ b/packages/core/utils/src/dml/helpers/entity-builder/index.ts @@ -6,3 +6,4 @@ export * from "./define-property" export * from "./define-relationship" export * from "./parse-entity-name" export * from "./query-builder" +export * from "./relationship-helpers" diff --git a/packages/core/utils/src/dml/helpers/entity-builder/relationship-helpers.ts b/packages/core/utils/src/dml/helpers/entity-builder/relationship-helpers.ts new file mode 100644 index 0000000000000..da964ff275700 --- /dev/null +++ b/packages/core/utils/src/dml/helpers/entity-builder/relationship-helpers.ts @@ -0,0 +1,12 @@ +import { RelationshipMetadata } from "@medusajs/types" +import { camelToSnakeCase } from "../../../common/camel-to-snake-case" + +/** + * Returns the foreign key name for a relationship + */ +export function getForeignKey(relationship: RelationshipMetadata) { + return ( + relationship.options.foreignKeyName ?? + camelToSnakeCase(`${relationship.name}Id`) + ) +}