@cerbos/orm-prisma 0.1.2 → 0.1.4

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/README.md CHANGED
@@ -6,6 +6,7 @@ The following conditions are supported: `and`, `or`, `eq`, `ne`, `lt`, `gt`, `lt
6
6
 
7
7
  ## Requirements
8
8
  - Cerbos > v0.16
9
+ - `@cerbos/http` or `@cerbos/grpc` client
9
10
 
10
11
  ## Usage
11
12
 
@@ -21,24 +22,67 @@ queryPlanToPrisma({ queryPlan, fieldNameMapper }): PrismaCondition
21
22
 
22
23
  The function reqiures the full query plan from Cerbos to be passed in an object along with a `fieldNameMapper`.
23
24
 
25
+ A basic implementation can be as simple as:
26
+
27
+ ```js
28
+ import { GRPC as Cerbos } from "@cerbos/grpc";
29
+ import { PrismaClient } from "@prisma/client";
30
+
31
+ const prisma = new PrismaClient();
32
+ const cerbos = new Cerbos("localhost:3592", { tls: false });
33
+
34
+ // Fetch the query plan from Cerbos passing in the principal
35
+ // resource type and action
36
+ const queryPlan = await cerbos.planResources({
37
+ principal: {....},
38
+ resource: { kind: "resourceKind" },
39
+ action: "view"
40
+ })
41
+
42
+ // Generate the prisma filter from the query plan
43
+ const filters = queryPlanToPrisma({
44
+ queryPlan,
45
+ fieldNameMapper: {
46
+ "request.resource.attr.aFieldName": "prismaModelFieldName"
47
+ }
48
+ });
49
+
50
+ // Pass the filters in as where conditions
51
+ // If you have prexisting where conditions, you can pass them in an AND clause
52
+ const result = await prisma.myModel.findMany({
53
+ where: {
54
+ AND: filters
55
+ },
56
+ });
57
+
58
+ console.log(result)
59
+ ```
60
+
24
61
  The `fieldNameMapper` is used to convert the field names in the query plan response to names of fields in the Prisma model - this can be done as a map or a function:
25
62
 
26
63
  ```js
27
- {
28
- "request.resource.attr.aFieldName": "prismaModelFieldName"
29
- }
64
+ const filters = queryPlanToPrisma({
65
+ queryPlan,
66
+ fieldNameMapper: {
67
+ "request.resource.attr.aFieldName": "prismaModelFieldName"
68
+ }
69
+ });
70
+
30
71
 
31
72
  //or
32
73
 
