@cerbos/orm-prisma 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.js +54 -1
- package/lib/index.js.map +1 -1
- package/package.json +3 -4
- package/src/generated/prisma/internal/class.ts +7 -5
- package/src/generated/prisma/internal/prismaNamespace.ts +4 -4
- package/src/generated/prisma/internal/prismaNamespaceBrowser.ts +2 -2
- package/src/index.test.ts +701 -0
- package/src/index.ts +79 -1
package/lib/index.js
CHANGED
|
@@ -240,7 +240,16 @@ function createScopedMapper(collectionPath, variableName, fullMapper) {
|
|
|
240
240
|
* Builds a Prisma filter from a Cerbos expression.
|
|
241
241
|
*/
|
|
242
242
|
function buildPrismaFilterFromCerbosExpression(expression, mapper) {
|
|
243
|
-
//
|
|
243
|
+
// A bare named operand represents a boolean field reference (e.g. `R.attr.booleanAttr`)
|
|
244
|
+
if (isNamedOperand(expression)) {
|
|
245
|
+
const { path, relations } = resolveFieldReference(expression.name, mapper);
|
|
246
|
+
const fieldName = getLeafField(path);
|
|
247
|
+
const fieldFilter = { [fieldName]: { equals: true } };
|
|
248
|
+
if (relations && relations.length > 0) {
|
|
249
|
+
return buildNestedRelationFilter(relations, fieldFilter);
|
|
250
|
+
}
|
|
251
|
+
return fieldFilter;
|
|
252
|
+
}
|
|
244
253
|
if (!isOperatorOperand(expression)) {
|
|
245
254
|
throw new Error("Invalid Cerbos expression structure");
|
|
246
255
|
}
|
|
@@ -260,6 +269,13 @@ function buildPrismaFilterFromCerbosExpression(expression, mapper) {
|
|
|
260
269
|
if (!operand) {
|
|
261
270
|
throw new Error("not operator requires an operand");
|
|
262
271
|
}
|
|
272
|
+
if (isNamedOperand(operand)) {
|
|
273
|
+
const { path, relations } = resolveFieldReference(operand.name, mapper);
|
|
274
|
+
if (!relations || relations.length === 0) {
|
|
275
|
+
const fieldName = getLeafField(path);
|
|
276
|
+
return { [fieldName]: { equals: false } };
|
|
277
|
+
}
|
|
278
|
+
}
|
|
263
279
|
return {
|
|
264
280
|
NOT: buildPrismaFilterFromCerbosExpression(operand, mapper),
|
|
265
281
|
};
|
|
@@ -303,6 +319,40 @@ function buildPrismaFilterFromCerbosExpression(expression, mapper) {
|
|
|
303
319
|
throw new Error(`Unsupported operator: ${operator}`);
|
|
304
320
|
}
|
|
305
321
|
}
|
|
322
|
+
function handleSizeComparison(operator, sizeOperand, valueOperand, mapper) {
|
|
323
|
+
const collectionOperand = sizeOperand.operands[0];
|
|
324
|
+
if (!collectionOperand || !isNamedOperand(collectionOperand)) {
|
|
325
|
+
throw new Error("size operator requires a named collection operand");
|
|
326
|
+
}
|
|
327
|
+
if (!isValueOperand(valueOperand)) {
|
|
328
|
+
throw new Error("size comparison requires a numeric value operand");
|
|
329
|
+
}
|
|
330
|
+
const count = valueOperand.value;
|
|
331
|
+
if (typeof count !== "number") {
|
|
332
|
+
throw new Error("size comparison requires a numeric value");
|
|
333
|
+
}
|
|
334
|
+
const isNonEmpty = (operator === "gt" && count === 0) || (operator === "ge" && count === 1);
|
|
335
|
+
const isEmpty = (operator === "eq" && count === 0) ||
|
|
336
|
+
(operator === "lt" && count === 1) ||
|
|
337
|
+
(operator === "le" && count === 0);
|
|
338
|
+
if (!isNonEmpty && !isEmpty) {
|
|
339
|
+
throw new Error(`Unsupported size comparison: size(...) ${operator} ${count}`);
|
|
340
|
+
}
|
|
341
|
+
const { relations } = resolveFieldReference(collectionOperand.name, mapper);
|
|
342
|
+
if (!relations || relations.length === 0) {
|
|
343
|
+
throw new Error("size operator requires a relation mapping");
|
|
344
|
+
}
|
|
345
|
+
const deepest = relations[relations.length - 1];
|
|
346
|
+
if (!deepest) {
|
|
347
|
+
throw new Error("size operator requires a relation mapping");
|
|
348
|
+
}
|
|
349
|
+
const prismaOp = isNonEmpty ? "some" : "none";
|
|
350
|
+
const leafFilter = { [deepest.name]: { [prismaOp]: {} } };
|
|
351
|
+
if (relations.length === 1) {
|
|
352
|
+
return leafFilter;
|
|
353
|
+
}
|
|
354
|
+
return buildNestedRelationFilter(relations.slice(0, -1), leafFilter);
|
|
355
|
+
}
|
|
306
356
|
/**
|
|
307
357
|
* Helper function to process relational operators (eq, ne, lt, etc.)
|
|
308
358
|
*/
|
|
@@ -324,6 +374,9 @@ function handleRelationalOperator(operator, operands, mapper) {
|
|
|
324
374
|
const rightOperand = operands.find((o) => o !== leftOperand);
|
|
325
375
|
if (!rightOperand)
|
|
326
376
|
throw new Error("No valid right operand found");
|
|
377
|
+
if (isOperatorOperand(leftOperand) && leftOperand.operator === "size") {
|
|
378
|
+
return handleSizeComparison(operator, leftOperand, rightOperand, mapper);
|
|
379
|
+
}
|
|
327
380
|
const left = resolveOperand(leftOperand, mapper);
|
|
328
381
|
const right = resolveOperand(rightOperand, mapper);
|
|
329
382
|
if (isResolvedFieldReference(left)) {
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cerbos/orm-prisma",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"homepage": "https://cerbos.dev",
|
|
5
5
|
"description": "Prisma adapter for Cerbos query plans",
|
|
6
6
|
"repository": {
|
|
@@ -38,7 +38,6 @@
|
|
|
38
38
|
"clean": "rimraf lib",
|
|
39
39
|
"build": "tsc --build",
|
|
40
40
|
"prepare": "npm run build",
|
|
41
|
-
"prepublishOnly": "npm test",
|
|
42
41
|
"version": "git add -A src",
|
|
43
42
|
"prisma:generate": "bash scripts/generate-clients.sh",
|
|
44
43
|
"test": "npm run test:v7",
|
|
@@ -70,8 +69,8 @@
|
|
|
70
69
|
"@prisma/client": "^5.0.0 || ^6.0.0 || ^7.0.0"
|
|
71
70
|
},
|
|
72
71
|
"dependencies": {
|
|
73
|
-
"@cerbos/core": "^0.
|
|
74
|
-
"@cerbos/grpc": "^0.
|
|
72
|
+
"@cerbos/core": "^0.27.0",
|
|
73
|
+
"@cerbos/grpc": "^0.24.0"
|
|
75
74
|
},
|
|
76
75
|
"keywords": [
|
|
77
76
|
"cerbos",
|
|
@@ -17,8 +17,8 @@ import type * as Prisma from "./prismaNamespace.js"
|
|
|
17
17
|
|
|
18
18
|
const config: runtime.GetPrismaClientConfig = {
|
|
19
19
|
"previewFeatures": [],
|
|
20
|
-
"clientVersion": "7.
|
|
21
|
-
"engineVersion": "
|
|
20
|
+
"clientVersion": "7.3.0",
|
|
21
|
+
"engineVersion": "9d6ad21cbbceab97458517b147a6a09ff43aa735",
|
|
22
22
|
"activeProvider": "sqlite",
|
|
23
23
|
"inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client\" // or `prisma-client-js`\n output = \"../src/generated/prisma\"\n engineType = \"client\" // enable Prisma ORM without Rust\n moduleFormat = \"cjs\"\n}\n\ndatasource db {\n provider = \"sqlite\"\n}\n\nmodel Resource {\n id String @id @default(cuid())\n aString String\n aNumber Int\n aBool Boolean\n ownedBy User[]\n createdBy User @relation(fields: [creatorId], references: [id], name: \"creator\")\n creatorId String\n nested NestedResource @relation(fields: [nestedResourceId], references: [id])\n nestedResourceId String\n tags Tag[] // Add many-to-many relationship\n aOptionalString String?\n categories Category[] // Add categories relation\n}\n\nmodel User {\n id String @id @default(cuid())\n aString String\n aNumber Int\n aBool Boolean\n resources Resource[]\n createdResources Resource[] @relation(name: \"creator\")\n}\n\nmodel NestedResource {\n id String @id @default(cuid())\n aString String\n aNumber Int\n aBool Boolean\n aOptionalString String?\n\n Resource Resource[]\n nextlevel NextLevelNestedResource @relation(fields: [nextLevelNestedResourceId], references: [id])\n nextLevelNestedResourceId String\n}\n\nmodel NextLevelNestedResource {\n id String @id @default(cuid())\n aString String\n aNumber Int\n aBool Boolean\n NestedResource NestedResource[]\n}\n\nmodel Tag {\n id String @id @default(cuid())\n name String @unique\n resources Resource[]\n}\n\n// Add new models for nested many-to-many relations\nmodel Category {\n id String @id @default(cuid())\n name String @unique\n resources Resource[]\n subCategories SubCategory[]\n}\n\nmodel SubCategory {\n id String @id @default(cuid())\n name String @unique\n categories Category[]\n labels Label[]\n}\n\nmodel Label {\n id String @id @default(cuid())\n name String @unique\n subCategories SubCategory[]\n}\n",
|
|
24
24
|
"runtimeDataModel": {
|
|
@@ -37,12 +37,14 @@ async function decodeBase64AsWasm(wasmBase64: string): Promise<WebAssembly.Modul
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
config.compilerWasm = {
|
|
40
|
-
getRuntime: async () => await import("@prisma/client/runtime/
|
|
40
|
+
getRuntime: async () => await import("@prisma/client/runtime/query_compiler_fast_bg.sqlite.js"),
|
|
41
41
|
|
|
42
42
|
getQueryCompilerWasmModule: async () => {
|
|
43
|
-
const { wasm } = await import("@prisma/client/runtime/
|
|
43
|
+
const { wasm } = await import("@prisma/client/runtime/query_compiler_fast_bg.sqlite.wasm-base64.js")
|
|
44
44
|
return await decodeBase64AsWasm(wasm)
|
|
45
|
-
}
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
importName: "./query_compiler_fast_bg.js"
|
|
46
48
|
}
|
|
47
49
|
|
|
48
50
|
|
|
@@ -80,12 +80,12 @@ export type PrismaVersion = {
|
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
/**
|
|
83
|
-
* Prisma Client JS version: 7.
|
|
84
|
-
* Query Engine version:
|
|
83
|
+
* Prisma Client JS version: 7.3.0
|
|
84
|
+
* Query Engine version: 9d6ad21cbbceab97458517b147a6a09ff43aa735
|
|
85
85
|
*/
|
|
86
86
|
export const prismaVersion: PrismaVersion = {
|
|
87
|
-
client: "7.
|
|
88
|
-
engine: "
|
|
87
|
+
client: "7.3.0",
|
|
88
|
+
engine: "9d6ad21cbbceab97458517b147a6a09ff43aa735"
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
/**
|
|
@@ -67,9 +67,9 @@ export type ModelName = (typeof ModelName)[keyof typeof ModelName]
|
|
|
67
67
|
* Enums
|
|
68
68
|
*/
|
|
69
69
|
|
|
70
|
-
export const TransactionIsolationLevel = {
|
|
70
|
+
export const TransactionIsolationLevel = runtime.makeStrictEnum({
|
|
71
71
|
Serializable: 'Serializable'
|
|
72
|
-
} as const
|
|
72
|
+
} as const)
|
|
73
73
|
|
|
74
74
|
export type TransactionIsolationLevel = (typeof TransactionIsolationLevel)[keyof typeof TransactionIsolationLevel]
|
|
75
75
|
|
package/src/index.test.ts
CHANGED
|
@@ -540,6 +540,457 @@ describe("Field Operations", () => {
|
|
|
540
540
|
});
|
|
541
541
|
});
|
|
542
542
|
|
|
543
|
+
describe("Bare Boolean Tests", () => {
|
|
544
|
+
test("conditional - bare boolean true (no value operand)", () => {
|
|
545
|
+
// #given
|
|
546
|
+
const queryPlan = createConditionalPlan({
|
|
547
|
+
name: "request.resource.attr.aBool",
|
|
548
|
+
});
|
|
549
|
+
|
|
550
|
+
// #when
|
|
551
|
+
const result = queryPlanToPrisma({
|
|
552
|
+
queryPlan,
|
|
553
|
+
mapper: {
|
|
554
|
+
"request.resource.attr.aBool": { field: "aBool" },
|
|
555
|
+
},
|
|
556
|
+
});
|
|
557
|
+
|
|
558
|
+
// #then
|
|
559
|
+
expect(result).toStrictEqual({
|
|
560
|
+
kind: PlanKind.CONDITIONAL,
|
|
561
|
+
filters: { aBool: { equals: true } },
|
|
562
|
+
});
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
test("conditional - bare boolean negated (not with single named operand)", () => {
|
|
566
|
+
// #given
|
|
567
|
+
const queryPlan = createConditionalPlan({
|
|
568
|
+
operator: "not",
|
|
569
|
+
operands: [{ name: "request.resource.attr.aBool" }],
|
|
570
|
+
});
|
|
571
|
+
|
|
572
|
+
// #when
|
|
573
|
+
const result = queryPlanToPrisma({
|
|
574
|
+
queryPlan,
|
|
575
|
+
mapper: {
|
|
576
|
+
"request.resource.attr.aBool": { field: "aBool" },
|
|
577
|
+
},
|
|
578
|
+
});
|
|
579
|
+
|
|
580
|
+
// #then
|
|
581
|
+
expect(result).toStrictEqual({
|
|
582
|
+
kind: PlanKind.CONDITIONAL,
|
|
583
|
+
filters: { aBool: { equals: false } },
|
|
584
|
+
});
|
|
585
|
+
});
|
|
586
|
+
|
|
587
|
+
test("conditional - bare boolean without mapper", () => {
|
|
588
|
+
// #given
|
|
589
|
+
const queryPlan = createConditionalPlan({
|
|
590
|
+
name: "request.resource.attr.aBool",
|
|
591
|
+
});
|
|
592
|
+
|
|
593
|
+
// #when
|
|
594
|
+
const result = queryPlanToPrisma({ queryPlan });
|
|
595
|
+
|
|
596
|
+
// #then
|
|
597
|
+
expect(result).toStrictEqual({
|
|
598
|
+
kind: PlanKind.CONDITIONAL,
|
|
599
|
+
filters: { "request.resource.attr.aBool": { equals: true } },
|
|
600
|
+
});
|
|
601
|
+
});
|
|
602
|
+
|
|
603
|
+
test("conditional - negated bare boolean without mapper", () => {
|
|
604
|
+
// #given
|
|
605
|
+
const queryPlan = createConditionalPlan({
|
|
606
|
+
operator: "not",
|
|
607
|
+
operands: [{ name: "request.resource.attr.aBool" }],
|
|
608
|
+
});
|
|
609
|
+
|
|
610
|
+
// #when
|
|
611
|
+
const result = queryPlanToPrisma({ queryPlan });
|
|
612
|
+
|
|
613
|
+
// #then
|
|
614
|
+
expect(result).toStrictEqual({
|
|
615
|
+
kind: PlanKind.CONDITIONAL,
|
|
616
|
+
filters: { "request.resource.attr.aBool": { equals: false } },
|
|
617
|
+
});
|
|
618
|
+
});
|
|
619
|
+
|
|
620
|
+
test("conditional - bare boolean inside AND", () => {
|
|
621
|
+
// #given
|
|
622
|
+
const queryPlan = createConditionalPlan({
|
|
623
|
+
operator: "and",
|
|
624
|
+
operands: [
|
|
625
|
+
{ name: "request.resource.attr.aBool" },
|
|
626
|
+
{
|
|
627
|
+
operator: "eq",
|
|
628
|
+
operands: [
|
|
629
|
+
{ name: "request.resource.attr.aString" },
|
|
630
|
+
{ value: "string" },
|
|
631
|
+
],
|
|
632
|
+
},
|
|
633
|
+
],
|
|
634
|
+
});
|
|
635
|
+
|
|
636
|
+
// #when
|
|
637
|
+
const result = queryPlanToPrisma({
|
|
638
|
+
queryPlan,
|
|
639
|
+
mapper: {
|
|
640
|
+
"request.resource.attr.aBool": { field: "aBool" },
|
|
641
|
+
"request.resource.attr.aString": { field: "aString" },
|
|
642
|
+
},
|
|
643
|
+
});
|
|
644
|
+
|
|
645
|
+
// #then
|
|
646
|
+
expect(result).toStrictEqual({
|
|
647
|
+
kind: PlanKind.CONDITIONAL,
|
|
648
|
+
filters: {
|
|
649
|
+
AND: [
|
|
650
|
+
{ aBool: { equals: true } },
|
|
651
|
+
{ aString: { equals: "string" } },
|
|
652
|
+
],
|
|
653
|
+
},
|
|
654
|
+
});
|
|
655
|
+
});
|
|
656
|
+
|
|
657
|
+
test("conditional - bare boolean inside OR", () => {
|
|
658
|
+
// #given
|
|
659
|
+
const queryPlan = createConditionalPlan({
|
|
660
|
+
operator: "or",
|
|
661
|
+
operands: [
|
|
662
|
+
{ name: "request.resource.attr.aBool" },
|
|
663
|
+
{
|
|
664
|
+
operator: "eq",
|
|
665
|
+
operands: [
|
|
666
|
+
{ name: "request.resource.attr.aNumber" },
|
|
667
|
+
{ value: 1 },
|
|
668
|
+
],
|
|
669
|
+
},
|
|
670
|
+
],
|
|
671
|
+
});
|
|
672
|
+
|
|
673
|
+
// #when
|
|
674
|
+
const result = queryPlanToPrisma({
|
|
675
|
+
queryPlan,
|
|
676
|
+
mapper: {
|
|
677
|
+
"request.resource.attr.aBool": { field: "aBool" },
|
|
678
|
+
"request.resource.attr.aNumber": { field: "aNumber" },
|
|
679
|
+
},
|
|
680
|
+
});
|
|
681
|
+
|
|
682
|
+
// #then
|
|
683
|
+
expect(result).toStrictEqual({
|
|
684
|
+
kind: PlanKind.CONDITIONAL,
|
|
685
|
+
filters: {
|
|
686
|
+
OR: [
|
|
687
|
+
{ aBool: { equals: true } },
|
|
688
|
+
{ aNumber: { equals: 1 } },
|
|
689
|
+
],
|
|
690
|
+
},
|
|
691
|
+
});
|
|
692
|
+
});
|
|
693
|
+
|
|
694
|
+
test("conditional - double negation bare boolean", () => {
|
|
695
|
+
// #given
|
|
696
|
+
const queryPlan = createConditionalPlan({
|
|
697
|
+
operator: "not",
|
|
698
|
+
operands: [
|
|
699
|
+
{
|
|
700
|
+
operator: "not",
|
|
701
|
+
operands: [{ name: "request.resource.attr.aBool" }],
|
|
702
|
+
},
|
|
703
|
+
],
|
|
704
|
+
});
|
|
705
|
+
|
|
706
|
+
// #when
|
|
707
|
+
const result = queryPlanToPrisma({
|
|
708
|
+
queryPlan,
|
|
709
|
+
mapper: {
|
|
710
|
+
"request.resource.attr.aBool": { field: "aBool" },
|
|
711
|
+
},
|
|
712
|
+
});
|
|
713
|
+
|
|
714
|
+
// #then
|
|
715
|
+
expect(result).toStrictEqual({
|
|
716
|
+
kind: PlanKind.CONDITIONAL,
|
|
717
|
+
filters: { NOT: { aBool: { equals: false } } },
|
|
718
|
+
});
|
|
719
|
+
});
|
|
720
|
+
|
|
721
|
+
test("conditional - bare boolean with relation", () => {
|
|
722
|
+
// #given
|
|
723
|
+
const queryPlan = createConditionalPlan({
|
|
724
|
+
name: "request.resource.attr.nested.aBool",
|
|
725
|
+
});
|
|
726
|
+
|
|
727
|
+
// #when
|
|
728
|
+
const result = queryPlanToPrisma({
|
|
729
|
+
queryPlan,
|
|
730
|
+
mapper: {
|
|
731
|
+
"request.resource.attr.nested": {
|
|
732
|
+
relation: {
|
|
733
|
+
name: "nestedResource",
|
|
734
|
+
type: "one",
|
|
735
|
+
},
|
|
736
|
+
},
|
|
737
|
+
"request.resource.attr.nested.aBool": {
|
|
738
|
+
relation: {
|
|
739
|
+
name: "nestedResource",
|
|
740
|
+
type: "one",
|
|
741
|
+
},
|
|
742
|
+
field: "aBool",
|
|
743
|
+
},
|
|
744
|
+
},
|
|
745
|
+
});
|
|
746
|
+
|
|
747
|
+
// #then
|
|
748
|
+
expect(result).toStrictEqual({
|
|
749
|
+
kind: PlanKind.CONDITIONAL,
|
|
750
|
+
filters: {
|
|
751
|
+
nestedResource: { is: { aBool: { equals: true } } },
|
|
752
|
+
},
|
|
753
|
+
});
|
|
754
|
+
});
|
|
755
|
+
|
|
756
|
+
test("conditional - negated bare boolean with relation", () => {
|
|
757
|
+
// #given
|
|
758
|
+
const queryPlan = createConditionalPlan({
|
|
759
|
+
operator: "not",
|
|
760
|
+
operands: [{ name: "request.resource.attr.nested.aBool" }],
|
|
761
|
+
});
|
|
762
|
+
|
|
763
|
+
// #when
|
|
764
|
+
const result = queryPlanToPrisma({
|
|
765
|
+
queryPlan,
|
|
766
|
+
mapper: {
|
|
767
|
+
"request.resource.attr.nested": {
|
|
768
|
+
relation: {
|
|
769
|
+
name: "nestedResource",
|
|
770
|
+
type: "one",
|
|
771
|
+
},
|
|
772
|
+
},
|
|
773
|
+
"request.resource.attr.nested.aBool": {
|
|
774
|
+
relation: {
|
|
775
|
+
name: "nestedResource",
|
|
776
|
+
type: "one",
|
|
777
|
+
},
|
|
778
|
+
field: "aBool",
|
|
779
|
+
},
|
|
780
|
+
},
|
|
781
|
+
});
|
|
782
|
+
|
|
783
|
+
// #then
|
|
784
|
+
expect(result).toStrictEqual({
|
|
785
|
+
kind: PlanKind.CONDITIONAL,
|
|
786
|
+
filters: {
|
|
787
|
+
NOT: { nestedResource: { is: { aBool: { equals: true } } } },
|
|
788
|
+
},
|
|
789
|
+
});
|
|
790
|
+
});
|
|
791
|
+
|
|
792
|
+
test("conditional - negated bare boolean with many relation", () => {
|
|
793
|
+
// #given
|
|
794
|
+
const queryPlan = createConditionalPlan({
|
|
795
|
+
operator: "not",
|
|
796
|
+
operands: [{ name: "request.resource.attr.tags.active" }],
|
|
797
|
+
});
|
|
798
|
+
|
|
799
|
+
// #when
|
|
800
|
+
const result = queryPlanToPrisma({
|
|
801
|
+
queryPlan,
|
|
802
|
+
mapper: {
|
|
803
|
+
"request.resource.attr.tags.active": {
|
|
804
|
+
relation: {
|
|
805
|
+
name: "tags",
|
|
806
|
+
type: "many",
|
|
807
|
+
},
|
|
808
|
+
field: "active",
|
|
809
|
+
},
|
|
810
|
+
},
|
|
811
|
+
});
|
|
812
|
+
|
|
813
|
+
// #then — must be NOT { some { equals: true } }, not some { equals: false }
|
|
814
|
+
expect(result).toStrictEqual({
|
|
815
|
+
kind: PlanKind.CONDITIONAL,
|
|
816
|
+
filters: {
|
|
817
|
+
NOT: { tags: { some: { active: { equals: true } } } },
|
|
818
|
+
},
|
|
819
|
+
});
|
|
820
|
+
});
|
|
821
|
+
|
|
822
|
+
test("conditional - bare boolean via cerbos policy", async () => {
|
|
823
|
+
const queryPlan = await cerbos.planResources({
|
|
824
|
+
principal: { id: "user1", roles: ["USER"] },
|
|
825
|
+
resource: { kind: "resource" },
|
|
826
|
+
action: "bare-bool",
|
|
827
|
+
});
|
|
828
|
+
|
|
829
|
+
expect(queryPlan.kind).toEqual(PlanKind.CONDITIONAL);
|
|
830
|
+
expect(
|
|
831
|
+
(queryPlan as PlanResourcesConditionalResponse).condition
|
|
832
|
+
).toEqual({ name: "request.resource.attr.aBool" });
|
|
833
|
+
|
|
834
|
+
const result = queryPlanToPrisma({
|
|
835
|
+
queryPlan,
|
|
836
|
+
mapper: {
|
|
837
|
+
"request.resource.attr.aBool": { field: "aBool" },
|
|
838
|
+
},
|
|
839
|
+
});
|
|
840
|
+
|
|
841
|
+
expect(result).toStrictEqual({
|
|
842
|
+
kind: PlanKind.CONDITIONAL,
|
|
843
|
+
filters: { aBool: { equals: true } },
|
|
844
|
+
});
|
|
845
|
+
|
|
846
|
+
if (result.kind !== PlanKind.CONDITIONAL) {
|
|
847
|
+
throw new Error("Expected CONDITIONAL result");
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
const query = await prisma.resource.findMany({
|
|
851
|
+
where: { ...result.filters },
|
|
852
|
+
});
|
|
853
|
+
expect(query.map((r) => r.id)).toEqual(
|
|
854
|
+
fixtureResources.filter((a) => a.aBool).map((r) => r.id)
|
|
855
|
+
);
|
|
856
|
+
});
|
|
857
|
+
|
|
858
|
+
test("conditional - negated bare boolean via cerbos policy", async () => {
|
|
859
|
+
const queryPlan = await cerbos.planResources({
|
|
860
|
+
principal: { id: "user1", roles: ["USER"] },
|
|
861
|
+
resource: { kind: "resource" },
|
|
862
|
+
action: "bare-bool-negated",
|
|
863
|
+
});
|
|
864
|
+
|
|
865
|
+
expect(queryPlan.kind).toEqual(PlanKind.CONDITIONAL);
|
|
866
|
+
expect(
|
|
867
|
+
(queryPlan as PlanResourcesConditionalResponse).condition
|
|
868
|
+
).toEqual({
|
|
869
|
+
operator: "not",
|
|
870
|
+
operands: [{ name: "request.resource.attr.aBool" }],
|
|
871
|
+
});
|
|
872
|
+
|
|
873
|
+
const result = queryPlanToPrisma({
|
|
874
|
+
queryPlan,
|
|
875
|
+
mapper: {
|
|
876
|
+
"request.resource.attr.aBool": { field: "aBool" },
|
|
877
|
+
},
|
|
878
|
+
});
|
|
879
|
+
|
|
880
|
+
expect(result).toStrictEqual({
|
|
881
|
+
kind: PlanKind.CONDITIONAL,
|
|
882
|
+
filters: { aBool: { equals: false } },
|
|
883
|
+
});
|
|
884
|
+
|
|
885
|
+
if (result.kind !== PlanKind.CONDITIONAL) {
|
|
886
|
+
throw new Error("Expected CONDITIONAL result");
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
const query = await prisma.resource.findMany({
|
|
890
|
+
where: { ...result.filters },
|
|
891
|
+
});
|
|
892
|
+
expect(query.map((r) => r.id)).toEqual(
|
|
893
|
+
fixtureResources.filter((a) => !a.aBool).map((r) => r.id)
|
|
894
|
+
);
|
|
895
|
+
});
|
|
896
|
+
|
|
897
|
+
test("conditional - bare boolean nested via cerbos policy", async () => {
|
|
898
|
+
const queryPlan = await cerbos.planResources({
|
|
899
|
+
principal: { id: "user1", roles: ["USER"] },
|
|
900
|
+
resource: { kind: "resource" },
|
|
901
|
+
action: "bare-bool-nested",
|
|
902
|
+
});
|
|
903
|
+
|
|
904
|
+
expect(queryPlan.kind).toEqual(PlanKind.CONDITIONAL);
|
|
905
|
+
expect(
|
|
906
|
+
(queryPlan as PlanResourcesConditionalResponse).condition
|
|
907
|
+
).toEqual({ name: "request.resource.attr.nested.aBool" });
|
|
908
|
+
|
|
909
|
+
const result = queryPlanToPrisma({
|
|
910
|
+
queryPlan,
|
|
911
|
+
mapper: {
|
|
912
|
+
"request.resource.attr.nested": {
|
|
913
|
+
relation: {
|
|
914
|
+
name: "nested",
|
|
915
|
+
type: "one",
|
|
916
|
+
fields: {
|
|
917
|
+
aBool: { field: "aBool" },
|
|
918
|
+
},
|
|
919
|
+
},
|
|
920
|
+
},
|
|
921
|
+
},
|
|
922
|
+
});
|
|
923
|
+
|
|
924
|
+
expect(result).toStrictEqual({
|
|
925
|
+
kind: PlanKind.CONDITIONAL,
|
|
926
|
+
filters: { nested: { is: { aBool: { equals: true } } } },
|
|
927
|
+
});
|
|
928
|
+
|
|
929
|
+
if (result.kind !== PlanKind.CONDITIONAL) {
|
|
930
|
+
throw new Error("Expected CONDITIONAL result");
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
const query = await prisma.resource.findMany({
|
|
934
|
+
where: { ...result.filters },
|
|
935
|
+
include: { nested: true },
|
|
936
|
+
});
|
|
937
|
+
expect(query.length).toBeGreaterThan(0);
|
|
938
|
+
for (const resource of query) {
|
|
939
|
+
expect(resource.nested.aBool).toBe(true);
|
|
940
|
+
}
|
|
941
|
+
});
|
|
942
|
+
|
|
943
|
+
test("conditional - negated bare boolean nested via cerbos policy", async () => {
|
|
944
|
+
const queryPlan = await cerbos.planResources({
|
|
945
|
+
principal: { id: "user1", roles: ["USER"] },
|
|
946
|
+
resource: { kind: "resource" },
|
|
947
|
+
action: "bare-bool-nested-negated",
|
|
948
|
+
});
|
|
949
|
+
|
|
950
|
+
expect(queryPlan.kind).toEqual(PlanKind.CONDITIONAL);
|
|
951
|
+
expect(
|
|
952
|
+
(queryPlan as PlanResourcesConditionalResponse).condition
|
|
953
|
+
).toEqual({
|
|
954
|
+
operator: "not",
|
|
955
|
+
operands: [{ name: "request.resource.attr.nested.aBool" }],
|
|
956
|
+
});
|
|
957
|
+
|
|
958
|
+
const result = queryPlanToPrisma({
|
|
959
|
+
queryPlan,
|
|
960
|
+
mapper: {
|
|
961
|
+
"request.resource.attr.nested": {
|
|
962
|
+
relation: {
|
|
963
|
+
name: "nested",
|
|
964
|
+
type: "one",
|
|
965
|
+
fields: {
|
|
966
|
+
aBool: { field: "aBool" },
|
|
967
|
+
},
|
|
968
|
+
},
|
|
969
|
+
},
|
|
970
|
+
},
|
|
971
|
+
});
|
|
972
|
+
|
|
973
|
+
expect(result).toStrictEqual({
|
|
974
|
+
kind: PlanKind.CONDITIONAL,
|
|
975
|
+
filters: {
|
|
976
|
+
NOT: { nested: { is: { aBool: { equals: true } } } },
|
|
977
|
+
},
|
|
978
|
+
});
|
|
979
|
+
|
|
980
|
+
if (result.kind !== PlanKind.CONDITIONAL) {
|
|
981
|
+
throw new Error("Expected CONDITIONAL result");
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
const query = await prisma.resource.findMany({
|
|
985
|
+
where: { ...result.filters },
|
|
986
|
+
include: { nested: true },
|
|
987
|
+
});
|
|
988
|
+
for (const resource of query) {
|
|
989
|
+
expect(resource.nested.aBool).not.toBe(true);
|
|
990
|
+
}
|
|
991
|
+
});
|
|
992
|
+
});
|
|
993
|
+
|
|
543
994
|
describe("Comparison Tests", () => {
|
|
544
995
|
test("conditional - gt", async () => {
|
|
545
996
|
const queryPlan = await cerbos.planResources({
|
|
@@ -2463,6 +2914,174 @@ describe("Relations", () => {
|
|
|
2463
2914
|
.map((r) => r.id)
|
|
2464
2915
|
);
|
|
2465
2916
|
});
|
|
2917
|
+
|
|
2918
|
+
test("conditional - size(field) > 0 produces some", () => {
|
|
2919
|
+
const result = queryPlanToPrisma({
|
|
2920
|
+
queryPlan: createConditionalPlan({
|
|
2921
|
+
operator: "gt",
|
|
2922
|
+
operands: [
|
|
2923
|
+
{
|
|
2924
|
+
operator: "size",
|
|
2925
|
+
operands: [{ name: "request.resource.attr.ownedBy" }],
|
|
2926
|
+
},
|
|
2927
|
+
{ value: 0 },
|
|
2928
|
+
],
|
|
2929
|
+
}),
|
|
2930
|
+
mapper: {
|
|
2931
|
+
"request.resource.attr.ownedBy": {
|
|
2932
|
+
relation: { name: "ownedBy", type: "many", field: "id" },
|
|
2933
|
+
},
|
|
2934
|
+
},
|
|
2935
|
+
});
|
|
2936
|
+
|
|
2937
|
+
expect(result).toStrictEqual({
|
|
2938
|
+
kind: PlanKind.CONDITIONAL,
|
|
2939
|
+
filters: { ownedBy: { some: {} } },
|
|
2940
|
+
});
|
|
2941
|
+
});
|
|
2942
|
+
|
|
2943
|
+
test("conditional - size(field) == 0 produces none", () => {
|
|
2944
|
+
const result = queryPlanToPrisma({
|
|
2945
|
+
queryPlan: createConditionalPlan({
|
|
2946
|
+
operator: "eq",
|
|
2947
|
+
operands: [
|
|
2948
|
+
{
|
|
2949
|
+
operator: "size",
|
|
2950
|
+
operands: [{ name: "request.resource.attr.ownedBy" }],
|
|
2951
|
+
},
|
|
2952
|
+
{ value: 0 },
|
|
2953
|
+
],
|
|
2954
|
+
}),
|
|
2955
|
+
mapper: {
|
|
2956
|
+
"request.resource.attr.ownedBy": {
|
|
2957
|
+
relation: { name: "ownedBy", type: "many", field: "id" },
|
|
2958
|
+
},
|
|
2959
|
+
},
|
|
2960
|
+
});
|
|
2961
|
+
|
|
2962
|
+
expect(result).toStrictEqual({
|
|
2963
|
+
kind: PlanKind.CONDITIONAL,
|
|
2964
|
+
filters: { ownedBy: { none: {} } },
|
|
2965
|
+
});
|
|
2966
|
+
});
|
|
2967
|
+
|
|
2968
|
+
test("conditional - not(size(field) > 0) produces NOT some", () => {
|
|
2969
|
+
const result = queryPlanToPrisma({
|
|
2970
|
+
queryPlan: createConditionalPlan({
|
|
2971
|
+
operator: "not",
|
|
2972
|
+
operands: [
|
|
2973
|
+
{
|
|
2974
|
+
operator: "gt",
|
|
2975
|
+
operands: [
|
|
2976
|
+
{
|
|
2977
|
+
operator: "size",
|
|
2978
|
+
operands: [{ name: "request.resource.attr.ownedBy" }],
|
|
2979
|
+
},
|
|
2980
|
+
{ value: 0 },
|
|
2981
|
+
],
|
|
2982
|
+
},
|
|
2983
|
+
],
|
|
2984
|
+
}),
|
|
2985
|
+
mapper: {
|
|
2986
|
+
"request.resource.attr.ownedBy": {
|
|
2987
|
+
relation: { name: "ownedBy", type: "many", field: "id" },
|
|
2988
|
+
},
|
|
2989
|
+
},
|
|
2990
|
+
});
|
|
2991
|
+
|
|
2992
|
+
expect(result).toStrictEqual({
|
|
2993
|
+
kind: PlanKind.CONDITIONAL,
|
|
2994
|
+
filters: { NOT: { ownedBy: { some: {} } } },
|
|
2995
|
+
});
|
|
2996
|
+
});
|
|
2997
|
+
|
|
2998
|
+
test("conditional - size(field) >= 1 produces some", () => {
|
|
2999
|
+
const result = queryPlanToPrisma({
|
|
3000
|
+
queryPlan: createConditionalPlan({
|
|
3001
|
+
operator: "ge",
|
|
3002
|
+
operands: [
|
|
3003
|
+
{
|
|
3004
|
+
operator: "size",
|
|
3005
|
+
operands: [{ name: "request.resource.attr.ownedBy" }],
|
|
3006
|
+
},
|
|
3007
|
+
{ value: 1 },
|
|
3008
|
+
],
|
|
3009
|
+
}),
|
|
3010
|
+
mapper: {
|
|
3011
|
+
"request.resource.attr.ownedBy": {
|
|
3012
|
+
relation: { name: "ownedBy", type: "many", field: "id" },
|
|
3013
|
+
},
|
|
3014
|
+
},
|
|
3015
|
+
});
|
|
3016
|
+
|
|
3017
|
+
expect(result).toStrictEqual({
|
|
3018
|
+
kind: PlanKind.CONDITIONAL,
|
|
3019
|
+
filters: { ownedBy: { some: {} } },
|
|
3020
|
+
});
|
|
3021
|
+
});
|
|
3022
|
+
|
|
3023
|
+
test("conditional - size on nested relation walks full chain", () => {
|
|
3024
|
+
const result = queryPlanToPrisma({
|
|
3025
|
+
queryPlan: createConditionalPlan({
|
|
3026
|
+
operator: "gt",
|
|
3027
|
+
operands: [
|
|
3028
|
+
{
|
|
3029
|
+
operator: "size",
|
|
3030
|
+
operands: [
|
|
3031
|
+
{ name: "request.resource.attr.team.members" },
|
|
3032
|
+
],
|
|
3033
|
+
},
|
|
3034
|
+
{ value: 0 },
|
|
3035
|
+
],
|
|
3036
|
+
}),
|
|
3037
|
+
mapper: {
|
|
3038
|
+
"request.resource.attr.team": {
|
|
3039
|
+
relation: {
|
|
3040
|
+
name: "team",
|
|
3041
|
+
type: "one",
|
|
3042
|
+
fields: {
|
|
3043
|
+
members: {
|
|
3044
|
+
relation: { name: "members", type: "many" },
|
|
3045
|
+
},
|
|
3046
|
+
},
|
|
3047
|
+
},
|
|
3048
|
+
},
|
|
3049
|
+
},
|
|
3050
|
+
});
|
|
3051
|
+
|
|
3052
|
+
expect(result).toStrictEqual({
|
|
3053
|
+
kind: PlanKind.CONDITIONAL,
|
|
3054
|
+
filters: {
|
|
3055
|
+
team: {
|
|
3056
|
+
is: {
|
|
3057
|
+
members: { some: {} },
|
|
3058
|
+
},
|
|
3059
|
+
},
|
|
3060
|
+
},
|
|
3061
|
+
});
|
|
3062
|
+
});
|
|
3063
|
+
|
|
3064
|
+
test("conditional - unsupported size comparison throws", () => {
|
|
3065
|
+
expect(() =>
|
|
3066
|
+
queryPlanToPrisma({
|
|
3067
|
+
queryPlan: createConditionalPlan({
|
|
3068
|
+
operator: "gt",
|
|
3069
|
+
operands: [
|
|
3070
|
+
{
|
|
3071
|
+
operator: "size",
|
|
3072
|
+
operands: [{ name: "request.resource.attr.ownedBy" }],
|
|
3073
|
+
},
|
|
3074
|
+
{ value: 5 },
|
|
3075
|
+
],
|
|
3076
|
+
}),
|
|
3077
|
+
mapper: {
|
|
3078
|
+
"request.resource.attr.ownedBy": {
|
|
3079
|
+
relation: { name: "ownedBy", type: "many", field: "id" },
|
|
3080
|
+
},
|
|
3081
|
+
},
|
|
3082
|
+
})
|
|
3083
|
+
).toThrow("Unsupported size comparison: size(...) gt 5");
|
|
3084
|
+
});
|
|
2466
3085
|
});
|
|
2467
3086
|
});
|
|
2468
3087
|
|
|
@@ -4309,6 +4928,88 @@ describe("Integration", () => {
|
|
|
4309
4928
|
// .map((r) => r.id)
|
|
4310
4929
|
// );
|
|
4311
4930
|
});
|
|
4931
|
+
|
|
4932
|
+
test("conditional - relation-has-members (size > 0)", async () => {
|
|
4933
|
+
const queryPlan = await cerbos.planResources({
|
|
4934
|
+
principal: { id: "user1", roles: ["USER"] },
|
|
4935
|
+
resource: { kind: "resource" },
|
|
4936
|
+
action: "relation-has-members",
|
|
4937
|
+
});
|
|
4938
|
+
|
|
4939
|
+
expect(queryPlan.kind).toEqual(PlanKind.CONDITIONAL);
|
|
4940
|
+
|
|
4941
|
+
const result = queryPlanToPrisma({
|
|
4942
|
+
queryPlan,
|
|
4943
|
+
mapper: {
|
|
4944
|
+
"request.resource.attr.ownedBy": {
|
|
4945
|
+
relation: { name: "ownedBy", type: "many", field: "id" },
|
|
4946
|
+
},
|
|
4947
|
+
},
|
|
4948
|
+
});
|
|
4949
|
+
|
|
4950
|
+
expect(result).toStrictEqual({
|
|
4951
|
+
kind: PlanKind.CONDITIONAL,
|
|
4952
|
+
filters: { ownedBy: { some: {} } },
|
|
4953
|
+
});
|
|
4954
|
+
|
|
4955
|
+
if (result.kind !== PlanKind.CONDITIONAL) {
|
|
4956
|
+
throw new Error("Expected CONDITIONAL result");
|
|
4957
|
+
}
|
|
4958
|
+
|
|
4959
|
+
const query = await prisma.resource.findMany({
|
|
4960
|
+
where: { ...result.filters },
|
|
4961
|
+
});
|
|
4962
|
+
|
|
4963
|
+
expect(query.map((r) => r.id)).toEqual(
|
|
4964
|
+
fixtureResources
|
|
4965
|
+
.filter((r) => {
|
|
4966
|
+
if (!r.ownedBy?.connect) return false;
|
|
4967
|
+
return (r.ownedBy.connect as { id: string }[]).length > 0;
|
|
4968
|
+
})
|
|
4969
|
+
.map((r) => r.id)
|
|
4970
|
+
);
|
|
4971
|
+
});
|
|
4972
|
+
|
|
4973
|
+
test("conditional - relation-has-no-members (negated size > 0)", async () => {
|
|
4974
|
+
const queryPlan = await cerbos.planResources({
|
|
4975
|
+
principal: { id: "user1", roles: ["USER"] },
|
|
4976
|
+
resource: { kind: "resource" },
|
|
4977
|
+
action: "relation-has-no-members",
|
|
4978
|
+
});
|
|
4979
|
+
|
|
4980
|
+
expect(queryPlan.kind).toEqual(PlanKind.CONDITIONAL);
|
|
4981
|
+
|
|
4982
|
+
const result = queryPlanToPrisma({
|
|
4983
|
+
queryPlan,
|
|
4984
|
+
mapper: {
|
|
4985
|
+
"request.resource.attr.ownedBy": {
|
|
4986
|
+
relation: { name: "ownedBy", type: "many", field: "id" },
|
|
4987
|
+
},
|
|
4988
|
+
},
|
|
4989
|
+
});
|
|
4990
|
+
|
|
4991
|
+
expect(result).toStrictEqual({
|
|
4992
|
+
kind: PlanKind.CONDITIONAL,
|
|
4993
|
+
filters: { NOT: { ownedBy: { some: {} } } },
|
|
4994
|
+
});
|
|
4995
|
+
|
|
4996
|
+
if (result.kind !== PlanKind.CONDITIONAL) {
|
|
4997
|
+
throw new Error("Expected CONDITIONAL result");
|
|
4998
|
+
}
|
|
4999
|
+
|
|
5000
|
+
const query = await prisma.resource.findMany({
|
|
5001
|
+
where: { ...result.filters },
|
|
5002
|
+
});
|
|
5003
|
+
|
|
5004
|
+
expect(query.map((r) => r.id)).toEqual(
|
|
5005
|
+
fixtureResources
|
|
5006
|
+
.filter((r) => {
|
|
5007
|
+
if (!r.ownedBy?.connect) return true;
|
|
5008
|
+
return (r.ownedBy.connect as { id: string }[]).length === 0;
|
|
5009
|
+
})
|
|
5010
|
+
.map((r) => r.id)
|
|
5011
|
+
);
|
|
5012
|
+
});
|
|
4312
5013
|
});
|
|
4313
5014
|
|
|
4314
5015
|
describe("Deep Nested Relations", () => {
|
package/src/index.ts
CHANGED
|
@@ -379,7 +379,17 @@ function buildPrismaFilterFromCerbosExpression(
|
|
|
379
379
|
expression: PlanExpressionOperand,
|
|
380
380
|
mapper: Mapper
|
|
381
381
|
): PrismaFilter {
|
|
382
|
-
//
|
|
382
|
+
// A bare named operand represents a boolean field reference (e.g. `R.attr.booleanAttr`)
|
|
383
|
+
if (isNamedOperand(expression)) {
|
|
384
|
+
const { path, relations } = resolveFieldReference(expression.name, mapper);
|
|
385
|
+
const fieldName = getLeafField(path);
|
|
386
|
+
const fieldFilter = { [fieldName]: { equals: true } };
|
|
387
|
+
if (relations && relations.length > 0) {
|
|
388
|
+
return buildNestedRelationFilter(relations, fieldFilter);
|
|
389
|
+
}
|
|
390
|
+
return fieldFilter;
|
|
391
|
+
}
|
|
392
|
+
|
|
383
393
|
if (!isOperatorOperand(expression)) {
|
|
384
394
|
throw new Error("Invalid Cerbos expression structure");
|
|
385
395
|
}
|
|
@@ -407,6 +417,16 @@ function buildPrismaFilterFromCerbosExpression(
|
|
|
407
417
|
if (!operand) {
|
|
408
418
|
throw new Error("not operator requires an operand");
|
|
409
419
|
}
|
|
420
|
+
if (isNamedOperand(operand)) {
|
|
421
|
+
const { path, relations } = resolveFieldReference(
|
|
422
|
+
operand.name,
|
|
423
|
+
mapper
|
|
424
|
+
);
|
|
425
|
+
if (!relations || relations.length === 0) {
|
|
426
|
+
const fieldName = getLeafField(path);
|
|
427
|
+
return { [fieldName]: { equals: false } };
|
|
428
|
+
}
|
|
429
|
+
}
|
|
410
430
|
return {
|
|
411
431
|
NOT: buildPrismaFilterFromCerbosExpression(operand, mapper),
|
|
412
432
|
};
|
|
@@ -460,6 +480,60 @@ function buildPrismaFilterFromCerbosExpression(
|
|
|
460
480
|
}
|
|
461
481
|
}
|
|
462
482
|
|
|
483
|
+
function handleSizeComparison(
|
|
484
|
+
operator: string,
|
|
485
|
+
sizeOperand: OperatorOperand,
|
|
486
|
+
valueOperand: PlanExpressionOperand,
|
|
487
|
+
mapper: Mapper
|
|
488
|
+
): PrismaFilter {
|
|
489
|
+
const collectionOperand = sizeOperand.operands[0];
|
|
490
|
+
if (!collectionOperand || !isNamedOperand(collectionOperand)) {
|
|
491
|
+
throw new Error("size operator requires a named collection operand");
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
if (!isValueOperand(valueOperand)) {
|
|
495
|
+
throw new Error("size comparison requires a numeric value operand");
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
const count = valueOperand.value;
|
|
499
|
+
if (typeof count !== "number") {
|
|
500
|
+
throw new Error("size comparison requires a numeric value");
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
const isNonEmpty =
|
|
504
|
+
(operator === "gt" && count === 0) || (operator === "ge" && count === 1);
|
|
505
|
+
|
|
506
|
+
const isEmpty =
|
|
507
|
+
(operator === "eq" && count === 0) ||
|
|
508
|
+
(operator === "lt" && count === 1) ||
|
|
509
|
+
(operator === "le" && count === 0);
|
|
510
|
+
|
|
511
|
+
if (!isNonEmpty && !isEmpty) {
|
|
512
|
+
throw new Error(
|
|
513
|
+
`Unsupported size comparison: size(...) ${operator} ${count}`
|
|
514
|
+
);
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
const { relations } = resolveFieldReference(collectionOperand.name, mapper);
|
|
518
|
+
if (!relations || relations.length === 0) {
|
|
519
|
+
throw new Error("size operator requires a relation mapping");
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
const deepest = relations[relations.length - 1];
|
|
523
|
+
if (!deepest) {
|
|
524
|
+
throw new Error("size operator requires a relation mapping");
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
const prismaOp = isNonEmpty ? "some" : "none";
|
|
528
|
+
const leafFilter = { [deepest.name]: { [prismaOp]: {} } };
|
|
529
|
+
|
|
530
|
+
if (relations.length === 1) {
|
|
531
|
+
return leafFilter;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
return buildNestedRelationFilter(relations.slice(0, -1), leafFilter);
|
|
535
|
+
}
|
|
536
|
+
|
|
463
537
|
/**
|
|
464
538
|
* Helper function to process relational operators (eq, ne, lt, etc.)
|
|
465
539
|
*/
|
|
@@ -489,6 +563,10 @@ function handleRelationalOperator(
|
|
|
489
563
|
const rightOperand = operands.find((o) => o !== leftOperand);
|
|
490
564
|
if (!rightOperand) throw new Error("No valid right operand found");
|
|
491
565
|
|
|
566
|
+
if (isOperatorOperand(leftOperand) && leftOperand.operator === "size") {
|
|
567
|
+
return handleSizeComparison(operator, leftOperand, rightOperand, mapper);
|
|
568
|
+
}
|
|
569
|
+
|
|
492
570
|
const left = resolveOperand(leftOperand, mapper);
|
|
493
571
|
const right = resolveOperand(rightOperand, mapper);
|
|
494
572
|
|