Skip to content

Commit cc3cd8c

Browse files
authored
fix(policy): incorrect policy injection for createManyAndReturn when the model contains array fields (#1956)
1 parent 8e3b675 commit cc3cd8c

File tree

17 files changed

+130
-25
lines changed

17 files changed

+130
-25
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "zenstack-monorepo",
3-
"version": "2.11.1",
3+
"version": "2.11.2",
44
"description": "",
55
"scripts": {
66
"build": "pnpm -r --filter=\"!./packages/ide/*\" build",

packages/ide/jetbrains/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ plugins {
99
}
1010

1111
group = "dev.zenstack"
12-
version = "2.11.1"
12+
version = "2.11.2"
1313

1414
repositories {
1515
mavenCentral()

packages/ide/jetbrains/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "jetbrains",
3-
"version": "2.11.1",
3+
"version": "2.11.2",
44
"displayName": "ZenStack JetBrains IDE Plugin",
55
"description": "ZenStack JetBrains IDE plugin",
66
"homepage": "https://zenstack.dev",

packages/language/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@zenstackhq/language",
3-
"version": "2.11.1",
3+
"version": "2.11.2",
44
"displayName": "ZenStack modeling language compiler",
55
"description": "ZenStack modeling language compiler",
66
"homepage": "https://zenstack.dev",

packages/misc/redwood/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@zenstackhq/redwood",
33
"displayName": "ZenStack RedwoodJS Integration",
4-
"version": "2.11.1",
4+
"version": "2.11.2",
55
"description": "CLI and runtime for integrating ZenStack with RedwoodJS projects.",
66
"repository": {
77
"type": "git",

packages/plugins/openapi/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@zenstackhq/openapi",
33
"displayName": "ZenStack Plugin and Runtime for OpenAPI",
4-
"version": "2.11.1",
4+
"version": "2.11.2",
55
"description": "ZenStack plugin and runtime supporting OpenAPI",
66
"main": "index.js",
77
"repository": {

packages/plugins/swr/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@zenstackhq/swr",
33
"displayName": "ZenStack plugin for generating SWR hooks",
4-
"version": "2.11.1",
4+
"version": "2.11.2",
55
"description": "ZenStack plugin for generating SWR hooks",
66
"main": "index.js",
77
"repository": {

packages/plugins/tanstack-query/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@zenstackhq/tanstack-query",
33
"displayName": "ZenStack plugin for generating tanstack-query hooks",
4-
"version": "2.11.1",
4+
"version": "2.11.2",
55
"description": "ZenStack plugin for generating tanstack-query hooks",
66
"main": "index.js",
77
"exports": {

packages/plugins/trpc/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@zenstackhq/trpc",
33
"displayName": "ZenStack plugin for tRPC",
4-
"version": "2.11.1",
4+
"version": "2.11.2",
55
"description": "ZenStack plugin for tRPC",
66
"main": "index.js",
77
"repository": {

packages/runtime/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@zenstackhq/runtime",
33
"displayName": "ZenStack Runtime Library",
4-
"version": "2.11.1",
4+
"version": "2.11.2",
55
"description": "Runtime of ZenStack for both client-side and server-side environments.",
66
"repository": {
77
"type": "git",

packages/runtime/src/enhancements/node/policy/handler.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -478,8 +478,14 @@ export class PolicyProxyHandler<DbClient extends DbClientContract> implements Pr
478478
let result: { result: unknown; error?: Error }[];
479479

480480
if (!shouldConvertToCreate) {
481-
// direct `createManyAndReturn`
482-
const created = await this.modelClient.createManyAndReturn(args);
481+
// direct `createManyAndReturn`, make sure we only select id fields for return
482+
// so we can use the results directly for read-back check
483+
const updatedArgs = {
484+
...args,
485+
select: this.policyUtils.makeIdSelection(this.model),
486+
include: undefined,
487+
};
488+
const created = await this.modelClient.createManyAndReturn(updatedArgs);
483489

484490
// process read-back
485491
result = await Promise.all(

packages/schema/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"publisher": "zenstack",
44
"displayName": "ZenStack Language Tools",
55
"description": "FullStack enhancement for Prisma ORM: seamless integration from database to UI",
6-
"version": "2.11.1",
6+
"version": "2.11.2",
77
"author": {
88
"name": "ZenStack Team"
99
},

packages/sdk/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@zenstackhq/sdk",
3-
"version": "2.11.1",
3+
"version": "2.11.2",
44
"description": "ZenStack plugin development SDK",
55
"main": "index.js",
66
"scripts": {

packages/server/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@zenstackhq/server",
3-
"version": "2.11.1",
3+
"version": "2.11.2",
44
"displayName": "ZenStack Server-side Adapters",
55
"description": "ZenStack server-side adapters",
66
"homepage": "https://zenstack.dev",

packages/testtools/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@zenstackhq/testtools",
3-
"version": "2.11.1",
3+
"version": "2.11.2",
44
"description": "ZenStack Test Tools",
55
"main": "index.js",
66
"private": true,

tests/integration/tests/enhancements/with-policy/create-many-and-return.test.ts

+11-9
Original file line numberDiff line numberDiff line change
@@ -92,15 +92,17 @@ describe('Test API createManyAndReturn', () => {
9292

9393
const db = enhance();
9494

95-
// create should succeed but one result can't be read back
96-
await expect(
97-
db.post.createManyAndReturn({
98-
data: [
99-
{ title: 'post1', published: true },
100-
{ title: 'post2', published: false },
101-
],
102-
})
103-
).toBeRejectedByPolicy();
95+
// create should succeed but one result's title field can't be read back
96+
const r = await db.post.createManyAndReturn({
97+
data: [
98+
{ title: 'post1', published: true },
99+
{ title: 'post2', published: false },
100+
],
101+
});
102+
103+
expect(r.length).toBe(2);
104+
expect(r[0].title).toBeTruthy();
105+
expect(r[1].title).toBeUndefined();
104106

105107
// check posts are created
106108
await expect(prisma.post.findMany()).resolves.toHaveLength(2);
+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import { createPostgresDb, dropPostgresDb, loadSchema } from '@zenstackhq/testtools';
2+
3+
describe('issue 1955', () => {
4+
it('simple policy', async () => {
5+
const dbUrl = await createPostgresDb('issue-1955-1');
6+
let _prisma: any;
7+
8+
try {
9+
const { enhance, prisma } = await loadSchema(
10+
`
11+
model Post {
12+
id Int @id @default(autoincrement())
13+
name String
14+
expections String[]
15+
16+
@@allow('all', true)
17+
}
18+
`,
19+
{ provider: 'postgresql', dbUrl }
20+
);
21+
_prisma = prisma;
22+
23+
const db = enhance();
24+
await expect(
25+
db.post.createManyAndReturn({
26+
data: [
27+
{
28+
name: 'bla',
29+
},
30+
{
31+
name: 'blu',
32+
},
33+
],
34+
})
35+
).resolves.toEqual(
36+
expect.arrayContaining([
37+
expect.objectContaining({ name: 'bla' }),
38+
expect.objectContaining({ name: 'blu' }),
39+
])
40+
);
41+
} finally {
42+
await _prisma.$disconnect();
43+
await dropPostgresDb('issue-1955');
44+
}
45+
});
46+
47+
it('complex policy', async () => {
48+
const dbUrl = await createPostgresDb('issue-1955-2');
49+
let _prisma: any;
50+
51+
try {
52+
const { enhance, prisma } = await loadSchema(
53+
`
54+
model Post {
55+
id Int @id @default(autoincrement())
56+
name String
57+
expections String[]
58+
comments Comment[]
59+
60+
@@allow('all', comments^[private])
61+
}
62+
63+
model Comment {
64+
id Int @id @default(autoincrement())
65+
private Boolean @default(false)
66+
postId Int
67+
post Post @relation(fields: [postId], references: [id])
68+
}
69+
`,
70+
{ provider: 'postgresql', dbUrl }
71+
);
72+
_prisma = prisma;
73+
74+
const db = enhance();
75+
await expect(
76+
db.post.createManyAndReturn({
77+
data: [
78+
{
79+
name: 'bla',
80+
},
81+
{
82+
name: 'blu',
83+
},
84+
],
85+
})
86+
).resolves.toEqual(
87+
expect.arrayContaining([
88+
expect.objectContaining({ name: 'bla' }),
89+
expect.objectContaining({ name: 'blu' }),
90+
])
91+
);
92+
} finally {
93+
await _prisma.$disconnect();
94+
await dropPostgresDb('issue-1955-2');
95+
}
96+
});
97+
});

0 commit comments

Comments
 (0)