jxp 2.16.0 → 4.0.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 (218) hide show
  1. package/.env.sample +31 -6
  2. package/README.md +27 -13
  3. package/dist/bin/init_db.d.ts +3 -0
  4. package/dist/bin/init_db.d.ts.map +1 -0
  5. package/dist/bin/init_db.js +48 -0
  6. package/dist/bin/init_db.js.map +1 -0
  7. package/dist/bin/server.d.ts +4 -0
  8. package/dist/bin/server.d.ts.map +1 -0
  9. package/dist/bin/server.js +132 -0
  10. package/dist/bin/server.js.map +1 -0
  11. package/dist/bin/setup.d.ts +3 -0
  12. package/dist/bin/setup.d.ts.map +1 -0
  13. package/dist/bin/setup.js +185 -0
  14. package/dist/bin/setup.js.map +1 -0
  15. package/dist/globals.d.ts +14 -0
  16. package/dist/globals.d.ts.map +1 -0
  17. package/dist/globals.js +3 -0
  18. package/dist/globals.js.map +1 -0
  19. package/dist/libs/aggregate_guard.d.ts +5 -0
  20. package/dist/libs/aggregate_guard.d.ts.map +1 -0
  21. package/dist/libs/aggregate_guard.js +58 -0
  22. package/dist/libs/aggregate_guard.js.map +1 -0
  23. package/dist/libs/bulkwrite_guard.d.ts +5 -0
  24. package/dist/libs/bulkwrite_guard.d.ts.map +1 -0
  25. package/dist/libs/bulkwrite_guard.js +44 -0
  26. package/dist/libs/bulkwrite_guard.js.map +1 -0
  27. package/dist/libs/cache.d.ts +2 -0
  28. package/dist/libs/cache.d.ts.map +1 -0
  29. package/dist/libs/cache.js +94 -0
  30. package/dist/libs/cache.js.map +1 -0
  31. package/dist/libs/call_guard.d.ts +3 -0
  32. package/dist/libs/call_guard.d.ts.map +1 -0
  33. package/dist/libs/call_guard.js +17 -0
  34. package/dist/libs/call_guard.js.map +1 -0
  35. package/dist/libs/connection_string.d.ts +3 -0
  36. package/dist/libs/connection_string.d.ts.map +1 -0
  37. package/dist/libs/connection_string.js +4 -0
  38. package/dist/libs/connection_string.js.map +1 -0
  39. package/dist/libs/datamunging.d.ts +2 -0
  40. package/dist/libs/datamunging.d.ts.map +1 -0
  41. package/dist/libs/datamunging.js +320 -0
  42. package/dist/libs/datamunging.js.map +1 -0
  43. package/dist/libs/docs.d.ts +2 -0
  44. package/dist/libs/docs.d.ts.map +1 -0
  45. package/dist/libs/docs.js +307 -0
  46. package/dist/libs/docs.js.map +1 -0
  47. package/dist/libs/groups.d.ts +2 -0
  48. package/dist/libs/groups.d.ts.map +1 -0
  49. package/dist/libs/groups.js +136 -0
  50. package/dist/libs/groups.js.map +1 -0
  51. package/dist/libs/jxp.d.ts +4 -0
  52. package/dist/libs/jxp.d.ts.map +1 -0
  53. package/dist/libs/jxp.js +1157 -0
  54. package/dist/libs/jxp.js.map +1 -0
  55. package/dist/libs/link_index.d.ts +14 -0
  56. package/dist/libs/link_index.d.ts.map +1 -0
  57. package/dist/libs/link_index.js +37 -0
  58. package/dist/libs/link_index.js.map +1 -0
  59. package/dist/libs/load-config.d.ts +16 -0
  60. package/dist/libs/load-config.d.ts.map +1 -0
  61. package/dist/libs/load-config.js +155 -0
  62. package/dist/libs/load-config.js.map +1 -0
  63. package/dist/libs/login.d.ts +2 -0
  64. package/dist/libs/login.d.ts.map +1 -0
  65. package/dist/libs/login.js +244 -0
  66. package/dist/libs/login.js.map +1 -0
  67. package/dist/libs/modeldir.d.ts +5 -0
  68. package/dist/libs/modeldir.d.ts.map +1 -0
  69. package/dist/libs/modeldir.js +15 -0
  70. package/dist/libs/modeldir.js.map +1 -0
  71. package/dist/libs/query_limits.d.ts +2 -0
  72. package/dist/libs/query_limits.d.ts.map +1 -0
  73. package/dist/libs/query_limits.js +84 -0
  74. package/dist/libs/query_limits.js.map +1 -0
  75. package/dist/libs/query_manipulation.d.ts +3 -0
  76. package/dist/libs/query_manipulation.d.ts.map +1 -0
  77. package/{libs → dist/libs}/query_manipulation.js +22 -21
  78. package/dist/libs/query_manipulation.js.map +1 -0
  79. package/dist/libs/query_sanitize.d.ts +5 -0
  80. package/dist/libs/query_sanitize.d.ts.map +1 -0
  81. package/dist/libs/query_sanitize.js +109 -0
  82. package/dist/libs/query_sanitize.js.map +1 -0
  83. package/dist/libs/response_sanitize.d.ts +7 -0
  84. package/dist/libs/response_sanitize.d.ts.map +1 -0
  85. package/dist/libs/response_sanitize.js +57 -0
  86. package/dist/libs/response_sanitize.js.map +1 -0
  87. package/dist/libs/safe_error.d.ts +3 -0
  88. package/dist/libs/safe_error.d.ts.map +1 -0
  89. package/dist/libs/safe_error.js +14 -0
  90. package/dist/libs/safe_error.js.map +1 -0
  91. package/dist/libs/schema.d.ts +14 -0
  92. package/dist/libs/schema.d.ts.map +1 -0
  93. package/dist/libs/schema.js +98 -0
  94. package/dist/libs/schema.js.map +1 -0
  95. package/dist/libs/schema_description.d.ts +3 -0
  96. package/dist/libs/schema_description.d.ts.map +1 -0
  97. package/{libs → dist/libs}/schema_description.js +12 -21
  98. package/dist/libs/schema_description.js.map +1 -0
  99. package/dist/libs/security.d.ts +2 -0
  100. package/dist/libs/security.d.ts.map +1 -0
  101. package/dist/libs/security.js +428 -0
  102. package/dist/libs/security.js.map +1 -0
  103. package/dist/libs/setup.d.ts +2 -0
  104. package/dist/libs/setup.d.ts.map +1 -0
  105. package/dist/libs/setup.js +87 -0
  106. package/dist/libs/setup.js.map +1 -0
  107. package/dist/libs/startup-deprecations.d.ts +2 -0
  108. package/dist/libs/startup-deprecations.d.ts.map +1 -0
  109. package/dist/libs/startup-deprecations.js +21 -0
  110. package/dist/libs/startup-deprecations.js.map +1 -0
  111. package/dist/libs/startup.d.ts +16 -0
  112. package/dist/libs/startup.d.ts.map +1 -0
  113. package/dist/libs/startup.js +63 -0
  114. package/dist/libs/startup.js.map +1 -0
  115. package/dist/libs/ws.d.ts +2 -0
  116. package/dist/libs/ws.d.ts.map +1 -0
  117. package/{libs → dist/libs}/ws.js +114 -73
  118. package/dist/libs/ws.js.map +1 -0
  119. package/dist/models/apikey_model.d.ts +10 -0
  120. package/dist/models/apikey_model.d.ts.map +1 -0
  121. package/dist/models/apikey_model.js +14 -0
  122. package/dist/models/apikey_model.js.map +1 -0
  123. package/dist/models/link_model.d.ts +9 -0
  124. package/dist/models/link_model.d.ts.map +1 -0
  125. package/dist/models/link_model.js +20 -0
  126. package/dist/models/link_model.js.map +1 -0
  127. package/dist/models/refreshtoken_model.d.ts +11 -0
  128. package/dist/models/refreshtoken_model.d.ts.map +1 -0
  129. package/dist/models/refreshtoken_model.js +22 -0
  130. package/dist/models/refreshtoken_model.js.map +1 -0
  131. package/dist/models/test_model.d.ts +24 -0
  132. package/dist/models/test_model.d.ts.map +1 -0
  133. package/dist/models/test_model.js +44 -0
  134. package/dist/models/test_model.js.map +1 -0
  135. package/dist/models/token_model.d.ts +14 -0
  136. package/dist/models/token_model.d.ts.map +1 -0
  137. package/dist/models/token_model.js +25 -0
  138. package/dist/models/token_model.js.map +1 -0
  139. package/dist/models/user_model.d.ts +15 -0
  140. package/dist/models/user_model.d.ts.map +1 -0
  141. package/dist/models/user_model.js +38 -0
  142. package/dist/models/user_model.js.map +1 -0
  143. package/dist/models/usergroups_model.d.ts +9 -0
  144. package/dist/models/usergroups_model.d.ts.map +1 -0
  145. package/dist/models/usergroups_model.js +18 -0
  146. package/dist/models/usergroups_model.js.map +1 -0
  147. package/dist/types/jxp-config.d.ts +134 -0
  148. package/dist/types/jxp-config.d.ts.map +1 -0
  149. package/dist/types/jxp-config.js +3 -0
  150. package/dist/types/jxp-config.js.map +1 -0
  151. package/dist/types/schema-fields.d.ts +43 -0
  152. package/dist/types/schema-fields.d.ts.map +1 -0
  153. package/dist/types/schema-fields.js +3 -0
  154. package/dist/types/schema-fields.js.map +1 -0
  155. package/docs/aggregations.md +40 -21
  156. package/docs/api.md +55 -15
  157. package/docs/authentication.md +60 -37
  158. package/docs/bulk_writes.md +11 -8
  159. package/docs/caching.md +28 -11
  160. package/docs/changelog.md +237 -31
  161. package/docs/configuration.md +99 -118
  162. package/docs/hooks.md +12 -8
  163. package/docs/index.md +17 -17
  164. package/docs/installation.md +23 -18
  165. package/docs/permissions.md +33 -19
  166. package/docs/queries.md +9 -5
  167. package/docs/schemas.md +21 -10
  168. package/docs/special.md +4 -4
  169. package/docs/typescript.md +86 -0
  170. package/docs/websocket.md +99 -1
  171. package/mkdocs.yml +1 -0
  172. package/package.json +121 -69
  173. package/templates/api.pug +32 -0
  174. package/templates/app-server.js +43 -0
  175. package/templates/app.env.sample +8 -0
  176. package/templates/assets/api-console.js +133 -0
  177. package/templates/assets/docs.css +227 -0
  178. package/templates/index.pug +62 -2
  179. package/templates/layout.pug +17 -11
  180. package/templates/md.pug +1 -1
  181. package/templates/model.pug +117 -68
  182. package/templates/navbar.pug +14 -21
  183. package/templates/sidebar.pug +30 -0
  184. package/.env +0 -9
  185. package/.eslintrc.json +0 -20
  186. package/.jshintrc +0 -4
  187. package/.vscode/launch.json +0 -29
  188. package/.vscode/settings.json +0 -3
  189. package/Dockerfile +0 -7
  190. package/bin/init_db.js +0 -54
  191. package/bin/server.js +0 -84
  192. package/bin/setup.js +0 -190
  193. package/config_sample.json +0 -10
  194. package/docker-compose.yml +0 -32
  195. package/libs/cache.js +0 -92
  196. package/libs/connection_string.js +0 -24
  197. package/libs/datamunging.js +0 -335
  198. package/libs/docs.js +0 -162
  199. package/libs/groups.js +0 -133
  200. package/libs/jxp.js +0 -1208
  201. package/libs/login.js +0 -218
  202. package/libs/modeldir.js +0 -14
  203. package/libs/schema.js +0 -99
  204. package/libs/security.js +0 -410
  205. package/libs/setup.js +0 -90
  206. package/models/apikey_model.js +0 -10
  207. package/models/link_model.js +0 -17
  208. package/models/refreshtoken_model.js +0 -20
  209. package/models/test_model.js +0 -50
  210. package/models/token_model.js +0 -23
  211. package/models/user_model.js +0 -38
  212. package/models/usergroups_model.js +0 -15
  213. package/setup.sh +0 -3
  214. package/test/.eslintrc.json +0 -13
  215. package/test/init.js +0 -92
  216. package/test/setup.test.js +0 -62
  217. package/test/test.js +0 -1527
  218. package/test/wstest.js.old +0 -124
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const schema_1 = __importDefault(require("../libs/schema"));
7
+ const load_config_1 = require("../libs/load-config");
8
+ const RefreshTokenSchema = new schema_1.default({
9
+ user_id: { type: global.ObjectId, index: true },
10
+ refresh_token: { type: String, index: true },
11
+ expires_in: { type: Number, default: (0, load_config_1.getRefreshTokenExpiry)() },
12
+ }, {
13
+ perms: {
14
+ admin: "crud",
15
+ owner: "crud",
16
+ user: "",
17
+ },
18
+ });
19
+ RefreshTokenSchema.index({ expire_at: 1 }, { expireAfterSeconds: (0, load_config_1.getRefreshTokenExpiry)() });
20
+ const RefreshToken = schema_1.default.model("RefreshToken", RefreshTokenSchema);
21
+ exports.default = RefreshToken;
22
+ //# sourceMappingURL=refreshtoken_model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refreshtoken_model.js","sourceRoot":"","sources":["../../src/models/refreshtoken_model.ts"],"names":[],"mappings":";;;;;AAAA,4DAAuC;AACvC,qDAA4D;AAW5D,MAAM,kBAAkB,GAAG,IAAI,gBAAS,CACvC;IACC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;IAC/C,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE;IAC5C,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAA,mCAAqB,GAAE,EAAE;CAC9D,EACD;IACC,KAAK,EAAE;QACN,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,EAAE;KACR;CACD,CACD,CAAC;AAEF,kBAAkB,CAAC,KAAK,CACvB,EAAE,SAAS,EAAE,CAAC,EAAE,EAChB,EAAE,kBAAkB,EAAE,IAAA,mCAAqB,GAAE,EAAE,CAC/C,CAAC;AAEF,MAAM,YAAY,GAAG,gBAAS,CAAC,KAAK,CAAgB,cAAc,EAAE,kBAAkB,CAAC,CAAC;AACxF,kBAAe,YAAY,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { Types } from "mongoose";
2
+ export interface ITest {
3
+ _id?: Types.ObjectId;
4
+ foo?: string;
5
+ bar?: string;
6
+ user_id?: Types.ObjectId;
7
+ yack?: unknown;
8
+ shmack?: string[];
9
+ password?: string;
10
+ fulltext?: string;
11
+ link_id?: Types.ObjectId;
12
+ other_link_id?: Types.ObjectId;
13
+ string_array?: string[];
14
+ array_link_id?: Types.ObjectId[];
15
+ composite_array?: {
16
+ afoo?: string;
17
+ abar?: number;
18
+ }[];
19
+ mixed_array?: unknown[];
20
+ date_field?: Date;
21
+ }
22
+ declare const Test: import("mongoose").Model<ITest, {}, {}, {}, any>;
23
+ export default Test;
24
+ //# sourceMappingURL=test_model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_model.d.ts","sourceRoot":"","sources":["../../src/models/test_model.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,WAAW,KAAK;IACrB,GAAG,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;IACzB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;IACzB,aAAa,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;IACjC,eAAe,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrD,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,IAAI,CAAC;CAClB;AA0CD,QAAA,MAAM,IAAI,kDAA6C,CAAC;AACxD,eAAe,IAAI,CAAC"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const restify_errors_1 = __importDefault(require("restify-errors"));
7
+ const schema_1 = __importDefault(require("../libs/schema"));
8
+ const TestSchema = new schema_1.default({
9
+ foo: String,
10
+ bar: { type: String, unique: true, index: true, default: "Some Default" },
11
+ user_id: { type: global.ObjectId, link: "User" },
12
+ yack: global.Mixed,
13
+ shmack: [String],
14
+ password: String,
15
+ fulltext: { type: String, index: { text: true } },
16
+ link_id: { type: global.ObjectId, link: "Link" },
17
+ other_link_id: { type: global.ObjectId, link: "Link", map_to: "other_link" },
18
+ string_array: [String],
19
+ array_link_id: [{ type: global.ObjectId, link: "Link", map_to: "array_link", justOne: false }],
20
+ composite_array: [{ afoo: String, abar: Number }],
21
+ mixed_array: [global.Mixed],
22
+ date_field: { type: Date, index: true },
23
+ }, {
24
+ perms: {
25
+ admin: "crud",
26
+ owner: "crud",
27
+ user: "cr",
28
+ all: "r",
29
+ },
30
+ callable_statics: ["test"],
31
+ advanced_queries: { query: true, aggregate: true, bulkwrite: true },
32
+ });
33
+ TestSchema.statics.test = function () {
34
+ return "Testing OKAY!";
35
+ };
36
+ TestSchema.pre("save", function (next) {
37
+ if (this.bar == "Throw an error") {
38
+ throw new restify_errors_1.default.ImATeapotError("I'm a teapot");
39
+ }
40
+ next();
41
+ });
42
+ const Test = schema_1.default.model("Test", TestSchema);
43
+ exports.default = Test;
44
+ //# sourceMappingURL=test_model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test_model.js","sourceRoot":"","sources":["../../src/models/test_model.ts"],"names":[],"mappings":";;;;;AAAA,oEAAoC;AACpC,4DAAuC;AAqBvC,MAAM,UAAU,GAAG,IAAI,gBAAS,CAC/B;IACC,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE;IACzE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;IAChD,IAAI,EAAE,MAAM,CAAC,KAAK;IAClB,MAAM,EAAE,CAAC,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;IACjD,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;IAChD,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE;IAC5E,YAAY,EAAE,CAAC,MAAM,CAAC;IACtB,aAAa,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC9F,eAAe,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACjD,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;IAC3B,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;CACvC,EACD;IACC,KAAK,EAAE;QACN,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,IAAI;QACV,GAAG,EAAE,GAAG;KACR;IACD,gBAAgB,EAAE,CAAC,MAAM,CAAC;IAC1B,gBAAgB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE;CACnE,CACD,CAAC;AAEF,UAAU,CAAC,OAAO,CAAC,IAAI,GAAG;IACzB,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AAEF,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,IAAI;IACpC,IAAI,IAAI,CAAC,GAAG,IAAI,gBAAgB,EAAE,CAAC;QAClC,MAAM,IAAI,wBAAM,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,EAAE,CAAC;AACR,CAAC,CAAC,CAAC;AAEH,MAAM,IAAI,GAAG,gBAAS,CAAC,KAAK,CAAQ,MAAM,EAAE,UAAU,CAAC,CAAC;AACxD,kBAAe,IAAI,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Types } from "mongoose";
2
+ export interface IToken {
3
+ _id?: Types.ObjectId;
4
+ user_id?: Types.ObjectId;
5
+ provider?: string;
6
+ access_token?: string;
7
+ token_type?: string;
8
+ expires_in?: number;
9
+ last_accessed?: Date;
10
+ createdAt?: Date;
11
+ }
12
+ declare const Token: import("mongoose").Model<IToken, {}, {}, {}, any>;
13
+ export default Token;
14
+ //# sourceMappingURL=token_model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token_model.d.ts","sourceRoot":"","sources":["../../src/models/token_model.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,WAAW,MAAM;IACtB,GAAG,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;IACrB,OAAO,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,IAAI,CAAC;CACjB;AAsBD,QAAA,MAAM,KAAK,mDAAgD,CAAC;AAC5D,eAAe,KAAK,CAAC"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const schema_1 = __importDefault(require("../libs/schema"));
7
+ const load_config_1 = require("../libs/load-config");
8
+ const TokenSchema = new schema_1.default({
9
+ user_id: { type: global.ObjectId, index: true },
10
+ provider: String,
11
+ access_token: { type: String, index: true },
12
+ token_type: String,
13
+ expires_in: { type: Number, default: (0, load_config_1.getTokenExpiry)(), required: true },
14
+ last_accessed: { type: Date, default: Date.now, index: true },
15
+ }, {
16
+ perms: {
17
+ admin: "crud",
18
+ owner: "crud",
19
+ user: "",
20
+ },
21
+ });
22
+ TokenSchema.index({ expire_at: 1 }, { expireAfterSeconds: (0, load_config_1.getTokenExpiry)() });
23
+ const Token = schema_1.default.model("Token", TokenSchema);
24
+ exports.default = Token;
25
+ //# sourceMappingURL=token_model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token_model.js","sourceRoot":"","sources":["../../src/models/token_model.ts"],"names":[],"mappings":";;;;;AAAA,4DAAuC;AACvC,qDAAqD;AAcrD,MAAM,WAAW,GAAG,IAAI,gBAAS,CAChC;IACC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE;IAC/C,QAAQ,EAAE,MAAM;IAChB,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE;IAC3C,UAAU,EAAE,MAAM;IAClB,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAA,4BAAc,GAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;IACvE,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE;CAC7D,EACD;IACC,KAAK,EAAE;QACN,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,EAAE;KACR;CACD,CACD,CAAC;AAEF,WAAW,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,EAAE,kBAAkB,EAAE,IAAA,4BAAc,GAAE,EAAE,CAAC,CAAC;AAE9E,MAAM,KAAK,GAAG,gBAAS,CAAC,KAAK,CAAS,OAAO,EAAE,WAAW,CAAC,CAAC;AAC5D,kBAAe,KAAK,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { Types } from "mongoose";
2
+ export interface IUser {
3
+ _id?: Types.ObjectId;
4
+ name?: string;
5
+ urlid?: string;
6
+ email?: string;
7
+ password?: string;
8
+ admin?: boolean;
9
+ temp_hash?: string;
10
+ createdAt?: Date;
11
+ updatedAt?: Date;
12
+ }
13
+ declare const User: import("mongoose").Model<IUser, {}, {}, {}, any>;
14
+ export default User;
15
+ //# sourceMappingURL=user_model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user_model.d.ts","sourceRoot":"","sources":["../../src/models/user_model.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,WAAW,KAAK;IACrB,GAAG,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;CACjB;AAoCD,QAAA,MAAM,IAAI,kDAA6C,CAAC;AACxD,eAAe,IAAI,CAAC"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const mongoose_friendly_1 = __importDefault(require("mongoose-friendly"));
7
+ const schema_1 = __importDefault(require("../libs/schema"));
8
+ function toLower(v) {
9
+ if (v)
10
+ return v.toLowerCase();
11
+ return null;
12
+ }
13
+ const UserSchema = new schema_1.default({
14
+ name: { type: String },
15
+ urlid: { type: String, unique: true, index: true },
16
+ email: { type: String, unique: true, index: true, set: toLower },
17
+ password: String,
18
+ admin: Boolean,
19
+ temp_hash: String,
20
+ }, {
21
+ perms: {
22
+ admin: "crud",
23
+ owner: "cru",
24
+ user: "r",
25
+ member: "r",
26
+ api: "r",
27
+ },
28
+ });
29
+ UserSchema.path("name").validate(function (v) {
30
+ return v && v.length > 0;
31
+ }, "Name cannot be empty");
32
+ UserSchema.plugin(mongoose_friendly_1.default, {
33
+ source: "name",
34
+ friendly: "urlid",
35
+ });
36
+ const User = schema_1.default.model("User", UserSchema);
37
+ exports.default = User;
38
+ //# sourceMappingURL=user_model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user_model.js","sourceRoot":"","sources":["../../src/models/user_model.ts"],"names":[],"mappings":";;;;;AAAA,0EAAyC;AACzC,4DAAuC;AAevC,SAAS,OAAO,CAAC,CAA4B;IAC5C,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9B,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,gBAAS,CAC/B;IACC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;IACtB,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;IAClD,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE;IAChE,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,OAAO;IACd,SAAS,EAAE,MAAM;CACjB,EACD;IACC,KAAK,EAAE;QACN,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,GAAG;QACX,GAAG,EAAE,GAAG;KACR;CACD,CACD,CAAC;AAEF,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAS;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC1B,CAAC,EAAE,sBAAsB,CAAC,CAAC;AAE3B,UAAU,CAAC,MAAM,CAAC,2BAAQ,EAAE;IAC3B,MAAM,EAAE,MAAM;IACd,QAAQ,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,MAAM,IAAI,GAAG,gBAAS,CAAC,KAAK,CAAQ,MAAM,EAAE,UAAU,CAAC,CAAC;AACxD,kBAAe,IAAI,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Types } from "mongoose";
2
+ export interface IUserGroup {
3
+ _id?: Types.ObjectId;
4
+ user_id?: Types.ObjectId;
5
+ groups?: string[];
6
+ }
7
+ declare const UserGroup: import("mongoose").Model<IUserGroup, {}, {}, {}, any>;
8
+ export default UserGroup;
9
+ //# sourceMappingURL=usergroups_model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usergroups_model.d.ts","sourceRoot":"","sources":["../../src/models/usergroups_model.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,WAAW,UAAU;IAC1B,GAAG,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;IACrB,OAAO,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAeD,QAAA,MAAM,SAAS,uDAA4D,CAAC;AAC5E,eAAe,SAAS,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const schema_1 = __importDefault(require("../libs/schema"));
7
+ const UserGroupSchema = new schema_1.default({
8
+ user_id: { type: global.ObjectId, index: true, unique: true, link: "User" },
9
+ groups: [String],
10
+ }, {
11
+ perms: {
12
+ admin: "crud",
13
+ user: "r",
14
+ },
15
+ });
16
+ const UserGroup = schema_1.default.model("Usergroup", UserGroupSchema);
17
+ exports.default = UserGroup;
18
+ //# sourceMappingURL=usergroups_model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usergroups_model.js","sourceRoot":"","sources":["../../src/models/usergroups_model.ts"],"names":[],"mappings":";;;;;AAAA,4DAAuC;AASvC,MAAM,eAAe,GAAG,IAAI,gBAAS,CACpC;IACC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;IAC3E,MAAM,EAAE,CAAC,MAAM,CAAC;CAChB,EACD;IACC,KAAK,EAAE;QACN,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,GAAG;KACT;CACD,CACD,CAAC;AAEF,MAAM,SAAS,GAAG,gBAAS,CAAC,KAAK,CAAa,WAAW,EAAE,eAAe,CAAC,CAAC;AAC5E,kBAAe,SAAS,CAAC"}
@@ -0,0 +1,134 @@
1
+ import type { Server } from "restify";
2
+ import type { Model } from "mongoose";
3
+ export type JXPHook = (req: JXPRequest, res: JXPResponse, next: () => void) => void | Promise<void>;
4
+ export type JXPCallback = (modelname: string, item: unknown, user: unknown, opts?: {
5
+ soft?: boolean;
6
+ }) => void;
7
+ export interface JXPQueryLimits {
8
+ enabled?: boolean;
9
+ large_collection_threshold?: number;
10
+ max?: number;
11
+ /** Applied when client omits ?limit= (secure default) */
12
+ default?: number;
13
+ require_limit_always?: boolean;
14
+ /** Skip countDocuments unless ?page= or ?count=true */
15
+ skip_count_unless_paginated?: boolean;
16
+ }
17
+ export interface JXPSecurityConfig {
18
+ strip_fields?: string[];
19
+ filter_operators_deny?: string[];
20
+ aggregate_stages_allow?: string[];
21
+ bulk_operations_allow?: string[];
22
+ }
23
+ export interface JXPCorsConfig {
24
+ origins?: string[];
25
+ }
26
+ export interface JXPCacheConfig {
27
+ enabled?: boolean;
28
+ debug?: boolean;
29
+ ttl?: number;
30
+ }
31
+ export interface JXPOAuthProviderConfig {
32
+ auth_uri: string;
33
+ token_uri: string;
34
+ api_uri: string;
35
+ app_id: string;
36
+ app_secret: string;
37
+ scope?: string;
38
+ }
39
+ export interface JXPConfig {
40
+ port?: number;
41
+ url?: string;
42
+ server?: string;
43
+ apikey?: string;
44
+ secret?: string;
45
+ shared_secret?: string;
46
+ model_dir?: string;
47
+ log?: string;
48
+ mongo?: {
49
+ connection_string?: string;
50
+ server?: string;
51
+ db?: string;
52
+ options?: Record<string, unknown>;
53
+ };
54
+ debug?: boolean;
55
+ /** When true, skip default console startup lines (use custom banner in bin/server). */
56
+ quiet_startup?: boolean;
57
+ throttle?: Record<string, unknown>;
58
+ token_expiry?: number;
59
+ refresh_token_expiry?: number;
60
+ password_recovery_url?: string;
61
+ smtp_server?: string;
62
+ smtp_username?: string;
63
+ smtp_password?: string;
64
+ smtp_from?: string;
65
+ cache?: JXPCacheConfig;
66
+ cache_timeout?: string;
67
+ query_limits?: JXPQueryLimits;
68
+ security?: JXPSecurityConfig;
69
+ cors?: JXPCorsConfig;
70
+ oauth?: {
71
+ success_uri?: string;
72
+ fail_uri?: string;
73
+ [provider: string]: JXPOAuthProviderConfig | string | undefined;
74
+ };
75
+ callbacks?: {
76
+ put?: JXPCallback;
77
+ post?: JXPCallback;
78
+ delete?: JXPCallback;
79
+ get?: JXPCallback;
80
+ getOne?: JXPCallback;
81
+ update?: JXPCallback;
82
+ };
83
+ pre_hooks?: {
84
+ login?: JXPHook;
85
+ get?: JXPHook;
86
+ getOne?: JXPHook;
87
+ post?: JXPHook;
88
+ put?: JXPHook;
89
+ update?: JXPHook;
90
+ delete?: JXPHook;
91
+ };
92
+ post_hooks?: {
93
+ login?: (req: JXPRequest, res: JXPResponse) => void | Promise<void>;
94
+ };
95
+ }
96
+ /** Restify request extended by JXP middleware. */
97
+ export interface JXPRequest {
98
+ params: Record<string, string>;
99
+ query: Record<string, unknown>;
100
+ body?: Record<string, unknown>;
101
+ headers: Record<string, string | string[] | undefined>;
102
+ method: string;
103
+ route?: {
104
+ name?: string;
105
+ };
106
+ modelname?: string;
107
+ Model?: Model<unknown>;
108
+ config: JXPConfig;
109
+ username?: string;
110
+ path(): string;
111
+ }
112
+ /** Restify response extended by JXP middleware. */
113
+ export interface JXPResponse {
114
+ user?: {
115
+ _id: unknown;
116
+ email?: string;
117
+ name?: string;
118
+ admin?: boolean;
119
+ };
120
+ groups?: string[];
121
+ token?: unknown;
122
+ refresh_token?: unknown;
123
+ username?: string;
124
+ result?: unknown;
125
+ jxp_cache_key?: string;
126
+ header(name: string, value?: string): unknown;
127
+ send(body?: unknown): unknown;
128
+ json(body?: unknown): unknown;
129
+ writeHead(code: number, headers?: Record<string, unknown>): void;
130
+ write(chunk: string | Buffer): void;
131
+ end(chunk?: string | Buffer): void;
132
+ }
133
+ export type JXPFactory = (options: JXPConfig) => Server;
134
+ //# sourceMappingURL=jxp-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jxp-config.d.ts","sourceRoot":"","sources":["../../src/types/jxp-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=jxp-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jxp-config.js","sourceRoot":"","sources":["../../src/types/jxp-config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ import type { SchemaDefinitionProperty, SchemaTypeOptions } from "mongoose";
2
+ /** JXP field extensions on top of Mongoose schema types. */
3
+ export interface JXPFieldDefinition extends SchemaTypeOptions<unknown> {
4
+ link?: string;
5
+ map_to?: string;
6
+ virtual?: string;
7
+ justOne?: boolean;
8
+ alias?: string;
9
+ }
10
+ export interface JXPAdvancedQueries {
11
+ query?: boolean;
12
+ aggregate?: boolean;
13
+ bulkwrite?: boolean;
14
+ }
15
+ export interface JXPSchemaOptions {
16
+ perms?: Partial<Record<"admin" | "owner" | "user" | "all" | string, string>>;
17
+ timestamps?: boolean;
18
+ toJSON?: {
19
+ virtuals?: boolean;
20
+ };
21
+ toObject?: {
22
+ virtuals?: boolean;
23
+ };
24
+ query_limits?: {
25
+ enabled?: boolean;
26
+ large_collection_threshold?: number;
27
+ max?: number;
28
+ };
29
+ /** Static method names exposed via GET/POST /call/:modelname/:method_name */
30
+ callable_statics?: string[];
31
+ /** Opt out of HTTP advanced endpoints per model (default: query/aggregate on, bulkwrite off) */
32
+ advanced_queries?: JXPAdvancedQueries;
33
+ [key: string]: unknown;
34
+ }
35
+ export type JXPDefinition = Record<string, JXPFieldDefinition | JXPFieldDefinition[] | SchemaDefinitionProperty<unknown> | SchemaDefinitionProperty<unknown>[]>;
36
+ export interface JXPPerms {
37
+ admin: string;
38
+ owner: string;
39
+ user: string;
40
+ all: string;
41
+ [key: string]: string;
42
+ }
43
+ //# sourceMappingURL=schema-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-fields.d.ts","sourceRoot":"","sources":["../../src/types/schema-fields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE5E,4DAA4D;AAC5D,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB,CAAC,OAAO,CAAC;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAChC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAClC,YAAY,CAAC,EAAE;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,0BAA0B,CAAC,EAAE,MAAM,CAAC;QACpC,GAAG,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;IACF,6EAA6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,gGAAgG;IAChG,gBAAgB,CAAC,EAAE,kBAAkB,CAAC;IACtC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,CACjC,MAAM,EACJ,kBAAkB,GAClB,kBAAkB,EAAE,GACpB,wBAAwB,CAAC,OAAO,CAAC,GACjC,wBAAwB,CAAC,OAAO,CAAC,EAAE,CACrC,CAAC;AAEF,MAAM,WAAW,QAAQ;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACtB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=schema-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-fields.js","sourceRoot":"","sources":["../../src/types/schema-fields.ts"],"names":[],"mappings":""}
@@ -1,25 +1,39 @@
1
1
  # Aggregation Queries
