@zenstackhq/runtime 0.3.19 → 0.3.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/lib/handler/data/crud.d.ts +17 -0
- package/lib/handler/data/crud.js +257 -0
- package/lib/handler/data/crud.js.map +1 -0
- package/lib/handler/data/handler.d.ts +1 -2
- package/lib/handler/data/handler.js +17 -193
- package/lib/handler/data/handler.js.map +1 -1
- package/lib/types.d.ts +9 -0
- package/lib/types.js.map +1 -1
- package/package.json +1 -1
- package/lib/client.d.ts +0 -3
- package/lib/client.js +0 -34
- package/lib/client.js.map +0 -1
|
@@ -0,0 +1,17 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,257 @@
|
|
|
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 constants_1 = require("../../constants");
|
|
19
|
+
const types_1 = require("../../types");
|
|
20
|
+
const validation_1 = require("../../validation");
|
|
21
|
+
const types_2 = require("../types");
|
|
22
|
+
const policy_utils_1 = require("./policy-utils");
|
|
23
|
+
const PRISMA_ERROR_MAPPING = {
|
|
24
|
+
P2002: types_1.ServerErrorCode.UNIQUE_CONSTRAINT_VIOLATION,
|
|
25
|
+
P2003: types_1.ServerErrorCode.REFERENCE_CONSTRAINT_VIOLATION,
|
|
26
|
+
P2025: types_1.ServerErrorCode.REFERENCE_CONSTRAINT_VIOLATION,
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Request handler for /data endpoint which processes data CRUD requests.
|
|
30
|
+
*/
|
|
31
|
+
class CRUD {
|
|
32
|
+
constructor(service) {
|
|
33
|
+
this.service = service;
|
|
34
|
+
}
|
|
35
|
+
get db() {
|
|
36
|
+
return this.service.db;
|
|
37
|
+
}
|
|
38
|
+
get(model, id, args, context) {
|
|
39
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
40
|
+
args = args !== null && args !== void 0 ? args : {};
|
|
41
|
+
args.where = (0, policy_utils_1.and)(args.where, { id });
|
|
42
|
+
let entities;
|
|
43
|
+
try {
|
|
44
|
+
entities = yield (0, policy_utils_1.readWithCheck)(model, args, this.service, context, this.db);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
throw this.processError(err, 'get', model);
|
|
48
|
+
}
|
|
49
|
+
if (entities.length === 0) {
|
|
50
|
+
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.ENTITY_NOT_FOUND);
|
|
51
|
+
}
|
|
52
|
+
return entities[0];
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
find(model, args, context) {
|
|
56
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
57
|
+
try {
|
|
58
|
+
return yield (0, policy_utils_1.readWithCheck)(model, args !== null && args !== void 0 ? args : {}, this.service, context, this.db);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
throw this.processError(err, 'find', model);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
create(model, args, context) {
|
|
66
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
67
|
+
if (!args) {
|
|
68
|
+
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS, 'body is required');
|
|
69
|
+
}
|
|
70
|
+
if (!args.data) {
|
|
71
|
+
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS, 'data field is required');
|
|
72
|
+
}
|
|
73
|
+
let createResult;
|
|
74
|
+
try {
|
|
75
|
+
yield this.service.validateModelPayload(model, 'create', args.data);
|
|
76
|
+
// preprocess payload to modify fields as required by attribute like @password
|
|
77
|
+
yield (0, policy_utils_1.preprocessWritePayload)(model, args, this.service);
|
|
78
|
+
const transactionId = (0, cuid_1.default)();
|
|
79
|
+
// start an interactive transaction
|
|
80
|
+
createResult = yield this.db.$transaction((tx) => __awaiter(this, void 0, void 0, function* () {
|
|
81
|
+
// inject transaction id into update/create payload (direct and nested)
|
|
82
|
+
const { createdModels } = yield (0, policy_utils_1.injectTransactionId)(model, args, 'create', transactionId, this.service);
|
|
83
|
+
// conduct the create
|
|
84
|
+
this.service.verbose(`Conducting create: ${model}:\n${JSON.stringify(args)}`);
|
|
85
|
+
const createResult = (yield tx[model].create(args));
|
|
86
|
+
// verify that the created entity pass policy check
|
|
87
|
+
yield (0, policy_utils_1.checkPolicyForIds)(model, [createResult.id], 'create', this.service, context, tx);
|
|
88
|
+
// verify that nested creates pass policy check
|
|
89
|
+
yield Promise.all(createdModels.map((model) => __awaiter(this, void 0, void 0, function* () {
|
|
90
|
+
const createdIds = yield (0, policy_utils_1.queryIds)(model, tx, {
|
|
91
|
+
[constants_1.TRANSACTION_FIELD_NAME]: `${transactionId}:create`,
|
|
92
|
+
});
|
|
93
|
+
this.service.verbose(`Validating nestedly created entities: ${model}#[${createdIds.join(', ')}]`);
|
|
94
|
+
yield (0, policy_utils_1.checkPolicyForIds)(model, createdIds, 'create', this.service, context, tx);
|
|
95
|
+
})));
|
|
96
|
+
return createResult;
|
|
97
|
+
}));
|
|
98
|
+
}
|
|
99
|
+
catch (err) {
|
|
100
|
+
throw this.processError(err, 'create', model);
|
|
101
|
+
}
|
|
102
|
+
// verify that return data requested by query args pass policy check
|
|
103
|
+
const readArgs = Object.assign(Object.assign({}, args), { where: { id: createResult.id } });
|
|
104
|
+
delete readArgs.data;
|
|
105
|
+
try {
|
|
106
|
+
const result = yield (0, policy_utils_1.readWithCheck)(model, readArgs, this.service, context, this.db);
|
|
107
|
+
if (result.length === 0) {
|
|
108
|
+
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.READ_BACK_AFTER_WRITE_DENIED);
|
|
109
|
+
}
|
|
110
|
+
return result[0];
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
if (err instanceof types_2.RequestHandlerError &&
|
|
114
|
+
err.code === types_1.ServerErrorCode.DENIED_BY_POLICY) {
|
|
115
|
+
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.READ_BACK_AFTER_WRITE_DENIED);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
throw err;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
update(model, id, args, context) {
|
|
124
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
125
|
+
if (!args) {
|
|
126
|
+
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS, 'body is required');
|
|
127
|
+
}
|
|
128
|
+
try {
|
|
129
|
+
yield this.service.validateModelPayload(model, 'update', args.data);
|
|
130
|
+
// preprocess payload to modify fields as required by attribute like @password
|
|
131
|
+
yield (0, policy_utils_1.preprocessWritePayload)(model, args, this.service);
|
|
132
|
+
args.where = Object.assign(Object.assign({}, args.where), { id });
|
|
133
|
+
const transactionId = (0, cuid_1.default)();
|
|
134
|
+
yield this.db.$transaction((tx) => __awaiter(this, void 0, void 0, function* () {
|
|
135
|
+
// make sure the entity (including ones involved in nested write) pass policy check
|
|
136
|
+
yield (0, policy_utils_1.preUpdateCheck)(model, id, args, this.service, context, tx);
|
|
137
|
+
// inject transaction id into update/create payload (direct and nested)
|
|
138
|
+
const { createdModels } = yield (0, policy_utils_1.injectTransactionId)(model, args, 'update', transactionId, this.service);
|
|
139
|
+
// conduct the update
|
|
140
|
+
this.service.verbose(`Conducting update: ${model}:\n${JSON.stringify(args)}`);
|
|
141
|
+
yield tx[model].update(args);
|
|
142
|
+
// verify that nested creates pass policy check
|
|
143
|
+
yield Promise.all(createdModels.map((model) => __awaiter(this, void 0, void 0, function* () {
|
|
144
|
+
const createdIds = yield (0, policy_utils_1.queryIds)(model, tx, {
|
|
145
|
+
[constants_1.TRANSACTION_FIELD_NAME]: `${transactionId}:create`,
|
|
146
|
+
});
|
|
147
|
+
this.service.verbose(`Validating nestedly created entities: ${model}#[${createdIds.join(', ')}]`);
|
|
148
|
+
yield (0, policy_utils_1.checkPolicyForIds)(model, createdIds, 'create', this.service, context, tx);
|
|
149
|
+
})));
|
|
150
|
+
}));
|
|
151
|
+
}
|
|
152
|
+
catch (err) {
|
|
153
|
+
throw this.processError(err, 'update', model);
|
|
154
|
+
}
|
|
155
|
+
// verify that return data requested by query args pass policy check
|
|
156
|
+
const readArgs = Object.assign({}, args);
|
|
157
|
+
delete readArgs.data;
|
|
158
|
+
try {
|
|
159
|
+
const result = yield (0, policy_utils_1.readWithCheck)(model, readArgs, this.service, context, this.db);
|
|
160
|
+
if (result.length === 0) {
|
|
161
|
+
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.READ_BACK_AFTER_WRITE_DENIED);
|
|
162
|
+
}
|
|
163
|
+
return result[0];
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
if (err instanceof types_2.RequestHandlerError &&
|
|
167
|
+
err.code === types_1.ServerErrorCode.DENIED_BY_POLICY) {
|
|
168
|
+
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.READ_BACK_AFTER_WRITE_DENIED);
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
throw err;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
del(model, id, args, context) {
|
|
177
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
178
|
+
let result;
|
|
179
|
+
try {
|
|
180
|
+
// ensures the item under deletion passes policy check
|
|
181
|
+
yield (0, policy_utils_1.checkPolicyForIds)(model, [id], 'delete', this.service, context, this.db);
|
|
182
|
+
args = args !== null && args !== void 0 ? args : {};
|
|
183
|
+
args.where = Object.assign(Object.assign({}, args.where), { id });
|
|
184
|
+
result = yield this.db.$transaction((tx) => __awaiter(this, void 0, void 0, function* () {
|
|
185
|
+
// first fetch the data that needs to be returned after deletion
|
|
186
|
+
let readResult;
|
|
187
|
+
try {
|
|
188
|
+
const items = yield (0, policy_utils_1.readWithCheck)(model, args, this.service, context, tx);
|
|
189
|
+
readResult = items[0];
|
|
190
|
+
}
|
|
191
|
+
catch (err) {
|
|
192
|
+
if (err instanceof types_2.RequestHandlerError &&
|
|
193
|
+
err.code === types_1.ServerErrorCode.DENIED_BY_POLICY) {
|
|
194
|
+
// can't read back, just return undefined, outer logic handles it
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
throw err;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
// conduct the deletion
|
|
201
|
+
this.service.verbose(`Conducting delete ${model}:\n${JSON.stringify(args)}`);
|
|
202
|
+
yield tx[model].delete(args);
|
|
203
|
+
return readResult;
|
|
204
|
+
}));
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
throw this.processError(err, 'del', model);
|
|
208
|
+
}
|
|
209
|
+
if (result) {
|
|
210
|
+
return result;
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.READ_BACK_AFTER_WRITE_DENIED);
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
isPrismaClientKnownRequestError(err) {
|
|
218
|
+
return (err.__proto__.constructor.name === 'PrismaClientKnownRequestError');
|
|
219
|
+
}
|
|
220
|
+
isPrismaClientValidationError(err) {
|
|
221
|
+
return err.__proto__.constructor.name === 'PrismaClientValidationError';
|
|
222
|
+
}
|
|
223
|
+
processError(err, operation, model) {
|
|
224
|
+
if (err instanceof types_2.RequestHandlerError) {
|
|
225
|
+
return err;
|
|
226
|
+
}
|
|
227
|
+
if (this.isPrismaClientKnownRequestError(err)) {
|
|
228
|
+
this.service.warn(`Prisma request error: ${operation} ${model}: ${err}`);
|
|
229
|
+
// errors thrown by Prisma, try mapping to a known error
|
|
230
|
+
if (PRISMA_ERROR_MAPPING[err.code]) {
|
|
231
|
+
return new types_2.RequestHandlerError(PRISMA_ERROR_MAPPING[err.code], (0, types_1.getServerErrorMessage)(PRISMA_ERROR_MAPPING[err.code]));
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
return new types_2.RequestHandlerError(types_1.ServerErrorCode.UNKNOWN, 'an unhandled Prisma error occurred: ' + err.code);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
else if (this.isPrismaClientValidationError(err)) {
|
|
238
|
+
this.service.warn(`Prisma validation error: ${operation} ${model}: ${err}`);
|
|
239
|
+
// prisma validation error
|
|
240
|
+
return new types_2.RequestHandlerError(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS, (0, types_1.getServerErrorMessage)(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS));
|
|
241
|
+
}
|
|
242
|
+
else if (err instanceof validation_1.ValidationError) {
|
|
243
|
+
this.service.warn(`Field constraint validation error: ${operation} ${model}: ${err.message}`);
|
|
244
|
+
return new types_2.RequestHandlerError(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS, err.message);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
// generic errors
|
|
248
|
+
this.service.error(`An unknown error occurred: ${JSON.stringify(err)}`);
|
|
249
|
+
if (err instanceof Error && err.stack) {
|
|
250
|
+
this.service.error(err.stack);
|
|
251
|
+
}
|
|
252
|
+
return new types_2.RequestHandlerError(types_1.ServerErrorCode.UNKNOWN, (0, types_1.getServerErrorMessage)(types_1.ServerErrorCode.UNKNOWN));
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
exports.CRUD = CRUD;
|
|
257
|
+
//# sourceMappingURL=crud.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crud.js","sourceRoot":"","sources":["../../../../src/handler/data/crud.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,12 +8,11 @@ import { RequestHandler } from '../types';
|
|
|
8
8
|
export default class DataHandler<DbClient extends DbClientContract> implements RequestHandler {
|
|
9
9
|
private readonly service;
|
|
10
10
|
private readonly options;
|
|
11
|
+
private readonly crud;
|
|
11
12
|
constructor(service: Service<DbClient>, options: RequestHandlerOptions);
|
|
12
13
|
handle(req: NextApiRequest, res: NextApiResponse, path: string[]): Promise<void>;
|
|
13
14
|
private get;
|
|
14
15
|
private post;
|
|
15
16
|
private put;
|
|
16
17
|
private del;
|
|
17
|
-
private isPrismaClientKnownRequestError;
|
|
18
|
-
private isPrismaClientValidationError;
|
|
19
18
|
}
|
|
@@ -8,22 +8,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
16
|
-
const cuid_1 = __importDefault(require("cuid"));
|
|
17
|
-
const constants_1 = require("../../constants");
|
|
18
12
|
const types_1 = require("../../types");
|
|
19
|
-
const validation_1 = require("../../validation");
|
|
20
13
|
const types_2 = require("../types");
|
|
21
|
-
const
|
|
22
|
-
const PRISMA_ERROR_MAPPING = {
|
|
23
|
-
P2002: types_1.ServerErrorCode.UNIQUE_CONSTRAINT_VIOLATION,
|
|
24
|
-
P2003: types_1.ServerErrorCode.REFERENCE_CONSTRAINT_VIOLATION,
|
|
25
|
-
P2025: types_1.ServerErrorCode.REFERENCE_CONSTRAINT_VIOLATION,
|
|
26
|
-
};
|
|
14
|
+
const crud_1 = require("./crud");
|
|
27
15
|
/**
|
|
28
16
|
* Request handler for /data endpoint which processes data CRUD requests.
|
|
29
17
|
*/
|
|
@@ -31,6 +19,7 @@ class DataHandler {
|
|
|
31
19
|
constructor(service, options) {
|
|
32
20
|
this.service = service;
|
|
33
21
|
this.options = options;
|
|
22
|
+
this.crud = new crud_1.CRUD(service);
|
|
34
23
|
}
|
|
35
24
|
handle(req, res, path) {
|
|
36
25
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -79,6 +68,12 @@ class DataHandler {
|
|
|
79
68
|
message: err.message,
|
|
80
69
|
});
|
|
81
70
|
break;
|
|
71
|
+
case types_1.ServerErrorCode.UNKNOWN:
|
|
72
|
+
res.status(500).send({
|
|
73
|
+
code: err.code,
|
|
74
|
+
message: err.message,
|
|
75
|
+
});
|
|
76
|
+
break;
|
|
82
77
|
default:
|
|
83
78
|
res.status(400).send({
|
|
84
79
|
code: err.code,
|
|
@@ -86,48 +81,6 @@ class DataHandler {
|
|
|
86
81
|
});
|
|
87
82
|
}
|
|
88
83
|
}
|
|
89
|
-
else if (this.isPrismaClientKnownRequestError(err)) {
|
|
90
|
-
this.service.warn(`${method} ${model}: ${err}`);
|
|
91
|
-
// errors thrown by Prisma, try mapping to a known error
|
|
92
|
-
if (PRISMA_ERROR_MAPPING[err.code]) {
|
|
93
|
-
res.status(400).send({
|
|
94
|
-
code: PRISMA_ERROR_MAPPING[err.code],
|
|
95
|
-
message: (0, types_1.getServerErrorMessage)(PRISMA_ERROR_MAPPING[err.code]),
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
res.status(400).send({
|
|
100
|
-
code: 'PRISMA:' + err.code,
|
|
101
|
-
message: 'an unhandled Prisma error occurred',
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
else if (this.isPrismaClientValidationError(err)) {
|
|
106
|
-
this.service.warn(`${method} ${model}: ${err}`);
|
|
107
|
-
// prisma validation error
|
|
108
|
-
res.status(400).send({
|
|
109
|
-
code: types_1.ServerErrorCode.INVALID_REQUEST_PARAMS,
|
|
110
|
-
message: (0, types_1.getServerErrorMessage)(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS),
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
else if (err instanceof validation_1.ValidationError) {
|
|
114
|
-
this.service.warn(`Field constraint validation error for model "${model}": ${err.message}`);
|
|
115
|
-
res.status(400).send({
|
|
116
|
-
code: types_1.ServerErrorCode.INVALID_REQUEST_PARAMS,
|
|
117
|
-
message: err.message,
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
// generic errors
|
|
122
|
-
this.service.error(`An unknown error occurred: ${JSON.stringify(err)}`);
|
|
123
|
-
if (err instanceof Error && err.stack) {
|
|
124
|
-
this.service.error(err.stack);
|
|
125
|
-
}
|
|
126
|
-
res.status(500).send({
|
|
127
|
-
code: types_1.ServerErrorCode.UNKNOWN,
|
|
128
|
-
message: (0, types_1.getServerErrorMessage)(types_1.ServerErrorCode.UNKNOWN),
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
84
|
}
|
|
132
85
|
});
|
|
133
86
|
}
|
|
@@ -137,72 +90,20 @@ class DataHandler {
|
|
|
137
90
|
const args = req.query.q ? JSON.parse(req.query.q) : {};
|
|
138
91
|
if (id) {
|
|
139
92
|
// GET <model>/:id, make sure "id" is injected
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
if (result.length === 0) {
|
|
143
|
-
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.ENTITY_NOT_FOUND);
|
|
144
|
-
}
|
|
145
|
-
res.status(200).send(result[0]);
|
|
93
|
+
const result = yield this.crud.get(model, id, args, context);
|
|
94
|
+
res.status(200).send(result);
|
|
146
95
|
}
|
|
147
96
|
else {
|
|
148
97
|
// GET <model>/, get list
|
|
149
|
-
const result = yield
|
|
98
|
+
const result = yield this.crud.find(model, args, context);
|
|
150
99
|
res.status(200).send(result);
|
|
151
100
|
}
|
|
152
101
|
});
|
|
153
102
|
}
|
|
154
103
|
post(req, res, model, context) {
|
|
155
104
|
return __awaiter(this, void 0, void 0, function* () {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
if (!args) {
|
|
159
|
-
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS, 'body is required');
|
|
160
|
-
}
|
|
161
|
-
if (!args.data) {
|
|
162
|
-
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS, 'data field is required');
|
|
163
|
-
}
|
|
164
|
-
yield this.service.validateModelPayload(model, 'create', args.data);
|
|
165
|
-
// preprocess payload to modify fields as required by attribute like @password
|
|
166
|
-
yield (0, policy_utils_1.preprocessWritePayload)(model, args, this.service);
|
|
167
|
-
const transactionId = (0, cuid_1.default)();
|
|
168
|
-
// start an interactive transaction
|
|
169
|
-
const r = yield this.service.db.$transaction((tx) => __awaiter(this, void 0, void 0, function* () {
|
|
170
|
-
// inject transaction id into update/create payload (direct and nested)
|
|
171
|
-
const { createdModels } = yield (0, policy_utils_1.injectTransactionId)(model, args, 'create', transactionId, this.service);
|
|
172
|
-
// conduct the create
|
|
173
|
-
this.service.verbose(`Conducting create: ${model}:\n${JSON.stringify(args)}`);
|
|
174
|
-
const createResult = (yield tx[model].create(args));
|
|
175
|
-
// verify that the created entity pass policy check
|
|
176
|
-
yield (0, policy_utils_1.checkPolicyForIds)(model, [createResult.id], 'create', this.service, context, tx);
|
|
177
|
-
// verify that nested creates pass policy check
|
|
178
|
-
yield Promise.all(createdModels.map((model) => __awaiter(this, void 0, void 0, function* () {
|
|
179
|
-
const createdIds = yield (0, policy_utils_1.queryIds)(model, tx, {
|
|
180
|
-
[constants_1.TRANSACTION_FIELD_NAME]: `${transactionId}:create`,
|
|
181
|
-
});
|
|
182
|
-
this.service.verbose(`Validating nestedly created entities: ${model}#[${createdIds.join(', ')}]`);
|
|
183
|
-
yield (0, policy_utils_1.checkPolicyForIds)(model, createdIds, 'create', this.service, context, tx);
|
|
184
|
-
})));
|
|
185
|
-
return createResult;
|
|
186
|
-
}));
|
|
187
|
-
// verify that return data requested by query args pass policy check
|
|
188
|
-
const readArgs = Object.assign(Object.assign({}, args), { where: { id: r.id } });
|
|
189
|
-
delete readArgs.data;
|
|
190
|
-
try {
|
|
191
|
-
const result = yield (0, policy_utils_1.readWithCheck)(model, readArgs, this.service, context, this.service.db);
|
|
192
|
-
if (result.length === 0) {
|
|
193
|
-
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.READ_BACK_AFTER_WRITE_DENIED);
|
|
194
|
-
}
|
|
195
|
-
res.status(201).send(result[0]);
|
|
196
|
-
}
|
|
197
|
-
catch (err) {
|
|
198
|
-
if (err instanceof types_2.RequestHandlerError &&
|
|
199
|
-
err.code === types_1.ServerErrorCode.DENIED_BY_POLICY) {
|
|
200
|
-
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.READ_BACK_AFTER_WRITE_DENIED);
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
throw err;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
105
|
+
const result = yield this.crud.create(model, req.body, context);
|
|
106
|
+
res.status(201).send(result);
|
|
206
107
|
});
|
|
207
108
|
}
|
|
208
109
|
put(req, res, model, id, context) {
|
|
@@ -210,51 +111,8 @@ class DataHandler {
|
|
|
210
111
|
if (!id) {
|
|
211
112
|
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS, 'missing "id" parameter');
|
|
212
113
|
}
|
|
213
|
-
const
|
|
214
|
-
|
|
215
|
-
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS, 'body is required');
|
|
216
|
-
}
|
|
217
|
-
yield this.service.validateModelPayload(model, 'update', args.data);
|
|
218
|
-
// preprocess payload to modify fields as required by attribute like @password
|
|
219
|
-
yield (0, policy_utils_1.preprocessWritePayload)(model, args, this.service);
|
|
220
|
-
args.where = Object.assign(Object.assign({}, args.where), { id });
|
|
221
|
-
const transactionId = (0, cuid_1.default)();
|
|
222
|
-
yield this.service.db.$transaction((tx) => __awaiter(this, void 0, void 0, function* () {
|
|
223
|
-
// make sure the entity (including ones involved in nested write) pass policy check
|
|
224
|
-
yield (0, policy_utils_1.preUpdateCheck)(model, id, args, this.service, context, tx);
|
|
225
|
-
// inject transaction id into update/create payload (direct and nested)
|
|
226
|
-
const { createdModels } = yield (0, policy_utils_1.injectTransactionId)(model, args, 'update', transactionId, this.service);
|
|
227
|
-
// conduct the update
|
|
228
|
-
this.service.verbose(`Conducting update: ${model}:\n${JSON.stringify(args)}`);
|
|
229
|
-
yield tx[model].update(args);
|
|
230
|
-
// verify that nested creates pass policy check
|
|
231
|
-
yield Promise.all(createdModels.map((model) => __awaiter(this, void 0, void 0, function* () {
|
|
232
|
-
const createdIds = yield (0, policy_utils_1.queryIds)(model, tx, {
|
|
233
|
-
[constants_1.TRANSACTION_FIELD_NAME]: `${transactionId}:create`,
|
|
234
|
-
});
|
|
235
|
-
this.service.verbose(`Validating nestedly created entities: ${model}#[${createdIds.join(', ')}]`);
|
|
236
|
-
yield (0, policy_utils_1.checkPolicyForIds)(model, createdIds, 'create', this.service, context, tx);
|
|
237
|
-
})));
|
|
238
|
-
}));
|
|
239
|
-
// verify that return data requested by query args pass policy check
|
|
240
|
-
const readArgs = Object.assign({}, args);
|
|
241
|
-
delete readArgs.data;
|
|
242
|
-
try {
|
|
243
|
-
const result = yield (0, policy_utils_1.readWithCheck)(model, readArgs, this.service, context, this.service.db);
|
|
244
|
-
if (result.length === 0) {
|
|
245
|
-
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.READ_BACK_AFTER_WRITE_DENIED);
|
|
246
|
-
}
|
|
247
|
-
res.status(200).send(result[0]);
|
|
248
|
-
}
|
|
249
|
-
catch (err) {
|
|
250
|
-
if (err instanceof types_2.RequestHandlerError &&
|
|
251
|
-
err.code === types_1.ServerErrorCode.DENIED_BY_POLICY) {
|
|
252
|
-
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.READ_BACK_AFTER_WRITE_DENIED);
|
|
253
|
-
}
|
|
254
|
-
else {
|
|
255
|
-
throw err;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
114
|
+
const result = yield this.crud.update(model, id, req.body, context);
|
|
115
|
+
res.status(200).send(result);
|
|
258
116
|
});
|
|
259
117
|
}
|
|
260
118
|
del(req, res, model, id, context) {
|
|
@@ -262,45 +120,11 @@ class DataHandler {
|
|
|
262
120
|
if (!id) {
|
|
263
121
|
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.INVALID_REQUEST_PARAMS, 'missing "id" parameter');
|
|
264
122
|
}
|
|
265
|
-
// ensures the item under deletion passes policy check
|
|
266
|
-
yield (0, policy_utils_1.checkPolicyForIds)(model, [id], 'delete', this.service, context, this.service.db);
|
|
267
123
|
const args = req.query.q ? JSON.parse(req.query.q) : {};
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
// first fetch the data that needs to be returned after deletion
|
|
271
|
-
let readResult;
|
|
272
|
-
try {
|
|
273
|
-
const items = yield (0, policy_utils_1.readWithCheck)(model, args, this.service, context, tx);
|
|
274
|
-
readResult = items[0];
|
|
275
|
-
}
|
|
276
|
-
catch (err) {
|
|
277
|
-
if (err instanceof types_2.RequestHandlerError &&
|
|
278
|
-
err.code === types_1.ServerErrorCode.DENIED_BY_POLICY) {
|
|
279
|
-
// can't read back, just return undefined, outer logic handles it
|
|
280
|
-
}
|
|
281
|
-
else {
|
|
282
|
-
throw err;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
// conduct the deletion
|
|
286
|
-
this.service.verbose(`Conducting delete ${model}:\n${JSON.stringify(args)}`);
|
|
287
|
-
yield tx[model].delete(args);
|
|
288
|
-
return readResult;
|
|
289
|
-
}));
|
|
290
|
-
if (r) {
|
|
291
|
-
res.status(200).send(r);
|
|
292
|
-
}
|
|
293
|
-
else {
|
|
294
|
-
throw new types_2.RequestHandlerError(types_1.ServerErrorCode.READ_BACK_AFTER_WRITE_DENIED);
|
|
295
|
-
}
|
|
124
|
+
const result = yield this.crud.del(model, id, args, context);
|
|
125
|
+
res.status(200).send(result);
|
|
296
126
|
});
|
|
297
127
|
}
|
|
298
|
-
isPrismaClientKnownRequestError(err) {
|
|
299
|
-
return (err.__proto__.constructor.name === 'PrismaClientKnownRequestError');
|
|
300
|
-
}
|
|
301
|
-
isPrismaClientValidationError(err) {
|
|
302
|
-
return err.__proto__.constructor.name === 'PrismaClientValidationError';
|
|
303
|
-
}
|
|
304
128
|
}
|
|
305
129
|
exports.default = DataHandler;
|
|
306
130
|
//# sourceMappingURL=handler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../../src/handler/data/handler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,uDAAuD;AACvD,gDAAwB;AAExB,+CAAyD;AAEzD,uCAOqB;AACrB,iDAAmD;AACnD,oCAA+D;AAC/D,iDAQwB;AAExB,MAAM,oBAAoB,GAAoC;IAC1D,KAAK,EAAE,uBAAe,CAAC,2BAA2B;IAClD,KAAK,EAAE,uBAAe,CAAC,8BAA8B;IACrD,KAAK,EAAE,uBAAe,CAAC,8BAA8B;CACxD,CAAC;AAEF;;GAEG;AACH,MAAqB,WAAW;IAG5B,YACqB,OAA0B,EAC1B,OAA8B;QAD9B,YAAO,GAAP,OAAO,CAAmB;QAC1B,YAAO,GAAP,OAAO,CAAuB;IAChD,CAAC;IAEE,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,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aACrE;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,2BAAmB,EAAE;oBACpC,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;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;qBAAM,IAAI,IAAI,CAAC,+BAA+B,CAAC,GAAG,CAAC,EAAE;oBAClD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC,CAAC;oBAEhD,wDAAwD;oBACxD,IAAI,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;wBAChC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;4BACjB,IAAI,EAAE,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;4BACpC,OAAO,EAAE,IAAA,6BAAqB,EAC1B,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CACjC;yBACJ,CAAC,CAAC;qBACN;yBAAM;wBACH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;4BACjB,IAAI,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI;4BAC1B,OAAO,EAAE,oCAAoC;yBAChD,CAAC,CAAC;qBACN;iBACJ;qBAAM,IAAI,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,EAAE;oBAChD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC,CAAC;oBAEhD,0BAA0B;oBAC1B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBACjB,IAAI,EAAE,uBAAe,CAAC,sBAAsB;wBAC5C,OAAO,EAAE,IAAA,6BAAqB,EAC1B,uBAAe,CAAC,sBAAsB,CACzC;qBACJ,CAAC,CAAC;iBACN;qBAAM,IAAI,GAAG,YAAY,4BAAe,EAAE;oBACvC,IAAI,CAAC,OAAO,CAAC,IAAI,CACb,gDAAgD,KAAK,MAAM,GAAG,CAAC,OAAO,EAAE,CAC3E,CAAC;oBACF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBACjB,IAAI,EAAE,uBAAe,CAAC,sBAAsB;wBAC5C,OAAO,EAAE,GAAG,CAAC,OAAO;qBACvB,CAAC,CAAC;iBACN;qBAAM;oBACH,iBAAiB;oBACjB,IAAI,CAAC,OAAO,CAAC,KAAK,CACd,8BAA8B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CACtD,CAAC;oBACF,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,KAAK,EAAE;wBACnC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;qBACjC;oBACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;wBACjB,IAAI,EAAE,uBAAe,CAAC,OAAO;wBAC7B,OAAO,EAAE,IAAA,6BAAqB,EAAC,uBAAe,CAAC,OAAO,CAAC;qBAC1D,CAAC,CAAC;iBACN;aACJ;QACL,CAAC;KAAA;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,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAElE,IAAI,EAAE,EAAE;gBACJ,8CAA8C;gBAC9C,IAAI,CAAC,KAAK,GAAG,IAAA,kBAAG,EAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBAErC,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAa,EAC9B,KAAK,EACL,IAAI,EACJ,IAAI,CAAC,OAAO,EACZ,OAAO,EACP,IAAI,CAAC,OAAO,CAAC,EAAE,CAClB,CAAC;gBAEF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;oBACrB,MAAM,IAAI,2BAAmB,CAAC,uBAAe,CAAC,gBAAgB,CAAC,CAAC;iBACnE;gBACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;aACnC;iBAAM;gBACH,yBAAyB;gBACzB,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAa,EAC9B,KAAK,EACL,IAAI,EACJ,IAAI,CAAC,OAAO,EACZ,OAAO,EACP,IAAI,CAAC,OAAO,CAAC,EAAE,CAClB,CAAC;gBACF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aAChC;QACL,CAAC;KAAA;IAEa,IAAI,CACd,GAAmB,EACnB,GAAoB,EACpB,KAAa,EACb,OAAqB;;YAErB,gBAAgB;YAChB,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YACtB,IAAI,CAAC,IAAI,EAAE;gBACP,MAAM,IAAI,2BAAmB,CACzB,uBAAe,CAAC,sBAAsB,EACtC,kBAAkB,CACrB,CAAC;aACL;YACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBACZ,MAAM,IAAI,2BAAmB,CACzB,uBAAe,CAAC,sBAAsB,EACtC,wBAAwB,CAC3B,CAAC;aACL;YAED,MAAM,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAEpE,8EAA8E;YAC9E,MAAM,IAAA,qCAAsB,EAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAExD,MAAM,aAAa,GAAG,IAAA,cAAI,GAAE,CAAC;YAE7B,mCAAmC;YACnC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CACxC,CAAO,EAAgC,EAAE,EAAE;gBACvC,uEAAuE;gBACvE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,IAAA,kCAAmB,EAC/C,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,IAAI,CAAC,OAAO,CACf,CAAC;gBAEF,qBAAqB;gBACrB,IAAI,CAAC,OAAO,CAAC,OAAO,CAChB,sBAAsB,KAAK,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAC1D,CAAC;gBACF,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAEjD,CAAC;gBAEF,mDAAmD;gBACnD,MAAM,IAAA,gCAAiB,EACnB,KAAK,EACL,CAAC,YAAY,CAAC,EAAE,CAAC,EACjB,QAAQ,EACR,IAAI,CAAC,OAAO,EACZ,OAAO,EACP,EAAE,CACL,CAAC;gBAEF,+CAA+C;gBAC/C,MAAM,OAAO,CAAC,GAAG,CACb,aAAa,CAAC,GAAG,CAAC,CAAO,KAAK,EAAE,EAAE;oBAC9B,MAAM,UAAU,GAAG,MAAM,IAAA,uBAAQ,EAAC,KAAK,EAAE,EAAE,EAAE;wBACzC,CAAC,kCAAsB,CAAC,EAAE,GAAG,aAAa,SAAS;qBACtD,CAAC,CAAC;oBACH,IAAI,CAAC,OAAO,CAAC,OAAO,CAChB,yCAAyC,KAAK,KAAK,UAAU,CAAC,IAAI,CAC9D,IAAI,CACP,GAAG,CACP,CAAC;oBACF,MAAM,IAAA,gCAAiB,EACnB,KAAK,EACL,UAAU,EACV,QAAQ,EACR,IAAI,CAAC,OAAO,EACZ,OAAO,EACP,EAAE,CACL,CAAC;gBACN,CAAC,CAAA,CAAC,CACL,CAAC;gBAEF,OAAO,YAAY,CAAC;YACxB,CAAC,CAAA,CACJ,CAAC;YAEF,oEAAoE;YACpE,MAAM,QAAQ,mCAAQ,IAAI,KAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAE,CAAC;YAClD,OAAO,QAAQ,CAAC,IAAI,CAAC;YAErB,IAAI;gBACA,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAa,EAC9B,KAAK,EACL,QAAQ,EACR,IAAI,CAAC,OAAO,EACZ,OAAO,EACP,IAAI,CAAC,OAAO,CAAC,EAAE,CAClB,CAAC;gBACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;oBACrB,MAAM,IAAI,2BAAmB,CACzB,uBAAe,CAAC,4BAA4B,CAC/C,CAAC;iBACL;gBACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;aACnC;YAAC,OAAO,GAAG,EAAE;gBACV,IACI,GAAG,YAAY,2BAAmB;oBAClC,GAAG,CAAC,IAAI,KAAK,uBAAe,CAAC,gBAAgB,EAC/C;oBACE,MAAM,IAAI,2BAAmB,CACzB,uBAAe,CAAC,4BAA4B,CAC/C,CAAC;iBACL;qBAAM;oBACH,MAAM,GAAG,CAAC;iBACb;aACJ;QACL,CAAC;KAAA;IAEa,GAAG,CACb,GAAmB,EACnB,GAAoB,EACpB,KAAa,EACb,EAAU,EACV,OAAqB;;YAErB,IAAI,CAAC,EAAE,EAAE;gBACL,MAAM,IAAI,2BAAmB,CACzB,uBAAe,CAAC,sBAAsB,EACtC,wBAAwB,CAC3B,CAAC;aACL;YAED,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YACtB,IAAI,CAAC,IAAI,EAAE;gBACP,MAAM,IAAI,2BAAmB,CACzB,uBAAe,CAAC,sBAAsB,EACtC,kBAAkB,CACrB,CAAC;aACL;YAED,MAAM,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAEpE,8EAA8E;YAC9E,MAAM,IAAA,qCAAsB,EAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAExD,IAAI,CAAC,KAAK,mCAAQ,IAAI,CAAC,KAAK,KAAE,EAAE,GAAE,CAAC;YAEnC,MAAM,aAAa,GAAG,IAAA,cAAI,GAAE,CAAC;YAE7B,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAC9B,CAAO,EAAgC,EAAE,EAAE;gBACvC,mFAAmF;gBACnF,MAAM,IAAA,6BAAc,EAChB,KAAK,EACL,EAAE,EACF,IAAI,EACJ,IAAI,CAAC,OAAO,EACZ,OAAO,EACP,EAAE,CACL,CAAC;gBAEF,uEAAuE;gBACvE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,IAAA,kCAAmB,EAC/C,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,IAAI,CAAC,OAAO,CACf,CAAC;gBAEF,qBAAqB;gBACrB,IAAI,CAAC,OAAO,CAAC,OAAO,CAChB,sBAAsB,KAAK,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAC1D,CAAC;gBACF,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAE7B,+CAA+C;gBAC/C,MAAM,OAAO,CAAC,GAAG,CACb,aAAa,CAAC,GAAG,CAAC,CAAO,KAAK,EAAE,EAAE;oBAC9B,MAAM,UAAU,GAAG,MAAM,IAAA,uBAAQ,EAAC,KAAK,EAAE,EAAE,EAAE;wBACzC,CAAC,kCAAsB,CAAC,EAAE,GAAG,aAAa,SAAS;qBACtD,CAAC,CAAC;oBACH,IAAI,CAAC,OAAO,CAAC,OAAO,CAChB,yCAAyC,KAAK,KAAK,UAAU,CAAC,IAAI,CAC9D,IAAI,CACP,GAAG,CACP,CAAC;oBACF,MAAM,IAAA,gCAAiB,EACnB,KAAK,EACL,UAAU,EACV,QAAQ,EACR,IAAI,CAAC,OAAO,EACZ,OAAO,EACP,EAAE,CACL,CAAC;gBACN,CAAC,CAAA,CAAC,CACL,CAAC;YACN,CAAC,CAAA,CACJ,CAAC;YAEF,oEAAoE;YACpE,MAAM,QAAQ,qBAAQ,IAAI,CAAE,CAAC;YAC7B,OAAO,QAAQ,CAAC,IAAI,CAAC;YAErB,IAAI;gBACA,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAa,EAC9B,KAAK,EACL,QAAQ,EACR,IAAI,CAAC,OAAO,EACZ,OAAO,EACP,IAAI,CAAC,OAAO,CAAC,EAAE,CAClB,CAAC;gBACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;oBACrB,MAAM,IAAI,2BAAmB,CACzB,uBAAe,CAAC,4BAA4B,CAC/C,CAAC;iBACL;gBACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;aACnC;YAAC,OAAO,GAAG,EAAE;gBACV,IACI,GAAG,YAAY,2BAAmB;oBAClC,GAAG,CAAC,IAAI,KAAK,uBAAe,CAAC,gBAAgB,EAC/C;oBACE,MAAM,IAAI,2BAAmB,CACzB,uBAAe,CAAC,4BAA4B,CAC/C,CAAC;iBACL;qBAAM;oBACH,MAAM,GAAG,CAAC;iBACb;aACJ;QACL,CAAC;KAAA;IAEa,GAAG,CACb,GAAmB,EACnB,GAAoB,EACpB,KAAa,EACb,EAAU,EACV,OAAqB;;YAErB,IAAI,CAAC,EAAE,EAAE;gBACL,MAAM,IAAI,2BAAmB,CACzB,uBAAe,CAAC,sBAAsB,EACtC,wBAAwB,CAC3B,CAAC;aACL;YAED,sDAAsD;YACtD,MAAM,IAAA,gCAAiB,EACnB,KAAK,EACL,CAAC,EAAE,CAAC,EACJ,QAAQ,EACR,IAAI,CAAC,OAAO,EACZ,OAAO,EACP,IAAI,CAAC,OAAO,CAAC,EAAE,CAClB,CAAC;YAEF,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClE,IAAI,CAAC,KAAK,mCAAQ,IAAI,CAAC,KAAK,KAAE,EAAE,GAAE,CAAC;YAEnC,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CACxC,CAAO,EAAgC,EAAE,EAAE;gBACvC,gEAAgE;gBAChE,IAAI,UAAe,CAAC;gBACpB,IAAI;oBACA,MAAM,KAAK,GAAG,MAAM,IAAA,4BAAa,EAC7B,KAAK,EACL,IAAI,EACJ,IAAI,CAAC,OAAO,EACZ,OAAO,EACP,EAAE,CACL,CAAC;oBACF,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;iBACzB;gBAAC,OAAO,GAAG,EAAE;oBACV,IACI,GAAG,YAAY,2BAAmB;wBAClC,GAAG,CAAC,IAAI,KAAK,uBAAe,CAAC,gBAAgB,EAC/C;wBACE,iEAAiE;qBACpE;yBAAM;wBACH,MAAM,GAAG,CAAC;qBACb;iBACJ;gBAED,uBAAuB;gBACvB,IAAI,CAAC,OAAO,CAAC,OAAO,CAChB,qBAAqB,KAAK,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CACzD,CAAC;gBACF,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAE7B,OAAO,UAAU,CAAC;YACtB,CAAC,CAAA,CACJ,CAAC;YAEF,IAAI,CAAC,EAAE;gBACH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aAC3B;iBAAM;gBACH,MAAM,IAAI,2BAAmB,CACzB,uBAAe,CAAC,4BAA4B,CAC/C,CAAC;aACL;QACL,CAAC;KAAA;IAEO,+BAA+B,CACnC,GAAQ;QAER,OAAO,CACH,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,KAAK,+BAA+B,CACrE,CAAC;IACN,CAAC;IAEO,6BAA6B,CACjC,GAAQ;QAER,OAAO,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,KAAK,6BAA6B,CAAC;IAC5E,CAAC;CACJ;AA5dD,8BA4dC"}
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../../src/handler/data/handler.ts"],"names":[],"mappings":"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"}
|
package/lib/types.d.ts
CHANGED
|
@@ -85,6 +85,15 @@ export interface Service<DbClient = any> {
|
|
|
85
85
|
* @param context Query context
|
|
86
86
|
*/
|
|
87
87
|
buildQueryGuard(model: string, operation: PolicyOperationKind, context: QueryContext): Promise<unknown>;
|
|
88
|
+
/**
|
|
89
|
+
* Validates the given write payload for the given model according to field constraints in model.
|
|
90
|
+
*
|
|
91
|
+
* @param model Model name
|
|
92
|
+
* @param mode Write mode
|
|
93
|
+
* @param payload Write payload
|
|
94
|
+
*
|
|
95
|
+
* @throws @see ValidationError
|
|
96
|
+
*/
|
|
88
97
|
validateModelPayload(model: string, mode: 'create' | 'update', payload: unknown): Promise<void>;
|
|
89
98
|
/**
|
|
90
99
|
* Generates a log message with verbose level.
|
package/lib/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";;;AA8IA;;GAEG;AACH,IAAY,eAmCX;AAnCD,WAAY,eAAe;IACvB;;OAEG;IACH,wDAAqC,CAAA;IAErC;;OAEG;IACH,oEAAiD,CAAA;IAEjD;;OAEG;IACH,wDAAqC,CAAA;IAErC;;OAEG;IACH,8EAA2D,CAAA;IAE3D;;OAEG;IACH,oFAAiE,CAAA;IAEjE;;OAEG;IACH,gFAA6D,CAAA;IAE7D;;OAEG;IACH,sCAAmB,CAAA;AACvB,CAAC,EAnCW,eAAe,GAAf,uBAAe,KAAf,uBAAe,QAmC1B;AAED,SAAgB,qBAAqB,CAAC,IAAqB;IACvD,QAAQ,IAAI,EAAE;QACV,KAAK,eAAe,CAAC,gBAAgB;YACjC,OAAO,mCAAmC,CAAC;QAE/C,KAAK,eAAe,CAAC,sBAAsB;YACvC,OAAO,gCAAgC,CAAC;QAE5C,KAAK,eAAe,CAAC,gBAAgB;YACjC,OAAO,uDAAuD,CAAC;QAEnE,KAAK,eAAe,CAAC,2BAA2B;YAC5C,OAAO,oEAAoE,CAAC;QAEhF,KAAK,eAAe,CAAC,8BAA8B;YAC/C,OAAO,yEAAyE,CAAC;QAErF,KAAK,eAAe,CAAC,4BAA4B;YAC7C,OAAO,gGAAgG,CAAC;QAE5G,KAAK,eAAe,CAAC,OAAO;YACxB,OAAO,2BAA2B,CAAC;QAEvC;YACI,OAAO,kBAAkB,IAAI,EAAE,CAAC;KACvC;AACL,CAAC;AA1BD,sDA0BC"}
|
package/package.json
CHANGED
package/lib/client.d.ts
DELETED
package/lib/client.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
26
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
27
|
-
};
|
|
28
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.request = exports.ServerErrorCode = void 0;
|
|
30
|
-
var types_1 = require("./types");
|
|
31
|
-
Object.defineProperty(exports, "ServerErrorCode", { enumerable: true, get: function () { return types_1.ServerErrorCode; } });
|
|
32
|
-
exports.request = __importStar(require("./request"));
|
|
33
|
-
__exportStar(require("./validation"), exports);
|
|
34
|
-
//# sourceMappingURL=client.js.map
|
package/lib/client.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iCAA0D;AAAjD,wGAAA,eAAe,OAAA;AACxB,qDAAqC;AACrC,+CAA6B"}
|