diff --git a/package.json b/package.json index f75a41895..9d9b9fab3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "zenstack-monorepo", - "version": "1.2.0", + "version": "1.2.1", "description": "", "scripts": { "build": "pnpm -r build", diff --git a/packages/language/package.json b/packages/language/package.json index b6410310c..4aff10044 100644 --- a/packages/language/package.json +++ b/packages/language/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/language", - "version": "1.2.0", + "version": "1.2.1", "displayName": "ZenStack modeling language compiler", "description": "ZenStack modeling language compiler", "homepage": "https://zenstack.dev", diff --git a/packages/plugins/openapi/package.json b/packages/plugins/openapi/package.json index a4dd63c40..01ca84dab 100644 --- a/packages/plugins/openapi/package.json +++ b/packages/plugins/openapi/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/openapi", "displayName": "ZenStack Plugin and Runtime for OpenAPI", - "version": "1.2.0", + "version": "1.2.1", "description": "ZenStack plugin and runtime supporting OpenAPI", "main": "index.js", "repository": { diff --git a/packages/plugins/swr/package.json b/packages/plugins/swr/package.json index 97da62061..cd4d0b4f8 100644 --- a/packages/plugins/swr/package.json +++ b/packages/plugins/swr/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/swr", "displayName": "ZenStack plugin for generating SWR hooks", - "version": "1.2.0", + "version": "1.2.1", "description": "ZenStack plugin for generating SWR hooks", "main": "index.js", "repository": { diff --git a/packages/plugins/tanstack-query/package.json b/packages/plugins/tanstack-query/package.json index e0bc7c8b4..c5a903fc5 100644 --- a/packages/plugins/tanstack-query/package.json +++ b/packages/plugins/tanstack-query/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/tanstack-query", "displayName": "ZenStack plugin for generating tanstack-query hooks", - "version": "1.2.0", + "version": "1.2.1", "description": "ZenStack plugin for generating tanstack-query hooks", "main": "index.js", "exports": { diff --git a/packages/plugins/trpc/package.json b/packages/plugins/trpc/package.json index 9caa2ab1c..b20fa8240 100644 --- a/packages/plugins/trpc/package.json +++ b/packages/plugins/trpc/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/trpc", "displayName": "ZenStack plugin for tRPC", - "version": "1.2.0", + "version": "1.2.1", "description": "ZenStack plugin for tRPC", "main": "index.js", "repository": { diff --git a/packages/runtime/package.json b/packages/runtime/package.json index 4b0c66c0b..a47c314ff 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/runtime", "displayName": "ZenStack Runtime Library", - "version": "1.2.0", + "version": "1.2.1", "description": "Runtime of ZenStack for both client-side and server-side environments.", "repository": { "type": "git", diff --git a/packages/runtime/src/enhancements/policy/policy-utils.ts b/packages/runtime/src/enhancements/policy/policy-utils.ts index cfb6103f3..cc89942bc 100644 --- a/packages/runtime/src/enhancements/policy/policy-utils.ts +++ b/packages/runtime/src/enhancements/policy/policy-utils.ts @@ -525,6 +525,7 @@ export class PolicyUtil { if (backLinkField.isArray && !mutating) { // many-side of relationship, wrap with "some" query currQuery[currField.backLink] = { some: { ...visitWhere } }; + currQuery = currQuery[currField.backLink].some; } else { const fkMapping = where && backLinkField.isRelationOwner && backLinkField.foreignKeyMapping; @@ -553,8 +554,8 @@ export class PolicyUtil { // preserve the original structure currQuery[currField.backLink] = { ...visitWhere }; } + currQuery = currQuery[currField.backLink]; } - currQuery = currQuery[currField.backLink]; currField = field; } } diff --git a/packages/schema/package.json b/packages/schema/package.json index d125dad49..fb88a1a23 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -3,7 +3,7 @@ "publisher": "zenstack", "displayName": "ZenStack Language Tools", "description": "A toolkit for building secure CRUD apps with Next.js + Typescript", - "version": "1.2.0", + "version": "1.2.1", "author": { "name": "ZenStack Team" }, diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 8de2fd8e4..48145b484 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/sdk", - "version": "1.2.0", + "version": "1.2.1", "description": "ZenStack plugin development SDK", "main": "index.js", "scripts": { diff --git a/packages/server/package.json b/packages/server/package.json index 16a6e9832..f699f8a34 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/server", - "version": "1.2.0", + "version": "1.2.1", "displayName": "ZenStack Server-side Adapters", "description": "ZenStack server-side adapters", "homepage": "https://zenstack.dev", diff --git a/packages/testtools/package.json b/packages/testtools/package.json index d74ee7dea..b315a3196 100644 --- a/packages/testtools/package.json +++ b/packages/testtools/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/testtools", - "version": "1.2.0", + "version": "1.2.1", "description": "ZenStack Test Tools", "main": "index.js", "private": true, diff --git a/tests/integration/tests/regression/issue-811.test.ts b/tests/integration/tests/regression/issue-811.test.ts new file mode 100644 index 000000000..af2268203 --- /dev/null +++ b/tests/integration/tests/regression/issue-811.test.ts @@ -0,0 +1,71 @@ +import { loadSchema } from '@zenstackhq/testtools'; + +describe('Regression: issue 811', () => { + it('regression', async () => { + const { prisma, enhance } = await loadSchema( + ` + model Membership { + id String @id @default(uuid()) + role String @default('STANDARD') + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + userId String @unique + + @@auth + @@allow('create,update,delete', auth().role == 'ADMIN') + @@allow('update', auth() == this) + @@allow('read', true) + } + model User { + id String @id @default(uuid()) + profile Profile @relation(fields: [profileId], references: [id], onDelete: Cascade) + profileId String @unique + memberships Membership[] + + @@allow('create,update,delete', auth().role == 'ADMIN') + @@allow('update', id == auth().userId) + @@allow('read', true) + } + model Profile { + id String @id @default(uuid()) + firstName String + users User[] + + @@allow('create,update,delete', auth().role == 'ADMIN') + @@allow('update', users?[id == auth().userId]) + @@allow('read', true) + } + ` + ); + + const r = await prisma.user.create({ + data: { + profile: { + create: { firstName: 'Tom' }, + }, + memberships: { + create: { role: 'STANDARD' }, + }, + }, + include: { + profile: true, + memberships: true, + }, + }); + + const membershipId = r.memberships[0].id; + const userId = r.id; + const db = enhance({ id: membershipId, role: 'ADMIN', userId }); + + const r1 = await db.membership.update({ + data: { + role: 'VIP', + user: { update: { data: { profile: { update: { data: { firstName: 'Jerry' } } } } } }, + }, + include: { user: { include: { profile: true } } }, + where: { id: membershipId }, + }); + + expect(r1.role).toBe('VIP'); + expect(r1.user.profile.firstName).toBe('Jerry'); + }); +});