2
2
 
3
- You can apply an aggregation pipeline through the `/aggregate/<modelname>` endpoint. See [MongoDB's aggregation documentation](https://docs.mongodb.com/manual/aggregation/).
3
+ You can apply an aggregation pipeline through the `/aggregate/<modelname>` endpoint. See [MongoDB's aggregation documentation](https://www.mongodb.com/docs/manual/aggregation/).
4
4
 
5
- POST the query as JSON, and wrap it with a "query" variable, like so *:
6
- ```JSON
5
+ Only allowlisted stages are permitted (e.g. `$match`, `$group`, `$lookup`, `$project`, `$sort`, `$limit`). Stages such as `$out`, `$merge`, and `$function` require an admin user. Disable per model with `advanced_queries: { aggregate: false }`.
6
+
7
+ POST the pipeline as a **JSON array**, or wrap it in a `"query"` property. Both forms are accepted:
8
+
9
+ ```json
10
+ [
11
+ {
12
+ "$group": {
13
+ "_id": null,
14
+ "count": {
15
+ "$sum": 1
16
+ }
17
+ }
18
+ }
19
+ ]
20
+ ```
21
+
22
+ ```json
7
23
  {
8
24
  "query": [
9
25
  {
10
- "$group": {
26
+ "$group": {
11
27
  "_id": null,
12
- "count": {
13
- "$sum": 1
14
- }
15
- }
28
+ "count": {
29
+ "$sum": 1
30
+ }
31
+ }
16
32
  }
17
33
  ]
18
34
  }
19
35
  ```
20
36
 
21
- * Note that embedding in a "query" is no longer necessary
22
-
23
37
  ### Aggregations with ObjectIds
24
38
 
25
39
  Because we can't define ObjectIds in our aggregate functions, we need to send the ObjectIds as strings and then convert them in the pipeline.
@@ -27,12 +41,13 @@ Because we can't define ObjectIds in our aggregate functions, we need to send th
27
41
  There are two ways of doing this. We can embed `"ObjectId(\"<your object id>\")"` or you can convert in the pipeline. Embedding will be faster on execution.
28
42
 
29
43
  Embedding:
30
- ```JSON
44
+
45
+ ```json
31
46
  {
32
47
  "query": [
33
48
  {
34
49
  "$match": {
35
- "$campaign_id", "ObjectId(\"5fd45d05f2b93af8d59588fb\")"
50
+ "campaign_id": "ObjectId(\"5fd45d05f2b93af8d59588fb\")"
36
51
  }
37
52
  }
38
53
  ]
@@ -40,13 +55,14 @@ Embedding:
40
55
  ```
41
56
 
42
57
  Using a pipeline to add a field:
43
- ```JSON
58
+
59
+ ```json
44
60
  {
45
61
  "query": [
46
- {
62
+ {
47
63
  "$addFields": {
48
64
  "campaign_id_obj": {
49
- "$toObjectId": "5fd45d05f2b93af8d59588fb"
65
+ "$toObjectId": "5fd45d05f2b93af8d59588fb"
50
66
  }
51
67
  }
52
68
  },
@@ -70,12 +86,13 @@ Because we can't define Date objects in our aggregate functions, we need to send
70
86
  There are two ways of doing this. We can embed `"new Date(\"<your date>\")"` or you can convert in the pipeline. Embedding will be faster on execution.
71
87
 
72
88
  Embedding:
73
- ```JSON
89
+
90
+ ```json
74
91
  {
75
92
  "query": [
76
93
  {
77
94
  "$match": {
78
- "$timestamp": {
95
+ "timestamp": {
79
96
  "$gte": "new Date(\"2021-03-03T00:00:00.0Z\")"
80
97
  }
81
98
  }
@@ -85,7 +102,8 @@ Embedding:
85
102
  ```
86
103
 
87
104
  Using a pipeline to add a date field:
88
- ```JSON
105
+
106
+ ```json
89
107
  {
90
108
  "query": [
91
109
  {
@@ -115,12 +133,13 @@ Using a pipeline to add a date field:
115
133
  Say you want to use a date relative to today's date, you can use `relative_date(offset, offset_unit, startof_unit, endof_unit)`, similar to the method of embedding in a string above. It will also take `null` as a value.
116
134
 
117
135
  Eg. to get the beginning of this month:
118
- ```JSON
136
+
137
+ ```json
119
138
  {
120
139
  "query": [
121
140
  {
122
141
  "$match": {
123
- "$timestamp": {
142
+ "timestamp": {
124
143
  "$gte": "relative_date(null, null, \"month\")"
125
144
  }
126
145
  }
@@ -131,4 +150,4 @@ Eg. to get the beginning of this month:
131
150
 
132
151
  ### AllowDiskUse
133
152
 
134
- ***Tip*** Aggregates can use a lot of memory. If you're unable to complete your query, try using the disk. To enable allowDiskUse, add `?allowDiskUse=true` as a query parameter to the calling url.
153
+ Aggregates can use a lot of memory. If you're unable to complete your query, try using the disk. To enable `allowDiskUse`, add `?allowDiskUse=true` as a query parameter to the calling URL.