33
- (fieldName: string): string => {
34
- if(fieldName.indexOf("request.resource.") > 0) {
35
- return fieldName.replace("request.resource.attr", "")
36
- }
74
+ const filters = queryPlanToPrisma({
75
+ queryPlan,
76
+ fieldNameMapper: (fieldName: string): string => {
77
+ if(fieldName.indexOf("request.resource.") > 0) {
78
+ return fieldName.replace("request.resource.attr", "")
79
+ }
37
80
 
38
- if(fieldName.indexOf("request.principal.") > 0) {
39
- return fieldName.replace("request.principal.attr", "")
81
+ if(fieldName.indexOf("request.principal.") > 0) {
82
+ return fieldName.replace("request.principal.attr", "")
83
+ }
40
84
  }
41
- }
85
+ });
42
86
  ```
43
87
 
44
88
  ## Full Example
package/lib/cjs/index.js CHANGED
@@ -61,12 +61,12 @@ function mapOperand(operand, getFieldName, output = {}) {
61
61
  gt: getOperandValue(operands),
62
62
  };
63
63
  break;
64
- case "lte":
64
+ case "le":
65
65
  output[getFieldName(getOperandName(operands))] = {
66
66
  lte: getOperandValue(operands),
67
67
  };
68
68
  break;
69
- case "gte":
69
+ case "ge":
70
70
  output[getFieldName(getOperandName(operands))] = {
71
71
  gte: getOperandValue(operands),
72
72
  };
package/lib/index.js CHANGED
@@ -58,12 +58,12 @@ function mapOperand(operand, getFieldName, output = {}) {
58
58
  gt: getOperandValue(operands),
59
59
  };
60
60
  break;
61
- case "lte":
61
+ case "le":
62
62
  output[getFieldName(getOperandName(operands))] = {
63
63
  lte: getOperandValue(operands),
64
64
  };
65
65
  break;
66
- case "gte":
66
+ case "ge":
67
67
  output[getFieldName(getOperandName(operands))] = {
68
68
  gte: getOperandValue(operands),
69
69
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cerbos/orm-prisma",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "homepage": "https://cerbos.dev",
5
5
  "description": "",
6
6
  "private": false,
@@ -15,17 +15,22 @@
15
15
  "preversion": "npm run lint",
16
16
  "version": "git add -A src",
17
17
  "postversion": "git push && git push --tags",
18
- "test": "jest src/**.test.ts"
18
+ "test": "npx prisma db push --force-reset && cerbos run --log-level=error --set=storage.disk.directory=../policies --set=telemetry.disabled=true -- jest src/**.test.ts",
19
+ "cerbos": "cerbos server --config=./cerbos-config.yaml"
19
20
  },
20
21
  "author": "Cerbos",
21
22
  "license": "Apache-2.0",
22
23
  "devDependencies": {
23
- "@types/jest": "^29.0.0",
24
+ "@prisma/client": "^4.3.1",
25
+ "@types/jest": "^29.0.3",
26
+ "@types/node": "^18.7.21",
27
+ "prisma": "^4.3.1",
24
28
  "ts-jest": "^28.0.8",
25
29
  "ts-node": "^10.4.0",
26
30
  "typescript": "^4.5.4"
27
31
  },
28
32
  "dependencies": {
29
- "@cerbos/core": "^0.5.1"
33
+ "@cerbos/core": "^0.5.1",
34
+ "@cerbos/grpc": "^0.8.0"
30
35
  }
31
36
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,311 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const _1 = __importDefault(require("."));
7
- const core_1 = require("@cerbos/core");
8
- test("always allowed", () => {
9
- const queryPlan = {
10
- requestId: "",
11
- metadata: undefined,
12
- kind: core_1.PlanKind.ALWAYS_ALLOWED,
13
- };
14
- const result = (0, _1.default)({
15
- queryPlan,
16
- fieldNameMapper: {
17
- "request.resource.attr.ownerId": "ownerId",
18
- },
19
- });
20
- expect(result).toStrictEqual({});
21
- });
22
- test("always denied", () => {
23
- const queryPlan = {
24
- requestId: "",
25
- metadata: undefined,
26
- kind: core_1.PlanKind.ALWAYS_DENIED,
27
- };
28
- const result = (0, _1.default)({
29
- queryPlan,
30
- fieldNameMapper: {
31
- "request.resource.attr.ownerId": "ownerId",
32
- },
33
- });
34
- expect(result).toStrictEqual({ "1": { "equals": 0 } });
35
- });
36
- test("conditional - eq", () => {
37
- const queryPlan = {
38
- requestId: "",
39
- metadata: undefined,
40
- kind: core_1.PlanKind.CONDITIONAL,
41
- condition: {
42
- operator: "eq",
43
- operands: [{ name: "request.resource.attr.ownerId" }, { value: "sally" }],
44
- },
45
- };
46
- const result = (0, _1.default)({
47
- queryPlan,
48
- fieldNameMapper: {
49
- "request.resource.attr.ownerId": "ownerId",
50
- },
51
- });
52
- expect(result).toStrictEqual({ ownerId: { equals: "sally" } });
53
- });
54
- test("conditional - eq - inverted order", () => {
55
- const queryPlan = {
56
- requestId: "",
57
- metadata: undefined,
58
- kind: core_1.PlanKind.CONDITIONAL,
59
- condition: {
60
- operator: "eq",
61
- operands: [
62
- { value: "sally" },
63
- { name: "request.resource.attr.ownerId" }
64
- ],
65
- },
66
- };
67
- const result = (0, _1.default)({
68
- queryPlan,
69
- fieldNameMapper: {
70
- "request.resource.attr.ownerId": "ownerId",
71
- },
72
- });
73
- expect(result).toStrictEqual({ ownerId: { equals: "sally" } });
74
- });
75
- test("conditional - and", () => {
76
- const queryPlan = {
77
- requestId: "",
78
- metadata: undefined,
79
- kind: core_1.PlanKind.CONDITIONAL,
80
- condition: {
81
- "operator": "and",
82
- "operands": [
83
- {
84
- "operator": "eq",
85
- "operands": [
86
- {
87
- "name": "request.resource.attr.department"
88
- },
89
- {
90
- "value": "marketing"
91
- }
92
- ]
93
- },
94
- {
95
- "operator": "ne",
96
- "operands": [
97
- {
98
- "name": "request.resource.attr.team"
99
- },
100
- {
101
- "value": "design"
102
- }
103
- ]
104
- }
105
- ]
106
- },
107
- };
108
- const result = (0, _1.default)({
109
- queryPlan,
110
- fieldNameMapper: {
111
- "request.resource.attr.department": "department",
112
- "request.resource.attr.team": "team",
113
- },
114
- });
115
- expect(result).toStrictEqual({
116
- AND: [
117
- {
118
- department: { equals: "marketing" }
119
- },
120
- {
121
- team: { not: "design" }
122
- }
123
- ]
124
- });
125
- });
126
- test("conditional - or", () => {
127
- const queryPlan = {
128
- requestId: "",
129
- metadata: undefined,
130
- kind: core_1.PlanKind.CONDITIONAL,
131
- condition: {
132
- "operator": "or",
133
- "operands": [
134
- {
135
- "operator": "eq",
136
- "operands": [
137
- {
138
- "name": "request.resource.attr.department"
139
- },
140
- {
141
- "value": "marketing"
142
- }
143
- ]
144
- },
145
- {
146
- "operator": "ne",
147
- "operands": [
148
- {
149
- "name": "request.resource.attr.team"
150
- },
151
- {
152
- "value": "design"
153
- }
154
- ]
155
- }
156
- ]
157
- },
158
- };
159
- const result = (0, _1.default)({
160
- queryPlan,
161
- fieldNameMapper: {
162
- "request.resource.attr.department": "department",
163
- "request.resource.attr.team": "team",
164
- },
165
- });
166
- expect(result).toStrictEqual({
167
- OR: [
168
- {
169
- department: { equals: "marketing" }
170
- },
171
- {
172
- team: { not: "design" }
173
- }
174
- ]
175
- });
176
- });
177
- test("conditional - in", () => {
178
- const queryPlan = {
179
- requestId: "",
180
- metadata: undefined,
181
- kind: core_1.PlanKind.CONDITIONAL,
182
- condition: {
183
- "operator": "in",
184
- "operands": [
185
- {
186
- "name": "request.resource.attr.department"
187
- },
188
- {
189
- "value": ["marketing", "design"]
190
- }
191
- ]
192
- },
193
- };
194
- const result = (0, _1.default)({
195
- queryPlan,
196
- fieldNameMapper: {
197
- "request.resource.attr.department": "department",
198
- },
199
- });
200
- expect(result).toStrictEqual({
201
- department: { in: ["marketing", "design"] }
202
- });
203
- });
204
- test("conditional - gt", () => {
205
- const queryPlan = {
206
- requestId: "",
207
- metadata: undefined,
208
- kind: core_1.PlanKind.CONDITIONAL,
209
- condition: {
210
- "operator": "gt",
211
- "operands": [
212
- {
213
- "name": "request.resource.attr.amount"
214
- },
215
- {
216
- "value": 1000
217
- }
218
- ]
219
- },
220
- };
221
- const result = (0, _1.default)({
222
- queryPlan,
223
- fieldNameMapper: {
224
- "request.resource.attr.amount": "amount",
225
- },
226
- });
227
- expect(result).toStrictEqual({
228
- amount: { gt: 1000 }
229
- });
230
- });
231
- test("conditional - lt", () => {
232
- const queryPlan = {
233
- requestId: "",
234
- metadata: undefined,
235
- kind: core_1.PlanKind.CONDITIONAL,
236
- condition: {
237
- "operator": "lt",
238
- "operands": [
239
- {
240
- "name": "request.resource.attr.amount"
241
- },
242
- {
243
- "value": 1000
244
- }
245
- ]
246
- },
247
- };
248
- const result = (0, _1.default)({
249
- queryPlan,
250
- fieldNameMapper: {
251
- "request.resource.attr.amount": "amount",
252
- },
253
- });
254
- expect(result).toStrictEqual({
255
- amount: { lt: 1000 }
256
- });
257
- });
258
- test("conditional - gte", () => {
259
- const queryPlan = {
260
- requestId: "",
261
- metadata: undefined,
262
- kind: core_1.PlanKind.CONDITIONAL,
263
- condition: {
264
- "operator": "gte",
265
- "operands": [
266
- {
267
- "name": "request.resource.attr.amount"
268
- },
269
- {
270
- "value": 1000
271
- }
272
- ]
273
- },
274
- };
275
- const result = (0, _1.default)({
276
- queryPlan,
277
- fieldNameMapper: {
278
- "request.resource.attr.amount": "amount",
279
- },
280
- });
281
- expect(result).toStrictEqual({
282
- amount: { gte: 1000 }
283
- });
284
- });
285
- test("conditional - lte", () => {
286
- const queryPlan = {
287
- requestId: "",
288
- metadata: undefined,
289
- kind: core_1.PlanKind.CONDITIONAL,
290
- condition: {
291
- "operator": "lte",
292
- "operands": [
293
- {
294
- "name": "request.resource.attr.amount"
295
- },
296
- {
297
- "value": 1000
298
- }
299
- ]
300
- },
301
- };
302
- const result = (0, _1.default)({
303
- queryPlan,
304
- fieldNameMapper: {
305
- "request.resource.attr.amount": "amount",
306
- },
307
- });
308
- expect(result).toStrictEqual({
309
- amount: { lte: 1000 }
310
- });
311
- });
@@ -1 +0,0 @@
1
- export {};
package/lib/index.test.js DELETED
@@ -1,306 +0,0 @@
1
- import queryPlanToPrisma from ".";
2
- import { PlanKind } from "@cerbos/core";
3
- test("always allowed", () => {
4
- const queryPlan = {
5
- requestId: "",
6
- metadata: undefined,
7
- kind: PlanKind.ALWAYS_ALLOWED,
8
- };
9
- const result = queryPlanToPrisma({
10
- queryPlan,
11
- fieldNameMapper: {
12
- "request.resource.attr.ownerId": "ownerId",
13
- },
14
- });
15
- expect(result).toStrictEqual({});
16
- });
17
- test("always denied", () => {
18
- const queryPlan = {
19
- requestId: "",
20
- metadata: undefined,
21
- kind: PlanKind.ALWAYS_DENIED,
22
- };
23
- const result = queryPlanToPrisma({
24
- queryPlan,
25
- fieldNameMapper: {
26
- "request.resource.attr.ownerId": "ownerId",
27
- },
28
- });
29
- expect(result).toStrictEqual({ "1": { "equals": 0 } });
30
- });
31
- test("conditional - eq", () => {
32
- const queryPlan = {
33
- requestId: "",
34
- metadata: undefined,
35
- kind: PlanKind.CONDITIONAL,
36
- condition: {
37
- operator: "eq",
38
- operands: [{ name: "request.resource.attr.ownerId" }, { value: "sally" }],
39
- },
40
- };
41
- const result = queryPlanToPrisma({
42
- queryPlan,
43
- fieldNameMapper: {
44
- "request.resource.attr.ownerId": "ownerId",
45
- },
46
- });
47
- expect(result).toStrictEqual({ ownerId: { equals: "sally" } });
48
- });
49
- test("conditional - eq - inverted order", () => {
50
- const queryPlan = {
51
- requestId: "",
52
- metadata: undefined,
53
- kind: PlanKind.CONDITIONAL,
54
- condition: {
55
- operator: "eq",
56
- operands: [
57
- { value: "sally" },
58
- { name: "request.resource.attr.ownerId" }
59
- ],
60
- },
61
- };
62
- const result = queryPlanToPrisma({
63
- queryPlan,
64
- fieldNameMapper: {
65
- "request.resource.attr.ownerId": "ownerId",
66
- },
67
- });
68
- expect(result).toStrictEqual({ ownerId: { equals: "sally" } });
69
- });
70
- test("conditional - and", () => {
71
- const queryPlan = {
72
- requestId: "",
73
- metadata: undefined,
74
- kind: PlanKind.CONDITIONAL,
75
- condition: {
76
- "operator": "and",
77
- "operands": [
78
- {
79
- "operator": "eq",
80
- "operands": [
81
- {
82
- "name": "request.resource.attr.department"
83
- },
84
- {
85
- "value": "marketing"
86
- }
87
- ]
88
- },
89
- {
90
- "operator": "ne",
91
- "operands": [
92
- {
93
- "name": "request.resource.attr.team"
94
- },
95
- {
96
- "value": "design"
97
- }
98
- ]
99
- }
100
- ]
101
- },
102
- };
103
- const result = queryPlanToPrisma({
104
- queryPlan,
105
- fieldNameMapper: {
106
- "request.resource.attr.department": "department",
107
- "request.resource.attr.team": "team",
108
- },
109
- });
110
- expect(result).toStrictEqual({
111
- AND: [
112
- {
113
- department: { equals: "marketing" }
114
- },
115
- {
116
- team: { not: "design" }
117
- }
118
- ]
119
- });
120
- });
121
- test("conditional - or", () => {
122
- const queryPlan = {
123
- requestId: "",
124
- metadata: undefined,
125
- kind: PlanKind.CONDITIONAL,
126
- condition: {
127
- "operator": "or",
128
- "operands": [
129
- {
130
- "operator": "eq",
131
- "operands": [
132
- {
133
- "name": "request.resource.attr.department"
134
- },
135
- {
136
- "value": "marketing"
137
- }
138
- ]
139
- },
140
- {
141
- "operator": "ne",
142
- "operands": [
143
- {
144
- "name": "request.resource.attr.team"
145
- },
146
- {
147
- "value": "design"
148
- }
149
- ]
150
- }
151
- ]
152
- },
153
- };
154
- const result = queryPlanToPrisma({
155
- queryPlan,
156
- fieldNameMapper: {
157
- "request.resource.attr.department": "department",
158
- "request.resource.attr.team": "team",
159
- },
160
- });
161
- expect(result).toStrictEqual({
162
- OR: [
163
- {
164
- department: { equals: "marketing" }
165
- },
166
- {
167
- team: { not: "design" }
168
- }
169
- ]
170
- });
171
- });
172
- test("conditional - in", () => {
173
- const queryPlan = {
174
- requestId: "",
175
- metadata: undefined,
176
- kind: PlanKind.CONDITIONAL,
177
- condition: {
178
- "operator": "in",
179
- "operands": [
180
- {
181
- "name": "request.resource.attr.department"
182
- },
183
- {
184
- "value": ["marketing", "design"]
185
- }
186
- ]
187
- },
188
- };
189
- const result = queryPlanToPrisma({
190
- queryPlan,
191
- fieldNameMapper: {
192
- "request.resource.attr.department": "department",
193
- },
194
- });
195
- expect(result).toStrictEqual({
196
- department: { in: ["marketing", "design"] }
197
- });
198
- });
199
- test("conditional - gt", () => {
200
- const queryPlan = {
201
- requestId: "",
202
- metadata: undefined,
203
- kind: PlanKind.CONDITIONAL,
204
- condition: {
205
- "operator": "gt",
206
- "operands": [
207
- {
208
- "name": "request.resource.attr.amount"
209
- },
210
- {
211
- "value": 1000
212
- }
213
- ]
214
- },
215
- };
216
- const result = queryPlanToPrisma({
217
- queryPlan,
218
- fieldNameMapper: {
219
- "request.resource.attr.amount": "amount",
220
- },
221
- });
222
- expect(result).toStrictEqual({
223
- amount: { gt: 1000 }
224
- });
225
- });
226
- test("conditional - lt", () => {
227
- const queryPlan = {
228
- requestId: "",
229
- metadata: undefined,
230
- kind: PlanKind.CONDITIONAL,
231
- condition: {
232
- "operator": "lt",
233
- "operands": [
234
- {
235
- "name": "request.resource.attr.amount"
236
- },
237
- {
238
- "value": 1000
239
- }
240
- ]
241
- },
242
- };
243
- const result = queryPlanToPrisma({
244
- queryPlan,
245
- fieldNameMapper: {
246
- "request.resource.attr.amount": "amount",
247
- },
248
- });
249
- expect(result).toStrictEqual({
250
- amount: { lt: 1000 }
251
- });
252
- });
253
- test("conditional - gte", () => {
254
- const queryPlan = {
255
- requestId: "",
256
- metadata: undefined,
257
- kind: PlanKind.CONDITIONAL,
258
- condition: {
259
- "operator": "gte",
260
- "operands": [
261
- {
262
- "name": "request.resource.attr.amount"
263
- },
264
- {
265
- "value": 1000
266
- }
267
- ]
268
- },
269
- };
270
- const result = queryPlanToPrisma({
271
- queryPlan,
272
- fieldNameMapper: {
273
- "request.resource.attr.amount": "amount",
274
- },
275
- });
276
- expect(result).toStrictEqual({
277
- amount: { gte: 1000 }
278
- });
279
- });
280
- test("conditional - lte", () => {
281
- const queryPlan = {
282
- requestId: "",
283
- metadata: undefined,
284
- kind: PlanKind.CONDITIONAL,
285
- condition: {
286
- "operator": "lte",
287
- "operands": [
288
- {
289
- "name": "request.resource.attr.amount"
290
- },
291
- {
292
- "value": 1000
293
- }
294
- ]
295
- },
296
- };
297
- const result = queryPlanToPrisma({
298
- queryPlan,
299
- fieldNameMapper: {
300
- "request.resource.attr.amount": "amount",
301
- },
302
- });
303
- expect(result).toStrictEqual({
304
- amount: { lte: 1000 }
305
- });
306
- });