fix(utils): DML one to one definition (#10415)

RESOLVES FRMW-2819

**What**
Fix one to one definition.
This commit is contained in:
Adrien de Peretti
2024-12-05 16:55:57 +00:00
committed by GitHub
parent 70d77ea22f
commit b160fd3cbf
4 changed files with 53 additions and 21 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"@medusajs/utils": patch
---
fix(utils): DML one to one definition
@@ -2690,6 +2690,7 @@ describe("Entity builder", () => {
nullable: false, nullable: false,
mappedBy: "user", mappedBy: "user",
cascade: ["persist", "soft-remove"], cascade: ["persist", "soft-remove"],
onDelete: "cascade",
}, },
created_at: { created_at: {
reference: "scalar", reference: "scalar",
@@ -2853,6 +2854,7 @@ describe("Entity builder", () => {
nullable: false, nullable: false,
mappedBy: "user", mappedBy: "user",
cascade: ["persist", "soft-remove"], cascade: ["persist", "soft-remove"],
onDelete: "cascade",
}, },
created_at: { created_at: {
reference: "scalar", reference: "scalar",
@@ -2918,22 +2920,24 @@ describe("Entity builder", () => {
}, },
user: { user: {
entity: "User", entity: "User",
fieldName: "user_id",
mappedBy: "email", mappedBy: "email",
name: "user", name: "user",
nullable: false, nullable: false,
onDelete: "cascade", onDelete: "cascade",
owner: true, owner: true,
reference: "1:1", reference: "1:1",
cascade: ["persist", "soft-remove"],
}, },
user_id: { user_id: {
columnType: "text", columnType: "text",
getter: false, getter: false,
persist: false,
name: "user_id", name: "user_id",
nullable: false, nullable: false,
reference: "scalar", reference: "scalar",
setter: false, setter: false,
type: "string", type: "string",
persist: false,
}, },
created_at: { created_at: {
reference: "scalar", reference: "scalar",
@@ -3612,6 +3616,8 @@ describe("Entity builder", () => {
onDelete: "cascade", onDelete: "cascade",
owner: true, owner: true,
reference: "1:1", reference: "1:1",
cascade: ["persist", "soft-remove"],
fieldName: "user_id",
}, },
user_id: { user_id: {
columnType: "text", columnType: "text",
@@ -4551,21 +4557,23 @@ describe("Entity builder", () => {
}, },
user: { user: {
name: "user", name: "user",
fieldName: "user_id",
reference: "1:1", reference: "1:1",
entity: "User", entity: "User",
nullable: false, nullable: false,
mappedBy: "email", mappedBy: "email",
onDelete: undefined,
owner: true, owner: true,
}, },
user_id: { user_id: {
reference: "scalar", reference: "scalar",
persist: false,
type: "string", type: "string",
columnType: "text", columnType: "text",
nullable: false, nullable: false,
name: "user_id", name: "user_id",
getter: false, getter: false,
setter: false, setter: false,
persist: false,
}, },
created_at: { created_at: {
reference: "scalar", reference: "scalar",
@@ -4747,21 +4755,23 @@ describe("Entity builder", () => {
}, },
user: { user: {
name: "user", name: "user",
fieldName: "user_id",
reference: "1:1", reference: "1:1",
entity: "User", entity: "User",
nullable: true, nullable: true,
onDelete: undefined,
mappedBy: "email", mappedBy: "email",
owner: true, owner: true,
}, },
user_id: { user_id: {
reference: "scalar", reference: "scalar",
persist: false,
type: "string", type: "string",
columnType: "text", columnType: "text",
nullable: true, nullable: true,
name: "user_id", name: "user_id",
getter: false, getter: false,
setter: false, setter: false,
persist: false,
}, },
created_at: { created_at: {
reference: "scalar", reference: "scalar",
@@ -5379,21 +5389,23 @@ describe("Entity builder", () => {
}, },
user: { user: {
name: "user", name: "user",
fieldName: "user_id",
reference: "1:1", reference: "1:1",
entity: "User", entity: "User",
nullable: false, nullable: false,
mappedBy: "email", mappedBy: "email",
onDelete: undefined,
owner: true, owner: true,
}, },
user_id: { user_id: {
reference: "scalar", reference: "scalar",
type: "string", type: "string",
persist: false,
columnType: "text", columnType: "text",
nullable: false, nullable: false,
name: "user_id", name: "user_id",
getter: false, getter: false,
setter: false, setter: false,
persist: false,
}, },
created_at: { created_at: {
reference: "scalar", reference: "scalar",
@@ -5577,21 +5589,23 @@ describe("Entity builder", () => {
}, },
user: { user: {
name: "user", name: "user",
fieldName: "user_id",
reference: "1:1", reference: "1:1",
entity: "User", entity: "User",
nullable: false, nullable: false,
mappedBy: "email", mappedBy: "email",
onDelete: undefined,
owner: true, owner: true,
}, },
user_id: { user_id: {
reference: "scalar", reference: "scalar",
persist: false,
type: "string", type: "string",
columnType: "text", columnType: "text",
nullable: false, nullable: false,
name: "user_id", name: "user_id",
getter: false, getter: false,
setter: false, setter: false,
persist: false,
}, },
created_at: { created_at: {
reference: "scalar", reference: "scalar",
@@ -5796,6 +5810,7 @@ describe("Entity builder", () => {
}, },
parent: { parent: {
name: "parent", name: "parent",
fieldName: "parent_id",
mappedBy: "child", mappedBy: "child",
reference: "1:1", reference: "1:1",
entity: "User", entity: "User",
@@ -5807,8 +5822,8 @@ describe("Entity builder", () => {
name: "parent_id", name: "parent_id",
type: "string", type: "string",
columnType: "text", columnType: "text",
persist: false,
reference: "scalar", reference: "scalar",
persist: false,
getter: false, getter: false,
setter: false, setter: false,
nullable: false, nullable: false,
@@ -7,6 +7,7 @@ import {
} from "@medusajs/types" } from "@medusajs/types"
import { import {
BeforeCreate, BeforeCreate,
Cascade,
ManyToMany, ManyToMany,
ManyToOne, ManyToOne,
OneToMany, OneToMany,
@@ -147,14 +148,18 @@ export function defineHasOneRelationship(
mappedBy = relationship.mappedBy mappedBy = relationship.mappedBy
} }
OneToOne({ const oneToOneOptions = {
entity: relatedModelName, entity: relatedModelName,
nullable: relationship.nullable, nullable: relationship.nullable,
...(mappedBy ? { mappedBy } : {}), ...(mappedBy ? { mappedBy } : {}),
cascade: shouldRemoveRelated onDelete: shouldRemoveRelated ? "cascade" : undefined,
? (["persist", "soft-remove"] as any) } as OneToOneOptions<any, any>
: undefined,
} as OneToOneOptions<any, any>)(MikroORMEntity.prototype, relationship.name) 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`) 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, { Object.defineProperty(MikroORMEntity.prototype, foreignKeyName, {
value: null, value: null,
configurable: true, configurable: true,
@@ -384,12 +381,27 @@ export function defineBelongsToRelationship(
}) })
Property({ Property({
type: "string",
columnType: "text", columnType: "text",
type: "string",
nullable: relationship.nullable, nullable: relationship.nullable,
persist: false, persist: false,
})(MikroORMEntity.prototype, foreignKeyName) })(MikroORMEntity.prototype, foreignKeyName)
const oneToOneOptions: Parameters<typeof OneToOne>[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) const { tableName } = parseEntityName(entity)
applyEntityIndexes(MikroORMEntity, tableName, [ applyEntityIndexes(MikroORMEntity, tableName, [
{ {
@@ -32,7 +32,7 @@ describe("hasOne - belongTo", () => {
const team = model.define("team", { const team = model.define("team", {
id: model.id().primaryKey(), id: model.id().primaryKey(),
name: model.text(), name: model.text(),
user: model.belongsTo(() => user, { mappedBy: "team" }), user: model.belongsTo(() => user, { mappedBy: "team" }).nullable(),
}) })
const user = model.define("user", { const user = model.define("user", {