Skip to content

Commit f5d328b

Browse files
maxbronnikov10maxbronnikov10
authored and
maxbronnikov10
committed
fix: update/delete/softDelete by criteria of condition objects
1 parent 79960e1 commit f5d328b

File tree

4 files changed

+160
-8
lines changed

4 files changed

+160
-8
lines changed

src/entity-manager/EntityManager.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,7 @@ export class EntityManager {
778778
typeof criteria === "string" ||
779779
typeof criteria === "number" ||
780780
criteria instanceof Date ||
781-
Array.isArray(criteria)
781+
(Array.isArray(criteria) && typeof criteria[0] !== "object" && criteria[0] !== null)
782782
) {
783783
return this.createQueryBuilder()
784784
.update(target)
@@ -832,7 +832,7 @@ export class EntityManager {
832832
typeof criteria === "string" ||
833833
typeof criteria === "number" ||
834834
criteria instanceof Date ||
835-
Array.isArray(criteria)
835+
(Array.isArray(criteria) && typeof criteria[0] !== "object" && criteria[0] !== null)
836836
) {
837837
return this.createQueryBuilder()
838838
.delete()
@@ -886,7 +886,7 @@ export class EntityManager {
886886
typeof criteria === "string" ||
887887
typeof criteria === "number" ||
888888
criteria instanceof Date ||
889-
Array.isArray(criteria)
889+
(Array.isArray(criteria) && typeof criteria[0] !== "object" && criteria[0] !== null)
890890
) {
891891
return this.createQueryBuilder()
892892
.softDelete()
@@ -940,7 +940,7 @@ export class EntityManager {
940940
typeof criteria === "string" ||
941941
typeof criteria === "number" ||
942942
criteria instanceof Date ||
943-
Array.isArray(criteria)
943+
(Array.isArray(criteria) && typeof criteria[0] !== "object" && criteria[0] !== null)
944944
) {
945945
return this.createQueryBuilder()
946946
.restore()

src/repository/Repository.ts

+8-4
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,8 @@ export class Repository<Entity extends ObjectLiteral> {
355355
| Date[]
356356
| ObjectId
357357
| ObjectId[]
358-
| FindOptionsWhere<Entity>,
358+
| FindOptionsWhere<Entity>
359+
| FindOptionsWhere<Entity>[],
359360
partialEntity: QueryDeepPartialEntity<Entity>,
360361
): Promise<UpdateResult> {
361362
return this.manager.update(
@@ -399,7 +400,8 @@ export class Repository<Entity extends ObjectLiteral> {
399400
| Date[]
400401
| ObjectId
401402
| ObjectId[]
402-
| FindOptionsWhere<Entity>,
403+
| FindOptionsWhere<Entity>
404+
| FindOptionsWhere<Entity>[],
403405
): Promise<DeleteResult> {
404406
return this.manager.delete(this.metadata.target as any, criteria as any)
405407
}
@@ -420,7 +422,8 @@ export class Repository<Entity extends ObjectLiteral> {
420422
| Date[]
421423
| ObjectId
422424
| ObjectId[]
423-
| FindOptionsWhere<Entity>,
425+
| FindOptionsWhere<Entity>
426+
| FindOptionsWhere<Entity>[],
424427
): Promise<UpdateResult> {
425428
return this.manager.softDelete(
426429
this.metadata.target as any,
@@ -444,7 +447,8 @@ export class Repository<Entity extends ObjectLiteral> {
444447
| Date[]
445448
| ObjectId
446449
| ObjectId[]
447-
| FindOptionsWhere<Entity>,
450+
| FindOptionsWhere<Entity>
451+
| FindOptionsWhere<Entity>[],
448452
): Promise<UpdateResult> {
449453
return this.manager.restore(
450454
this.metadata.target as any,
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { Column, Entity, PrimaryGeneratedColumn } from "../../../../src"
2+
3+
@Entity()
4+
export class Post {
5+
@PrimaryGeneratedColumn()
6+
id: number
7+
8+
@Column()
9+
title: string
10+
}
+138
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
import "reflect-metadata"
2+
import { expect } from "chai"
3+
import { DataSource } from "../../../src/data-source/DataSource"
4+
import {
5+
closeTestingConnections,
6+
createTestingConnections,
7+
reloadTestingDatabases,
8+
} from "../../utils/test-utils"
9+
import { Post } from "./entity/Post"
10+
11+
describe("github issues > #10517 EntityManager update/delete/softDelete don't work with list of where condition objects", function () {
12+
// -------------------------------------------------------------------------
13+
// Configuration
14+
// -------------------------------------------------------------------------
15+
16+
let connections: DataSource[]
17+
before(
18+
async () =>
19+
(connections = await createTestingConnections({
20+
entities: [Post],
21+
})),
22+
)
23+
beforeEach(() => reloadTestingDatabases(connections))
24+
after(() => closeTestingConnections(connections))
25+
26+
// -------------------------------------------------------------------------
27+
// Specifications
28+
// -------------------------------------------------------------------------
29+
30+
it("update by array of condition objects", () =>
31+
Promise.all(
32+
connections.map(async (connection) => {
33+
const postRepository = connection.getRepository(Post)
34+
35+
// save a new posts
36+
const newPost1 = postRepository.create()
37+
newPost1.title = "Super post #1"
38+
const newPost2 = postRepository.create()
39+
newPost2.title = "Super post #2"
40+
const newPost3 = postRepository.create()
41+
newPost3.title = "Super post #3"
42+
const newPost4 = postRepository.create()
43+
newPost4.title = "Super post #4"
44+
45+
await postRepository.save(newPost1)
46+
await postRepository.save(newPost2)
47+
await postRepository.save(newPost3)
48+
await postRepository.save(newPost4)
49+
50+
// update many
51+
await postRepository.update(
52+
[
53+
{
54+
title: "Super post #1",
55+
},
56+
{
57+
title: "Super post #2",
58+
},
59+
],
60+
{ title: "Super post" },
61+
)
62+
63+
// load to check
64+
const loadedPost1 = await postRepository.findOne({
65+
where: {
66+
id: 1,
67+
},
68+
})
69+
const loadedPost2 = await postRepository.findOne({
70+
where: {
71+
id: 2,
72+
},
73+
})
74+
75+
// assert
76+
expect(loadedPost1).to.be.eql({
77+
id: 1,
78+
title: "Super post",
79+
})
80+
81+
expect(loadedPost2).to.be.eql({
82+
id: 2,
83+
title: "Super post",
84+
})
85+
}),
86+
))
87+
88+
it("delete by array of condition objects", () =>
89+
Promise.all(
90+
connections.map(async (connection) => {
91+
const postRepository = connection.getRepository(Post)
92+
93+
// save a new posts
94+
const newPost1 = postRepository.create()
95+
newPost1.title = "Super post #1"
96+
const newPost2 = postRepository.create()
97+
newPost2.title = "Super post #2"
98+
const newPost3 = postRepository.create()
99+
newPost3.title = "Super post #3"
100+
const newPost4 = postRepository.create()
101+
newPost4.title = "Super post #4"
102+
103+
await postRepository.save(newPost1)
104+
await postRepository.save(newPost2)
105+
await postRepository.save(newPost3)
106+
await postRepository.save(newPost4)
107+
108+
// delete many
109+
await postRepository.delete(
110+
[
111+
{
112+
title: "Super post #1",
113+
},
114+
{
115+
title: "Super post #2",
116+
},
117+
],
118+
)
119+
120+
// load to check
121+
const loadedPost1 = await postRepository.findOne({
122+
where: {
123+
id: 1,
124+
},
125+
})
126+
const loadedPost2 = await postRepository.findOne({
127+
where: {
128+
id: 2,
129+
},
130+
})
131+
132+
// assert
133+
expect(loadedPost1).to.be.eql(null)
134+
135+
expect(loadedPost2).to.be.eql(null)
136+
}),
137+
))
138+
})

0 commit comments

Comments
 (0)