fix: Support bigNumber in upsertWithReplace (#7084)
This commit is contained in:
1 parent
7e66dd0dd0
commit
08dc861dc1
3 files changed
+42
-14
No files matched your search
@@ -51,6 +51,15 @@ export function MikroOrmBigNumberProperty(
|
|||||||
this[rawColumnName] = raw
|
this[rawColumnName] = raw
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This is custom code to keep track of which fields are bignumber, as well as their data
|
||||||
|
if (!this.__helper.__bignumberdata) {
|
||||||
|
this.__helper.__bignumberdata = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.__helper.__bignumberdata[columnName] =
|
||||||
|
this.__helper.__data[columnName]
|
||||||
|
this.__helper.__bignumberdata[rawColumnName] =
|
||||||
|
this.__helper.__data[rawColumnName]
|
||||||
this.__helper.__touched = !this.__helper.hydrator.isRunning()
|
this.__helper.__touched = !this.__helper.hydrator.isRunning()
|
||||||
},
|
},
|
||||||
enumerable: true,
|
enumerable: true,
|
||||||
|
|||||||
+14
-3
@@ -15,6 +15,9 @@ import {
|
|||||||
} from "@mikro-orm/core"
|
} from "@mikro-orm/core"
|
||||||
import { mikroOrmBaseRepositoryFactory } from "../../mikro-orm-repository"
|
import { mikroOrmBaseRepositoryFactory } from "../../mikro-orm-repository"
|
||||||
import { dropDatabase } from "pg-god"
|
import { dropDatabase } from "pg-god"
|
||||||
|
import { MikroOrmBigNumberProperty } from "../../big-number-field"
|
||||||
|
import BigNumber from "bignumber.js"
|
||||||
|
import { BigNumberRawValue } from "@medusajs/types"
|
||||||
|
|
||||||
const DB_HOST = process.env.DB_HOST ?? "localhost"
|
const DB_HOST = process.env.DB_HOST ?? "localhost"
|
||||||
const DB_USERNAME = process.env.DB_USERNAME ?? ""
|
const DB_USERNAME = process.env.DB_USERNAME ?? ""
|
||||||
@@ -42,6 +45,12 @@ class Entity1 {
|
|||||||
@Property()
|
@Property()
|
||||||
title: string
|
title: string
|
||||||
|
|
||||||
|
@MikroOrmBigNumberProperty({ nullable: true })
|
||||||
|
amount: BigNumber | number | null
|
||||||
|
|
||||||
|
@Property({ columnType: "jsonb", nullable: true })
|
||||||
|
raw_amount: BigNumberRawValue | null
|
||||||
|
|
||||||
@Property({ nullable: true })
|
@Property({ nullable: true })
|
||||||
deleted_at: Date | null
|
deleted_at: Date | null
|
||||||
|
|
||||||
@@ -165,16 +174,18 @@ describe("mikroOrmRepository", () => {
|
|||||||
|
|
||||||
describe("upsert with replace", () => {
|
describe("upsert with replace", () => {
|
||||||
it("should successfully create a flat entity", async () => {
|
it("should successfully create a flat entity", async () => {
|
||||||
const entity1 = { id: "1", title: "en1" }
|
const entity1 = { id: "1", title: "en1", amount: 100 }
|
||||||
|
|
||||||
const resp = await manager1().upsertWithReplace([entity1])
|
const resp = await manager1().upsertWithReplace([entity1])
|
||||||
const listedEntities = await manager1().find()
|
const listedEntities = await manager1().find()
|
||||||
|
|
||||||
expect(listedEntities).toHaveLength(1)
|
expect(listedEntities).toHaveLength(1)
|
||||||
expect(listedEntities[0]).toEqual(
|
expect(wrap(listedEntities[0]).toPOJO()).toEqual(
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
id: "1",
|
id: "1",
|
||||||
title: "en1",
|
title: "en1",
|
||||||
|
amount: 100,
|
||||||
|
raw_amount: { value: "100", precision: 20 },
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
@@ -188,7 +199,7 @@ describe("mikroOrmRepository", () => {
|
|||||||
const listedEntities = await manager1().find()
|
const listedEntities = await manager1().find()
|
||||||
|
|
||||||
expect(listedEntities).toHaveLength(1)
|
expect(listedEntities).toHaveLength(1)
|
||||||
expect(listedEntities[0]).toEqual(
|
expect(wrap(listedEntities[0]).toPOJO()).toEqual(
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
id: "1",
|
id: "1",
|
||||||
title: "newen1",
|
title: "newen1",
|
||||||
|
|||||||
@@ -639,16 +639,6 @@ export function mikroOrmBaseRepositoryFactory<T extends object = object>(
|
|||||||
Object.assign(normalizedDataItem, {
|
Object.assign(normalizedDataItem, {
|
||||||
...joinColumnsConstraints,
|
...joinColumnsConstraints,
|
||||||
})
|
})
|
||||||
// Non-persist relation columns should be removed before we do the upsert.
|
|
||||||
Object.entries(relation.targetMeta?.properties ?? {})
|
|
||||||
.filter(
|
|
||||||
([_, propDef]) =>
|
|
||||||
propDef.persist === false &&
|
|
||||||
propDef.reference === ReferenceType.MANY_TO_ONE
|
|
||||||
)
|
|
||||||
.forEach(([key]) => {
|
|
||||||
delete normalizedDataItem[key]
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
|
|
||||||
await this.upsertMany_(manager, relation.type, normalizedData)
|
await this.upsertMany_(manager, relation.type, normalizedData)
|
||||||
@@ -717,7 +707,25 @@ export function mikroOrmBaseRepositoryFactory<T extends object = object>(
|
|||||||
persist: false,
|
persist: false,
|
||||||
})
|
})
|
||||||
|
|
||||||
return { id: (created as any).id, ...data }
|
const resp = {
|
||||||
|
// `create` will omit non-existent fields, but we want to pass the data the user provided through so the correct errors get thrown
|
||||||
|
...data,
|
||||||
|
...(created as any).__helper.__bignumberdata,
|
||||||
|
id: (created as any).id,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Non-persist relation columns should be removed before we do the upsert.
|
||||||
|
Object.entries((created as any).__helper?.__meta.properties ?? {})
|
||||||
|
.filter(
|
||||||
|
([_, propDef]: any) =>
|
||||||
|
propDef.persist === false &&
|
||||||
|
propDef.reference === ReferenceType.MANY_TO_ONE
|
||||||
|
)
|
||||||
|
.forEach(([key]) => {
|
||||||
|
delete resp[key]
|
||||||
|
})
|
||||||
|
|
||||||
|
return resp
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async upsertMany_(
|
protected async upsertMany_(
|
||||||
|
|||||||
Reference in new issue
Block a user