@modular-rest/server 1.11.13 → 1.11.14

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 (112) hide show
  1. package/.nvmrc +1 -0
  2. package/.prettierrc.json +9 -0
  3. package/.releaserc.json +24 -0
  4. package/README.md +79 -94
  5. package/dist/index.js +79 -0
  6. package/docs/.keep +0 -0
  7. package/docs/system-access-type.md +26 -0
  8. package/package.json +58 -45
  9. package/src/application.ts +206 -0
  10. package/src/class/cms_trigger.ts +68 -0
  11. package/src/class/collection_definition.ts +134 -0
  12. package/src/class/combinator.ts +176 -0
  13. package/src/class/database_trigger.ts +99 -0
  14. package/src/class/db_schemas.ts +44 -0
  15. package/src/class/{directory.js → directory.ts} +40 -18
  16. package/src/class/paginator.ts +51 -0
  17. package/src/class/reply.ts +59 -0
  18. package/src/class/security.ts +250 -0
  19. package/src/class/trigger_operator.ts +142 -0
  20. package/src/class/user.ts +199 -0
  21. package/src/class/validator.ts +123 -0
  22. package/src/config.ts +122 -0
  23. package/src/defult-permissions.ts +31 -0
  24. package/src/events.ts +59 -0
  25. package/src/helper/data_insertion.ts +94 -0
  26. package/src/helper/presetup_services.ts +96 -0
  27. package/src/index.ts +146 -0
  28. package/src/middlewares.ts +75 -0
  29. package/src/play-test.ts +8 -0
  30. package/src/services/data_provider/router.ts +191 -0
  31. package/src/services/data_provider/service.ts +305 -0
  32. package/src/services/data_provider/typeCasters.ts +15 -0
  33. package/src/services/file/db.ts +29 -0
  34. package/src/services/file/router.ts +88 -0
  35. package/src/services/file/service.ts +387 -0
  36. package/src/services/functions/router.ts +34 -0
  37. package/src/services/functions/service.ts +203 -0
  38. package/src/services/jwt/router.ts +73 -0
  39. package/src/services/jwt/service.ts +139 -0
  40. package/src/services/user_manager/db.ts +87 -0
  41. package/src/services/user_manager/permissionManager.ts +49 -0
  42. package/src/services/user_manager/router.ts +193 -0
  43. package/src/services/user_manager/service.ts +698 -0
  44. package/tsconfig.json +16 -9
  45. package/typedoc.mjs +41 -0
  46. package/LICENSE +0 -21
  47. package/package-lock.json +0 -1373
  48. package/src/application.js +0 -239
  49. package/src/class/cms_trigger.js +0 -20
  50. package/src/class/collection_definition.js +0 -33
  51. package/src/class/combinator.js +0 -133
  52. package/src/class/database_trigger.js +0 -20
  53. package/src/class/db_schemas.js +0 -18
  54. package/src/class/paginator.js +0 -31
  55. package/src/class/reply.js +0 -37
  56. package/src/class/security.js +0 -141
  57. package/src/class/trigger_operator.js +0 -39
  58. package/src/class/user.js +0 -112
  59. package/src/class/validator.js +0 -91
  60. package/src/config.js +0 -67
  61. package/src/events.js +0 -15
  62. package/src/helper/data_insertion.js +0 -64
  63. package/src/helper/presetup_services.js +0 -31
  64. package/src/index.js +0 -66
  65. package/src/middlewares.js +0 -44
  66. package/src/services/data_provider/router.js +0 -552
  67. package/src/services/data_provider/service.js +0 -262
  68. package/src/services/data_provider/typeCasters.js +0 -10
  69. package/src/services/file/db.js +0 -29
  70. package/src/services/file/router.js +0 -92
  71. package/src/services/file/service.js +0 -231
  72. package/src/services/functions/router.js +0 -37
  73. package/src/services/functions/service.js +0 -74
  74. package/src/services/jwt/router.js +0 -82
  75. package/src/services/jwt/service.js +0 -37
  76. package/src/services/user_manager/db.js +0 -83
  77. package/src/services/user_manager/permissionManager.js +0 -43
  78. package/src/services/user_manager/router.js +0 -176
  79. package/src/services/user_manager/service.js +0 -377
  80. package/types/application.d.ts +0 -97
  81. package/types/class/cms_trigger.d.ts +0 -24
  82. package/types/class/collection_definition.d.ts +0 -36
  83. package/types/class/combinator.d.ts +0 -30
  84. package/types/class/database_trigger.d.ts +0 -28
  85. package/types/class/db_schemas.d.ts +0 -2
  86. package/types/class/directory.d.ts +0 -2
  87. package/types/class/paginator.d.ts +0 -8
  88. package/types/class/reply.d.ts +0 -8
  89. package/types/class/security.d.ts +0 -109
  90. package/types/class/trigger_operator.d.ts +0 -19
  91. package/types/class/user.d.ts +0 -24
  92. package/types/class/validator.d.ts +0 -9
  93. package/types/config.d.ts +0 -101
  94. package/types/events.d.ts +0 -7
  95. package/types/helper/data_insertion.d.ts +0 -4
  96. package/types/helper/presetup_services.d.ts +0 -5
  97. package/types/index.d.ts +0 -72
  98. package/types/middlewares.d.ts +0 -10
  99. package/types/services/data_provider/router.d.ts +0 -3
  100. package/types/services/data_provider/service.d.ts +0 -40
  101. package/types/services/data_provider/typeCasters.d.ts +0 -3
  102. package/types/services/file/db.d.ts +0 -3
  103. package/types/services/file/router.d.ts +0 -3
  104. package/types/services/file/service.d.ts +0 -81
  105. package/types/services/functions/router.d.ts +0 -3
  106. package/types/services/functions/service.d.ts +0 -23
  107. package/types/services/jwt/router.d.ts +0 -3
  108. package/types/services/jwt/service.d.ts +0 -10
  109. package/types/services/user_manager/db.d.ts +0 -3
  110. package/types/services/user_manager/permissionManager.d.ts +0 -3
  111. package/types/services/user_manager/router.d.ts +0 -3
  112. package/types/services/user_manager/service.d.ts +0 -131
