fix: add foreign keys to the generated query types output (#11388)
This commit is contained in:
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"@medusajs/utils": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix: add foreign keys to the generated query types output
|
||||||
@@ -31,6 +31,7 @@ describe("GraphQL builder", () => {
|
|||||||
const group = model.define("group", {
|
const group = model.define("group", {
|
||||||
id: model.number(),
|
id: model.number(),
|
||||||
name: model.text(),
|
name: model.text(),
|
||||||
|
admin: model.hasOne(() => user, { foreignKey: true }),
|
||||||
users: model.hasMany(() => user),
|
users: model.hasMany(() => user),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -70,6 +71,7 @@ describe("GraphQL builder", () => {
|
|||||||
email: Email!
|
email: Email!
|
||||||
spend_limit: String!
|
spend_limit: String!
|
||||||
phones: [String]!
|
phones: [String]!
|
||||||
|
group_id:String!
|
||||||
group: Group!
|
group: Group!
|
||||||
role: UserRoleEnum!
|
role: UserRoleEnum!
|
||||||
tags: [Tag]!
|
tags: [Tag]!
|
||||||
@@ -82,6 +84,8 @@ describe("GraphQL builder", () => {
|
|||||||
type Group {
|
type Group {
|
||||||
id: Int!
|
id: Int!
|
||||||
name: String!
|
name: String!
|
||||||
|
admin_id: String!
|
||||||
|
admin: User!
|
||||||
users: [User]!
|
users: [User]!
|
||||||
created_at: DateTime!
|
created_at: DateTime!
|
||||||
updated_at: DateTime!
|
updated_at: DateTime!
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { DmlEntity } from "../entity"
|
|||||||
import { parseEntityName } from "./entity-builder/parse-entity-name"
|
import { parseEntityName } from "./entity-builder/parse-entity-name"
|
||||||
import { setGraphQLRelationship } from "./graphql-builder/set-relationship"
|
import { setGraphQLRelationship } from "./graphql-builder/set-relationship"
|
||||||
import { getGraphQLAttributeFromDMLPropety } from "./graphql-builder/get-attribute"
|
import { getGraphQLAttributeFromDMLPropety } from "./graphql-builder/get-attribute"
|
||||||
|
import { getForeignKey } from "./entity-builder"
|
||||||
|
|
||||||
export function generateGraphQLFromEntity<T extends DmlEntity<any, any>>(
|
export function generateGraphQLFromEntity<T extends DmlEntity<any, any>>(
|
||||||
entity: T
|
entity: T
|
||||||
@@ -29,6 +30,28 @@ export function generateGraphQLFromEntity<T extends DmlEntity<any, any>>(
|
|||||||
|
|
||||||
gqlSchema.push(`${prop.attribute}`)
|
gqlSchema.push(`${prop.attribute}`)
|
||||||
} else {
|
} 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)
|
const prop = setGraphQLRelationship(modelName, field)
|
||||||
if (prop.extra) {
|
if (prop.extra) {
|
||||||
extra.push(prop.extra)
|
extra.push(prop.extra)
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import { HasOneWithForeignKey } from "../../relations/has-one-fk"
|
|||||||
import { ManyToMany as DmlManyToMany } from "../../relations/many-to-many"
|
import { ManyToMany as DmlManyToMany } from "../../relations/many-to-many"
|
||||||
import { applyEntityIndexes } from "../mikro-orm/apply-indexes"
|
import { applyEntityIndexes } from "../mikro-orm/apply-indexes"
|
||||||
import { parseEntityName } from "./parse-entity-name"
|
import { parseEntityName } from "./parse-entity-name"
|
||||||
|
import { getForeignKey } from "./relationship-helpers"
|
||||||
|
|
||||||
type Context = {
|
type Context = {
|
||||||
MANY_TO_MANY_TRACKED_RELATIONS: Record<string, boolean>
|
MANY_TO_MANY_TRACKED_RELATIONS: Record<string, boolean>
|
||||||
@@ -183,10 +184,7 @@ export function defineHasOneWithFKRelationship(
|
|||||||
{ relatedModelName }: { relatedModelName: string },
|
{ relatedModelName }: { relatedModelName: string },
|
||||||
cascades: EntityCascades<string[], string[]>
|
cascades: EntityCascades<string[], string[]>
|
||||||
) {
|
) {
|
||||||
const foreignKeyName =
|
const foreignKeyName = getForeignKey(relationship)
|
||||||
relationship.options.foreignKeyName ??
|
|
||||||
camelToSnakeCase(`${relationship.name}Id`)
|
|
||||||
|
|
||||||
const shouldRemoveRelated = !!cascades.delete?.includes(relationship.name)
|
const shouldRemoveRelated = !!cascades.delete?.includes(relationship.name)
|
||||||
|
|
||||||
let mappedBy: string | undefined = camelToSnakeCase(MikroORMEntity.name)
|
let mappedBy: string | undefined = camelToSnakeCase(MikroORMEntity.name)
|
||||||
@@ -428,9 +426,7 @@ export function defineBelongsToRelationship(
|
|||||||
HasMany.isHasMany(otherSideRelation) ||
|
HasMany.isHasMany(otherSideRelation) ||
|
||||||
DmlManyToMany.isManyToMany(otherSideRelation)
|
DmlManyToMany.isManyToMany(otherSideRelation)
|
||||||
) {
|
) {
|
||||||
const foreignKeyName =
|
const foreignKeyName = getForeignKey(relationship)
|
||||||
relationship.options.foreignKeyName ??
|
|
||||||
camelToSnakeCase(`${relationship.name}Id`)
|
|
||||||
const detachCascade =
|
const detachCascade =
|
||||||
!!relationship.mappedBy &&
|
!!relationship.mappedBy &&
|
||||||
relationCascades.detach?.includes(relationship.mappedBy)
|
relationCascades.detach?.includes(relationship.mappedBy)
|
||||||
@@ -491,9 +487,7 @@ export function defineBelongsToRelationship(
|
|||||||
HasOne.isHasOne(otherSideRelation) ||
|
HasOne.isHasOne(otherSideRelation) ||
|
||||||
HasOneWithForeignKey.isHasOneWithForeignKey(otherSideRelation)
|
HasOneWithForeignKey.isHasOneWithForeignKey(otherSideRelation)
|
||||||
) {
|
) {
|
||||||
const foreignKeyName =
|
const foreignKeyName = getForeignKey(relationship)
|
||||||
relationship.options.foreignKeyName ??
|
|
||||||
camelToSnakeCase(`${relationship.name}Id`)
|
|
||||||
Property({
|
Property({
|
||||||
columnType: "text",
|
columnType: "text",
|
||||||
type: "string",
|
type: "string",
|
||||||
|
|||||||
@@ -6,3 +6,4 @@ export * from "./define-property"
|
|||||||
export * from "./define-relationship"
|
export * from "./define-relationship"
|
||||||
export * from "./parse-entity-name"
|
export * from "./parse-entity-name"
|
||||||
export * from "./query-builder"
|
export * from "./query-builder"
|
||||||
|
export * from "./relationship-helpers"
|
||||||
|
|||||||
@@ -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`)
|
||||||
|
)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user