@lenne.tech/nest-server 10.0.2 → 10.0.4
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/README.md +9 -0
- package/dist/config.env.js +47 -17
- package/dist/config.env.js.map +1 -1
- package/dist/core/common/args/filter.args.js +3 -3
- package/dist/core/common/args/filter.args.js.map +1 -1
- package/dist/core/common/args/pagination.args.js +6 -6
- package/dist/core/common/args/pagination.args.js.map +1 -1
- package/dist/core/common/decorators/restricted.decorator.js +15 -17
- package/dist/core/common/decorators/restricted.decorator.js.map +1 -1
- package/dist/core/common/filters/http-exception-log.filter.js +1 -3
- package/dist/core/common/filters/http-exception-log.filter.js.map +1 -1
- package/dist/core/common/helpers/db.helper.js +14 -14
- package/dist/core/common/helpers/db.helper.js.map +1 -1
- package/dist/core/common/helpers/file.helper.js +2 -2
- package/dist/core/common/helpers/file.helper.js.map +1 -1
- package/dist/core/common/helpers/filter.helper.d.ts +2 -2
- package/dist/core/common/helpers/filter.helper.js +1 -1
- package/dist/core/common/helpers/filter.helper.js.map +1 -1
- package/dist/core/common/helpers/graphql.helper.js +1 -1
- package/dist/core/common/helpers/graphql.helper.js.map +1 -1
- package/dist/core/common/helpers/input.helper.js +31 -38
- package/dist/core/common/helpers/input.helper.js.map +1 -1
- package/dist/core/common/helpers/model.helper.js +7 -7
- package/dist/core/common/helpers/model.helper.js.map +1 -1
- package/dist/core/common/helpers/service.helper.js +2 -2
- package/dist/core/common/helpers/service.helper.js.map +1 -1
- package/dist/core/common/inputs/combined-filter.input.js +3 -3
- package/dist/core/common/inputs/combined-filter.input.js.map +1 -1
- package/dist/core/common/inputs/core-input.input.js +1 -1
- package/dist/core/common/inputs/core-input.input.js.map +1 -1
- package/dist/core/common/inputs/filter.input.js +3 -3
- package/dist/core/common/inputs/filter.input.js.map +1 -1
- package/dist/core/common/inputs/single-filter.input.js +4 -4
- package/dist/core/common/inputs/single-filter.input.js.map +1 -1
- package/dist/core/common/inputs/sort.input.js +1 -1
- package/dist/core/common/inputs/sort.input.js.map +1 -1
- package/dist/core/common/interceptors/check-security.interceptor.d.ts +1 -1
- package/dist/core/common/interceptors/check-security.interceptor.js +2 -2
- package/dist/core/common/interceptors/check-security.interceptor.js.map +1 -1
- package/dist/core/common/interfaces/server-options.interface.d.ts +28 -0
- package/dist/core/common/models/core-model.model.js.map +1 -1
- package/dist/core/common/models/core-persistence.model.js +3 -3
- package/dist/core/common/models/core-persistence.model.js.map +1 -1
- package/dist/core/common/pipes/map-and-validate.pipe.d.ts +1 -1
- package/dist/core/common/pipes/map-and-validate.pipe.js +1 -1
- package/dist/core/common/pipes/map-and-validate.pipe.js.map +1 -1
- package/dist/core/common/scalars/any.scalar.js +2 -2
- package/dist/core/common/scalars/any.scalar.js.map +1 -1
- package/dist/core/common/scalars/date-timestamp.scalar.js +1 -1
- package/dist/core/common/scalars/date-timestamp.scalar.js.map +1 -1
- package/dist/core/common/scalars/date.scalar.js +1 -1
- package/dist/core/common/scalars/date.scalar.js.map +1 -1
- package/dist/core/common/scalars/json.scalar.js +2 -2
- package/dist/core/common/scalars/json.scalar.js.map +1 -1
- package/dist/core/common/services/config.service.js +7 -7
- package/dist/core/common/services/config.service.js.map +1 -1
- package/dist/core/common/services/core-cron-jobs.service.js +5 -5
- package/dist/core/common/services/core-cron-jobs.service.js.map +1 -1
- package/dist/core/common/services/crud.service.js +1 -1
- package/dist/core/common/services/crud.service.js.map +1 -1
- package/dist/core/common/services/mailjet.service.js +5 -5
- package/dist/core/common/services/mailjet.service.js.map +1 -1
- package/dist/core/common/services/model-doc.service.d.ts +16 -0
- package/dist/core/common/services/model-doc.service.js +107 -0
- package/dist/core/common/services/model-doc.service.js.map +1 -0
- package/dist/core/common/services/module.service.js.map +1 -1
- package/dist/core/common/services/template.service.js +3 -3
- package/dist/core/common/services/template.service.js.map +1 -1
- package/dist/core/common/types/core-model-constructor.type.d.ts +2 -2
- package/dist/core/modules/auth/core-auth.module.js +3 -3
- package/dist/core/modules/auth/core-auth.module.js.map +1 -1
- package/dist/core/modules/auth/core-auth.resolver.js +5 -5
- package/dist/core/modules/auth/core-auth.resolver.js.map +1 -1
- package/dist/core/modules/auth/guards/auth.guard.js +4 -4
- package/dist/core/modules/auth/guards/auth.guard.js.map +1 -1
- package/dist/core/modules/auth/guards/roles.guard.js +1 -1
- package/dist/core/modules/auth/guards/roles.guard.js.map +1 -1
- package/dist/core/modules/auth/services/core-auth.service.js +5 -5
- package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
- package/dist/core/modules/auth/strategies/jwt.strategy.js.map +1 -1
- package/dist/core/modules/auth/tokens.decorator.js +2 -2
- package/dist/core/modules/auth/tokens.decorator.js.map +1 -1
- package/dist/core/modules/file/core-file-info.model.js +2 -2
- package/dist/core/modules/file/core-file-info.model.js.map +1 -1
- package/dist/core/modules/file/core-file.controller.d.ts +1 -2
- package/dist/core/modules/file/core-file.controller.js +3 -6
- package/dist/core/modules/file/core-file.controller.js.map +1 -1
- package/dist/core/modules/file/core-file.service.js +1 -1
- package/dist/core/modules/file/core-file.service.js.map +1 -1
- package/dist/core/modules/file/interfaces/file-upload.interface.d.ts +1 -1
- package/dist/core/modules/health-check/core-health-check-result.model.d.ts +8 -0
- package/dist/core/modules/health-check/core-health-check-result.model.js +53 -0
- package/dist/core/modules/health-check/core-health-check-result.model.js.map +1 -0
- package/dist/core/modules/health-check/core-health-check.controller.d.ts +6 -0
- package/dist/core/modules/health-check/core-health-check.controller.js +33 -0
- package/dist/core/modules/health-check/core-health-check.controller.js.map +1 -0
- package/dist/core/modules/health-check/core-health-check.module.d.ts +2 -0
- package/dist/core/modules/health-check/core-health-check.module.js +24 -0
- package/dist/core/modules/health-check/core-health-check.module.js.map +1 -0
- package/dist/core/modules/health-check/core-health-check.resolver.d.ts +6 -0
- package/dist/core/modules/health-check/core-health-check.resolver.js +38 -0
- package/dist/core/modules/health-check/core-health-check.resolver.js.map +1 -0
- package/dist/core/modules/health-check/core-health-check.service.d.ts +11 -0
- package/dist/core/modules/health-check/core-health-check.service.js +52 -0
- package/dist/core/modules/health-check/core-health-check.service.js.map +1 -0
- package/dist/core/modules/user/core-user.model.js +5 -5
- package/dist/core/modules/user/core-user.model.js.map +1 -1
- package/dist/core/modules/user/core-user.service.js +2 -2
- package/dist/core/modules/user/core-user.service.js.map +1 -1
- package/dist/core/modules/user/inputs/core-user.input.js +1 -1
- package/dist/core/modules/user/inputs/core-user.input.js.map +1 -1
- package/dist/core.module.js +14 -5
- package/dist/core.module.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/server/modules/auth/auth.service.js +1 -1
- package/dist/server/modules/auth/auth.service.js.map +1 -1
- package/dist/server/modules/file/file.controller.js +1 -1
- package/dist/server/modules/file/file.controller.js.map +1 -1
- package/dist/server/modules/file/file.resolver.js +2 -2
- package/dist/server/modules/file/file.resolver.js.map +1 -1
- package/dist/server/modules/file/file.service.js +1 -1
- package/dist/server/modules/file/file.service.js.map +1 -1
- package/dist/server/modules/file/multer-config.service.js +1 -1
- package/dist/server/modules/file/multer-config.service.js.map +1 -1
- package/dist/server/modules/user/avatar.controller.js +1 -1
- package/dist/server/modules/user/avatar.controller.js.map +1 -1
- package/dist/server/modules/user/user.resolver.js +1 -1
- package/dist/server/modules/user/user.resolver.js.map +1 -1
- package/dist/server/modules/user/user.service.js +3 -3
- package/dist/server/modules/user/user.service.js.map +1 -1
- package/dist/templates/index.ejs +2 -0
- package/dist/templates/password-reset.ejs +3 -0
- package/dist/templates/welcome.ejs +3 -0
- package/dist/test/test.helper.d.ts +1 -1
- package/dist/test/test.helper.js +7 -7
- package/dist/test/test.helper.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +32 -26
- package/src/config.env.ts +50 -20
- package/src/core/common/args/filter.args.ts +4 -4
- package/src/core/common/args/pagination.args.ts +7 -7
- package/src/core/common/decorators/graphql-service-options.decorator.ts +2 -2
- package/src/core/common/decorators/graphql-user.decorator.ts +1 -1
- package/src/core/common/decorators/rest-user.decorator.ts +1 -1
- package/src/core/common/decorators/restricted.decorator.ts +18 -18
- package/src/core/common/filters/http-exception-log.filter.ts +4 -4
- package/src/core/common/helpers/db.helper.ts +35 -40
- package/src/core/common/helpers/decorator.helper.ts +1 -1
- package/src/core/common/helpers/file.helper.ts +2 -2
- package/src/core/common/helpers/filter.helper.ts +7 -8
- package/src/core/common/helpers/graphql.helper.ts +6 -6
- package/src/core/common/helpers/input.helper.ts +54 -61
- package/src/core/common/helpers/model.helper.ts +33 -41
- package/src/core/common/helpers/service.helper.ts +8 -8
- package/src/core/common/inputs/combined-filter.input.ts +4 -4
- package/src/core/common/inputs/core-input.input.ts +2 -2
- package/src/core/common/inputs/filter.input.ts +4 -4
- package/src/core/common/inputs/single-filter.input.ts +4 -4
- package/src/core/common/inputs/sort.input.ts +1 -1
- package/src/core/common/interceptors/check-response.interceptor.ts +1 -1
- package/src/core/common/interceptors/check-security.interceptor.ts +5 -5
- package/src/core/common/interfaces/server-options.interface.ts +109 -0
- package/src/core/common/models/core-model.model.ts +6 -4
- package/src/core/common/models/core-persistence.model.ts +3 -3
- package/src/core/common/pipes/map-and-validate.pipe.ts +2 -2
- package/src/core/common/scalars/any.scalar.ts +2 -2
- package/src/core/common/scalars/date-timestamp.scalar.ts +1 -2
- package/src/core/common/scalars/date.scalar.ts +1 -2
- package/src/core/common/scalars/json.scalar.ts +4 -4
- package/src/core/common/services/config.service.ts +16 -16
- package/src/core/common/services/core-cron-jobs.service.ts +7 -7
- package/src/core/common/services/crud.service.ts +22 -22
- package/src/core/common/services/email.service.ts +1 -1
- package/src/core/common/services/mailjet.service.ts +8 -8
- package/src/core/common/services/model-doc.service.ts +140 -0
- package/src/core/common/services/module.service.ts +5 -6
- package/src/core/common/services/template.service.ts +4 -4
- package/src/core/common/types/core-model-constructor.type.ts +2 -2
- package/src/core/modules/auth/core-auth.controller.ts +2 -2
- package/src/core/modules/auth/core-auth.module.ts +4 -4
- package/src/core/modules/auth/core-auth.resolver.ts +9 -9
- package/src/core/modules/auth/guards/auth.guard.ts +8 -7
- package/src/core/modules/auth/guards/roles.guard.ts +1 -1
- package/src/core/modules/auth/services/core-auth.service.ts +9 -9
- package/src/core/modules/auth/strategies/jwt-refresh.strategy.ts +1 -1
- package/src/core/modules/auth/strategies/jwt.strategy.ts +1 -1
- package/src/core/modules/auth/tokens.decorator.ts +6 -7
- package/src/core/modules/file/core-file-info.model.ts +2 -2
- package/src/core/modules/file/core-file.controller.ts +2 -4
- package/src/core/modules/file/core-file.service.ts +6 -5
- package/src/core/modules/file/interfaces/file-upload.interface.ts +1 -1
- package/src/core/modules/health-check/core-health-check-result.model.ts +46 -0
- package/src/core/modules/health-check/core-health-check.controller.ts +24 -0
- package/src/core/modules/health-check/core-health-check.module.ts +17 -0
- package/src/core/modules/health-check/core-health-check.resolver.ts +32 -0
- package/src/core/modules/health-check/core-health-check.service.ts +62 -0
- package/src/core/modules/user/core-user.model.ts +6 -6
- package/src/core/modules/user/core-user.service.ts +10 -9
- package/src/core/modules/user/inputs/core-user.input.ts +1 -2
- package/src/core.module.ts +23 -12
- package/src/index.ts +11 -0
- package/src/main.ts +2 -2
- package/src/server/modules/auth/auth.controller.ts +1 -1
- package/src/server/modules/auth/auth.resolver.ts +3 -3
- package/src/server/modules/auth/auth.service.ts +2 -2
- package/src/server/modules/file/file.controller.ts +1 -2
- package/src/server/modules/file/file.module.ts +1 -1
- package/src/server/modules/file/file.resolver.ts +4 -3
- package/src/server/modules/file/file.service.ts +1 -1
- package/src/server/modules/file/multer-config.service.ts +1 -1
- package/src/server/modules/user/avatar.controller.ts +3 -3
- package/src/server/modules/user/user.model.ts +1 -1
- package/src/server/modules/user/user.resolver.ts +4 -4
- package/src/server/modules/user/user.service.ts +4 -4
- package/src/test/test.helper.ts +11 -11
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lenne.tech/nest-server",
|
|
3
|
-
"version": "10.0.
|
|
3
|
+
"version": "10.0.4",
|
|
4
4
|
"description": "Modern, fast, powerful Node.js web framework in TypeScript based on Nest with a GraphQL API and a connection to MongoDB (or other databases).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"node",
|
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
"build": "rimraf dist && nest build",
|
|
18
18
|
"build:pack": "npm pack && echo 'use file:/ROOT_PATH_TO_TGZ_FILE to integrate the package'",
|
|
19
19
|
"build:dev": "npm run build && yalc push --private",
|
|
20
|
-
"docs": "npm run docs:ci && open ./public/index.html",
|
|
20
|
+
"docs": "npm run docs:ci && open http://127.0.0.1:8080/ && open ./public/index.html && compodoc -p tsconfig.json -s ",
|
|
21
21
|
"docs:bootstrap": "node extras/update-spectaql-version.mjs && npx -y spectaql ./spectaql.yml",
|
|
22
|
-
"docs:ci": "ts-node ./scripts/init-server.ts && npm run docs:bootstrap",
|
|
22
|
+
"docs:ci": "ts-node ./scripts/init-server.ts && npm run docs:bootstrap && compodoc -p tsconfig.json",
|
|
23
23
|
"format": "prettier --write 'src/**/*.ts'",
|
|
24
24
|
"format:staged": "pretty-quick --staged",
|
|
25
25
|
"lint": "eslint \"{src,tests}/**/*.ts\" --fix",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"test:watch": "NODE_ENV=local jest --watch",
|
|
48
48
|
"prepack": "npm run prestart:prod",
|
|
49
49
|
"prepare": "husky install",
|
|
50
|
-
"prepublishOnly": "npm run
|
|
50
|
+
"prepublishOnly": "npm run lint && npm run test:ci",
|
|
51
51
|
"preversion": "npm run lint",
|
|
52
52
|
"watch": "npm-watch"
|
|
53
53
|
},
|
|
@@ -62,16 +62,17 @@
|
|
|
62
62
|
"node": ">= 16.13.0"
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
|
-
"@apollo/gateway": "2.
|
|
65
|
+
"@apollo/gateway": "2.5.1",
|
|
66
66
|
"@nestjs/apollo": "12.0.7",
|
|
67
|
-
"@nestjs/common": "10.
|
|
68
|
-
"@nestjs/core": "10.
|
|
67
|
+
"@nestjs/common": "10.1.3",
|
|
68
|
+
"@nestjs/core": "10.1.3",
|
|
69
69
|
"@nestjs/graphql": "12.0.8",
|
|
70
70
|
"@nestjs/jwt": "10.1.0",
|
|
71
|
-
"@nestjs/mongoose": "10.0.
|
|
71
|
+
"@nestjs/mongoose": "10.0.1",
|
|
72
72
|
"@nestjs/passport": "10.0.0",
|
|
73
|
-
"@nestjs/platform-express": "10.
|
|
73
|
+
"@nestjs/platform-express": "10.1.3",
|
|
74
74
|
"@nestjs/schedule": "3.0.1",
|
|
75
|
+
"@nestjs/terminus": "10.0.1",
|
|
75
76
|
"apollo-server-core": "3.11.1",
|
|
76
77
|
"apollo-server-express": "3.11.1",
|
|
77
78
|
"bcrypt": "5.1.0",
|
|
@@ -89,44 +90,49 @@
|
|
|
89
90
|
"light-my-request": "5.10.0",
|
|
90
91
|
"lodash": "4.17.21",
|
|
91
92
|
"mongodb": "4.16.0",
|
|
92
|
-
"mongoose": "6.11.
|
|
93
|
+
"mongoose": "6.11.5",
|
|
93
94
|
"mongoose-gridfs": "1.3.0",
|
|
94
95
|
"multer": "1.4.5-lts.1",
|
|
95
96
|
"multer-gridfs-storage": "5.0.2",
|
|
96
|
-
"node-mailjet": "6.0.
|
|
97
|
-
"nodemailer": "6.9.
|
|
97
|
+
"node-mailjet": "6.0.4",
|
|
98
|
+
"nodemailer": "6.9.4",
|
|
98
99
|
"nodemon": "3.0.1",
|
|
99
100
|
"passport": "0.6.0",
|
|
100
101
|
"passport-jwt": "4.0.1",
|
|
101
102
|
"reflect-metadata": "0.1.13",
|
|
102
103
|
"rfdc": "1.3.0",
|
|
103
104
|
"rimraf": "5.0.1",
|
|
104
|
-
"rxjs": "7.8.1"
|
|
105
|
+
"rxjs": "7.8.1",
|
|
106
|
+
"yuml-diagram": "1.2.0"
|
|
105
107
|
},
|
|
106
108
|
"devDependencies": {
|
|
107
|
-
"@
|
|
109
|
+
"@babel/plugin-proposal-private-methods": "7.18.6",
|
|
110
|
+
"@compodoc/compodoc": "1.1.21",
|
|
111
|
+
"@lenne.tech/eslint-config-ts": "0.0.8",
|
|
112
|
+
"@nestjs/cli": "10.1.11",
|
|
108
113
|
"@nestjs/schematics": "10.0.1",
|
|
109
|
-
"@nestjs/testing": "10.
|
|
114
|
+
"@nestjs/testing": "10.1.3",
|
|
110
115
|
"@swc/cli": "0.1.62",
|
|
111
|
-
"@swc/core": "1.3.
|
|
112
|
-
"@swc/jest": "0.2.
|
|
116
|
+
"@swc/core": "1.3.73",
|
|
117
|
+
"@swc/jest": "0.2.27",
|
|
113
118
|
"@types/compression": "1.7.2",
|
|
114
119
|
"@types/cookie-parser": "1.4.3",
|
|
115
120
|
"@types/cron": "2.0.1",
|
|
116
121
|
"@types/ejs": "3.1.2",
|
|
117
122
|
"@types/express": "4.17.17",
|
|
118
123
|
"@types/jest": "29.5.3",
|
|
119
|
-
"@types/lodash": "4.14.
|
|
124
|
+
"@types/lodash": "4.14.196",
|
|
120
125
|
"@types/multer": "1.4.7",
|
|
121
|
-
"@types/node": "20.4.
|
|
122
|
-
"@types/nodemailer": "6.4.
|
|
126
|
+
"@types/node": "20.4.5",
|
|
127
|
+
"@types/nodemailer": "6.4.9",
|
|
123
128
|
"@types/passport": "1.0.12",
|
|
124
129
|
"@types/supertest": "2.0.12",
|
|
125
|
-
"@typescript-eslint/eslint-plugin": "6.
|
|
126
|
-
"@typescript-eslint/parser": "6.
|
|
130
|
+
"@typescript-eslint/eslint-plugin": "6.2.1",
|
|
131
|
+
"@typescript-eslint/parser": "6.2.1",
|
|
127
132
|
"coffeescript": "2.7.0",
|
|
128
|
-
"eslint": "8.
|
|
129
|
-
"eslint-config-prettier": "8.
|
|
133
|
+
"eslint": "8.46.0",
|
|
134
|
+
"eslint-config-prettier": "8.9.0",
|
|
135
|
+
"eslint-plugin-unused-imports": "3.0.0",
|
|
130
136
|
"find-file-up": "2.0.1",
|
|
131
137
|
"grunt": "1.6.1",
|
|
132
138
|
"grunt-bg-shell": "2.3.3",
|
|
@@ -134,10 +140,10 @@
|
|
|
134
140
|
"grunt-contrib-watch": "1.1.0",
|
|
135
141
|
"grunt-sync": "0.8.2",
|
|
136
142
|
"husky": "8.0.3",
|
|
137
|
-
"jest": "29.6.
|
|
143
|
+
"jest": "29.6.2",
|
|
138
144
|
"npm-watch": "0.11.0",
|
|
139
145
|
"pm2": "5.3.0",
|
|
140
|
-
"prettier": "
|
|
146
|
+
"prettier": "3.0.0",
|
|
141
147
|
"pretty-quick": "3.1.3",
|
|
142
148
|
"supertest": "6.3.3",
|
|
143
149
|
"ts-jest": "29.1.1",
|
package/src/config.env.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { CronExpression } from '@nestjs/schedule';
|
|
2
1
|
import { join } from 'path';
|
|
2
|
+
import { CronExpression } from '@nestjs/schedule';
|
|
3
3
|
import { merge } from './core/common/helpers/config.helper';
|
|
4
4
|
import { IServerOptions } from './core/common/interfaces/server-options.interface';
|
|
5
5
|
|
|
@@ -55,6 +55,14 @@ const config: { [env: string]: IServerOptions } = {
|
|
|
55
55
|
},
|
|
56
56
|
maxComplexity: 20,
|
|
57
57
|
},
|
|
58
|
+
healthCheck: {
|
|
59
|
+
enabled: true,
|
|
60
|
+
configs: {
|
|
61
|
+
database: {
|
|
62
|
+
enabled: true,
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
},
|
|
58
66
|
ignoreSelectionsForPopulate: true,
|
|
59
67
|
jwt: {
|
|
60
68
|
secret: 'SECRET_OR_PRIVATE_KEY_LOCAL',
|
|
@@ -69,12 +77,13 @@ const config: { [env: string]: IServerOptions } = {
|
|
|
69
77
|
},
|
|
70
78
|
},
|
|
71
79
|
},
|
|
72
|
-
loadLocalConfig:
|
|
80
|
+
loadLocalConfig: true,
|
|
73
81
|
logExceptions: true,
|
|
74
82
|
mongoose: {
|
|
75
83
|
collation: {
|
|
76
84
|
locale: 'de',
|
|
77
85
|
},
|
|
86
|
+
modelDocumentation: true,
|
|
78
87
|
uri: 'mongodb://127.0.0.1/nest-server-local',
|
|
79
88
|
},
|
|
80
89
|
port: 3000,
|
|
@@ -128,6 +137,14 @@ const config: { [env: string]: IServerOptions } = {
|
|
|
128
137
|
},
|
|
129
138
|
maxComplexity: 20,
|
|
130
139
|
},
|
|
140
|
+
healthCheck: {
|
|
141
|
+
enabled: true,
|
|
142
|
+
configs: {
|
|
143
|
+
database: {
|
|
144
|
+
enabled: true,
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
},
|
|
131
148
|
ignoreSelectionsForPopulate: true,
|
|
132
149
|
jwt: {
|
|
133
150
|
secret: 'SECRET_OR_PRIVATE_KEY_DEV',
|
|
@@ -148,6 +165,7 @@ const config: { [env: string]: IServerOptions } = {
|
|
|
148
165
|
collation: {
|
|
149
166
|
locale: 'de',
|
|
150
167
|
},
|
|
168
|
+
modelDocumentation: false,
|
|
151
169
|
uri: 'mongodb://127.0.0.1/nest-server-dev',
|
|
152
170
|
},
|
|
153
171
|
port: 3000,
|
|
@@ -201,6 +219,14 @@ const config: { [env: string]: IServerOptions } = {
|
|
|
201
219
|
},
|
|
202
220
|
maxComplexity: 20,
|
|
203
221
|
},
|
|
222
|
+
healthCheck: {
|
|
223
|
+
enabled: true,
|
|
224
|
+
configs: {
|
|
225
|
+
database: {
|
|
226
|
+
enabled: true,
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
},
|
|
204
230
|
ignoreSelectionsForPopulate: true,
|
|
205
231
|
jwt: {
|
|
206
232
|
secret: 'SECRET_OR_PRIVATE_KEY_PROD',
|
|
@@ -221,6 +247,7 @@ const config: { [env: string]: IServerOptions } = {
|
|
|
221
247
|
collation: {
|
|
222
248
|
locale: 'de',
|
|
223
249
|
},
|
|
250
|
+
modelDocumentation: false,
|
|
224
251
|
uri: 'mongodb://127.0.0.1/nest-server-prod',
|
|
225
252
|
},
|
|
226
253
|
port: 3000,
|
|
@@ -239,32 +266,35 @@ const config: { [env: string]: IServerOptions } = {
|
|
|
239
266
|
/**
|
|
240
267
|
* Environment specific config
|
|
241
268
|
*
|
|
242
|
-
* default:
|
|
269
|
+
* default: local
|
|
243
270
|
*/
|
|
244
|
-
const env = process.env['NODE' + '_ENV'] || '
|
|
245
|
-
const envConfig = config[env] || config.
|
|
246
|
-
console.info(
|
|
247
|
-
|
|
271
|
+
const env = process.env['NODE' + '_ENV'] || 'local';
|
|
272
|
+
const envConfig = config[env] || config.local;
|
|
273
|
+
console.info(`Configured for: ${envConfig.env}${env !== envConfig.env ? ` (requested: ${env})` : ''}`);
|
|
248
274
|
// Merge with localConfig (e.g. config.json)
|
|
249
275
|
if (envConfig.loadLocalConfig) {
|
|
250
276
|
let localConfig;
|
|
251
277
|
if (typeof envConfig.loadLocalConfig === 'string') {
|
|
252
|
-
|
|
253
|
-
|
|
278
|
+
import(envConfig.loadLocalConfig).then((loadedConfig) => {
|
|
279
|
+
localConfig = loadedConfig.default || loadedConfig;
|
|
280
|
+
merge(envConfig, localConfig);
|
|
281
|
+
}).catch(() => {
|
|
282
|
+
console.info(`Configuration ${envConfig.loadLocalConfig} not found!`);
|
|
283
|
+
});
|
|
254
284
|
} else {
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
localConfig =
|
|
285
|
+
// get config from src directory
|
|
286
|
+
import(join(__dirname, 'config.json')).then((loadedConfig) => {
|
|
287
|
+
localConfig = loadedConfig.default || loadedConfig;
|
|
258
288
|
merge(envConfig, localConfig);
|
|
259
|
-
}
|
|
260
|
-
try
|
|
261
|
-
|
|
262
|
-
localConfig =
|
|
289
|
+
}).catch(() => {
|
|
290
|
+
// if not found try to find in project directory
|
|
291
|
+
import(join(__dirname, '..', 'config.json')).then((loadedConfig) => {
|
|
292
|
+
localConfig = loadedConfig.default || loadedConfig;
|
|
263
293
|
merge(envConfig, localConfig);
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
}
|
|
267
|
-
}
|
|
294
|
+
}).catch(() => {
|
|
295
|
+
console.info('No local config.json found!');
|
|
296
|
+
});
|
|
297
|
+
});
|
|
268
298
|
}
|
|
269
299
|
}
|
|
270
300
|
|
|
@@ -8,7 +8,7 @@ export class FilterArgs extends PaginationArgs {
|
|
|
8
8
|
/**
|
|
9
9
|
* Filtering
|
|
10
10
|
*/
|
|
11
|
-
@Field(
|
|
11
|
+
@Field(type => FilterInput, {
|
|
12
12
|
description: 'Input for filtering',
|
|
13
13
|
nullable: true,
|
|
14
14
|
})
|
|
@@ -18,7 +18,7 @@ export class FilterArgs extends PaginationArgs {
|
|
|
18
18
|
/**
|
|
19
19
|
* Get a specific number of random samples from filter results
|
|
20
20
|
*/
|
|
21
|
-
@Field(
|
|
21
|
+
@Field(type => Number, {
|
|
22
22
|
description:
|
|
23
23
|
'Request only a specified number of samples from the filter results; if not specified, all results are returned.',
|
|
24
24
|
nullable: true,
|
|
@@ -38,11 +38,11 @@ export class FilterArgs extends PaginationArgs {
|
|
|
38
38
|
cloneDeep?: boolean;
|
|
39
39
|
funcAllowed?: boolean;
|
|
40
40
|
mapId?: boolean;
|
|
41
|
-
} = {}
|
|
41
|
+
} = {},
|
|
42
42
|
): this {
|
|
43
43
|
super.map(data, options);
|
|
44
44
|
this.filter = data.filter ? FilterInput.map(data.filter, options) : undefined;
|
|
45
|
-
Object.keys(this).forEach(
|
|
45
|
+
Object.keys(this).forEach(key => this[key] === undefined && delete this[key]);
|
|
46
46
|
return this;
|
|
47
47
|
}
|
|
48
48
|
}
|
|
@@ -9,7 +9,7 @@ export class PaginationArgs extends CoreInput {
|
|
|
9
9
|
/**
|
|
10
10
|
* Limit for pagination
|
|
11
11
|
*/
|
|
12
|
-
@Field(
|
|
12
|
+
@Field(type => Int, {
|
|
13
13
|
description: 'Limit specifies the maximum number of elements found that are to be returned',
|
|
14
14
|
nullable: true,
|
|
15
15
|
})
|
|
@@ -19,7 +19,7 @@ export class PaginationArgs extends CoreInput {
|
|
|
19
19
|
/**
|
|
20
20
|
* Alias for skip
|
|
21
21
|
*/
|
|
22
|
-
@Field(
|
|
22
|
+
@Field(type => Int, {
|
|
23
23
|
description: 'Alias for skip',
|
|
24
24
|
nullable: true,
|
|
25
25
|
})
|
|
@@ -29,7 +29,7 @@ export class PaginationArgs extends CoreInput {
|
|
|
29
29
|
/**
|
|
30
30
|
* Skip for pagination
|
|
31
31
|
*/
|
|
32
|
-
@Field(
|
|
32
|
+
@Field(type => Int, {
|
|
33
33
|
description: 'Skip specifies how many found elements should be skipped on return',
|
|
34
34
|
nullable: true,
|
|
35
35
|
})
|
|
@@ -39,7 +39,7 @@ export class PaginationArgs extends CoreInput {
|
|
|
39
39
|
/**
|
|
40
40
|
* Sorting for pagination
|
|
41
41
|
*/
|
|
42
|
-
@Field(
|
|
42
|
+
@Field(type => [SortInput], {
|
|
43
43
|
description: 'Sorting the returned elements',
|
|
44
44
|
nullable: true,
|
|
45
45
|
})
|
|
@@ -49,7 +49,7 @@ export class PaginationArgs extends CoreInput {
|
|
|
49
49
|
/**
|
|
50
50
|
* Alias for limit
|
|
51
51
|
*/
|
|
52
|
-
@Field(
|
|
52
|
+
@Field(type => Int, {
|
|
53
53
|
description: 'Alias for limit',
|
|
54
54
|
nullable: true,
|
|
55
55
|
})
|
|
@@ -69,11 +69,11 @@ export class PaginationArgs extends CoreInput {
|
|
|
69
69
|
cloneDeep?: boolean;
|
|
70
70
|
funcAllowed?: boolean;
|
|
71
71
|
mapId?: boolean;
|
|
72
|
-
} = {}
|
|
72
|
+
} = {},
|
|
73
73
|
): this {
|
|
74
74
|
super.map(data, options);
|
|
75
75
|
this.sort = maps(data.sort, SortInput, options.cloneDeep);
|
|
76
|
-
Object.keys(this).forEach(
|
|
76
|
+
Object.keys(this).forEach(key => this[key] === undefined && delete this[key]);
|
|
77
77
|
return this;
|
|
78
78
|
}
|
|
79
79
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ExecutionContext, createParamDecorator } from '@nestjs/common';
|
|
2
2
|
import { currentUserDec, graphqlPopulateDec } from '../helpers/decorator.helper';
|
|
3
3
|
import { ServiceOptions } from '../interfaces/service-options.interface';
|
|
4
4
|
|
|
@@ -25,5 +25,5 @@ export const GraphQLServiceOptions = createParamDecorator(
|
|
|
25
25
|
currentUser: currentUserDec(null, ctx),
|
|
26
26
|
populate: graphqlPopulateDec(data, ctx),
|
|
27
27
|
};
|
|
28
|
-
}
|
|
28
|
+
},
|
|
29
29
|
);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
2
|
import { UnauthorizedException } from '@nestjs/common';
|
|
3
|
+
import _ = require('lodash');
|
|
3
4
|
import { ProcessType } from '../enums/process-type.enum';
|
|
4
5
|
import { RoleEnum } from '../enums/role.enum';
|
|
5
6
|
import { getIncludedIds } from '../helpers/db.helper';
|
|
6
7
|
import { RequireAtLeastOne } from '../types/required-at-least-one.type';
|
|
7
|
-
import _ = require('lodash');
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Restricted meta key
|
|
@@ -68,7 +68,7 @@ export const checkRestricted = (
|
|
|
68
68
|
removeUndefinedFromResultArray?: boolean;
|
|
69
69
|
throwError?: boolean;
|
|
70
70
|
} = {},
|
|
71
|
-
processedObjects: any[] = []
|
|
71
|
+
processedObjects: any[] = [],
|
|
72
72
|
) => {
|
|
73
73
|
const config = {
|
|
74
74
|
checkObjectItself: false,
|
|
@@ -92,9 +92,9 @@ export const checkRestricted = (
|
|
|
92
92
|
// Array
|
|
93
93
|
if (Array.isArray(data)) {
|
|
94
94
|
// Check array items
|
|
95
|
-
let result = data.map(
|
|
95
|
+
let result = data.map(item => checkRestricted(item, user, config, processedObjects));
|
|
96
96
|
if (!config.throwError && config.removeUndefinedFromResultArray) {
|
|
97
|
-
result = result.filter(
|
|
97
|
+
result = result.filter(item => item !== undefined);
|
|
98
98
|
}
|
|
99
99
|
return result;
|
|
100
100
|
}
|
|
@@ -114,8 +114,8 @@ export const checkRestricted = (
|
|
|
114
114
|
if (typeof item === 'string') {
|
|
115
115
|
roles.push(item);
|
|
116
116
|
} else if (
|
|
117
|
-
item?.roles?.length
|
|
118
|
-
(config.processType && item.processType ? config.processType === item.processType : true)
|
|
117
|
+
item?.roles?.length
|
|
118
|
+
&& (config.processType && item.processType ? config.processType === item.processType : true)
|
|
119
119
|
) {
|
|
120
120
|
if (Array.isArray(item.roles)) {
|
|
121
121
|
roles.push(...item.roles);
|
|
@@ -134,11 +134,11 @@ export const checkRestricted = (
|
|
|
134
134
|
|
|
135
135
|
// Check access rights
|
|
136
136
|
if (
|
|
137
|
-
roles.includes(RoleEnum.S_EVERYONE)
|
|
138
|
-
user?.hasRole?.(roles)
|
|
139
|
-
(user?.id && roles.includes(RoleEnum.S_USER))
|
|
140
|
-
(roles.includes(RoleEnum.S_SELF) && getIncludedIds(config.dbObject, user))
|
|
141
|
-
(roles.includes(RoleEnum.S_CREATOR) && getIncludedIds(config.dbObject?.createdBy, user))
|
|
137
|
+
roles.includes(RoleEnum.S_EVERYONE)
|
|
138
|
+
|| user?.hasRole?.(roles)
|
|
139
|
+
|| (user?.id && roles.includes(RoleEnum.S_USER))
|
|
140
|
+
|| (roles.includes(RoleEnum.S_SELF) && getIncludedIds(config.dbObject, user))
|
|
141
|
+
|| (roles.includes(RoleEnum.S_CREATOR) && getIncludedIds(config.dbObject?.createdBy, user))
|
|
142
142
|
) {
|
|
143
143
|
valid = true;
|
|
144
144
|
}
|
|
@@ -148,11 +148,11 @@ export const checkRestricted = (
|
|
|
148
148
|
// Get groups
|
|
149
149
|
const groups = restricted.filter((item) => {
|
|
150
150
|
return (
|
|
151
|
-
typeof item === 'object'
|
|
151
|
+
typeof item === 'object'
|
|
152
152
|
// Check if object is valid
|
|
153
|
-
item.memberOf?.length
|
|
153
|
+
&& item.memberOf?.length
|
|
154
154
|
// Check if processType is specified and is valid for current process
|
|
155
|
-
(config.processType && item.processType ? config.processType === item.processType : true)
|
|
155
|
+
&& (config.processType && item.processType ? config.processType === item.processType : true)
|
|
156
156
|
);
|
|
157
157
|
}) as { memberOf: string | string[] }[];
|
|
158
158
|
|
|
@@ -199,7 +199,7 @@ export const checkRestricted = (
|
|
|
199
199
|
if (!objectIsValid) {
|
|
200
200
|
// Throw error
|
|
201
201
|
if (config.throwError) {
|
|
202
|
-
throw new UnauthorizedException(
|
|
202
|
+
throw new UnauthorizedException(`The current user has no access rights for ${data.constructor?.name}`);
|
|
203
203
|
}
|
|
204
204
|
return null;
|
|
205
205
|
}
|
|
@@ -225,9 +225,9 @@ export const checkRestricted = (
|
|
|
225
225
|
// Throw error
|
|
226
226
|
if (config.throwError) {
|
|
227
227
|
throw new UnauthorizedException(
|
|
228
|
-
|
|
229
|
-
propertyKey
|
|
230
|
-
|
|
228
|
+
`The current user has no access rights for ${
|
|
229
|
+
propertyKey
|
|
230
|
+
}${data.constructor?.name ? ` of ${data.constructor.name}` : ''}`,
|
|
231
231
|
);
|
|
232
232
|
}
|
|
233
233
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ArgumentsHost, Catch, ExceptionFilter, HttpException } from '@nestjs/common';
|
|
1
|
+
import { ArgumentsHost, Catch, ExceptionFilter, HttpException, ServiceUnavailableException } from '@nestjs/common';
|
|
2
2
|
import { GqlContextType } from '@nestjs/graphql';
|
|
3
3
|
import { Response } from 'express';
|
|
4
4
|
|
|
@@ -21,8 +21,8 @@ export class HttpExceptionLogFilter implements ExceptionFilter {
|
|
|
21
21
|
const ctx = host.switchToHttp();
|
|
22
22
|
const res = ctx.getResponse<Response>();
|
|
23
23
|
const status = exception.getStatus();
|
|
24
|
-
res.status(status).json(
|
|
25
|
-
...exception,
|
|
26
|
-
|
|
24
|
+
res.status(status).json(
|
|
25
|
+
exception instanceof ServiceUnavailableException ? ({ ...exception } as any).response : { ...exception },
|
|
26
|
+
);
|
|
27
27
|
}
|
|
28
28
|
}
|