@@ -1,552 +0,0 @@
1
- let { AccessTypes } = require("./../../class/security");
2
- let Router = require("koa-router");
3
- let validateObject = require("../../class/validator");
4
- let reply = require("../../class/reply").create;
5
- var nestedProperty = require("nested-property");
6
-
7
- //let Types = require('./types.js');
8
-
9
- let name = "data-provider";
10
-
11
- let service = require("./service");
12
- let middleware = require("./../../middlewares");
13
-
14
- let dataProvider = new Router();
15
-
16
- dataProvider.use("/", middleware.auth, async (ctx, next) => {
17
- let body = ctx.request.body;
18
- let bodyValidated = validateObject(body, "database collection");
19
-
20
- // fields validation
21
- if (!bodyValidated.isValid) {
22
- ctx.throw(
23
- 412,
24
- JSON.stringify(reply("e", { error: bodyValidated.requires }))
25
- );
26
- }
27
-
28
- // type caster
29
- if (body.types && body.hasOwnProperty(body.bodyKey || ".")) {
30
- let bodyKey = body.bodyKey;
31
- for (const key in body.types) {
32
- if (
33
- body.types.hasOwnProperty(key) &&
34
- typeof body.types[key] == "object"
35
- ) {
36
- let typeDetail = body.types[key];
37
-
38
- try {
39
- let value = nestedProperty.get(body[bodyKey], typeDetail.path);
40
- let newProperty = service.TypeCasters[typeDetail.type](value);
41
- nestedProperty.set(body[bodyKey], typeDetail.path, newProperty);
42
- console.log(
43
- "newProperty",
44
- newProperty,
45
- JSON.stringify(body[bodyKey])
46
- );
47
- } catch (e) {
48
- console.log("type caster error", e);
49
- }
50
- }
51
- }
52
- }
53
-
54
- await next();
55
- });
56
-
57
- dataProvider.post("/find", async (ctx) => {
58
- let body = ctx.request.body;
59
- let bodyValidate = validateObject(body, "database collection query");
60
-
61
- // fields validation
62
- if (!bodyValidate.isValid) {
63
- ctx.throw(
64
- 412,
65
- JSON.stringify(reply("e", { error: bodyValidate.requires }))
66
- );
67
- }
68
-
69
- // access validation
70
- let hasAccess = service.checkAccess(
71
- body.database,
72
- body.collection,
73
- AccessTypes.read,
74
- body.query,
75
- ctx.state.user
76
- );
77
- if (!hasAccess) {
78
- console.log(body);
79
- console.log(ctx.state.user.permission);
80
- ctx.throw(403, "access denied");
81
- }
82
-
83
- // collection validation
84
- let collection = service.getCollection(body.database, body.collection);
85
- if (collection == null) {
86
- ctx.throw(
87
- 412,
88
- JSON.stringify(reply("e", { error: "wrong database or collection" }))
89
- );
90
- }
91
-
92
- // operate on db
93
- let queryRequest = collection.find(body.query, body.projection);
94
-
95
- if (body.options) {
96
- queryRequest = service.performAdditionalOptionsToQueryObject(
97
- queryRequest,
98
- body.options
99
- );
100
- }
101
-
102
- if (body.populates) {
103
- try {
104
- req = service.performPopulateToQueryObject(queryRequest, body.populates);
105
- } catch (err) {
106
- ctx.status = 412;
107
- ctx.body = err;
108
- }
109
- }
110
-
111
- await queryRequest
112
- .exec()
113
- .then(async (docs) => {
114
- // Call trigger
115
- service.triggers.call("find", body.database, body.collection, {
116
- query: body.query,
117
- queryResult: docs,
118
- });
119
-
120
- ctx.body = { data: docs };
121
- })
122
- .catch((err) => {
123
- ctx.status = err.status || 500;
124
- ctx.body = err.message;
125
- });
126
- });
127
-
128
- dataProvider.post("/find-one", async (ctx) => {
129
- let body = ctx.request.body;
130
- let bodyValidate = validateObject(body, "database collection query");
131
-
132
- // fields validation
133
- if (!bodyValidate.isValid) {
134
- ctx.throw(
135
- JSON.stringify(reply("e", { error: bodyValidate.requires })),
136
- 412
137
- );
138
- }
139
-
140
- // access validation
141
- let hasAccess = service.checkAccess(
142
- body.database,
143
- body.collection,
144
- AccessTypes.read,
145
- body.query,
146
- ctx.state.user
147
- );
148
- if (!hasAccess) ctx.throw(403, "access denied");
149
-
150
- // collection validation
151
- let collection = service.getCollection(body.database, body.collection);
152
- if (collection == null) {
153
- ctx.throw(
154
- JSON.stringify(reply("e", { error: "wrong database or collection" })),
155
- 412
156
- );
157
- }
158
-
159
- // operate on db
160
- let queryRequest = collection.findOne(
161
- body.query,
162
- body.projection,
163
- body.options
164
- );
165
-
166
- if (body.options) {
167
- queryRequest = service.performAdditionalOptionsToQueryObject(
168
- queryRequest,
169
- body.options
170
- );
171
- }
172
-
173
- if (body.populates) {
174
- try {
175
- req = service.performPopulateToQueryObject(queryRequest, body.populates);
176
- } catch (err) {
177
- ctx.status = 412;
178
- ctx.body = err;
179
- }
180
- }
181
-
182
- // operate on db
183
- await queryRequest
184
- .exec()
185
- .then(async (doc) => {
186
- // Call trigger
187
- service.triggers.call("find-one", body.database, body.collection, {
188
- query: body.query,
189
- queryResult: doc,
190
- });
191
-
192
- ctx.body = { data: doc };
193
- })
194
- .catch((err) => {
195
- ctx.status = err.status || 500;
196
- ctx.body = err.message;
197
- });
198
- });
199
-
200
- dataProvider.post("/count", async (ctx) => {
201
- let body = ctx.request.body;
202
- let bodyValidate = validateObject(body, "database collection query");
203
-
204
- // fields validation
205
- if (!bodyValidate.isValid) {
206
- ctx.throw(
207
- JSON.stringify(reply("e", { error: bodyValidate.requires })),
208
- 412
209
- );
210
- }
211
-
212
- // access validation
213
- let hasAccess = service.checkAccess(
214
- body.database,
215
- body.collection,
216
- AccessTypes.read,
217
- body.query,
218
- ctx.state.user
219
- );
220
- if (!hasAccess) ctx.throw(403, "access denied");
221
-
222
- // collection validation
223
- let collection = service.getCollection(body.database, body.collection);
224
- if (collection == null) {
225
- ctx.throw(
226
- JSON.stringify(reply("e", { error: "wrong database or collection" })),
227
- 412
228
- );
229
- }
230
-
231
- // operate on db
232
- await collection
233
- .countDocuments(body.query)
234
- .exec()
235
- .then((count) => {
236
- // Call trigger
237
- service.triggers.call("count", body.database, body.collection, {
238
- query: body.query,
239
- queryResult: count,
240
- });
241
-
242
- ctx.body = { data: count };
243
- })
244
- .catch((err) => {
245
- ctx.status = err.status || 500;
246
- ctx.body = err.message;
247
- });
248
- });
249
-
250
- dataProvider.post("/update-one", async (ctx) => {
251
- let body = ctx.request.body;
252
- let bodyValidate = validateObject(body, "database collection query update");
253
-
254
- // fields validation
255
- if (!bodyValidate.isValid) {
256
- ctx.throw(
257
- JSON.stringify(reply("e", { error: bodyValidate.requires })),
258
- 412
259
- );
260
- }
261
-
262
- // access validation
263
- let hasAccess = service.checkAccess(
264
- body.database,
265
- body.collection,
266
- AccessTypes.write,
267
- body.query,
268
- ctx.state.user
269
- );
270
- if (!hasAccess) ctx.throw(403, "access denied");
271
-
272
- // collection validation
273
- let collection = service.getCollection(body.database, body.collection);
274
- if (collection == null) {
275
- ctx.throw(
276
- JSON.stringify(reply("e", { error: "wrong database or collection" })),
277
- 412
278
- );
279
- }
280
-
281
- // get removing doc as output for triggers
282
- let output = await collection.findOne(body.query).exec().then();
283
-
284
- // operate on db
285
- await collection
286
- .updateOne(body.query, body.update, body.options)
287
- .exec()
288
- .then((writeOpResult) => {
289
- // Call trigger
290
- service.triggers.call("update-one", body.database, body.collection, {
291
- query: body.query,
292
- queryResult: writeOpResult,
293
- });
294
-
295
- ctx.body = { data: writeOpResult };
296
- })
297
- .catch((err) => {
298
- ctx.status = err.status || 500;
299
- ctx.body = err.message;
300
- });
301
- });
302
-
303
- dataProvider.post("/insert-one", async (ctx) => {
304
- let body = ctx.request.body;
305
- let bodyValidate = validateObject(body, "database collection doc");
306
-
307
- // fields validation
308
- if (!bodyValidate.isValid) {
309
- ctx.throw(
310
- JSON.stringify(reply("e", { error: bodyValidate.requires })),
311
- 412
312
- );
313
- }
314
-
315
- // access validation
316
- let hasAccess = service.checkAccess(
317
- body.database,
318
- body.collection,
319
- AccessTypes.write,
320
- body.doc,
321
- ctx.state.user
322
- );
323
- if (!hasAccess) {
324
- console.log(body);
325
- console.log(ctx.state.user.permission);
326
- ctx.throw(403, "access denied");
327
- }
328
-
329
- // collection validation
330
- let collection = service.getCollection(body.database, body.collection);
331
- if (collection == null) {
332
- ctx.throw(
333
- JSON.stringify(reply("e", { error: "wrong database or collection" })),
334
- 412
335
- );
336
- }
337
-
338
- // operate on db
339
- await new collection(body.doc)
340
- .save()
341
- .then(async (newDoc) => {
342
- // Call trigger
343
- service.triggers.call("insert-one", body.database, body.collection, {
344
- query: body.query,
345
- queryResult: newDoc,
346
- });
347
-
348
- ctx.body = { data: newDoc };
349
- })
350
- .catch((err) => {
351
- ctx.status = err.status || 500;
352
- ctx.body = err.message;
353
- });
354
- });
355
-
356
- dataProvider.post("/remove-one", async (ctx) => {
357
- let body = ctx.request.body;
358
- let bodyValidate = validateObject(body, "database collection query");
359
-
360
- // fields validation
361
- if (!bodyValidate.isValid) {
362
- ctx.throw(
363
- JSON.stringify(reply("e", { error: bodyValidate.requires })),
364
- 412
365
- );
366
- }
367
-
368
- // access validation
369
- let hasAccess = service.checkAccess(
370
- body.database,
371
- body.collection,
372
- AccessTypes.write,
373
- body.query,
374
- ctx.state.user
375
- );
376
- if (!hasAccess) ctx.throw(403, "access denied");
377
-
378
- // collection validation
379
- let collection = service.getCollection(body.database, body.collection);
380
- if (collection == null) {
381
- ctx.throw(
382
- JSON.stringify(reply("e", { error: "wrong database or collection" })),
383
- 412
384
- );
385
- }
386
-
387
- // get removing doc as output for triggers
388
- let output = await collection.findOne(body.query).exec().then();
389
-
390
- // operate on db
391
- await collection
392
- .deleteOne(body.query)
393
- .exec()
394
- .then(async (result) => {
395
- // Call trigger
396
- service.triggers.call("remove-one", body.database, body.collection, {
397
- query: body.query,
398
- queryResult: result,
399
- });
400
-
401
- ctx.body = { data: result };
402
- })
403
- .catch((err) => {
404
- ctx.status = err.status || 500;
405
- ctx.body = err.message;
406
- });
407
- });
408
-
409
- dataProvider.post("/aggregate", async (ctx) => {
410
- let body = ctx.request.body;
411
- let bodyValidate = validateObject(body, "database collection accessQuery");
412
-
413
- // fields validation
414
- if (!bodyValidate.isValid) {
415
- ctx.throw(
416
- JSON.stringify(reply("e", { error: bodyValidate.requires })),
417
- 412
418
- );
419
- }
420
-
421
- // access validation
422
- let hasAccess = service.checkAccess(
423
- body.database,
424
- body.collection,
425
- AccessTypes.read,
426
- body.accessQuery,
427
- ctx.state.user
428
- );
429
- if (!hasAccess) ctx.throw(403, "access denied");
430
-
431
- // collection validation
432
- let collection = service.getCollection(body.database, body.collection);
433
- if (collection == null) {
434
- ctx.throw(
435
- JSON.stringify(reply("e", { error: "wrong database or collection" })),
436
- 412
437
- );
438
- }
439
-
440
- // operate on db
441
- await collection
442
- .aggregate(body.pipelines)
443
- .exec()
444
- .then(async (result) => {
445
- // Call trigger
446
- service.triggers.call("aggregate", body.database, body.collection, {
447
- query: body.query,
448
- queryResult: result,
449
- });
450
-
451
- ctx.body = { data: result };
452
- })
453
- .catch((err) => {
454
- ctx.status = err.status || 500;
455
- ctx.body = err.message;
456
- });
457
- });
458
-
459
- dataProvider.post("/findByIds", async (ctx, next) => {
460
- let body = ctx.request.body;
461
- let bodyValidate = validateObject(body, "database collection ids");
462
-
463
- // fields validation
464
- if (!bodyValidate.isValid) {
465
- ctx.throw(
466
- JSON.stringify(reply("e", { error: bodyValidate.requires })),
467
- 412
468
- );
469
- }
470
-
471
- // access validation
472
- let hasAccess = service.checkAccess(
473
- body.database,
474
- body.collection,
475
- AccessTypes.read,
476
- body.accessQuery || {},
477
- ctx.state.user
478
- );
479
- if (!hasAccess) ctx.throw(403, "access denied");
480
-
481
- // collection validation
482
- let collection = service.getCollection(body.database, body.collection);
483
- if (collection == null) {
484
- ctx.throw(
485
- JSON.stringify(reply("e", { error: "wrong database or collection" })),
486
- 412
487
- );
488
- }
489
-
490
- let or = [];
491
-
492
- try {
493
- body.ids.forEach((id) => {
494
- let castedid = service.getAsID(id);
495
- or.push({ _id: castedid });
496
- });
497
- } catch (e) {
498
- console.log("ids.forEach", e);
499
- }
500
-
501
- let pipelines = [
502
- {
503
- $match: { $or: or },
504
- },
505
- // {
506
- // $sort: body.sort || { _id: 1 }
507
- // }
508
- ];
509
-
510
- // operate on db
511
- await collection
512
- .aggregate(pipelines)
513
- .exec()
514
- .then(async (result) => {
515
- ctx.state = { data: result };
516
- await next();
517
- })
518
- .catch((err) => {
519
- ctx.status = err.status || 500;
520
- ctx.body = err.message;
521
- });
522
- });
523
-
524
- dataProvider.use("/", async (ctx, next) => {
525
- // this event is responsible to covert whole mongoose doc to json form
526
- // inclouding getters, public propertise
527
- // each mongoose doc must have a "toJson" method being defined on its own Schema.
528
-
529
- let state = ctx.state;
530
- // let result;
531
-
532
- // // array
533
- // if(!isNaN(state.length)) {
534
- // result = [];
535
-
536
- // for (let index = 0; index < state.length; index++) {
537
- // const element = state[index];
538
- // if(element.hasOwnProperty('toJson'))
539
- // result.push(element.toJson());
540
- // else result.push(element);
541
- // }
542
- // }
543
- // // object
544
- // else {
545
- // result = state.toJson();
546
- // }
547
-
548
- ctx.body = state;
549
- });
550
-
551
- module.exports.name = name;
552
- module.exports.main = dataProvider;