jxp 3.0.0 → 4.1.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 +43 -6
- package/README.md +27 -13
- package/dist/bin/init_db.d.ts +3 -0
- package/dist/bin/init_db.d.ts.map +1 -0
- package/dist/bin/init_db.js +48 -0
- package/dist/bin/init_db.js.map +1 -0
- package/dist/bin/server.d.ts +4 -0
- package/dist/bin/server.d.ts.map +1 -0
- package/dist/bin/server.js +132 -0
- package/dist/bin/server.js.map +1 -0
- package/dist/bin/setup.d.ts +3 -0
- package/dist/bin/setup.d.ts.map +1 -0
- package/dist/bin/setup.js +185 -0
- package/dist/bin/setup.js.map +1 -0
- package/dist/globals.d.ts +14 -0
- package/dist/globals.d.ts.map +1 -0
- package/dist/globals.js +3 -0
- package/dist/globals.js.map +1 -0
- package/dist/libs/aggregate_guard.d.ts +5 -0
- package/dist/libs/aggregate_guard.d.ts.map +1 -0
- package/dist/libs/aggregate_guard.js +58 -0
- package/dist/libs/aggregate_guard.js.map +1 -0
- package/dist/libs/bulkwrite_guard.d.ts +5 -0
- package/dist/libs/bulkwrite_guard.d.ts.map +1 -0
- package/dist/libs/bulkwrite_guard.js +44 -0
- package/dist/libs/bulkwrite_guard.js.map +1 -0
- package/dist/libs/cache.d.ts +2 -0
- package/dist/libs/cache.d.ts.map +1 -0
- package/dist/libs/cache.js +94 -0
- package/dist/libs/cache.js.map +1 -0
- package/dist/libs/call_guard.d.ts +3 -0
- package/dist/libs/call_guard.d.ts.map +1 -0
- package/dist/libs/call_guard.js +17 -0
- package/dist/libs/call_guard.js.map +1 -0
- package/dist/libs/connection_string.d.ts +3 -0
- package/dist/libs/connection_string.d.ts.map +1 -0
- package/dist/libs/connection_string.js +4 -0
- package/dist/libs/connection_string.js.map +1 -0
- package/dist/libs/datamunging.d.ts +2 -0
- package/dist/libs/datamunging.d.ts.map +1 -0
- package/dist/libs/datamunging.js +320 -0
- package/dist/libs/datamunging.js.map +1 -0
- package/dist/libs/docs-auth.d.ts +25 -0
- package/dist/libs/docs-auth.d.ts.map +1 -0
- package/dist/libs/docs-auth.js +205 -0
- package/dist/libs/docs-auth.js.map +1 -0
- package/dist/libs/docs.d.ts +2 -0
- package/dist/libs/docs.d.ts.map +1 -0
- package/dist/libs/docs.js +328 -0
- package/dist/libs/docs.js.map +1 -0
- package/dist/libs/groups.d.ts +2 -0
- package/dist/libs/groups.d.ts.map +1 -0
- package/dist/libs/groups.js +136 -0
- package/dist/libs/groups.js.map +1 -0
- package/dist/libs/jxp.d.ts +4 -0
- package/dist/libs/jxp.d.ts.map +1 -0
- package/dist/libs/jxp.js +1176 -0
- package/dist/libs/jxp.js.map +1 -0
- package/dist/libs/link_index.d.ts +14 -0
- package/dist/libs/link_index.d.ts.map +1 -0
- package/dist/libs/link_index.js +37 -0
- package/dist/libs/link_index.js.map +1 -0
- package/dist/libs/load-config.d.ts +16 -0
- package/dist/libs/load-config.d.ts.map +1 -0
- package/dist/libs/load-config.js +166 -0
- package/dist/libs/load-config.js.map +1 -0
- package/dist/libs/login.d.ts +2 -0
- package/dist/libs/login.d.ts.map +1 -0
- package/dist/libs/login.js +244 -0
- package/dist/libs/login.js.map +1 -0
- package/dist/libs/login_rate_limit.d.ts +16 -0
- package/dist/libs/login_rate_limit.d.ts.map +1 -0
- package/dist/libs/login_rate_limit.js +49 -0
- package/dist/libs/login_rate_limit.js.map +1 -0
- package/dist/libs/modeldir.d.ts +5 -0
- package/dist/libs/modeldir.d.ts.map +1 -0
- package/dist/libs/modeldir.js +15 -0
- package/dist/libs/modeldir.js.map +1 -0
- package/dist/libs/query_limits.d.ts +2 -0
- package/dist/libs/query_limits.d.ts.map +1 -0
- package/dist/libs/query_limits.js +84 -0
- package/dist/libs/query_limits.js.map +1 -0
- package/dist/libs/query_manipulation.d.ts +3 -0
- package/dist/libs/query_manipulation.d.ts.map +1 -0
- package/{libs → dist/libs}/query_manipulation.js +22 -21
- package/dist/libs/query_manipulation.js.map +1 -0
- package/dist/libs/query_sanitize.d.ts +5 -0
- package/dist/libs/query_sanitize.d.ts.map +1 -0
- package/dist/libs/query_sanitize.js +109 -0
- package/dist/libs/query_sanitize.js.map +1 -0
- package/dist/libs/response_sanitize.d.ts +7 -0
- package/dist/libs/response_sanitize.d.ts.map +1 -0
- package/dist/libs/response_sanitize.js +57 -0
- package/dist/libs/response_sanitize.js.map +1 -0
- package/dist/libs/safe_error.d.ts +3 -0
- package/dist/libs/safe_error.d.ts.map +1 -0
- package/dist/libs/safe_error.js +14 -0
- package/dist/libs/safe_error.js.map +1 -0
- package/dist/libs/schema.d.ts +14 -0
- package/dist/libs/schema.d.ts.map +1 -0
- package/dist/libs/schema.js +98 -0
- package/dist/libs/schema.js.map +1 -0
- package/dist/libs/schema_description.d.ts +3 -0
- package/dist/libs/schema_description.d.ts.map +1 -0
- package/{libs → dist/libs}/schema_description.js +12 -21
- package/dist/libs/schema_description.js.map +1 -0
- package/dist/libs/security.d.ts +2 -0
- package/dist/libs/security.d.ts.map +1 -0
- package/dist/libs/security.js +428 -0
- package/dist/libs/security.js.map +1 -0
- package/dist/libs/setup.d.ts +2 -0
- package/dist/libs/setup.d.ts.map +1 -0
- package/dist/libs/setup.js +87 -0
- package/dist/libs/setup.js.map +1 -0
- package/dist/libs/startup-deprecations.d.ts +2 -0
- package/dist/libs/startup-deprecations.d.ts.map +1 -0
- package/dist/libs/startup-deprecations.js +21 -0
- package/dist/libs/startup-deprecations.js.map +1 -0
- package/dist/libs/startup.d.ts +16 -0
- package/dist/libs/startup.d.ts.map +1 -0
- package/dist/libs/startup.js +63 -0
- package/dist/libs/startup.js.map +1 -0
- package/dist/libs/ws.d.ts +2 -0
- package/dist/libs/ws.d.ts.map +1 -0
- package/{libs → dist/libs}/ws.js +91 -73
- package/dist/libs/ws.js.map +1 -0
- package/dist/models/apikey_model.d.ts +10 -0
- package/dist/models/apikey_model.d.ts.map +1 -0
- package/dist/models/apikey_model.js +14 -0
- package/dist/models/apikey_model.js.map +1 -0
- package/dist/models/link_model.d.ts +9 -0
- package/dist/models/link_model.d.ts.map +1 -0
- package/dist/models/link_model.js +20 -0
- package/dist/models/link_model.js.map +1 -0
- package/dist/models/refreshtoken_model.d.ts +11 -0
- package/dist/models/refreshtoken_model.d.ts.map +1 -0
- package/dist/models/refreshtoken_model.js +22 -0
- package/dist/models/refreshtoken_model.js.map +1 -0
- package/dist/models/test_model.d.ts +24 -0
- package/dist/models/test_model.d.ts.map +1 -0
- package/dist/models/test_model.js +44 -0
- package/dist/models/test_model.js.map +1 -0
- package/dist/models/token_model.d.ts +14 -0
- package/dist/models/token_model.d.ts.map +1 -0
- package/dist/models/token_model.js +25 -0
- package/dist/models/token_model.js.map +1 -0
- package/dist/models/user_model.d.ts +15 -0
- package/dist/models/user_model.d.ts.map +1 -0
- package/dist/models/user_model.js +38 -0
- package/dist/models/user_model.js.map +1 -0
- package/dist/models/usergroups_model.d.ts +9 -0
- package/dist/models/usergroups_model.d.ts.map +1 -0
- package/dist/models/usergroups_model.js +18 -0
- package/dist/models/usergroups_model.js.map +1 -0
- package/dist/types/jxp-config.d.ts +151 -0
- package/dist/types/jxp-config.d.ts.map +1 -0
- package/dist/types/jxp-config.js +3 -0
- package/dist/types/jxp-config.js.map +1 -0
- package/dist/types/schema-fields.d.ts +43 -0
- package/dist/types/schema-fields.d.ts.map +1 -0
- package/dist/types/schema-fields.js +3 -0
- package/dist/types/schema-fields.js.map +1 -0
- package/docs/aggregations.md +40 -21
- package/docs/api.md +55 -15
- package/docs/authentication.md +60 -37
- package/docs/bulk_writes.md +11 -8
- package/docs/caching.md +28 -11
- package/docs/changelog.md +258 -31
- package/docs/configuration.md +126 -115
- package/docs/hooks.md +12 -8
- package/docs/index.md +17 -17
- package/docs/installation.md +23 -18
- package/docs/permissions.md +33 -19
- package/docs/queries.md +9 -5
- package/docs/schemas.md +21 -10
- package/docs/special.md +4 -4
- package/docs/typescript.md +86 -0
- package/docs/websocket.md +99 -1
- package/mkdocs.yml +1 -0
- package/package.json +121 -69
- package/templates/api.pug +32 -0
- package/templates/app-server.js +43 -0
- package/templates/app.env.sample +8 -0
- package/templates/assets/api-console.js +151 -0
- package/templates/assets/docs-login.js +66 -0
- package/templates/assets/docs.css +244 -0
- package/templates/index.pug +67 -2
- package/templates/layout.pug +21 -11
- package/templates/login.pug +39 -0
- package/templates/md.pug +1 -1
- package/templates/model.pug +117 -68
- package/templates/navbar.pug +25 -21
- package/templates/sidebar.pug +30 -0
- package/.env +0 -9
- package/.eslintrc.json +0 -20
- package/.jshintrc +0 -4
- package/.vscode/launch.json +0 -34
- package/.vscode/settings.json +0 -3
- package/Dockerfile +0 -7
- package/bin/init_db.js +0 -54
- package/bin/server.js +0 -131
- package/bin/setup.js +0 -190
- package/config_sample.json +0 -10
- package/docker-compose.yml +0 -32
- package/libs/cache.js +0 -92
- package/libs/connection_string.js +0 -24
- package/libs/datamunging.js +0 -335
- package/libs/docs.js +0 -162
- package/libs/groups.js +0 -133
- package/libs/jxp.js +0 -1208
- package/libs/login.js +0 -222
- package/libs/modeldir.js +0 -14
- package/libs/schema.js +0 -99
- package/libs/security.js +0 -410
- package/libs/setup.js +0 -90
- package/models/apikey_model.js +0 -10
- package/models/link_model.js +0 -17
- package/models/refreshtoken_model.js +0 -20
- package/models/test_model.js +0 -50
- package/models/token_model.js +0 -23
- package/models/user_model.js +0 -38
- package/models/usergroups_model.js +0 -15
- package/setup.sh +0 -3
- package/test/.eslintrc.json +0 -13
- package/test/auth.js +0 -190
- package/test/init.js +0 -92
- package/test/setup.test.js +0 -62
- package/test/test.js +0 -1527
- package/test/wstest.js.old +0 -124
package/.env.sample
CHANGED
|
@@ -1,6 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
# Server
|
|
2
|
+
PORT=4001
|
|
3
|
+
NODE_DOCKER_PORT=4001
|
|
4
|
+
API_URL=http://localhost:4001
|
|
5
|
+
|
|
6
|
+
# MongoDB — use MONGO_CONNECTION_STRING or individual MONGODB_* vars
|
|
7
|
+
MONGO_CONNECTION_STRING=mongodb://127.0.0.1:27017/jxp
|
|
8
|
+
# MONGODB_HOST=127.0.0.1
|
|
9
|
+
# MONGODB_PORT=27017
|
|
10
|
+
# MONGODB_NAME=jxp
|
|
11
|
+
# MONGODB_USER=
|
|
12
|
+
# MONGODB_PASSWORD=
|
|
13
|
+
# MONGODB_AUTH_DB=admin
|
|
14
|
+
|
|
15
|
+
# Auth / tokens
|
|
16
|
+
SHARED_SECRET=change-me
|
|
17
|
+
TOKEN_EXPIRY=86400
|
|
18
|
+
REFRESH_TOKEN_EXPIRY=2678400
|
|
19
|
+
|
|
20
|
+
# Paths
|
|
21
|
+
MODEL_DIR=./dist/models
|
|
22
|
+
LOG_FILE=access.log
|
|
23
|
+
|
|
24
|
+
# API docs browser: protected (default) | disabled | public
|
|
25
|
+
# Protected: home + guides public; /docs/api and /docs/model/* need POST /login
|
|
26
|
+
# DOCS_ACCESS=protected
|
|
27
|
+
# DOCS_USER_EMAIL=docs@example.com
|
|
28
|
+
# DOCS_COOKIE_SECURE=true
|
|
29
|
+
|
|
30
|
+
# Login brute-force protection (default on): per-IP token bucket on POST /login and POST /docs/session
|
|
31
|
+
# LOGIN_RATE_LIMIT_ENABLED=true
|
|
32
|
+
# LOGIN_RATE_BURST=8
|
|
33
|
+
# LOGIN_RATE_PER_MINUTE=12
|
|
34
|
+
# LOGIN_RATE_LIMIT_XFF=true
|
|
35
|
+
|
|
36
|
+
# Optional
|
|
37
|
+
# APIKEY=
|
|
38
|
+
# DEBUG=false
|
|
39
|
+
# CACHE_ENABLED=false
|
|
40
|
+
# CACHE_TTL=300
|
|
41
|
+
# QUERY_LIMITS_MAX=1000
|
|
42
|
+
# QUERY_LIMITS_DEFAULT=100
|
|
43
|
+
# CORS_ORIGINS=http://localhost:3000,http://localhost:4001
|
package/README.md
CHANGED
|
@@ -22,21 +22,35 @@ JXP is an opinionated RESTful API framework that lets you make an API just by de
|
|
|
22
22
|
|
|
23
23
|
npm install -g jxp
|
|
24
24
|
jxp-setup my-app
|
|
25
|
-
cd my-
|
|
25
|
+
cd my-app
|
|
26
26
|
npm start
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
* [Installation](https://jxp.readthedocs.io/en/v2.0.0/installation)
|
|
31
|
-
* [Configuration](https://jxp.readthedocs.io/en/v2.0.0/configuration)
|
|
32
|
-
* [Authentication](https://jxp.readthedocs.io/en/v2.0.0/authentication)
|
|
33
|
-
* [Schemas](https://jxp.readthedocs.io/en/v2.0.0/schemas)
|
|
34
|
-
* [Restful API](https://jxp.readthedocs.io/en/v2.0.0/api)
|
|
35
|
-
* [Roles and Permissions](https://jxp.readthedocs.io/en/v2.0.0/permissions)
|
|
36
|
-
* [Hooks](https://jxp.readthedocs.io/en/v2.0.0/hooks)
|
|
37
|
-
* [Special Features](https://jxp.readthedocs.io/en/v2.0.0/special)
|
|
38
|
-
* [Changelog](https://jxp.readthedocs.io/en/v2.0.0/changelog)
|
|
28
|
+
Requires **Node.js 22+**.
|
|
39
29
|
|
|
40
30
|
## Installing from source
|
|
41
31
|
|
|
42
|
-
|
|
32
|
+
```bash
|
|
33
|
+
npm i --legacy-peer-deps
|
|
34
|
+
npm run build # compiles TypeScript (runs on git clone install when src/ is present)
|
|
35
|
+
npm start # sample server at dist/bin/server.js
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Requires **Node.js 22+** and MongoDB for the sample server and integration tests.
|
|
39
|
+
|
|
40
|
+
## TypeScript
|
|
41
|
+
|
|
42
|
+
JXP 4 is implemented in TypeScript. See [docs/typescript.md](docs/typescript.md) for building from source, consuming types in JavaScript apps, and authoring typed models.
|
|
43
|
+
|
|
44
|
+
## Documentation
|
|
45
|
+
|
|
46
|
+
* [TypeScript / v4 migration](docs/typescript.md)
|
|
47
|
+
* [Installation](https://jxp.readthedocs.io/en/latest/installation/)
|
|
48
|
+
* [Configuration](https://jxp.readthedocs.io/en/latest/configuration/)
|
|
49
|
+
* [Authentication](https://jxp.readthedocs.io/en/latest/authentication/)
|
|
50
|
+
* [Schemas](https://jxp.readthedocs.io/en/latest/schemas/)
|
|
51
|
+
* [Restful API](https://jxp.readthedocs.io/en/latest/api/)
|
|
52
|
+
* [Roles and Permissions](https://jxp.readthedocs.io/en/latest/permissions/)
|
|
53
|
+
* [Hooks](https://jxp.readthedocs.io/en/latest/hooks/)
|
|
54
|
+
* [Special Features](https://jxp.readthedocs.io/en/latest/special/)
|
|
55
|
+
* [Changelog](https://jxp.readthedocs.io/en/latest/changelog/)
|
|
56
|
+
* [Full docs](https://jxp.readthedocs.io/en/latest/)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init_db.d.ts","sourceRoot":"","sources":["../../src/bin/init_db.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#! /usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const program = require("commander");
|
|
5
|
+
const readline = require("readline-sync");
|
|
6
|
+
const mongoose = require("mongoose");
|
|
7
|
+
const path = require("path");
|
|
8
|
+
const security = require("../libs/security");
|
|
9
|
+
const { getMongoConnectionString, loadEnv } = require("../libs/load-config");
|
|
10
|
+
const schemaModule = require("../libs/schema");
|
|
11
|
+
global.JXPSchema = schemaModule.default || schemaModule;
|
|
12
|
+
loadEnv();
|
|
13
|
+
const modelDir = process.env.MODEL_DIR || path.resolve(process.cwd(), "dist/models");
|
|
14
|
+
const User = require(path.join(modelDir, "user_model"));
|
|
15
|
+
const UserModel = User.default || User;
|
|
16
|
+
const pkg = require("../../package.json");
|
|
17
|
+
program
|
|
18
|
+
.version(pkg.version)
|
|
19
|
+
.usage("[options] [dir]")
|
|
20
|
+
.option("-v, --version", "JXP version")
|
|
21
|
+
.option("-e, --email <user>", "Admin user email")
|
|
22
|
+
.option("-p, --password <password>", "Admin password")
|
|
23
|
+
.option("-u, --username <name>", "Admin user name")
|
|
24
|
+
.parse();
|
|
25
|
+
const opts = program.opts();
|
|
26
|
+
async function main() {
|
|
27
|
+
const email = opts.email || readline.question("Admin user email: ");
|
|
28
|
+
const password = opts.password || readline.question("Admin user password: ");
|
|
29
|
+
const name = opts.username ||
|
|
30
|
+
readline.question("Admin user name (Admin): ", { defaultInput: "Admin" });
|
|
31
|
+
await mongoose.connect(getMongoConnectionString());
|
|
32
|
+
const user = new UserModel();
|
|
33
|
+
user.email = email;
|
|
34
|
+
user.password = security.encPassword(password);
|
|
35
|
+
user.name = name;
|
|
36
|
+
user.admin = true;
|
|
37
|
+
try {
|
|
38
|
+
await user.save();
|
|
39
|
+
console.log("Created admin user", name, "<" + email + ">");
|
|
40
|
+
process.exit(0);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
console.log("Error:", err.message);
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
main();
|
|
48
|
+
//# sourceMappingURL=init_db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init_db.js","sourceRoot":"","sources":["../../src/bin/init_db.ts"],"names":[],"mappings":";;;AACA,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;AAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACrC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAC7C,MAAM,EAAE,wBAAwB,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAE7E,MAAM,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC/C,MAAM,CAAC,SAAS,GAAG,YAAY,CAAC,OAAO,IAAI,YAAY,CAAC;AAExD,OAAO,EAAE,CAAC;AACV,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC;AACrF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;AACxD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;AAEvC,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAE1C,OAAO;KACL,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,KAAK,CAAC,iBAAiB,CAAC;KACxB,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC;KACtC,MAAM,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;KAChD,MAAM,CAAC,2BAA2B,EAAE,gBAAgB,CAAC;KACrD,MAAM,CAAC,uBAAuB,EAAE,iBAAiB,CAAC;KAClD,KAAK,EAAE,CAAC;AAEV,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;AAE5B,KAAK,UAAU,IAAI;IAClB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;IAC7E,MAAM,IAAI,GACT,IAAI,CAAC,QAAQ;QACb,QAAQ,CAAC,QAAQ,CAAC,2BAA2B,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;IAE3E,MAAM,QAAQ,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;IAC7B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACjB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IAClB,IAAI,CAAC;QACJ,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,EAAE,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC;AAED,IAAI,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/bin/server.ts"],"names":[],"mappings":"AAUA,OAAO,8BAA8B,CAAC;AAgHtC,QAAA,MAAM,MAAM,KAAiB,CAAC;AAoB9B,SAAS,MAAM,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
=================
|
|
4
|
+
JXP - Express API
|
|
5
|
+
=================
|
|
6
|
+
|
|
7
|
+
Documentation:
|
|
8
|
+
https://jxp.readthedocs.io/en/latest/
|
|
9
|
+
|
|
10
|
+
*/
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
require("../libs/startup-deprecations");
|
|
15
|
+
const path_1 = __importDefault(require("path"));
|
|
16
|
+
const mongoose_1 = __importDefault(require("mongoose"));
|
|
17
|
+
const JXP = require("../libs/jxp");
|
|
18
|
+
const load_config_1 = require("../libs/load-config");
|
|
19
|
+
const startup_1 = require("../libs/startup");
|
|
20
|
+
const package_json_1 = __importDefault(require("../../package.json"));
|
|
21
|
+
const apiconfig = (0, load_config_1.loadJxpConfig)();
|
|
22
|
+
apiconfig.quiet_startup = true;
|
|
23
|
+
apiconfig.callbacks = {
|
|
24
|
+
post: function () { },
|
|
25
|
+
put: function () { },
|
|
26
|
+
delete: function () { },
|
|
27
|
+
};
|
|
28
|
+
apiconfig.pre_hooks = {
|
|
29
|
+
login: (_req, _res, next) => {
|
|
30
|
+
next();
|
|
31
|
+
},
|
|
32
|
+
get: (_req, _res, next) => {
|
|
33
|
+
next();
|
|
34
|
+
},
|
|
35
|
+
getOne: (_req, _res, next) => {
|
|
36
|
+
next();
|
|
37
|
+
},
|
|
38
|
+
post: (_req, _res, next) => {
|
|
39
|
+
next();
|
|
40
|
+
},
|
|
41
|
+
put: (_req, _res, next) => {
|
|
42
|
+
next();
|
|
43
|
+
},
|
|
44
|
+
delete: (_req, _res, next) => {
|
|
45
|
+
next();
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
mongoose_1.default.Promise = Promise;
|
|
49
|
+
mongoose_1.default.set("strictQuery", true);
|
|
50
|
+
if (!apiconfig.mongo)
|
|
51
|
+
apiconfig.mongo = {};
|
|
52
|
+
if (!apiconfig.mongo.options)
|
|
53
|
+
apiconfig.mongo.options = {};
|
|
54
|
+
const mongo_options = Object.assign(apiconfig.mongo.options, {
|
|
55
|
+
useNewUrlParser: true,
|
|
56
|
+
useUnifiedTopology: true,
|
|
57
|
+
serverSelectionTimeoutMS: 10000,
|
|
58
|
+
socketTimeoutMS: 45000,
|
|
59
|
+
maxPoolSize: process.env.NODE_ENV === "test" ? 20 : 50,
|
|
60
|
+
minPoolSize: process.env.NODE_ENV === "test" ? 5 : 10,
|
|
61
|
+
maxIdleTimeMS: 30000,
|
|
62
|
+
connectTimeoutMS: 10000,
|
|
63
|
+
heartbeatFrequencyMS: 10000,
|
|
64
|
+
retryWrites: true,
|
|
65
|
+
retryReads: true,
|
|
66
|
+
});
|
|
67
|
+
const connection_string = (0, load_config_1.getMongoConnectionString)();
|
|
68
|
+
const startupCtx = {
|
|
69
|
+
name: package_json_1.default.name,
|
|
70
|
+
version: package_json_1.default.version,
|
|
71
|
+
mongoUri: connection_string,
|
|
72
|
+
accessLog: path_1.default.resolve(apiconfig.log || "access.log"),
|
|
73
|
+
maxPoolSize: mongo_options.maxPoolSize,
|
|
74
|
+
};
|
|
75
|
+
(0, startup_1.printBanner)(startupCtx);
|
|
76
|
+
(0, startup_1.printBooting)(startupCtx);
|
|
77
|
+
mongoose_1.default.connect(connection_string, mongo_options);
|
|
78
|
+
const db = mongoose_1.default.connection;
|
|
79
|
+
let mongoConnectedAt = null;
|
|
80
|
+
let httpUrl = null;
|
|
81
|
+
let readyPrinted = false;
|
|
82
|
+
db.on("error", (err) => {
|
|
83
|
+
console.error("MongoDB connection error:", err);
|
|
84
|
+
if (err.name === "MongoNetworkError") {
|
|
85
|
+
console.error("Network error occurred. Attempting to reconnect...");
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
db.once("open", () => {
|
|
89
|
+
mongoConnectedAt = new Date();
|
|
90
|
+
maybePrintReady();
|
|
91
|
+
});
|
|
92
|
+
mongoose_1.default.connection.on("disconnected", () => {
|
|
93
|
+
console.log("Mongoose disconnected");
|
|
94
|
+
setTimeout(() => {
|
|
95
|
+
Promise.resolve(mongoose_1.default.connect(connection_string, mongo_options)).catch((err) => {
|
|
96
|
+
console.error("Failed to reconnect to MongoDB:", err);
|
|
97
|
+
});
|
|
98
|
+
}, 5000);
|
|
99
|
+
});
|
|
100
|
+
mongoose_1.default.connection.on("error", (err) => {
|
|
101
|
+
console.error("Mongoose connection error:", err);
|
|
102
|
+
});
|
|
103
|
+
setInterval(() => {
|
|
104
|
+
const client = mongoose_1.default.connection.getClient?.();
|
|
105
|
+
const pool = client?.topology?.s
|
|
106
|
+
?.pool?.totalConnectionCount ?? 0;
|
|
107
|
+
const maxPoolSize = mongo_options.maxPoolSize;
|
|
108
|
+
if (pool > 0 && pool > maxPoolSize * 0.8) {
|
|
109
|
+
console.warn(`Connection pool is at ${Math.round((pool / maxPoolSize) * 100)}% capacity`);
|
|
110
|
+
}
|
|
111
|
+
}, 30000);
|
|
112
|
+
const server = JXP(apiconfig);
|
|
113
|
+
let port = process.env.NODE_DOCKER_PORT || process.env.PORT || String(apiconfig.port || 4001);
|
|
114
|
+
if (process.env.NODE_ENV === "test")
|
|
115
|
+
port = "4005";
|
|
116
|
+
server.listen(parseInt(String(port), 10), function () {
|
|
117
|
+
httpUrl = server.url;
|
|
118
|
+
maybePrintReady();
|
|
119
|
+
});
|
|
120
|
+
function maybePrintReady() {
|
|
121
|
+
if (readyPrinted || !mongoConnectedAt || !httpUrl)
|
|
122
|
+
return;
|
|
123
|
+
readyPrinted = true;
|
|
124
|
+
(0, startup_1.printReady)({
|
|
125
|
+
...startupCtx,
|
|
126
|
+
url: httpUrl,
|
|
127
|
+
mongooseVersion: mongoose_1.default.version,
|
|
128
|
+
mongoConnectedAt,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
module.exports = server;
|
|
132
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/bin/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/bin/setup.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
#! /usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const program = require("commander");
|
|
8
|
+
const path = require("path");
|
|
9
|
+
const readline = require('readline-sync');
|
|
10
|
+
const fs = require("fs");
|
|
11
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
12
|
+
const execSync = require('child_process').execSync;
|
|
13
|
+
const mongoose = require("mongoose");
|
|
14
|
+
const security = require("../libs/security");
|
|
15
|
+
const schemaModule = require("../libs/schema");
|
|
16
|
+
global.JXPSchema = schemaModule.default || schemaModule;
|
|
17
|
+
const userMod = require(path.join(__dirname, "../models/user_model"));
|
|
18
|
+
const User = userMod.default || userMod;
|
|
19
|
+
const pkg = require('../package.json');
|
|
20
|
+
const version = pkg.version;
|
|
21
|
+
program
|
|
22
|
+
.version(version)
|
|
23
|
+
.usage('[options] [dir]')
|
|
24
|
+
.option('-v, --version', 'JXP version')
|
|
25
|
+
.parse(process.argv);
|
|
26
|
+
async function main() {
|
|
27
|
+
try {
|
|
28
|
+
const models = ["apikey", "test", "token", "user", "usergroups", "link", "refreshtoken"];
|
|
29
|
+
const destination_path = program.args.shift() || '.';
|
|
30
|
+
// Get some defaults
|
|
31
|
+
let default_author_name = "Me";
|
|
32
|
+
let default_author_email = "me@example.com";
|
|
33
|
+
let default_app_description = "A JXP installation";
|
|
34
|
+
let default_license = "MIT";
|
|
35
|
+
let default_version = "0.0.1";
|
|
36
|
+
try {
|
|
37
|
+
default_author_name = execSync('git config --global user.name', { encoding: 'utf-8' }).trim();
|
|
38
|
+
default_author_email = execSync('git config --global user.email', { encoding: 'utf-8' }).trim();
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
// Nothing to see here
|
|
42
|
+
}
|
|
43
|
+
let default_app_author = `${default_author_name} <${default_author_email}>`;
|
|
44
|
+
// Ask the basics
|
|
45
|
+
let default_app_name = path.basename(path.resolve(destination_path));
|
|
46
|
+
const app_name = readline.question(`App name (${default_app_name}): `, { defaultInput: default_app_name });
|
|
47
|
+
const app_description = readline.question(`App description (${default_app_description}): `, { defaultInput: default_app_description });
|
|
48
|
+
const app_license = readline.question(`Licence (${default_license}): `, { defaultInput: default_license });
|
|
49
|
+
const app_author = readline.question(`Author (${default_app_author}): `, { defaultInput: default_app_author });
|
|
50
|
+
const app_version = readline.question(`Version (${default_version}): `, { defaultInput: default_version });
|
|
51
|
+
var opts = {};
|
|
52
|
+
// Config setup
|
|
53
|
+
// opts.email = readline.question("Admin email address: ");
|
|
54
|
+
// opts.password = readline.question("Admin password: ", { hideEchoBack: true });
|
|
55
|
+
opts.port = readline.question("Port (2001): ", { defaultInput: "2001" });
|
|
56
|
+
opts.url = readline.question("URL (http://localhost:" + opts.port + "): ", { defaultInput: "http://localhost:" + opts.port });
|
|
57
|
+
const default_connection_string = `mongodb://localhost/${app_name}?retryWrites=true&w=majority`;
|
|
58
|
+
opts.connection_string = readline.question(`Mongo connection string (${default_connection_string}): `, { defaultInput: default_connection_string });
|
|
59
|
+
const email = readline.question(`Admin user email (${default_author_email}): `);
|
|
60
|
+
const name = readline.question(`Admin user name (${default_author_name}): `, { defaultInput: "Admin" });
|
|
61
|
+
const random_password = crypto_1.default.randomBytes(12).toString('base64');
|
|
62
|
+
const password = readline.question(`Admin user password (${random_password}): `, { hideEchoBack: true, defaultInput: random_password });
|
|
63
|
+
opts.shared_secret = crypto_1.default.randomBytes(20).toString('hex');
|
|
64
|
+
const package_data = {
|
|
65
|
+
"name": app_name,
|
|
66
|
+
"version": app_version,
|
|
67
|
+
"description": app_description,
|
|
68
|
+
"main": "bin/server.js",
|
|
69
|
+
"scripts": {
|
|
70
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
71
|
+
"start": "node bin/server.js"
|
|
72
|
+
},
|
|
73
|
+
"dependencies": {
|
|
74
|
+
"jxp": "^4.0.0",
|
|
75
|
+
"dotenv": "^16.4.7",
|
|
76
|
+
"mongoose": "6.13.9"
|
|
77
|
+
},
|
|
78
|
+
"author": app_author,
|
|
79
|
+
"license": app_license
|
|
80
|
+
};
|
|
81
|
+
await fs.promises.mkdir(destination_path, { recursive: true, mode: 0o755 });
|
|
82
|
+
write(path.join(destination_path, "package.json"), JSON.stringify(package_data, null, "\t"));
|
|
83
|
+
await mkdir(path.join(destination_path, "bin"));
|
|
84
|
+
await mkdir(path.join(destination_path, "models"));
|
|
85
|
+
await mkdir(path.join(destination_path, "logs"));
|
|
86
|
+
await cp_replace("../../templates/app.env.sample", path.join(destination_path, ".env"), opts, "{", "}");
|
|
87
|
+
await cp("../../templates/app-server.js", path.join(destination_path, "bin/server.js"));
|
|
88
|
+
for (let model of models) {
|
|
89
|
+
await cp("../models/" + model + "_model.js", path.join(destination_path, "models/" + model + "_model.js"));
|
|
90
|
+
}
|
|
91
|
+
console.log();
|
|
92
|
+
console.log("Installing dependencies...");
|
|
93
|
+
console.log();
|
|
94
|
+
execSync(`cd ${destination_path} && npm install`);
|
|
95
|
+
console.log();
|
|
96
|
+
console.log("Setting up your admin user...");
|
|
97
|
+
console.log();
|
|
98
|
+
try {
|
|
99
|
+
process.env.MONGO_CONNECTION_STRING = opts.connection_string;
|
|
100
|
+
mongoose.connect(opts.connection_string, function (err) {
|
|
101
|
+
if (err) {
|
|
102
|
+
throw (err);
|
|
103
|
+
}
|
|
104
|
+
}, {
|
|
105
|
+
db: {
|
|
106
|
+
safe: true
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
console.log("WARNING: We had a problem talking to the database");
|
|
112
|
+
console.error(err);
|
|
113
|
+
return process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
var user = new User();
|
|
116
|
+
user.email = email;
|
|
117
|
+
user.password = security.encPassword(password);
|
|
118
|
+
user.name = name;
|
|
119
|
+
user.admin = true;
|
|
120
|
+
user.save((err) => {
|
|
121
|
+
if (err) {
|
|
122
|
+
console.log("Error saving user");
|
|
123
|
+
console.error(err.message);
|
|
124
|
+
return process.exit(1);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
console.log("Created admin user", name, "<" + email + ">");
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
process.chdir(destination_path);
|
|
131
|
+
console.log("Congratulations! Your JXP server is ready to go. Happy API'ing...");
|
|
132
|
+
console.log("Next steps:");
|
|
133
|
+
console.log("0. Change to your directory");
|
|
134
|
+
console.log(` cd ${destination_path}`);
|
|
135
|
+
console.log("1. Start your server");
|
|
136
|
+
console.log(" npm start");
|
|
137
|
+
console.log("2. Connect to your server");
|
|
138
|
+
console.log(` ${opts.url}`);
|
|
139
|
+
return process.exit(0);
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
console.log("Error:", err.message);
|
|
143
|
+
return process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Copy from to replacing text as we go
|
|
148
|
+
*
|
|
149
|
+
*/
|
|
150
|
+
function cp_replace(from, to, opts, startEnclosure = "", endEnclosure = "") {
|
|
151
|
+
startEnclosure = startEnclosure || "";
|
|
152
|
+
endEnclosure = endEnclosure || "";
|
|
153
|
+
from = path.join(__dirname, from);
|
|
154
|
+
var s = fs.readFileSync(from, "utf-8");
|
|
155
|
+
for (var i in opts) {
|
|
156
|
+
console.log(startEnclosure + i + endEnclosure, opts[i]);
|
|
157
|
+
s = s.replace(startEnclosure + i + endEnclosure, opts[i]);
|
|
158
|
+
}
|
|
159
|
+
write(to, s);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Copy from to
|
|
163
|
+
*
|
|
164
|
+
* @param {String} from
|
|
165
|
+
* @param {String} to
|
|
166
|
+
*/
|
|
167
|
+
function cp(from, to) {
|
|
168
|
+
from = path.join(__dirname, from);
|
|
169
|
+
write(to, fs.readFileSync(from, 'utf-8'));
|
|
170
|
+
}
|
|
171
|
+
function write(filePath, str, mode) {
|
|
172
|
+
fs.writeFileSync(filePath, str, mode !== undefined ? { mode } : undefined);
|
|
173
|
+
console.log(' \x1b[36mcreate\x1b[0m : ' + filePath);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Mkdir -p.
|
|
177
|
+
*
|
|
178
|
+
* @param {String} path
|
|
179
|
+
* @return {Promise}
|
|
180
|
+
*/
|
|
181
|
+
function mkdir(path) {
|
|
182
|
+
return fs.promises.mkdir(path, { recursive: true, mode: 0o755 });
|
|
183
|
+
}
|
|
184
|
+
main();
|
|
185
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/bin/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type JXPSchemaClass from "./libs/schema";
|
|
2
|
+
import type { Schema } from "mongoose";
|
|
3
|
+
import type JXPHelper from "jxp-helper";
|
|
4
|
+
declare global {
|
|
5
|
+
var JXPSchema: typeof JXPSchemaClass;
|
|
6
|
+
var ObjectId: typeof Schema.Types.ObjectId;
|
|
7
|
+
var Mixed: typeof Schema.Types.Mixed;
|
|
8
|
+
var jxphelper: InstanceType<typeof JXPHelper> | undefined;
|
|
9
|
+
var apikey: string | undefined;
|
|
10
|
+
var server: string | undefined;
|
|
11
|
+
var model_dir: string | undefined;
|
|
12
|
+
}
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=globals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"globals.d.ts","sourceRoot":"","sources":["../src/globals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,SAAS,MAAM,YAAY,CAAC;AAExC,OAAO,CAAC,MAAM,CAAC;IAEd,IAAI,SAAS,EAAE,OAAO,cAAc,CAAC;IAErC,IAAI,QAAQ,EAAE,OAAO,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;IAE3C,IAAI,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;IAErC,IAAI,SAAS,EAAE,YAAY,CAAC,OAAO,SAAS,CAAC,GAAG,SAAS,CAAC;IAE1D,IAAI,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAE/B,IAAI,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAE/B,IAAI,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,OAAO,EAAE,CAAC"}
|
package/dist/globals.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"globals.js","sourceRoot":"","sources":["../src/globals.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate_guard.d.ts","sourceRoot":"","sources":["../../src/libs/aggregate_guard.ts"],"names":[],"mappings":"AAmCA,wBAAgB,gBAAgB,CAC/B,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,CAAC,EAAE;IAAE,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAChE,IAAI,CAkBN"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validatePipeline = validatePipeline;
|
|
4
|
+
const errors = require("restify-errors");
|
|
5
|
+
const DEFAULT_ALLOWED_STAGES = new Set([
|
|
6
|
+
"$match",
|
|
7
|
+
"$group",
|
|
8
|
+
"$lookup",
|
|
9
|
+
"$project",
|
|
10
|
+
"$sort",
|
|
11
|
+
"$limit",
|
|
12
|
+
"$skip",
|
|
13
|
+
"$unwind",
|
|
14
|
+
"$addFields",
|
|
15
|
+
"$set",
|
|
16
|
+
"$count",
|
|
17
|
+
"$facet",
|
|
18
|
+
"$bucket",
|
|
19
|
+
"$bucketAuto",
|
|
20
|
+
"$sample",
|
|
21
|
+
"$replaceRoot",
|
|
22
|
+
"$replaceWith",
|
|
23
|
+
"$redact",
|
|
24
|
+
]);
|
|
25
|
+
const ADMIN_ONLY_STAGES = new Set(["$out", "$merge", "$function"]);
|
|
26
|
+
function getAllowedStages(custom) {
|
|
27
|
+
if (!custom || !custom.length)
|
|
28
|
+
return DEFAULT_ALLOWED_STAGES;
|
|
29
|
+
return new Set(custom);
|
|
30
|
+
}
|
|
31
|
+
function stageKeys(stage) {
|
|
32
|
+
if (!stage || typeof stage !== "object" || Array.isArray(stage))
|
|
33
|
+
return [];
|
|
34
|
+
return Object.keys(stage).filter((k) => k.startsWith("$"));
|
|
35
|
+
}
|
|
36
|
+
function validatePipeline(pipeline, options) {
|
|
37
|
+
if (!Array.isArray(pipeline)) {
|
|
38
|
+
throw new errors.BadRequestError("Aggregation pipeline must be an array");
|
|
39
|
+
}
|
|
40
|
+
const allowed = getAllowedStages(options?.aggregate_stages_allow);
|
|
41
|
+
const isAdmin = options?.isAdmin === true;
|
|
42
|
+
for (const stage of pipeline) {
|
|
43
|
+
const keys = stageKeys(stage);
|
|
44
|
+
for (const key of keys) {
|
|
45
|
+
if (ADMIN_ONLY_STAGES.has(key) && !isAdmin) {
|
|
46
|
+
throw new errors.ForbiddenError(`Aggregation stage ${key} requires admin`);
|
|
47
|
+
}
|
|
48
|
+
if (!allowed.has(key) && !ADMIN_ONLY_STAGES.has(key)) {
|
|
49
|
+
throw new errors.BadRequestError(`Aggregation stage ${key} is not allowed`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
module.exports = {
|
|
55
|
+
validatePipeline,
|
|
56
|
+
DEFAULT_ALLOWED_STAGES: [...DEFAULT_ALLOWED_STAGES],
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=aggregate_guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate_guard.js","sourceRoot":"","sources":["../../src/libs/aggregate_guard.ts"],"names":[],"mappings":";;AAmCA,4CAqBC;AAxDD,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAEzC,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACtC,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,UAAU;IACV,OAAO;IACP,QAAQ;IACR,OAAO;IACP,SAAS;IACT,YAAY;IACZ,MAAM;IACN,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,aAAa;IACb,SAAS;IACT,cAAc;IACd,cAAc;IACd,SAAS;CACT,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AAEnE,SAAS,gBAAgB,CAAC,MAAiB;IAC1C,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,sBAAsB,CAAC;IAC7D,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAChC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3E,OAAO,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AACvF,CAAC;AAED,SAAgB,gBAAgB,CAC/B,QAAmB,EACnB,OAAkE;IAElE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,MAAM,CAAC,eAAe,CAAC,uCAAuC,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,EAAE,sBAAsB,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAE1C,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;QAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC5C,MAAM,IAAI,MAAM,CAAC,cAAc,CAAC,qBAAqB,GAAG,iBAAiB,CAAC,CAAC;YAC5E,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtD,MAAM,IAAI,MAAM,CAAC,eAAe,CAAC,qBAAqB,GAAG,iBAAiB,CAAC,CAAC;YAC7E,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,CAAC,OAAO,GAAG;IAChB,gBAAgB;IAChB,sBAAsB,EAAE,CAAC,GAAG,sBAAsB,CAAC;CACnD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulkwrite_guard.d.ts","sourceRoot":"","sources":["../../src/libs/bulkwrite_guard.ts"],"names":[],"mappings":"AAgBA,wBAAgB,eAAe,CAC9B,GAAG,EAAE,OAAO,EAAE,EACd,OAAO,CAAC,EAAE;IAAE,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/D,IAAI,CAuBN"}
|