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.
Files changed (79) hide show
  1. package/.env.sample +14 -0
  2. package/dist/bin/index_audit.d.ts +3 -0
  3. package/dist/bin/index_audit.d.ts.map +1 -0
  4. package/dist/bin/index_audit.js +66 -0
  5. package/dist/bin/index_audit.js.map +1 -0
  6. package/dist/bin/server.d.ts.map +1 -1
  7. package/dist/bin/server.js +6 -1
  8. package/dist/bin/server.js.map +1 -1
  9. package/dist/libs/builtin_models.d.ts +21 -0
  10. package/dist/libs/builtin_models.d.ts.map +1 -0
  11. package/dist/libs/builtin_models.js +125 -0
  12. package/dist/libs/builtin_models.js.map +1 -0
  13. package/dist/libs/bulkwrite_guard.d.ts +1 -0
  14. package/dist/libs/bulkwrite_guard.d.ts.map +1 -1
  15. package/dist/libs/bulkwrite_guard.js +43 -0
  16. package/dist/libs/bulkwrite_guard.js.map +1 -1
  17. package/dist/libs/docs-auth.d.ts.map +1 -1
  18. package/dist/libs/docs-auth.js +3 -1
  19. package/dist/libs/docs-auth.js.map +1 -1
  20. package/dist/libs/docs.js +32 -2
  21. package/dist/libs/docs.js.map +1 -1
  22. package/dist/libs/groups.js +3 -4
  23. package/dist/libs/groups.js.map +1 -1
  24. package/dist/libs/index_diagnostics.d.ts +144 -0
  25. package/dist/libs/index_diagnostics.d.ts.map +1 -0
  26. package/dist/libs/index_diagnostics.js +671 -0
  27. package/dist/libs/index_diagnostics.js.map +1 -0
  28. package/dist/libs/jxp.d.ts.map +1 -1
  29. package/dist/libs/jxp.js +185 -70
  30. package/dist/libs/jxp.js.map +1 -1
  31. package/dist/libs/load-config.d.ts +2 -0
  32. package/dist/libs/load-config.d.ts.map +1 -1
  33. package/dist/libs/load-config.js +10 -0
  34. package/dist/libs/load-config.js.map +1 -1
  35. package/dist/libs/login.js +3 -8
  36. package/dist/libs/login.js.map +1 -1
  37. package/dist/libs/parse_byte_size.d.ts +10 -0
  38. package/dist/libs/parse_byte_size.d.ts.map +1 -0
  39. package/dist/libs/parse_byte_size.js +80 -0
  40. package/dist/libs/parse_byte_size.js.map +1 -0
  41. package/dist/libs/query_limits.js +104 -12
  42. package/dist/libs/query_limits.js.map +1 -1
  43. package/dist/libs/request_log.d.ts +44 -0
  44. package/dist/libs/request_log.d.ts.map +1 -0
  45. package/dist/libs/request_log.js +229 -0
  46. package/dist/libs/request_log.js.map +1 -0
  47. package/dist/libs/schema.js +2 -2
  48. package/dist/libs/schema.js.map +1 -1
  49. package/dist/libs/security.js +25 -20
  50. package/dist/libs/security.js.map +1 -1
  51. package/dist/libs/setup.js +3 -4
  52. package/dist/libs/setup.js.map +1 -1
  53. package/dist/libs/startup.d.ts +4 -0
  54. package/dist/libs/startup.d.ts.map +1 -1
  55. package/dist/libs/startup.js +17 -0
  56. package/dist/libs/startup.js.map +1 -1
  57. package/dist/models/indexquerylog_model.d.ts +19 -0
  58. package/dist/models/indexquerylog_model.d.ts.map +1 -0
  59. package/dist/models/indexquerylog_model.js +32 -0
  60. package/dist/models/indexquerylog_model.js.map +1 -0
  61. package/dist/models/test_model.js +1 -1
  62. package/dist/models/test_model.js.map +1 -1
  63. package/dist/types/jxp-config.d.ts +22 -0
  64. package/dist/types/jxp-config.d.ts.map +1 -1
  65. package/dist/types/schema-fields.d.ts +4 -0
  66. package/dist/types/schema-fields.d.ts.map +1 -1
  67. package/docs/api.md +16 -2
  68. package/docs/bulk_writes.md +9 -2
  69. package/docs/changelog.md +120 -1
  70. package/docs/configuration.md +39 -0
  71. package/docs/index.md +1 -0
  72. package/docs/index_diagnostics.md +127 -0
  73. package/docs/schemas.md +3 -1
  74. package/mkdocs.yml +1 -0
  75. package/package.json +18 -7
  76. package/templates/assets/diagnostics.js +352 -0
  77. package/templates/diagnostics.pug +94 -0
  78. package/templates/index.pug +1 -0
  79. 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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"}
@@ -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;AA65BrD,QAAA,MAAM,GAAG,GAAa,SAAS,SAAS,QAwXvC,CAAC;AAEF,SAAS,GAAG,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
- throw new errors.NotFoundError(`Model ${modelname} not found`);
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
- throw new errors.ForbiddenError("password_override requires admin");
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
- console.error(new Date(), err);
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
- console.error(err);
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
- console.trace(new Date(), err);
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
- // Preserve BadRequestError, convert others to InternalServerError
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
- console.error(new Date(), err);
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
- console.error(new Date(), err);
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
- console.error(new Date(), "Document not found");
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
- console.error(new Date(), err);
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
- console.error(new Date(), err);
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
- throw new errors.ConflictError(`Parent link item exists in ${linked_model.modelname}/${linked_model.field}`);
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
- console.error(new Date(), err);
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
- console.trace(new Date(), err);
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
- console.error(new Date(), err);
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
- console.error(new Date(), err);
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
- console.trace(err);
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
- throw new errors.BadRequestError("Query missing or not of type object");
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
- const sanitizedQuery = query_sanitize.sanitizeFilter(req.body.query, getSecurityOpts(req));
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 || err instanceof errors.ForbiddenError) {
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
- if (!advancedQueryAllowed(req.Model, "aggregate")) {
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
- console.error("query missing or not of type array");
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
- aggregate_guard.validatePipeline(query, {
613
- aggregate_stages_allow: getSecurityOpts(req).aggregate_stages_allow,
614
- isAdmin: res.user?.admin,
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
- console.error("query missing or not of type array");
649
- throw new errors.BadRequestError("Query missing or not of type array");
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
- console.error(new Date(), err);
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
- var files = fs.readdirSync(config.model_dir);
1042
- let modelnames = files.filter(function (fname) {
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;