jxp 4.1.0 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.sample +14 -0
- package/dist/bin/index_audit.d.ts +3 -0
- package/dist/bin/index_audit.d.ts.map +1 -0
- package/dist/bin/index_audit.js +66 -0
- package/dist/bin/index_audit.js.map +1 -0
- package/dist/bin/server.d.ts.map +1 -1
- package/dist/bin/server.js +6 -1
- package/dist/bin/server.js.map +1 -1
- package/dist/libs/builtin_models.d.ts +21 -0
- package/dist/libs/builtin_models.d.ts.map +1 -0
- package/dist/libs/builtin_models.js +125 -0
- package/dist/libs/builtin_models.js.map +1 -0
- package/dist/libs/bulkwrite_guard.d.ts +1 -0
- package/dist/libs/bulkwrite_guard.d.ts.map +1 -1
- package/dist/libs/bulkwrite_guard.js +43 -0
- package/dist/libs/bulkwrite_guard.js.map +1 -1
- package/dist/libs/docs-auth.d.ts.map +1 -1
- package/dist/libs/docs-auth.js +3 -1
- package/dist/libs/docs-auth.js.map +1 -1
- package/dist/libs/docs.js +32 -2
- package/dist/libs/docs.js.map +1 -1
- package/dist/libs/groups.js +3 -4
- package/dist/libs/groups.js.map +1 -1
- package/dist/libs/index_diagnostics.d.ts +144 -0
- package/dist/libs/index_diagnostics.d.ts.map +1 -0
- package/dist/libs/index_diagnostics.js +671 -0
- package/dist/libs/index_diagnostics.js.map +1 -0
- package/dist/libs/jxp.d.ts.map +1 -1
- package/dist/libs/jxp.js +185 -70
- package/dist/libs/jxp.js.map +1 -1
- package/dist/libs/load-config.d.ts +2 -0
- package/dist/libs/load-config.d.ts.map +1 -1
- package/dist/libs/load-config.js +10 -0
- package/dist/libs/load-config.js.map +1 -1
- package/dist/libs/login.js +3 -8
- package/dist/libs/login.js.map +1 -1
- package/dist/libs/parse_byte_size.d.ts +10 -0
- package/dist/libs/parse_byte_size.d.ts.map +1 -0
- package/dist/libs/parse_byte_size.js +80 -0
- package/dist/libs/parse_byte_size.js.map +1 -0
- package/dist/libs/query_limits.js +104 -12
- package/dist/libs/query_limits.js.map +1 -1
- package/dist/libs/request_log.d.ts +44 -0
- package/dist/libs/request_log.d.ts.map +1 -0
- package/dist/libs/request_log.js +229 -0
- package/dist/libs/request_log.js.map +1 -0
- package/dist/libs/schema.js +2 -2
- package/dist/libs/schema.js.map +1 -1
- package/dist/libs/security.js +25 -20
- package/dist/libs/security.js.map +1 -1
- package/dist/libs/setup.js +3 -4
- package/dist/libs/setup.js.map +1 -1
- package/dist/libs/startup.d.ts +4 -0
- package/dist/libs/startup.d.ts.map +1 -1
- package/dist/libs/startup.js +17 -0
- package/dist/libs/startup.js.map +1 -1
- package/dist/models/indexquerylog_model.d.ts +19 -0
- package/dist/models/indexquerylog_model.d.ts.map +1 -0
- package/dist/models/indexquerylog_model.js +32 -0
- package/dist/models/indexquerylog_model.js.map +1 -0
- package/dist/models/test_model.js +1 -1
- package/dist/models/test_model.js.map +1 -1
- package/dist/types/jxp-config.d.ts +22 -0
- package/dist/types/jxp-config.d.ts.map +1 -1
- package/dist/types/schema-fields.d.ts +4 -0
- package/dist/types/schema-fields.d.ts.map +1 -1
- package/docs/api.md +16 -2
- package/docs/bulk_writes.md +9 -2
- package/docs/changelog.md +120 -1
- package/docs/configuration.md +39 -0
- package/docs/index.md +1 -0
- package/docs/index_diagnostics.md +127 -0
- package/docs/schemas.md +3 -1
- package/mkdocs.yml +1 -0
- package/package.json +18 -7
- package/templates/assets/diagnostics.js +352 -0
- package/templates/diagnostics.pug +94 -0
- package/templates/index.pug +1 -0
- package/templates/sidebar.pug +8 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index_diagnostics.js","sourceRoot":"","sources":["../../src/libs/index_diagnostics.ts"],"names":[],"mappings":"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"}
|
package/dist/libs/jxp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jxp.d.ts","sourceRoot":"","sources":["../../src/libs/jxp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"jxp.d.ts","sourceRoot":"","sources":["../../src/libs/jxp.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AA6hCrD,QAAA,MAAM,GAAG,GAAa,SAAS,SAAS,QAucvC,CAAC;AAEF,SAAS,GAAG,CAAC"}
|
package/dist/libs/jxp.js
CHANGED
|
@@ -27,6 +27,9 @@ const call_guard = require("./call_guard");
|
|
|
27
27
|
const response_sanitize = require("./response_sanitize");
|
|
28
28
|
const link_index = require("./link_index");
|
|
29
29
|
const { safeErrorMessage } = require("./safe_error");
|
|
30
|
+
const { logRequestError, logAndThrow } = require("./request_log");
|
|
31
|
+
const index_diagnostics = require("./index_diagnostics");
|
|
32
|
+
const builtin_models = require("./builtin_models");
|
|
30
33
|
const schemaModule = require("./schema");
|
|
31
34
|
global.JXPSchema = schemaModule.default || schemaModule;
|
|
32
35
|
var models = {};
|
|
@@ -39,10 +42,12 @@ function getStripFields(req) {
|
|
|
39
42
|
function getSecurityOpts(req) {
|
|
40
43
|
return req.config?.security || {};
|
|
41
44
|
}
|
|
42
|
-
function advancedQueryAllowed(Model, kind) {
|
|
45
|
+
function advancedQueryAllowed(Model, kind, options) {
|
|
43
46
|
const opts = Model.schema.opts;
|
|
44
47
|
const aq = opts?.advanced_queries;
|
|
45
48
|
if (kind === "bulkwrite") {
|
|
49
|
+
if (options?.isAdmin)
|
|
50
|
+
return true;
|
|
46
51
|
return aq?.bulkwrite === true;
|
|
47
52
|
}
|
|
48
53
|
if (kind === "aggregate") {
|
|
@@ -50,13 +55,33 @@ function advancedQueryAllowed(Model, kind) {
|
|
|
50
55
|
}
|
|
51
56
|
return aq?.query !== false;
|
|
52
57
|
}
|
|
58
|
+
const middlewareBulkWriteAllowed = (req, res, next) => {
|
|
59
|
+
if (!advancedQueryAllowed(req.Model, "bulkwrite", { isAdmin: !!res.user?.admin })) {
|
|
60
|
+
const err = new errors.ForbiddenError(`POST /bulkwrite is disabled for model ${req.modelname}`);
|
|
61
|
+
logRequestError(req, res, err, "bulkwrite disabled");
|
|
62
|
+
return next(err);
|
|
63
|
+
}
|
|
64
|
+
next();
|
|
65
|
+
};
|
|
66
|
+
const middlewareAdvancedQueryAllowed = (kind) => {
|
|
67
|
+
return (req, res, next) => {
|
|
68
|
+
if (!advancedQueryAllowed(req.Model, kind)) {
|
|
69
|
+
const err = new errors.ForbiddenError(`POST /${kind} is disabled for model ${req.modelname}`);
|
|
70
|
+
logRequestError(req, res, err, `${kind} disabled`);
|
|
71
|
+
return next(err);
|
|
72
|
+
}
|
|
73
|
+
next();
|
|
74
|
+
};
|
|
75
|
+
};
|
|
53
76
|
// Middleware
|
|
54
77
|
const middlewareModel = (req, res, next) => {
|
|
55
78
|
const modelname = req.params.modelname;
|
|
56
79
|
req.modelname = modelname;
|
|
57
80
|
req.Model = models[modelname];
|
|
58
81
|
if (!req.Model) {
|
|
59
|
-
|
|
82
|
+
const err = new errors.NotFoundError(`Model ${modelname} not found`);
|
|
83
|
+
logRequestError(req, res, err, "model");
|
|
84
|
+
return next(err);
|
|
60
85
|
}
|
|
61
86
|
return next();
|
|
62
87
|
};
|
|
@@ -64,7 +89,9 @@ const middlewarePasswords = (req, res, next) => {
|
|
|
64
89
|
if (req.body && req.body.password) {
|
|
65
90
|
if (req.query.password_override) {
|
|
66
91
|
if (!res.user?.admin) {
|
|
67
|
-
|
|
92
|
+
const err = new errors.ForbiddenError("password_override requires admin");
|
|
93
|
+
logRequestError(req, res, err, "password_override");
|
|
94
|
+
return next(err);
|
|
68
95
|
}
|
|
69
96
|
}
|
|
70
97
|
else {
|
|
@@ -96,7 +123,7 @@ const outputJSON = async (req, res) => {
|
|
|
96
123
|
res.send(res.result);
|
|
97
124
|
}
|
|
98
125
|
catch (err) {
|
|
99
|
-
|
|
126
|
+
logRequestError(req, res, err, "outputJSON");
|
|
100
127
|
throw new errors.InternalServerError(safeErrorMessage(err));
|
|
101
128
|
}
|
|
102
129
|
};
|
|
@@ -116,11 +143,23 @@ const outputCSV = (req, res, next) => {
|
|
|
116
143
|
'Content-Disposition': 'attachment; filename=export.csv'
|
|
117
144
|
});
|
|
118
145
|
const csv = new CsvParser(opts).parse(data);
|
|
146
|
+
const limits = query_limits.getLimits(req);
|
|
147
|
+
if (limits.max_response_bytes > 0) {
|
|
148
|
+
const size = Buffer.byteLength(csv, "utf8");
|
|
149
|
+
if (size > limits.max_response_bytes) {
|
|
150
|
+
const err = new errors.PayloadTooLargeError(`CSV export size ${size} bytes exceeds maximum ${limits.max_response_bytes} bytes. ` +
|
|
151
|
+
`Reduce ?limit= or narrow ?filter=.`);
|
|
152
|
+
logRequestError(req, res, err, "response_size", `${size}B max=${limits.max_response_bytes}B`);
|
|
153
|
+
throw err;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
119
156
|
res.end(csv);
|
|
120
157
|
next();
|
|
121
158
|
}
|
|
122
159
|
catch (err) {
|
|
123
|
-
|
|
160
|
+
if (!(err instanceof errors.PayloadTooLargeError)) {
|
|
161
|
+
logRequestError(req, res, err, "outputCSV");
|
|
162
|
+
}
|
|
124
163
|
throw new errors.InternalServerError(safeErrorMessage(err));
|
|
125
164
|
}
|
|
126
165
|
};
|
|
@@ -134,8 +173,7 @@ const actionGet = async (req, res) => {
|
|
|
134
173
|
filters = query_sanitize.sanitizeFilter(filters, getSecurityOpts(req));
|
|
135
174
|
}
|
|
136
175
|
catch (err) {
|
|
137
|
-
|
|
138
|
-
// Preserve BadRequestError, convert others to InternalServerError
|
|
176
|
+
logRequestError(req, res, err, "filter");
|
|
139
177
|
if (err instanceof errors.BadRequestError) {
|
|
140
178
|
throw err;
|
|
141
179
|
}
|
|
@@ -168,8 +206,10 @@ const actionGet = async (req, res) => {
|
|
|
168
206
|
}
|
|
169
207
|
try {
|
|
170
208
|
const estimatedCount = await req.Model.estimatedDocumentCount();
|
|
209
|
+
const result = {};
|
|
210
|
+
const { limit: effectiveLimit, limitCapped, filterExemption } = query_limits.enforceListLimit(req, estimatedCount, res, { result, bodyQuery: filters });
|
|
171
211
|
let count = -1;
|
|
172
|
-
if (query_limits.shouldRunCount(req)) {
|
|
212
|
+
if (query_limits.shouldRunCount(req, { filterExemption, limitCapped })) {
|
|
173
213
|
if (estimatedCount < 100000 && Object.keys(countquery).length !== 0) {
|
|
174
214
|
count = await qcount.countDocuments();
|
|
175
215
|
}
|
|
@@ -177,11 +217,9 @@ const actionGet = async (req, res) => {
|
|
|
177
217
|
count = estimatedCount;
|
|
178
218
|
}
|
|
179
219
|
}
|
|
180
|
-
const result = {};
|
|
181
220
|
if (count >= 0) {
|
|
182
221
|
result.count = count;
|
|
183
222
|
}
|
|
184
|
-
const effectiveLimit = query_limits.enforceListLimit(req, estimatedCount);
|
|
185
223
|
query_limits.applyListPagination(q, result, req, effectiveLimit, count >= 0 ? count : 0, changeUrlParams);
|
|
186
224
|
if (req.query.sort) {
|
|
187
225
|
q.sort(req.query.sort);
|
|
@@ -221,21 +259,29 @@ const actionGet = async (req, res) => {
|
|
|
221
259
|
}
|
|
222
260
|
result.data = await q.exec();
|
|
223
261
|
response_sanitize.sanitizeListResult(result, getStripFields(req));
|
|
262
|
+
query_limits.finalizeListPagination(result, req, Array.isArray(result.data) ? result.data.length : 0, effectiveLimit, count, changeUrlParams);
|
|
263
|
+
query_limits.enforceResponseSize(result, req, res);
|
|
224
264
|
res.result = result;
|
|
225
265
|
if (debug)
|
|
226
266
|
console.timeEnd(opname);
|
|
227
267
|
}
|
|
228
268
|
catch (err) {
|
|
229
|
-
console.error(new Date(), err);
|
|
230
269
|
if (debug)
|
|
231
270
|
console.timeEnd(opname);
|
|
232
|
-
|
|
271
|
+
if (!(err instanceof errors.BadRequestError) &&
|
|
272
|
+
!(err instanceof errors.ForbiddenError) &&
|
|
273
|
+
!(err instanceof errors.PayloadTooLargeError)) {
|
|
274
|
+
logRequestError(req, res, err, "get");
|
|
275
|
+
}
|
|
233
276
|
if (err instanceof errors.BadRequestError) {
|
|
234
277
|
throw err;
|
|
235
278
|
}
|
|
236
279
|
if (err instanceof errors.ForbiddenError) {
|
|
237
280
|
throw err;
|
|
238
281
|
}
|
|
282
|
+
if (err instanceof errors.PayloadTooLargeError) {
|
|
283
|
+
throw err;
|
|
284
|
+
}
|
|
239
285
|
if (err.code)
|
|
240
286
|
throw err;
|
|
241
287
|
throw new errors.InternalServerError(safeErrorMessage(err));
|
|
@@ -251,7 +297,7 @@ const actionGetOne = async (req, res) => {
|
|
|
251
297
|
console.timeEnd(opname);
|
|
252
298
|
}
|
|
253
299
|
catch (err) {
|
|
254
|
-
|
|
300
|
+
logRequestError(req, res, err, "getOne");
|
|
255
301
|
if (debug)
|
|
256
302
|
console.timeEnd(opname);
|
|
257
303
|
if (err.code)
|
|
@@ -286,7 +332,7 @@ const actionPost = async (req, res) => {
|
|
|
286
332
|
console.timeEnd(opname);
|
|
287
333
|
}
|
|
288
334
|
catch (err) {
|
|
289
|
-
|
|
335
|
+
logRequestError(req, res, err, "post");
|
|
290
336
|
if (debug)
|
|
291
337
|
console.timeEnd(opname);
|
|
292
338
|
if (err.code)
|
|
@@ -300,8 +346,7 @@ const actionPut = async (req, res) => {
|
|
|
300
346
|
try {
|
|
301
347
|
let item = await req.Model.findById(req.params.item_id);
|
|
302
348
|
if (!item) {
|
|
303
|
-
|
|
304
|
-
throw new errors.NotFoundError(`Document ${req.params.item_id} not found on ${req.modelname}`);
|
|
349
|
+
logAndThrow(req, res, new errors.NotFoundError(`Document ${req.params.item_id} not found on ${req.modelname}`), "put");
|
|
305
350
|
}
|
|
306
351
|
_populateItem(item, datamunging.deserialize(req.body));
|
|
307
352
|
_versionItem(item);
|
|
@@ -326,7 +371,7 @@ const actionPut = async (req, res) => {
|
|
|
326
371
|
console.timeEnd(opname);
|
|
327
372
|
}
|
|
328
373
|
catch (err) {
|
|
329
|
-
|
|
374
|
+
logRequestError(req, res, err, "put");
|
|
330
375
|
if (debug)
|
|
331
376
|
console.timeEnd(opname);
|
|
332
377
|
if (err.code)
|
|
@@ -366,7 +411,7 @@ const actionUpdate = async (req, res) => {
|
|
|
366
411
|
console.timeEnd(opname);
|
|
367
412
|
}
|
|
368
413
|
catch (err) {
|
|
369
|
-
|
|
414
|
+
logRequestError(req, res, err, "update");
|
|
370
415
|
if (debug)
|
|
371
416
|
console.timeEnd(opname);
|
|
372
417
|
if (err.code)
|
|
@@ -400,7 +445,7 @@ const actionDelete = async (req, res) => {
|
|
|
400
445
|
}
|
|
401
446
|
}
|
|
402
447
|
else {
|
|
403
|
-
|
|
448
|
+
logAndThrow(req, res, new errors.ConflictError(`Parent link item exists in ${linked_model.modelname}/${linked_model.field}`), "delete");
|
|
404
449
|
}
|
|
405
450
|
}
|
|
406
451
|
});
|
|
@@ -429,7 +474,9 @@ const actionDelete = async (req, res) => {
|
|
|
429
474
|
console.timeEnd(opname);
|
|
430
475
|
}
|
|
431
476
|
catch (err) {
|
|
432
|
-
|
|
477
|
+
if (!(err instanceof errors.ConflictError)) {
|
|
478
|
+
logRequestError(req, res, err, "delete");
|
|
479
|
+
}
|
|
433
480
|
if (debug)
|
|
434
481
|
console.timeEnd(opname);
|
|
435
482
|
if (err.code)
|
|
@@ -446,7 +493,7 @@ const actionCount = async (req, res) => {
|
|
|
446
493
|
filters = query_sanitize.sanitizeFilter(filters, getSecurityOpts(req));
|
|
447
494
|
}
|
|
448
495
|
catch (err) {
|
|
449
|
-
|
|
496
|
+
logRequestError(req, res, err, "filter");
|
|
450
497
|
if (err instanceof errors.BadRequestError || err instanceof errors.ForbiddenError) {
|
|
451
498
|
throw err;
|
|
452
499
|
}
|
|
@@ -466,7 +513,7 @@ const actionCount = async (req, res) => {
|
|
|
466
513
|
console.timeEnd(opname);
|
|
467
514
|
}
|
|
468
515
|
catch (err) {
|
|
469
|
-
|
|
516
|
+
logRequestError(req, res, err, "count");
|
|
470
517
|
if (debug)
|
|
471
518
|
console.timeEnd(opname);
|
|
472
519
|
if (err.code)
|
|
@@ -483,7 +530,7 @@ const actionCall = async (req, res) => {
|
|
|
483
530
|
res.json(result);
|
|
484
531
|
}
|
|
485
532
|
catch (err) {
|
|
486
|
-
|
|
533
|
+
logRequestError(req, res, err, "call");
|
|
487
534
|
if (err.code)
|
|
488
535
|
throw err;
|
|
489
536
|
if (err instanceof errors.ForbiddenError || err instanceof errors.NotFoundError) {
|
|
@@ -508,7 +555,7 @@ const actionCallItem = async (req, res) => {
|
|
|
508
555
|
res.json(result);
|
|
509
556
|
}
|
|
510
557
|
catch (err) {
|
|
511
|
-
|
|
558
|
+
logRequestError(req, res, err, "call");
|
|
512
559
|
if (err.code)
|
|
513
560
|
throw err;
|
|
514
561
|
if (err instanceof errors.ForbiddenError || err instanceof errors.NotFoundError) {
|
|
@@ -519,15 +566,22 @@ const actionCallItem = async (req, res) => {
|
|
|
519
566
|
};
|
|
520
567
|
// Actions (verbs)
|
|
521
568
|
const actionQuery = async (req, res) => {
|
|
522
|
-
if (!advancedQueryAllowed(req.Model, "query")) {
|
|
523
|
-
throw new errors.ForbiddenError(`POST /query is disabled for model ${req.modelname}`);
|
|
524
|
-
}
|
|
525
569
|
if (!req.body || !req.body.query || typeof req.body.query !== "object") {
|
|
526
|
-
|
|
570
|
+
logAndThrow(req, res, new errors.BadRequestError("Query missing or not of type object"), "query");
|
|
527
571
|
}
|
|
528
572
|
const opname = `query ${req.modelname} ${ops++}`;
|
|
529
573
|
console.time(opname);
|
|
530
|
-
|
|
574
|
+
let sanitizedQuery;
|
|
575
|
+
try {
|
|
576
|
+
sanitizedQuery = query_sanitize.sanitizeFilter(req.body.query, getSecurityOpts(req));
|
|
577
|
+
}
|
|
578
|
+
catch (err) {
|
|
579
|
+
logRequestError(req, res, err, "query_sanitize");
|
|
580
|
+
if (err instanceof errors.BadRequestError || err instanceof errors.ForbiddenError) {
|
|
581
|
+
throw err;
|
|
582
|
+
}
|
|
583
|
+
throw new errors.InternalServerError(safeErrorMessage(err));
|
|
584
|
+
}
|
|
531
585
|
let query = [sanitizedQuery];
|
|
532
586
|
let checkDeleted = { "$or": [{ _deleted: false }, { _deleted: null }] };
|
|
533
587
|
if (!req.query.showDeleted) {
|
|
@@ -536,16 +590,16 @@ const actionQuery = async (req, res) => {
|
|
|
536
590
|
let qcount = req.Model.find({ "$and": query });
|
|
537
591
|
let q = req.Model.find({ "$and": query });
|
|
538
592
|
try {
|
|
593
|
+
const estimatedCount = await req.Model.estimatedDocumentCount();
|
|
594
|
+
const result = {};
|
|
595
|
+
const { limit: effectiveLimit, limitCapped, filterExemption } = query_limits.enforceListLimit(req, estimatedCount, res, { result, bodyQuery: sanitizedQuery });
|
|
539
596
|
let count = -1;
|
|
540
|
-
if (query_limits.shouldRunCount(req)) {
|
|
597
|
+
if (query_limits.shouldRunCount(req, { filterExemption, limitCapped })) {
|
|
541
598
|
count = await qcount.countDocuments();
|
|
542
599
|
}
|
|
543
|
-
const result = {};
|
|
544
600
|
if (count >= 0) {
|
|
545
601
|
result.count = count;
|
|
546
602
|
}
|
|
547
|
-
const estimatedCount = await req.Model.estimatedDocumentCount();
|
|
548
|
-
const effectiveLimit = query_limits.enforceListLimit(req, estimatedCount);
|
|
549
603
|
query_limits.applyListPagination(q, result, req, effectiveLimit, count >= 0 ? count : 0, changeUrlParams);
|
|
550
604
|
if (req.query.sort) {
|
|
551
605
|
q.sort(req.query.sort);
|
|
@@ -581,16 +635,24 @@ const actionQuery = async (req, res) => {
|
|
|
581
635
|
}
|
|
582
636
|
result.data = await q.exec();
|
|
583
637
|
response_sanitize.sanitizeListResult(result, getStripFields(req));
|
|
638
|
+
query_limits.finalizeListPagination(result, req, Array.isArray(result.data) ? result.data.length : 0, effectiveLimit, count, changeUrlParams);
|
|
639
|
+
query_limits.enforceResponseSize(result, req, res);
|
|
584
640
|
res.result = result;
|
|
585
641
|
if (debug)
|
|
586
642
|
console.timeEnd(opname);
|
|
587
643
|
res.json(result);
|
|
588
644
|
}
|
|
589
645
|
catch (err) {
|
|
590
|
-
console.error(new Date(), err);
|
|
591
646
|
if (debug)
|
|
592
647
|
console.timeEnd(opname);
|
|
593
|
-
if (err instanceof errors.BadRequestError
|
|
648
|
+
if (!(err instanceof errors.BadRequestError) &&
|
|
649
|
+
!(err instanceof errors.ForbiddenError) &&
|
|
650
|
+
!(err instanceof errors.PayloadTooLargeError)) {
|
|
651
|
+
logRequestError(req, res, err, "query");
|
|
652
|
+
}
|
|
653
|
+
if (err instanceof errors.BadRequestError ||
|
|
654
|
+
err instanceof errors.ForbiddenError ||
|
|
655
|
+
err instanceof errors.PayloadTooLargeError) {
|
|
594
656
|
throw err;
|
|
595
657
|
}
|
|
596
658
|
if (err.code)
|
|
@@ -600,19 +662,24 @@ const actionQuery = async (req, res) => {
|
|
|
600
662
|
};
|
|
601
663
|
// Actions (verbs)
|
|
602
664
|
const actionAggregate = async (req, res) => {
|
|
603
|
-
|
|
604
|
-
throw new errors.ForbiddenError(`POST /aggregate is disabled for model ${req.modelname}`);
|
|
605
|
-
}
|
|
606
|
-
let query = (req.body.query) ? req.body.query : req.body; // Don't require to embed in query anymore
|
|
665
|
+
let query = req.body?.query ? req.body.query : req.body;
|
|
607
666
|
if (!query || !Array.isArray(query)) {
|
|
608
|
-
|
|
609
|
-
throw new errors.BadRequestError("Query missing or not of type array");
|
|
667
|
+
logAndThrow(req, res, new errors.BadRequestError("Query missing or not of type array"), "aggregate");
|
|
610
668
|
}
|
|
611
669
|
query = query_manipulation.fix_query(query);
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
670
|
+
try {
|
|
671
|
+
aggregate_guard.validatePipeline(query, {
|
|
672
|
+
aggregate_stages_allow: getSecurityOpts(req).aggregate_stages_allow,
|
|
673
|
+
isAdmin: res.user?.admin,
|
|
674
|
+
});
|
|
675
|
+
}
|
|
676
|
+
catch (err) {
|
|
677
|
+
logRequestError(req, res, err, "aggregate_guard");
|
|
678
|
+
if (err instanceof errors.BadRequestError || err instanceof errors.ForbiddenError) {
|
|
679
|
+
throw err;
|
|
680
|
+
}
|
|
681
|
+
throw new errors.InternalServerError(safeErrorMessage(err));
|
|
682
|
+
}
|
|
616
683
|
const opname = `aggregate ${req.modelname} ${ops++}`;
|
|
617
684
|
console.time(opname);
|
|
618
685
|
try {
|
|
@@ -630,9 +697,12 @@ const actionAggregate = async (req, res) => {
|
|
|
630
697
|
res.json(result);
|
|
631
698
|
}
|
|
632
699
|
catch (err) {
|
|
633
|
-
console.error(new Date(), err);
|
|
634
700
|
if (debug)
|
|
635
701
|
console.timeEnd(opname);
|
|
702
|
+
if (!(err instanceof errors.BadRequestError) &&
|
|
703
|
+
!(err instanceof errors.ForbiddenError)) {
|
|
704
|
+
logRequestError(req, res, err, "aggregate");
|
|
705
|
+
}
|
|
636
706
|
if (err instanceof errors.BadRequestError || err instanceof errors.ForbiddenError) {
|
|
637
707
|
throw err;
|
|
638
708
|
}
|
|
@@ -641,12 +711,10 @@ const actionAggregate = async (req, res) => {
|
|
|
641
711
|
};
|
|
642
712
|
// Actions (verbs)
|
|
643
713
|
const actionBulkWrite = async (req, res) => {
|
|
644
|
-
if (!advancedQueryAllowed(req.Model, "bulkwrite")) {
|
|
645
|
-
throw new errors.ForbiddenError(`POST /bulkwrite is disabled for model ${req.modelname}`);
|
|
646
|
-
}
|
|
647
714
|
if (!req.body || !Array.isArray(req.body)) {
|
|
648
|
-
|
|
649
|
-
|
|
715
|
+
const err = new errors.BadRequestError("Query missing or not of type array");
|
|
716
|
+
logRequestError(req, res, err, "bulkwrite");
|
|
717
|
+
throw err;
|
|
650
718
|
}
|
|
651
719
|
const opname = `bulkwrite ${req.modelname} ${ops++}`;
|
|
652
720
|
console.time(opname);
|
|
@@ -664,7 +732,7 @@ const actionBulkWrite = async (req, res) => {
|
|
|
664
732
|
res.json(result);
|
|
665
733
|
}
|
|
666
734
|
catch (err) {
|
|
667
|
-
|
|
735
|
+
logRequestError(req, res, err, "bulkwrite");
|
|
668
736
|
if (debug)
|
|
669
737
|
console.timeEnd(opname);
|
|
670
738
|
if (err instanceof errors.BadRequestError || err instanceof errors.ForbiddenError) {
|
|
@@ -736,7 +804,6 @@ const getOne = async (Model, item_id, params, options) => {
|
|
|
736
804
|
return response_sanitize.sanitizeDocument(item);
|
|
737
805
|
}
|
|
738
806
|
catch (err) {
|
|
739
|
-
console.error(err);
|
|
740
807
|
if (err.code)
|
|
741
808
|
throw err;
|
|
742
809
|
throw new errors.InternalServerError(safeErrorMessage(err));
|
|
@@ -955,6 +1022,8 @@ const changeUrlParams = (req, key, val) => {
|
|
|
955
1022
|
return req.config.url + req.path() + "?" + querystring.stringify(q);
|
|
956
1023
|
};
|
|
957
1024
|
const JXP = function (options) {
|
|
1025
|
+
// Must run before models load; reads QUERY_INDEX_MONITOR / INDEX_DIAGNOSTICS_ENABLED from env
|
|
1026
|
+
index_diagnostics.registerQueryIndexMonitor(options.index_diagnostics);
|
|
958
1027
|
const server = restify.createServer();
|
|
959
1028
|
const model_dir = options.model_dir || modeldir.findModelDir(path.dirname(process.argv[1]));
|
|
960
1029
|
//Set up config with default
|
|
@@ -1005,6 +1074,7 @@ const JXP = function (options) {
|
|
|
1005
1074
|
default: 100,
|
|
1006
1075
|
require_limit_always: true,
|
|
1007
1076
|
skip_count_unless_paginated: true,
|
|
1077
|
+
max_response_size: "10mb",
|
|
1008
1078
|
},
|
|
1009
1079
|
security: {
|
|
1010
1080
|
strip_fields: ["password"],
|
|
@@ -1037,21 +1107,14 @@ const JXP = function (options) {
|
|
|
1037
1107
|
global.apikey = config.apikey;
|
|
1038
1108
|
global.server = config.server;
|
|
1039
1109
|
global.model_dir = config.model_dir;
|
|
1040
|
-
// Pre-load models
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
return fname.endsWith("_model.js");
|
|
1044
|
-
});
|
|
1045
|
-
modelnames.forEach(function (fname) {
|
|
1046
|
-
var modelname = fname.replace("_model.js", "");
|
|
1047
|
-
const mod = require(path.join(config.model_dir, fname));
|
|
1048
|
-
models[modelname] = mod.default || mod;
|
|
1049
|
-
});
|
|
1110
|
+
// Pre-load app models, then jxp built-ins for any missing slugs
|
|
1111
|
+
Object.assign(models, builtin_models.loadAllModels(config.model_dir));
|
|
1112
|
+
index_diagnostics.wireQueryLogPersistence(models);
|
|
1050
1113
|
link_index.buildLinkIndex(models);
|
|
1051
|
-
setup.init(config);
|
|
1052
|
-
security.init(config);
|
|
1053
|
-
login.init(config);
|
|
1054
|
-
groups.init(config);
|
|
1114
|
+
setup.init(models, config);
|
|
1115
|
+
security.init(models, config);
|
|
1116
|
+
login.init(models, config);
|
|
1117
|
+
groups.init(models, config);
|
|
1055
1118
|
ws.init({ models });
|
|
1056
1119
|
cache.init(config);
|
|
1057
1120
|
const docs = new Docs({ config, models });
|
|
@@ -1114,9 +1177,9 @@ const JXP = function (options) {
|
|
|
1114
1177
|
// CSV endpoints
|
|
1115
1178
|
server.get("/csv/:modelname", middlewareModel, security.login, security.auth, config.pre_hooks.get, actionGet, outputCSV);
|
|
1116
1179
|
// Query endpoints
|
|
1117
|
-
server.post("/query/:modelname", middlewareModel, security.login, security.auth, config.pre_hooks.get, actionQuery);
|
|
1118
|
-
server.post("/aggregate/:modelname", middlewareModel, security.login, security.auth, config.pre_hooks.get, actionAggregate);
|
|
1119
|
-
server.post("/bulkwrite/:modelname", middlewareModel, security.login, security.bulkAuth, config.pre_hooks.get, actionBulkWrite);
|
|
1180
|
+
server.post("/query/:modelname", middlewareModel, security.login, security.auth, middlewareAdvancedQueryAllowed("query"), config.pre_hooks.get, actionQuery);
|
|
1181
|
+
server.post("/aggregate/:modelname", middlewareModel, security.login, security.auth, middlewareAdvancedQueryAllowed("aggregate"), config.pre_hooks.get, actionAggregate);
|
|
1182
|
+
server.post("/bulkwrite/:modelname", middlewareModel, security.login, middlewareBulkWriteAllowed, security.bulkAuth, config.pre_hooks.get, actionBulkWrite);
|
|
1120
1183
|
server.post("/update/:modelname/:item_id", middlewareModel, security.login, security.auth, middlewarePasswords, middlewareCheckAdmin, config.pre_hooks.update, actionUpdate, cache.clearAll);
|
|
1121
1184
|
/* Batch routes - ROLLED BACK FOR NOW */
|
|
1122
1185
|
// server.post('/batch/create/:modelname', middlewareModel, security.login, security.auth, actionBatch);
|
|
@@ -1158,6 +1221,7 @@ const JXP = function (options) {
|
|
|
1158
1221
|
server.post("/docs/logout", docsAuth.logout);
|
|
1159
1222
|
server.get("/docs/assets/:file", docs.serveAsset.bind(docs));
|
|
1160
1223
|
server.get("/docs/api", docsAuth.docsAccessMiddleware, docs.apiIndex.bind(docs));
|
|
1224
|
+
server.get("/docs/diagnostics", docsAuth.docsAccessMiddleware, docs.diagnostics.bind(docs));
|
|
1161
1225
|
server.get("/docs/md/:md_doc", docs.md.bind(docs));
|
|
1162
1226
|
server.get("/docs/model/:modelname", docsAuth.docsAccessMiddleware, docs.model.bind(docs));
|
|
1163
1227
|
server.get("/", docs.frontPage.bind(docs));
|
|
@@ -1167,9 +1231,60 @@ const JXP = function (options) {
|
|
|
1167
1231
|
server.post("/setup/data", setup.checkUserDoesNotExist, setup.data_setup);
|
|
1168
1232
|
/* Websocket */
|
|
1169
1233
|
server.on("upgrade", ws.upgrade);
|
|
1234
|
+
server.on("restError", (req, res, err, callback) => {
|
|
1235
|
+
logRequestError(req, res, err);
|
|
1236
|
+
return callback();
|
|
1237
|
+
});
|
|
1170
1238
|
/* Cache */
|
|
1171
1239
|
server.get("/cache/stats", security.login, security.admin_only, cache.stats, outputJSON);
|
|
1172
1240
|
server.get("/cache/clear", security.login, security.admin_only, cache.clearAll, outputJSON);
|
|
1241
|
+
/* Index diagnostics (admin) */
|
|
1242
|
+
const actionDiagnosticsIndexes = async (req, res) => {
|
|
1243
|
+
const refresh = req.query?.refresh === "true" || req.query?.refresh === "1";
|
|
1244
|
+
const includeUnused = req.query?.unused === "true" || req.query?.unused === "1";
|
|
1245
|
+
res.result = await index_diagnostics.getCachedIndexAudit(models, {
|
|
1246
|
+
refresh: !!refresh,
|
|
1247
|
+
includeUnused: !!includeUnused,
|
|
1248
|
+
});
|
|
1249
|
+
};
|
|
1250
|
+
const actionDiagnosticsQueries = async (req, res) => {
|
|
1251
|
+
const limit = parseInt(String(req.query?.limit ?? "50"), 10);
|
|
1252
|
+
const skip = parseInt(String(req.query?.skip ?? "0"), 10);
|
|
1253
|
+
const severity = typeof req.query?.severity === "string" ? req.query.severity : undefined;
|
|
1254
|
+
const modelRaw = typeof req.query?.model === "string"
|
|
1255
|
+
? req.query.model
|
|
1256
|
+
: typeof req.query?.model_name === "string"
|
|
1257
|
+
? req.query.model_name
|
|
1258
|
+
: undefined;
|
|
1259
|
+
const model_name = modelRaw
|
|
1260
|
+
? builtin_models.resolveModelFilterName(models, modelRaw)
|
|
1261
|
+
: undefined;
|
|
1262
|
+
res.result = await index_diagnostics.listQueryLogs({
|
|
1263
|
+
limit: Number.isFinite(limit) ? limit : 50,
|
|
1264
|
+
skip: Number.isFinite(skip) ? skip : 0,
|
|
1265
|
+
severity,
|
|
1266
|
+
model_name,
|
|
1267
|
+
});
|
|
1268
|
+
};
|
|
1269
|
+
const actionDiagnosticsIndexesSync = async (req, res) => {
|
|
1270
|
+
const confirm = typeof req.body?.confirm === "string"
|
|
1271
|
+
? req.body.confirm
|
|
1272
|
+
: typeof req.query?.confirm === "string"
|
|
1273
|
+
? req.query.confirm
|
|
1274
|
+
: undefined;
|
|
1275
|
+
const who = res.user?.email || res.user?._id?.toString?.() || "unknown";
|
|
1276
|
+
console.log(`[index-diagnostics] sync requested by ${who} confirm=${confirm === index_diagnostics.SYNC_CONFIRM_PHRASE ? "ok" : "invalid"}`);
|
|
1277
|
+
try {
|
|
1278
|
+
res.result = await index_diagnostics.syncAllModels(models, { confirm });
|
|
1279
|
+
}
|
|
1280
|
+
catch (err) {
|
|
1281
|
+
logRequestError(req, res, err, "diagnostics/indexes/sync");
|
|
1282
|
+
throw err;
|
|
1283
|
+
}
|
|
1284
|
+
};
|
|
1285
|
+
server.get("/diagnostics/indexes", security.login, security.admin_only, actionDiagnosticsIndexes, outputJSON);
|
|
1286
|
+
server.get("/diagnostics/queries", security.login, security.admin_only, actionDiagnosticsQueries, outputJSON);
|
|
1287
|
+
server.post("/diagnostics/indexes/sync", security.login, security.admin_only, actionDiagnosticsIndexesSync, outputJSON);
|
|
1173
1288
|
return server;
|
|
1174
1289
|
};
|
|
1175
1290
|
module.exports = JXP;
|