@zenstackhq/runtime 0.6.0-pre.2 → 1.0.0-alpha.20
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/constants.d.ts +4 -0
- package/constants.js +8 -0
- package/constants.js.map +1 -0
- package/enhancements/index.d.ts +4 -0
- package/enhancements/index.js +21 -0
- package/enhancements/index.js.map +1 -0
- package/enhancements/model-meta.d.ts +9 -0
- package/enhancements/model-meta.js +25 -0
- package/enhancements/model-meta.js.map +1 -0
- package/enhancements/nested-write-vistor.d.ts +65 -0
- package/enhancements/nested-write-vistor.js +155 -0
- package/enhancements/nested-write-vistor.js.map +1 -0
- package/enhancements/omit.d.ts +5 -0
- package/enhancements/omit.js +60 -0
- package/enhancements/omit.js.map +1 -0
- package/enhancements/password.d.ts +5 -0
- package/enhancements/password.js +66 -0
- package/enhancements/password.js.map +1 -0
- package/enhancements/policy/handler.d.ts +36 -0
- package/enhancements/policy/handler.js +278 -0
- package/enhancements/policy/handler.js.map +1 -0
- package/enhancements/policy/index.d.ts +17 -0
- package/enhancements/policy/index.js +31 -0
- package/enhancements/policy/index.js.map +1 -0
- package/{lib/proxy → enhancements/policy}/logger.d.ts +3 -0
- package/{lib/proxy → enhancements/policy}/logger.js +4 -0
- package/enhancements/policy/logger.js.map +1 -0
- package/enhancements/policy/policy-utils.d.ts +78 -0
- package/enhancements/policy/policy-utils.js +575 -0
- package/enhancements/policy/policy-utils.js.map +1 -0
- package/enhancements/preset.d.ts +16 -0
- package/enhancements/preset.js +24 -0
- package/enhancements/preset.js.map +1 -0
- package/enhancements/proxy.d.ts +75 -0
- package/enhancements/proxy.js +196 -0
- package/enhancements/proxy.js.map +1 -0
- package/enhancements/types.d.ts +24 -0
- package/{lib/config.js → enhancements/types.js} +1 -1
- package/enhancements/types.js.map +1 -0
- package/enhancements/utils.d.ts +16 -0
- package/enhancements/utils.js +31 -0
- package/enhancements/utils.js.map +1 -0
- package/error.d.ts +10 -0
- package/error.js +17 -0
- package/error.js.map +1 -0
- package/index.d.ts +5 -0
- package/{lib/index.js → index.js} +3 -4
- package/index.js.map +1 -0
- package/package.json +7 -5
- package/{lib/serialization-utils.d.ts → serialization-utils.d.ts} +0 -0
- package/{lib/serialization-utils.js → serialization-utils.js} +0 -0
- package/serialization-utils.js.map +1 -0
- package/types.d.ts +73 -0
- package/types.js +14 -0
- package/types.js.map +1 -0
- package/{lib/validation.d.ts → validation.d.ts} +0 -0
- package/{lib/validation.js → validation.js} +0 -0
- package/validation.js.map +1 -0
- package/{lib/version.d.ts → version.d.ts} +0 -0
- package/{lib/version.js → version.js} +6 -1
- package/version.js.map +1 -0
- package/client/index.d.ts +0 -3
- package/client/index.js +0 -11
- package/lib/config.d.ts +0 -14
- package/lib/config.js.map +0 -1
- package/lib/constants.d.ts +0 -12
- package/lib/constants.js +0 -16
- package/lib/constants.js.map +0 -1
- package/lib/handler/data/crud.d.ts +0 -17
- package/lib/handler/data/crud.js +0 -255
- package/lib/handler/data/crud.js.map +0 -1
- package/lib/handler/data/handler.d.ts +0 -20
- package/lib/handler/data/handler.js +0 -150
- package/lib/handler/data/handler.js.map +0 -1
- package/lib/handler/data/nested-write-vistor.d.ts +0 -31
- package/lib/handler/data/nested-write-vistor.js +0 -67
- package/lib/handler/data/nested-write-vistor.js.map +0 -1
- package/lib/handler/data/policy-utils.d.ts +0 -73
- package/lib/handler/data/policy-utils.js +0 -447
- package/lib/handler/data/policy-utils.js.map +0 -1
- package/lib/handler/index.d.ts +0 -1
- package/lib/handler/index.js +0 -9
- package/lib/handler/index.js.map +0 -1
- package/lib/handler/types.d.ts +0 -28
- package/lib/handler/types.js +0 -36
- package/lib/handler/types.js.map +0 -1
- package/lib/index.d.ts +0 -6
- package/lib/index.js.map +0 -1
- package/lib/policy.d.ts +0 -11
- package/lib/policy.js +0 -10
- package/lib/policy.js.map +0 -1
- package/lib/proxy/handler.d.ts +0 -37
- package/lib/proxy/handler.js +0 -333
- package/lib/proxy/handler.js.map +0 -1
- package/lib/proxy/logger.js.map +0 -1
- package/lib/proxy/nested-write-vistor.d.ts +0 -30
- package/lib/proxy/nested-write-vistor.js +0 -69
- package/lib/proxy/nested-write-vistor.js.map +0 -1
- package/lib/proxy/policy-utils.d.ts +0 -78
- package/lib/proxy/policy-utils.js +0 -508
- package/lib/proxy/policy-utils.js.map +0 -1
- package/lib/request-handler.d.ts +0 -21
- package/lib/request-handler.js +0 -37
- package/lib/request-handler.js.map +0 -1
- package/lib/request.d.ts +0 -37
- package/lib/request.js +0 -164
- package/lib/request.js.map +0 -1
- package/lib/serialization-utils.js.map +0 -1
- package/lib/service.d.ts +0 -32
- package/lib/service.js +0 -184
- package/lib/service.js.map +0 -1
- package/lib/types.d.ts +0 -185
- package/lib/types.js +0 -71
- package/lib/types.js.map +0 -1
- package/lib/validation.js.map +0 -1
- package/lib/version.js.map +0 -1
- package/server/index.d.ts +0 -16
- package/server/index.js +0 -6
- package/types/index.d.ts +0 -1
- package/types/index.js +0 -3
package/lib/constants.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DEFAULT_PASSWORD_SALT_LENGTH = exports.GUARD_FIELD_NAME = exports.TRANSACTION_FIELD_NAME = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* Auxiliary database field for supporting policy check for nested writes
|
|
6
|
-
*/
|
|
7
|
-
exports.TRANSACTION_FIELD_NAME = 'zenstack_transaction';
|
|
8
|
-
/**
|
|
9
|
-
* Auxiliary database field for building up policy check queries
|
|
10
|
-
*/
|
|
11
|
-
exports.GUARD_FIELD_NAME = 'zenstack_guard';
|
|
12
|
-
/**
|
|
13
|
-
* Default length of password hash salt (used by bcryptjs to hash password)
|
|
14
|
-
*/
|
|
15
|
-
exports.DEFAULT_PASSWORD_SALT_LENGTH = 12;
|
|
16
|
-
//# sourceMappingURL=constants.js.map
|
package/lib/constants.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,sBAAsB,GAAG,sBAAsB,CAAC;AAE7D;;GAEG;AACU,QAAA,gBAAgB,GAAG,gBAAgB,CAAC;AAEjD;;GAEG;AACU,QAAA,4BAA4B,GAAG,EAAE,CAAC"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { QueryContext, Service } from '../../types';
|
|
2
|
-
/**
|
|
3
|
-
* Request handler for /data endpoint which processes data CRUD requests.
|
|
4
|
-
*/
|
|
5
|
-
export declare class CRUD<DbClient> {
|
|
6
|
-
private readonly service;
|
|
7
|
-
constructor(service: Service<DbClient>);
|
|
8
|
-
private get db();
|
|
9
|
-
get(model: string, id: string, args: any, context: QueryContext): Promise<unknown>;
|
|
10
|
-
find(model: string, args: any, context: QueryContext): Promise<unknown[]>;
|
|
11
|
-
create(model: string, args: any, context: QueryContext): Promise<unknown>;
|
|
12
|
-
update(model: string, id: string, args: any, context: QueryContext): Promise<unknown>;
|
|
13
|
-
del(model: string, id: string, args: any, context: QueryContext): Promise<unknown>;
|
|
14
|
-
private isPrismaClientKnownRequestError;
|
|
15
|
-
private isPrismaClientValidationError;
|
|
16
|
-
private processError;
|
|
17
|
-
}
|
package/lib/handler/data/crud.js
DELETED
|
@@ -1,255 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.CRUD = void 0;
|
|
16
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
17
|
-
const cuid_1 = __importDefault(require("cuid"));
|
|
18
|
-
const superjson_1 = __importDefault(require("superjson"));
|
|
19
|
-
const constants_1 = require("../../constants");
|
|
20
|
-
const types_1 = require("../../types");
|
|
21
|
-
const validation_1 = require("../../validation");
|
|
22
|
-
const types_2 = require("../types");
|
|
23
|
-
const policy_utils_1 = require("./policy-utils");
|
|
24
|
-
const PRISMA_ERROR_MAPPING = {
|
|
25
|
-
P2002: types_1.ServerErrorCode.UNIQUE_CONSTRAINT_VIOLATION,
|
|
26
|
-
P2003: types_1.ServerErrorCode.REFERENCE_CONSTRAINT_VIOLATION,
|
|
27
|
-
P2025: types_1.ServerErrorCode.REFERENCE_CONSTRAINT_VIOLATION,
|
|
28
|
-
};
|
|
29
|
-
/**
|
|
30
|
-
* Request handler for /data endpoint which processes data CRUD requests.
|
|
31
|
-
*/
|
|
32
|
-
class CRUD {
|
|
33
|
-
constructor(service) {
|
|
34
|
-
this.service = service;
|
|
35
|
-
}
|
|
36
|
-
get db() {
|
|
37
|
-
return this.service.db;
|
|
38
|
-
}
|
|
39
|
-
get(model, id, args, context) {
|
|
40
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
41
|
-
args = args !== null && args !== void 0 ? args : {};
|
|
42
|
-
args.where = (0, policy_utils_1.and)(args.where, { id });
|
|
43
|
-
let entities;
|
|
44
|
-
try {
|
|
45
|
-
entities = yield (0, policy_utils_1.readWithCheck)(model, args, this.service, context, this.db);
|
|
46
|
-
}
|
|
47
|
-
catch (err) {
|
|
48
|
-
throw this.processError(err, 'get', model);
|
|
49
|
-
}
|
|
50
|
-
return entities[0];
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
find(model, args, context) {
|
|
54
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
55
|
-
try {
|
|
56
|
-
return yield (0, policy_utils_1.readWithCheck)(model, args !== null && args !== void 0 ? args : {}, this.service, context, this.db);
|
|
57
|
-
}
|
|
58
|
-
catch (err) {
|
|
59
|
-
throw this.processError(err, 'find', model);
|
|
60
|
-
}
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
create(model, args, context) {
|
|
64
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
-
if (!args) {
|
|
66
|
-
throw new types_2.CRUDError(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS, 'body is required');
|
|
67
|
-
}
|
|
68
|
-
if (!args.data) {
|
|
69
|
-
throw new types_2.CRUDError(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS, 'data field is required');
|
|
70
|
-
}
|
|
71
|
-
let createResult;
|
|
72
|
-
try {
|
|
73
|
-
yield this.service.validateModelPayload(model, 'create', args.data);
|
|
74
|
-
// preprocess payload to modify fields as required by attribute like @password
|
|
75
|
-
yield (0, policy_utils_1.preprocessWritePayload)(model, args, this.service);
|
|
76
|
-
const transactionId = (0, cuid_1.default)();
|
|
77
|
-
// start an interactive transaction
|
|
78
|
-
createResult = yield this.db.$transaction((tx) => __awaiter(this, void 0, void 0, function* () {
|
|
79
|
-
// inject transaction id into update/create payload (direct and nested)
|
|
80
|
-
const { createdModels } = yield (0, policy_utils_1.injectTransactionId)(model, args, 'create', transactionId, this.service);
|
|
81
|
-
// conduct the create
|
|
82
|
-
this.service.verbose(`Conducting create: ${model}:\n${superjson_1.default.stringify(args)}`);
|
|
83
|
-
const createResult = (yield tx[model].create(args));
|
|
84
|
-
// verify that the created entity pass policy check
|
|
85
|
-
yield (0, policy_utils_1.checkPolicyForIds)(model, [createResult.id], 'create', this.service, context, tx);
|
|
86
|
-
// verify that nested creates pass policy check
|
|
87
|
-
yield Promise.all(createdModels.map((model) => __awaiter(this, void 0, void 0, function* () {
|
|
88
|
-
const createdIds = yield (0, policy_utils_1.queryIds)(model, tx, {
|
|
89
|
-
[constants_1.TRANSACTION_FIELD_NAME]: `${transactionId}:create`,
|
|
90
|
-
});
|
|
91
|
-
this.service.verbose(`Validating nestedly created entities: ${model}#[${createdIds.join(', ')}]`);
|
|
92
|
-
yield (0, policy_utils_1.checkPolicyForIds)(model, createdIds, 'create', this.service, context, tx);
|
|
93
|
-
})));
|
|
94
|
-
return createResult;
|
|
95
|
-
}));
|
|
96
|
-
}
|
|
97
|
-
catch (err) {
|
|
98
|
-
throw this.processError(err, 'create', model);
|
|
99
|
-
}
|
|
100
|
-
// verify that return data requested by query args pass policy check
|
|
101
|
-
const readArgs = Object.assign(Object.assign({}, args), { where: { id: createResult.id } });
|
|
102
|
-
delete readArgs.data;
|
|
103
|
-
try {
|
|
104
|
-
const result = yield (0, policy_utils_1.readWithCheck)(model, readArgs, this.service, context, this.db);
|
|
105
|
-
if (result.length === 0) {
|
|
106
|
-
throw new types_2.CRUDError(types_1.ServerErrorCode.READ_BACK_AFTER_WRITE_DENIED);
|
|
107
|
-
}
|
|
108
|
-
return result[0];
|
|
109
|
-
}
|
|
110
|
-
catch (err) {
|
|
111
|
-
if (err instanceof types_2.CRUDError &&
|
|
112
|
-
err.code === types_1.ServerErrorCode.DENIED_BY_POLICY) {
|
|
113
|
-
throw new types_2.CRUDError(types_1.ServerErrorCode.READ_BACK_AFTER_WRITE_DENIED);
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
throw err;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
update(model, id, args, context) {
|
|
122
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
123
|
-
if (!args) {
|
|
124
|
-
throw new types_2.CRUDError(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS, 'body is required');
|
|
125
|
-
}
|
|
126
|
-
try {
|
|
127
|
-
yield this.service.validateModelPayload(model, 'update', args.data);
|
|
128
|
-
// preprocess payload to modify fields as required by attribute like @password
|
|
129
|
-
yield (0, policy_utils_1.preprocessWritePayload)(model, args, this.service);
|
|
130
|
-
args.where = Object.assign(Object.assign({}, args.where), { id });
|
|
131
|
-
const transactionId = (0, cuid_1.default)();
|
|
132
|
-
yield this.db.$transaction((tx) => __awaiter(this, void 0, void 0, function* () {
|
|
133
|
-
// make sure the entity (including ones involved in nested write) pass policy check
|
|
134
|
-
yield (0, policy_utils_1.preUpdateCheck)(model, id, args, this.service, context, tx);
|
|
135
|
-
// inject transaction id into update/create payload (direct and nested)
|
|
136
|
-
const { createdModels } = yield (0, policy_utils_1.injectTransactionId)(model, args, 'update', transactionId, this.service);
|
|
137
|
-
// conduct the update
|
|
138
|
-
this.service.verbose(`Conducting update: ${model}:\n${superjson_1.default.stringify(args)}`);
|
|
139
|
-
yield tx[model].update(args);
|
|
140
|
-
// verify that nested creates pass policy check
|
|
141
|
-
yield Promise.all(createdModels.map((model) => __awaiter(this, void 0, void 0, function* () {
|
|
142
|
-
const createdIds = yield (0, policy_utils_1.queryIds)(model, tx, {
|
|
143
|
-
[constants_1.TRANSACTION_FIELD_NAME]: `${transactionId}:create`,
|
|
144
|
-
});
|
|
145
|
-
this.service.verbose(`Validating nestedly created entities: ${model}#[${createdIds.join(', ')}]`);
|
|
146
|
-
yield (0, policy_utils_1.checkPolicyForIds)(model, createdIds, 'create', this.service, context, tx);
|
|
147
|
-
})));
|
|
148
|
-
}));
|
|
149
|
-
}
|
|
150
|
-
catch (err) {
|
|
151
|
-
throw this.processError(err, 'update', model);
|
|
152
|
-
}
|
|
153
|
-
// verify that return data requested by query args pass policy check
|
|
154
|
-
const readArgs = Object.assign({}, args);
|
|
155
|
-
delete readArgs.data;
|
|
156
|
-
try {
|
|
157
|
-
const result = yield (0, policy_utils_1.readWithCheck)(model, readArgs, this.service, context, this.db);
|
|
158
|
-
if (result.length === 0) {
|
|
159
|
-
throw new types_2.CRUDError(types_1.ServerErrorCode.READ_BACK_AFTER_WRITE_DENIED);
|
|
160
|
-
}
|
|
161
|
-
return result[0];
|
|
162
|
-
}
|
|
163
|
-
catch (err) {
|
|
164
|
-
if (err instanceof types_2.CRUDError &&
|
|
165
|
-
err.code === types_1.ServerErrorCode.DENIED_BY_POLICY) {
|
|
166
|
-
throw new types_2.CRUDError(types_1.ServerErrorCode.READ_BACK_AFTER_WRITE_DENIED);
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
throw err;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
del(model, id, args, context) {
|
|
175
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
176
|
-
let result;
|
|
177
|
-
try {
|
|
178
|
-
// ensures the item under deletion passes policy check
|
|
179
|
-
yield (0, policy_utils_1.checkPolicyForIds)(model, [id], 'delete', this.service, context, this.db);
|
|
180
|
-
args = args !== null && args !== void 0 ? args : {};
|
|
181
|
-
args.where = Object.assign(Object.assign({}, args.where), { id });
|
|
182
|
-
result = yield this.db.$transaction((tx) => __awaiter(this, void 0, void 0, function* () {
|
|
183
|
-
// first fetch the data that needs to be returned after deletion
|
|
184
|
-
let readResult;
|
|
185
|
-
try {
|
|
186
|
-
const items = yield (0, policy_utils_1.readWithCheck)(model, args, this.service, context, tx);
|
|
187
|
-
readResult = items[0];
|
|
188
|
-
}
|
|
189
|
-
catch (err) {
|
|
190
|
-
if (err instanceof types_2.CRUDError &&
|
|
191
|
-
err.code === types_1.ServerErrorCode.DENIED_BY_POLICY) {
|
|
192
|
-
// can't read back, just return undefined, outer logic handles it
|
|
193
|
-
}
|
|
194
|
-
else {
|
|
195
|
-
throw err;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
// conduct the deletion
|
|
199
|
-
this.service.verbose(`Conducting delete ${model}:\n${superjson_1.default.stringify(args)}`);
|
|
200
|
-
yield tx[model].delete(args);
|
|
201
|
-
return readResult;
|
|
202
|
-
}));
|
|
203
|
-
}
|
|
204
|
-
catch (err) {
|
|
205
|
-
throw this.processError(err, 'del', model);
|
|
206
|
-
}
|
|
207
|
-
if (result) {
|
|
208
|
-
return result;
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
throw new types_2.CRUDError(types_1.ServerErrorCode.READ_BACK_AFTER_WRITE_DENIED);
|
|
212
|
-
}
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
isPrismaClientKnownRequestError(err) {
|
|
216
|
-
return (err.__proto__.constructor.name === 'PrismaClientKnownRequestError');
|
|
217
|
-
}
|
|
218
|
-
isPrismaClientValidationError(err) {
|
|
219
|
-
return err.__proto__.constructor.name === 'PrismaClientValidationError';
|
|
220
|
-
}
|
|
221
|
-
processError(err, operation, model) {
|
|
222
|
-
if (err instanceof types_2.CRUDError) {
|
|
223
|
-
return err;
|
|
224
|
-
}
|
|
225
|
-
if (this.isPrismaClientKnownRequestError(err)) {
|
|
226
|
-
this.service.warn(`Prisma request error: ${operation} ${model}: ${err}`);
|
|
227
|
-
// errors thrown by Prisma, try mapping to a known error
|
|
228
|
-
if (PRISMA_ERROR_MAPPING[err.code]) {
|
|
229
|
-
return new types_2.CRUDError(PRISMA_ERROR_MAPPING[err.code], (0, types_1.getServerErrorMessage)(PRISMA_ERROR_MAPPING[err.code]));
|
|
230
|
-
}
|
|
231
|
-
else {
|
|
232
|
-
return new types_2.CRUDError(types_1.ServerErrorCode.UNKNOWN, 'an unhandled Prisma error occurred: ' + err.code);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
else if (this.isPrismaClientValidationError(err)) {
|
|
236
|
-
this.service.warn(`Prisma validation error: ${operation} ${model}: ${err}`);
|
|
237
|
-
// prisma validation error
|
|
238
|
-
return new types_2.CRUDError(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS, (0, types_1.getServerErrorMessage)(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS));
|
|
239
|
-
}
|
|
240
|
-
else if (err instanceof validation_1.ValidationError) {
|
|
241
|
-
this.service.warn(`Field constraint validation error: ${operation} ${model}: ${err.message}`);
|
|
242
|
-
return new types_2.CRUDError(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS, err.message);
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
// generic errors
|
|
246
|
-
this.service.error(`An unknown error occurred: ${JSON.stringify(err)}`);
|
|
247
|
-
if (err instanceof Error && err.stack) {
|
|
248
|
-
this.service.error(err.stack);
|
|
249
|
-
}
|
|
250
|
-
return new types_2.CRUDError(types_1.ServerErrorCode.UNKNOWN, (0, types_1.getServerErrorMessage)(types_1.ServerErrorCode.UNKNOWN));
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
exports.CRUD = CRUD;
|
|
255
|
-
//# sourceMappingURL=crud.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"crud.js","sourceRoot":"","sources":["../../../../src/handler/data/crud.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { NextApiRequest, NextApiResponse } from 'next';
|
|
2
|
-
import { RequestHandlerOptions } from '../../request-handler';
|
|
3
|
-
import { DbClientContract, Service } from '../../types';
|
|
4
|
-
import { RequestHandler } from '../types';
|
|
5
|
-
/**
|
|
6
|
-
* Request handler for /data endpoint which processes data CRUD requests.
|
|
7
|
-
*/
|
|
8
|
-
export default class DataHandler<DbClient extends DbClientContract> implements RequestHandler {
|
|
9
|
-
private readonly service;
|
|
10
|
-
private readonly options;
|
|
11
|
-
private readonly crud;
|
|
12
|
-
constructor(service: Service<DbClient>, options: RequestHandlerOptions);
|
|
13
|
-
handle(req: NextApiRequest, res: NextApiResponse, path: string[]): Promise<void>;
|
|
14
|
-
private marshal;
|
|
15
|
-
private unmarshal;
|
|
16
|
-
private get;
|
|
17
|
-
private post;
|
|
18
|
-
private put;
|
|
19
|
-
private del;
|
|
20
|
-
}
|
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
const superjson_1 = __importDefault(require("superjson"));
|
|
16
|
-
const serialization_utils_1 = require("../../serialization-utils");
|
|
17
|
-
const types_1 = require("../../types");
|
|
18
|
-
const types_2 = require("../types");
|
|
19
|
-
const crud_1 = require("./crud");
|
|
20
|
-
(0, serialization_utils_1.registerSerializers)();
|
|
21
|
-
/**
|
|
22
|
-
* Request handler for /data endpoint which processes data CRUD requests.
|
|
23
|
-
*/
|
|
24
|
-
class DataHandler {
|
|
25
|
-
constructor(service, options) {
|
|
26
|
-
this.service = service;
|
|
27
|
-
this.options = options;
|
|
28
|
-
this.crud = new crud_1.CRUD(service);
|
|
29
|
-
}
|
|
30
|
-
handle(req, res, path) {
|
|
31
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
32
|
-
const [model, id] = path;
|
|
33
|
-
const method = req.method;
|
|
34
|
-
const context = { user: yield this.options.getServerUser(req, res) };
|
|
35
|
-
this.service.verbose(`Data request: ${method} ${path}`);
|
|
36
|
-
if (req.body) {
|
|
37
|
-
this.service.verbose(`Request body: ${superjson_1.default.stringify(req.body)}`);
|
|
38
|
-
}
|
|
39
|
-
try {
|
|
40
|
-
switch (method) {
|
|
41
|
-
case 'GET':
|
|
42
|
-
yield this.get(req, res, model, id, context);
|
|
43
|
-
break;
|
|
44
|
-
case 'POST':
|
|
45
|
-
yield this.post(req, res, model, context);
|
|
46
|
-
break;
|
|
47
|
-
case 'PUT':
|
|
48
|
-
yield this.put(req, res, model, id, context);
|
|
49
|
-
break;
|
|
50
|
-
case 'DELETE':
|
|
51
|
-
yield this.del(req, res, model, id, context);
|
|
52
|
-
break;
|
|
53
|
-
default:
|
|
54
|
-
this.service.warn(`Unhandled method: ${method}`);
|
|
55
|
-
res.status(200).send({});
|
|
56
|
-
break;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
catch (err) {
|
|
60
|
-
if (err instanceof types_2.CRUDError) {
|
|
61
|
-
this.service.warn(`${method} ${model}: ${err}`);
|
|
62
|
-
// in case of errors thrown directly by ZenStack
|
|
63
|
-
switch (err.code) {
|
|
64
|
-
case types_1.ServerErrorCode.DENIED_BY_POLICY:
|
|
65
|
-
case types_1.ServerErrorCode.READ_BACK_AFTER_WRITE_DENIED:
|
|
66
|
-
res.status(403).send({
|
|
67
|
-
code: err.code,
|
|
68
|
-
message: err.message,
|
|
69
|
-
});
|
|
70
|
-
break;
|
|
71
|
-
case types_1.ServerErrorCode.ENTITY_NOT_FOUND:
|
|
72
|
-
res.status(404).send({
|
|
73
|
-
code: err.code,
|
|
74
|
-
message: err.message,
|
|
75
|
-
});
|
|
76
|
-
break;
|
|
77
|
-
case types_1.ServerErrorCode.UNKNOWN:
|
|
78
|
-
res.status(500).send({
|
|
79
|
-
code: err.code,
|
|
80
|
-
message: err.message,
|
|
81
|
-
});
|
|
82
|
-
break;
|
|
83
|
-
default:
|
|
84
|
-
res.status(400).send({
|
|
85
|
-
code: err.code,
|
|
86
|
-
message: err.message,
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
marshal(value) {
|
|
94
|
-
return JSON.parse(superjson_1.default.stringify(value));
|
|
95
|
-
}
|
|
96
|
-
unmarshal(value) {
|
|
97
|
-
if (typeof value === 'string') {
|
|
98
|
-
return superjson_1.default.parse(value);
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
return superjson_1.default.parse(JSON.stringify(value));
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
get(req, res, model, id, context) {
|
|
105
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
106
|
-
// parse additional query args from "q" parameter
|
|
107
|
-
const args = req.query.q ? this.unmarshal(req.query.q) : {};
|
|
108
|
-
if (id) {
|
|
109
|
-
// GET <model>/:id, make sure "id" is injected
|
|
110
|
-
const result = yield this.crud.get(model, id, args, context);
|
|
111
|
-
if (!result) {
|
|
112
|
-
throw new types_2.CRUDError(types_1.ServerErrorCode.ENTITY_NOT_FOUND);
|
|
113
|
-
}
|
|
114
|
-
res.status(200).send(this.marshal(result));
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
// GET <model>/, get list
|
|
118
|
-
const result = yield this.crud.find(model, args, context);
|
|
119
|
-
res.status(200).send(this.marshal(result));
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
post(req, res, model, context) {
|
|
124
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
125
|
-
const result = yield this.crud.create(model, this.unmarshal(req.body), context);
|
|
126
|
-
res.status(201).send(this.marshal(result));
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
put(req, res, model, id, context) {
|
|
130
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
131
|
-
if (!id) {
|
|
132
|
-
throw new types_2.CRUDError(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS, 'missing "id" parameter');
|
|
133
|
-
}
|
|
134
|
-
const result = yield this.crud.update(model, id, this.unmarshal(req.body), context);
|
|
135
|
-
res.status(200).send(this.marshal(result));
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
del(req, res, model, id, context) {
|
|
139
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
140
|
-
if (!id) {
|
|
141
|
-
throw new types_2.CRUDError(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS, 'missing "id" parameter');
|
|
142
|
-
}
|
|
143
|
-
const args = req.query.q ? this.unmarshal(req.query.q) : {};
|
|
144
|
-
const result = yield this.crud.del(model, id, args, context);
|
|
145
|
-
res.status(200).send(this.marshal(result));
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
exports.default = DataHandler;
|
|
150
|
-
//# sourceMappingURL=handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../../src/handler/data/handler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AACA,0DAAkC;AAElC,mEAAgE;AAChE,uCAKqB;AACrB,oCAAqD;AACrD,iCAA8B;AAE9B,IAAA,yCAAmB,GAAE,CAAC;AAEtB;;GAEG;AACH,MAAqB,WAAW;IAK5B,YACqB,OAA0B,EAC1B,OAA8B;QAD9B,YAAO,GAAP,OAAO,CAAmB;QAC1B,YAAO,GAAP,OAAO,CAAuB;QAE/C,IAAI,CAAC,IAAI,GAAG,IAAI,WAAI,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAEK,MAAM,CACR,GAAmB,EACnB,GAAoB,EACpB,IAAc;;YAEd,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;YACzB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAE1B,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YAErE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;YACxD,IAAI,GAAG,CAAC,IAAI,EAAE;gBACV,IAAI,CAAC,OAAO,CAAC,OAAO,CAChB,iBAAiB,mBAAS,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CACnD,CAAC;aACL;YAED,IAAI;gBACA,QAAQ,MAAM,EAAE;oBACZ,KAAK,KAAK;wBACN,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;wBAC7C,MAAM;oBAEV,KAAK,MAAM;wBACP,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;wBAC1C,MAAM;oBAEV,KAAK,KAAK;wBACN,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;wBAC7C,MAAM;oBAEV,KAAK,QAAQ;wBACT,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;wBAC7C,MAAM;oBAEV;wBACI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC;wBACjD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBACzB,MAAM;iBACb;aACJ;YAAC,OAAO,GAAY,EAAE;gBACnB,IAAI,GAAG,YAAY,iBAAS,EAAE;oBAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC,CAAC;oBAEhD,gDAAgD;oBAChD,QAAQ,GAAG,CAAC,IAAI,EAAE;wBACd,KAAK,uBAAe,CAAC,gBAAgB,CAAC;wBACtC,KAAK,uBAAe,CAAC,4BAA4B;4BAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gCACjB,IAAI,EAAE,GAAG,CAAC,IAAI;gCACd,OAAO,EAAE,GAAG,CAAC,OAAO;6BACvB,CAAC,CAAC;4BACH,MAAM;wBAEV,KAAK,uBAAe,CAAC,gBAAgB;4BACjC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gCACjB,IAAI,EAAE,GAAG,CAAC,IAAI;gCACd,OAAO,EAAE,GAAG,CAAC,OAAO;6BACvB,CAAC,CAAC;4BACH,MAAM;wBAEV,KAAK,uBAAe,CAAC,OAAO;4BACxB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gCACjB,IAAI,EAAE,GAAG,CAAC,IAAI;gCACd,OAAO,EAAE,GAAG,CAAC,OAAO;6BACvB,CAAC,CAAC;4BACH,MAAM;wBAEV;4BACI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gCACjB,IAAI,EAAE,GAAG,CAAC,IAAI;gCACd,OAAO,EAAE,GAAG,CAAC,OAAO;6BACvB,CAAC,CAAC;qBACV;iBACJ;aACJ;QACL,CAAC;KAAA;IAEO,OAAO,CAAC,KAAc;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,mBAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC;IAEO,SAAS,CAAC,KAAc;QAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC3B,OAAO,mBAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SACjC;aAAM;YACH,OAAO,mBAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;SACjD;IACL,CAAC;IAEa,GAAG,CACb,GAAmB,EACnB,GAAoB,EACpB,KAAa,EACb,EAAU,EACV,OAAqB;;YAErB,iDAAiD;YACjD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAEtE,IAAI,EAAE,EAAE;gBACJ,8CAA8C;gBAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC7D,IAAI,CAAC,MAAM,EAAE;oBACT,MAAM,IAAI,iBAAS,CAAC,uBAAe,CAAC,gBAAgB,CAAC,CAAC;iBACzD;gBACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;aAC9C;iBAAM;gBACH,yBAAyB;gBACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC1D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;aAC9C;QACL,CAAC;KAAA;IAEa,IAAI,CACd,GAAmB,EACnB,GAAoB,EACpB,KAAa,EACb,OAAqB;;YAErB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CACjC,KAAK,EACL,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EACxB,OAAO,CACV,CAAC;YACF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/C,CAAC;KAAA;IAEa,GAAG,CACb,GAAmB,EACnB,GAAoB,EACpB,KAAa,EACb,EAAU,EACV,OAAqB;;YAErB,IAAI,CAAC,EAAE,EAAE;gBACL,MAAM,IAAI,iBAAS,CACf,uBAAe,CAAC,sBAAsB,EACtC,wBAAwB,CAC3B,CAAC;aACL;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CACjC,KAAK,EACL,EAAE,EACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EACxB,OAAO,CACV,CAAC;YACF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/C,CAAC;KAAA;IAEa,GAAG,CACb,GAAmB,EACnB,GAAoB,EACpB,KAAa,EACb,EAAU,EACV,OAAqB;;YAErB,IAAI,CAAC,EAAE,EAAE;gBACL,MAAM,IAAI,iBAAS,CACf,uBAAe,CAAC,sBAAsB,EACtC,wBAAwB,CAC3B,CAAC;aACL;YAED,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YAC7D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/C,CAAC;KAAA;CACJ;AArLD,8BAqLC"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { FieldInfo, Service } from '../../types';
|
|
2
|
-
import { PrismaWriteActionType } from '../types';
|
|
3
|
-
/**
|
|
4
|
-
* Visitor callback function type
|
|
5
|
-
*
|
|
6
|
-
* @fieldInfo current visiting field
|
|
7
|
-
* @action prisma action for this field, e.g., update, create, etc.
|
|
8
|
-
* @fieldData data attached to the field, a scalar type for simple field
|
|
9
|
-
* and nested structure for model field
|
|
10
|
-
* @parentData parent data of @see fieldData, can be used to replace current field data
|
|
11
|
-
* @state a custom state
|
|
12
|
-
*
|
|
13
|
-
* @return if a truethy value is returned, recursive visiting will continue and the return
|
|
14
|
-
* value will be used as the new state passed to visiting of the direct child level; otherwise
|
|
15
|
-
* visiting is stopped at this level
|
|
16
|
-
*/
|
|
17
|
-
export type NestedWriterVisitorCallback<State = unknown> = (fieldInfo: FieldInfo, action: PrismaWriteActionType, fieldData: any, parentData: any, state: State) => Promise<State | undefined>;
|
|
18
|
-
/**
|
|
19
|
-
* Recursive visitor for nested write (create/update) payload
|
|
20
|
-
*/
|
|
21
|
-
export declare class NestedWriteVisitor<State> {
|
|
22
|
-
private readonly service;
|
|
23
|
-
constructor(service: Service);
|
|
24
|
-
private isPrismaWriteAction;
|
|
25
|
-
/**
|
|
26
|
-
* Start visiting
|
|
27
|
-
*
|
|
28
|
-
* @see NestedWriterVisitorCallback
|
|
29
|
-
*/
|
|
30
|
-
visit(model: string, fieldData: any, parentData: any, state: State, callback: NestedWriterVisitorCallback<State>): Promise<void>;
|
|
31
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.NestedWriteVisitor = void 0;
|
|
13
|
-
const types_1 = require("../types");
|
|
14
|
-
/**
|
|
15
|
-
* Recursive visitor for nested write (create/update) payload
|
|
16
|
-
*/
|
|
17
|
-
class NestedWriteVisitor {
|
|
18
|
-
constructor(service) {
|
|
19
|
-
this.service = service;
|
|
20
|
-
}
|
|
21
|
-
isPrismaWriteAction(value) {
|
|
22
|
-
return types_1.PrismaWriteActions.includes(value);
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Start visiting
|
|
26
|
-
*
|
|
27
|
-
* @see NestedWriterVisitorCallback
|
|
28
|
-
*/
|
|
29
|
-
visit(model, fieldData, parentData, state, callback) {
|
|
30
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
31
|
-
if (!fieldData) {
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
for (const [field, payload] of Object.entries(fieldData)) {
|
|
35
|
-
if (!payload) {
|
|
36
|
-
continue;
|
|
37
|
-
}
|
|
38
|
-
const fieldInfo = yield this.service.resolveField(model, field);
|
|
39
|
-
if (!fieldInfo) {
|
|
40
|
-
continue;
|
|
41
|
-
}
|
|
42
|
-
if (!fieldInfo.isDataModel) {
|
|
43
|
-
// simple field, just call action
|
|
44
|
-
yield callback(fieldInfo, 'none', payload, fieldData, state);
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
// deal with nested write of other model, here payload is a
|
|
48
|
-
// potentially nested structure like:
|
|
49
|
-
//
|
|
50
|
-
// { update: { field: {...} } }
|
|
51
|
-
//
|
|
52
|
-
for (const [subKey, subPayload] of Object.entries(payload)) {
|
|
53
|
-
if (this.isPrismaWriteAction(subKey) && subPayload) {
|
|
54
|
-
const newState = yield callback(fieldInfo, subKey, subPayload, payload, state);
|
|
55
|
-
if (newState) {
|
|
56
|
-
// recurse into content
|
|
57
|
-
yield this.visit(fieldInfo.type, subPayload, payload, newState, callback);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
exports.NestedWriteVisitor = NestedWriteVisitor;
|
|
67
|
-
//# sourceMappingURL=nested-write-vistor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nested-write-vistor.js","sourceRoot":"","sources":["../../../../src/handler/data/nested-write-vistor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,oCAAqE;AAwBrE;;GAEG;AACH,MAAa,kBAAkB;IAC3B,YAA6B,OAAgB;QAAhB,YAAO,GAAP,OAAO,CAAS;IAAG,CAAC;IAEzC,mBAAmB,CAAC,KAAa;QACrC,OAAO,0BAAkB,CAAC,QAAQ,CAAC,KAA8B,CAAC,CAAC;IACvE,CAAC;IAED;;;;OAIG;IACG,KAAK,CACP,KAAa,EACb,SAAc,EACd,UAAe,EACf,KAAY,EACZ,QAA4C;;YAE5C,IAAI,CAAC,SAAS,EAAE;gBACZ,OAAO;aACV;YAED,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAM,SAAS,CAAC,EAAE;gBAC3D,IAAI,CAAC,OAAO,EAAE;oBACV,SAAS;iBACZ;gBAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAChE,IAAI,CAAC,SAAS,EAAE;oBACZ,SAAS;iBACZ;gBAED,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;oBACxB,iCAAiC;oBACjC,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;iBAChE;qBAAM;oBACH,2DAA2D;oBAC3D,qCAAqC;oBACrC,EAAE;oBACF,mCAAmC;oBACnC,EAAE;oBACF,KAAK,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAC7C,OAAO,CACV,EAAE;wBACC,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,UAAU,EAAE;4BAChD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAC3B,SAAS,EACT,MAAM,EACN,UAAU,EACV,OAAO,EACP,KAAK,CACR,CAAC;4BACF,IAAI,QAAQ,EAAE;gCACV,uBAAuB;gCACvB,MAAM,IAAI,CAAC,KAAK,CACZ,SAAS,CAAC,IAAI,EACd,UAAU,EACV,OAAO,EACP,QAAQ,EACR,QAAQ,CACX,CAAC;6BACL;yBACJ;qBACJ;iBACJ;aACJ;QACL,CAAC;KAAA;CACJ;AApED,gDAoEC"}
|