From b160fd3cbf6edf06702fa15b694709375557d188 Mon Sep 17 00:00:00 2001 From: Adrien de Peretti Date: Thu, 5 Dec 2024 17:55:57 +0100 Subject: [PATCH] fix(utils): DML one to one definition (#10415) RESOLVES FRMW-2819 **What** Fix one to one definition. --- .changeset/green-turkeys-fetch.md | 5 +++ .../src/dml/__tests__/entity-builder.spec.ts | 27 ++++++++++--- .../entity-builder/define-relationship.ts | 40 ++++++++++++------- .../__tests__/has-one-belongs-to.spec.ts | 2 +- 4 files changed, 53 insertions(+), 21 deletions(-) create mode 100644 .changeset/green-turkeys-fetch.md diff --git a/.changeset/green-turkeys-fetch.md b/.changeset/green-turkeys-fetch.md new file mode 100644 index 0000000000..adc6943edc --- /dev/null +++ b/.changeset/green-turkeys-fetch.md @@ -0,0 +1,5 @@ +--- +"@medusajs/utils": patch +--- + +fix(utils): DML one to one definition diff --git a/packages/core/utils/src/dml/__tests__/entity-builder.spec.ts b/packages/core/utils/src/dml/__tests__/entity-builder.spec.ts index 3dac21d178..12501f91f1 100644 --- a/packages/core/utils/src/dml/__tests__/entity-builder.spec.ts +++ b/packages/core/utils/src/dml/__tests__/entity-builder.spec.ts @@ -2690,6 +2690,7 @@ describe("Entity builder", () => { nullable: false, mappedBy: "user", cascade: ["persist", "soft-remove"], + onDelete: "cascade", }, created_at: { reference: "scalar", @@ -2853,6 +2854,7 @@ describe("Entity builder", () => { nullable: false, mappedBy: "user", cascade: ["persist", "soft-remove"], + onDelete: "cascade", }, created_at: { reference: "scalar", @@ -2918,22 +2920,24 @@ describe("Entity builder", () => { }, user: { entity: "User", + fieldName: "user_id", mappedBy: "email", name: "user", nullable: false, onDelete: "cascade", owner: true, reference: "1:1", + cascade: ["persist", "soft-remove"], }, user_id: { columnType: "text", getter: false, + persist: false, name: "user_id", nullable: false, reference: "scalar", setter: false, type: "string", - persist: false, }, created_at: { reference: "scalar", @@ -3612,6 +3616,8 @@ describe("Entity builder", () => { onDelete: "cascade", owner: true, reference: "1:1", + cascade: ["persist", "soft-remove"], + fieldName: "user_id", }, user_id: { columnType: "text", @@ -4551,21 +4557,23 @@ describe("Entity builder", () => { }, user: { name: "user", + fieldName: "user_id", reference: "1:1", entity: "User", nullable: false, mappedBy: "email", + onDelete: undefined, owner: true, }, user_id: { reference: "scalar", + persist: false, type: "string", columnType: "text", nullable: false, name: "user_id", getter: false, setter: false, - persist: false, }, created_at: { reference: "scalar", @@ -4747,21 +4755,23 @@ describe("Entity builder", () => { }, user: { name: "user", + fieldName: "user_id", reference: "1:1", entity: "User", nullable: true, + onDelete: undefined, mappedBy: "email", owner: true, }, user_id: { reference: "scalar", + persist: false, type: "string", columnType: "text", nullable: true, name: "user_id", getter: false, setter: false, - persist: false, }, created_at: { reference: "scalar", @@ -5379,21 +5389,23 @@ describe("Entity builder", () => { }, user: { name: "user", + fieldName: "user_id", reference: "1:1", entity: "User", nullable: false, mappedBy: "email", + onDelete: undefined, owner: true, }, user_id: { reference: "scalar", type: "string", + persist: false, columnType: "text", nullable: false, name: "user_id", getter: false, setter: false, - persist: false, }, created_at: { reference: "scalar", @@ -5577,21 +5589,23 @@ describe("Entity builder", () => { }, user: { name: "user", + fieldName: "user_id", reference: "1:1", entity: "User", nullable: false, mappedBy: "email", + onDelete: undefined, owner: true, }, user_id: { reference: "scalar", + persist: false, type: "string", columnType: "text", nullable: false, name: "user_id", getter: false, setter: false, - persist: false, }, created_at: { reference: "scalar", @@ -5796,6 +5810,7 @@ describe("Entity builder", () => { }, parent: { name: "parent", + fieldName: "parent_id", mappedBy: "child", reference: "1:1", entity: "User", @@ -5807,8 +5822,8 @@ describe("Entity builder", () => { name: "parent_id", type: "string", columnType: "text", - persist: false, reference: "scalar", + persist: false, getter: false, setter: false, nullable: false, 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 3d7f91cb12..e15a8bf9c6 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 @@ -7,6 +7,7 @@ import { } from "@medusajs/types" import { BeforeCreate, + Cascade, ManyToMany, ManyToOne, OneToMany, @@ -147,14 +148,18 @@ export function defineHasOneRelationship( mappedBy = relationship.mappedBy } - OneToOne({ + const oneToOneOptions = { entity: relatedModelName, nullable: relationship.nullable, ...(mappedBy ? { mappedBy } : {}), - cascade: shouldRemoveRelated - ? (["persist", "soft-remove"] as any) - : undefined, - } as OneToOneOptions)(MikroORMEntity.prototype, relationship.name) + onDelete: shouldRemoveRelated ? "cascade" : undefined, + } as OneToOneOptions + + if (shouldRemoveRelated) { + oneToOneOptions.cascade = ["persist", "soft-remove"] as any + } + + OneToOne(oneToOneOptions)(MikroORMEntity.prototype, relationship.name) } /** @@ -368,14 +373,6 @@ export function defineBelongsToRelationship( ) { const foreignKeyName = camelToSnakeCase(`${relationship.name}Id`) - OneToOne({ - entity: relatedModelName, - nullable: relationship.nullable, - mappedBy: mappedBy, - owner: true, - onDelete: shouldCascade ? "cascade" : undefined, - })(MikroORMEntity.prototype, relationship.name) - Object.defineProperty(MikroORMEntity.prototype, foreignKeyName, { value: null, configurable: true, @@ -384,12 +381,27 @@ export function defineBelongsToRelationship( }) Property({ - type: "string", columnType: "text", + type: "string", nullable: relationship.nullable, persist: false, })(MikroORMEntity.prototype, foreignKeyName) + const oneToOneOptions: Parameters[0] = { + entity: relatedModelName, + nullable: relationship.nullable, + mappedBy: mappedBy, + fieldName: foreignKeyName, + owner: true, + onDelete: shouldCascade ? "cascade" : undefined, + } + + if (shouldCascade) { + oneToOneOptions.cascade = [Cascade.PERSIST, "soft-remove"] as any + } + + OneToOne(oneToOneOptions)(MikroORMEntity.prototype, relationship.name) + const { tableName } = parseEntityName(entity) applyEntityIndexes(MikroORMEntity, tableName, [ { diff --git a/packages/core/utils/src/dml/integration-tests/__tests__/has-one-belongs-to.spec.ts b/packages/core/utils/src/dml/integration-tests/__tests__/has-one-belongs-to.spec.ts index eab1935f02..ba58d8b035 100644 --- a/packages/core/utils/src/dml/integration-tests/__tests__/has-one-belongs-to.spec.ts +++ b/packages/core/utils/src/dml/integration-tests/__tests__/has-one-belongs-to.spec.ts @@ -32,7 +32,7 @@ describe("hasOne - belongTo", () => { const team = model.define("team", { id: model.id().primaryKey(), name: model.text(), - user: model.belongsTo(() => user, { mappedBy: "team" }), + user: model.belongsTo(() => user, { mappedBy: "team" }).nullable(), }) const user = model.define("user", {