@lenne.tech/nest-server 10.0.0 → 10.0.3
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/dist/config.env.js +29 -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 +27 -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/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 +4 -4
- 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 +10 -5
- package/dist/core.module.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +5 -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 +28 -25
- package/src/config.env.ts +32 -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 +31 -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/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 +60 -0
- package/src/core/modules/user/core-user.model.ts +5 -5
- 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 +16 -10
- package/src/index.ts +10 -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.3",
|
|
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",
|
|
@@ -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,12 +90,12 @@
|
|
|
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",
|
|
@@ -104,29 +105,31 @@
|
|
|
104
105
|
"rxjs": "7.8.1"
|
|
105
106
|
},
|
|
106
107
|
"devDependencies": {
|
|
107
|
-
"@
|
|
108
|
+
"@lenne.tech/eslint-config-ts": "0.0.8",
|
|
109
|
+
"@nestjs/cli": "10.1.11",
|
|
108
110
|
"@nestjs/schematics": "10.0.1",
|
|
109
|
-
"@nestjs/testing": "10.
|
|
110
|
-
"@swc/cli": "
|
|
111
|
-
"@swc/core": "1.3.
|
|
112
|
-
"@swc/jest": "0.2.
|
|
113
|
-
"@types/compression": "
|
|
111
|
+
"@nestjs/testing": "10.1.3",
|
|
112
|
+
"@swc/cli": "0.1.62",
|
|
113
|
+
"@swc/core": "1.3.73",
|
|
114
|
+
"@swc/jest": "0.2.27",
|
|
115
|
+
"@types/compression": "1.7.2",
|
|
114
116
|
"@types/cookie-parser": "1.4.3",
|
|
115
117
|
"@types/cron": "2.0.1",
|
|
116
118
|
"@types/ejs": "3.1.2",
|
|
117
119
|
"@types/express": "4.17.17",
|
|
118
120
|
"@types/jest": "29.5.3",
|
|
119
|
-
"@types/lodash": "4.14.
|
|
121
|
+
"@types/lodash": "4.14.196",
|
|
120
122
|
"@types/multer": "1.4.7",
|
|
121
|
-
"@types/node": "20.4.
|
|
122
|
-
"@types/nodemailer": "6.4.
|
|
123
|
+
"@types/node": "20.4.5",
|
|
124
|
+
"@types/nodemailer": "6.4.9",
|
|
123
125
|
"@types/passport": "1.0.12",
|
|
124
126
|
"@types/supertest": "2.0.12",
|
|
125
|
-
"@typescript-eslint/eslint-plugin": "6.
|
|
126
|
-
"@typescript-eslint/parser": "6.
|
|
127
|
+
"@typescript-eslint/eslint-plugin": "6.2.1",
|
|
128
|
+
"@typescript-eslint/parser": "6.2.1",
|
|
127
129
|
"coffeescript": "2.7.0",
|
|
128
|
-
"eslint": "8.
|
|
129
|
-
"eslint-config-prettier": "8.
|
|
130
|
+
"eslint": "8.46.0",
|
|
131
|
+
"eslint-config-prettier": "8.9.0",
|
|
132
|
+
"eslint-plugin-unused-imports": "^3.0.0",
|
|
130
133
|
"find-file-up": "2.0.1",
|
|
131
134
|
"grunt": "1.6.1",
|
|
132
135
|
"grunt-bg-shell": "2.3.3",
|
|
@@ -134,10 +137,10 @@
|
|
|
134
137
|
"grunt-contrib-watch": "1.1.0",
|
|
135
138
|
"grunt-sync": "0.8.2",
|
|
136
139
|
"husky": "8.0.3",
|
|
137
|
-
"jest": "29.6.
|
|
140
|
+
"jest": "29.6.2",
|
|
138
141
|
"npm-watch": "0.11.0",
|
|
139
142
|
"pm2": "5.3.0",
|
|
140
|
-
"prettier": "
|
|
143
|
+
"prettier": "3.0.0",
|
|
141
144
|
"pretty-quick": "3.1.3",
|
|
142
145
|
"supertest": "6.3.3",
|
|
143
146
|
"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,9 @@ const config: { [env: string]: IServerOptions } = {
|
|
|
55
55
|
},
|
|
56
56
|
maxComplexity: 20,
|
|
57
57
|
},
|
|
58
|
+
healthCheck: {
|
|
59
|
+
enabled: true,
|
|
60
|
+
},
|
|
58
61
|
ignoreSelectionsForPopulate: true,
|
|
59
62
|
jwt: {
|
|
60
63
|
secret: 'SECRET_OR_PRIVATE_KEY_LOCAL',
|
|
@@ -69,7 +72,7 @@ const config: { [env: string]: IServerOptions } = {
|
|
|
69
72
|
},
|
|
70
73
|
},
|
|
71
74
|
},
|
|
72
|
-
loadLocalConfig:
|
|
75
|
+
loadLocalConfig: true,
|
|
73
76
|
logExceptions: true,
|
|
74
77
|
mongoose: {
|
|
75
78
|
collation: {
|
|
@@ -128,6 +131,9 @@ const config: { [env: string]: IServerOptions } = {
|
|
|
128
131
|
},
|
|
129
132
|
maxComplexity: 20,
|
|
130
133
|
},
|
|
134
|
+
healthCheck: {
|
|
135
|
+
enabled: true,
|
|
136
|
+
},
|
|
131
137
|
ignoreSelectionsForPopulate: true,
|
|
132
138
|
jwt: {
|
|
133
139
|
secret: 'SECRET_OR_PRIVATE_KEY_DEV',
|
|
@@ -201,6 +207,9 @@ const config: { [env: string]: IServerOptions } = {
|
|
|
201
207
|
},
|
|
202
208
|
maxComplexity: 20,
|
|
203
209
|
},
|
|
210
|
+
healthCheck: {
|
|
211
|
+
enabled: true,
|
|
212
|
+
},
|
|
204
213
|
ignoreSelectionsForPopulate: true,
|
|
205
214
|
jwt: {
|
|
206
215
|
secret: 'SECRET_OR_PRIVATE_KEY_PROD',
|
|
@@ -239,32 +248,35 @@ const config: { [env: string]: IServerOptions } = {
|
|
|
239
248
|
/**
|
|
240
249
|
* Environment specific config
|
|
241
250
|
*
|
|
242
|
-
* default:
|
|
251
|
+
* default: local
|
|
243
252
|
*/
|
|
244
|
-
const env = process.env['NODE' + '_ENV'] || '
|
|
245
|
-
const envConfig = config[env] || config.
|
|
246
|
-
console.info(
|
|
247
|
-
|
|
253
|
+
const env = process.env['NODE' + '_ENV'] || 'local';
|
|
254
|
+
const envConfig = config[env] || config.local;
|
|
255
|
+
console.info(`Configured for: ${envConfig.env}${env !== envConfig.env ? ` (requested: ${env})` : ''}`);
|
|
248
256
|
// Merge with localConfig (e.g. config.json)
|
|
249
257
|
if (envConfig.loadLocalConfig) {
|
|
250
258
|
let localConfig;
|
|
251
259
|
if (typeof envConfig.loadLocalConfig === 'string') {
|
|
252
|
-
|
|
253
|
-
|
|
260
|
+
import(envConfig.loadLocalConfig).then((loadedConfig) => {
|
|
261
|
+
localConfig = loadedConfig.default || loadedConfig;
|
|
262
|
+
merge(envConfig, localConfig);
|
|
263
|
+
}).catch(() => {
|
|
264
|
+
console.info(`Configuration ${envConfig.loadLocalConfig} not found!`);
|
|
265
|
+
});
|
|
254
266
|
} else {
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
localConfig =
|
|
267
|
+
// get config from src directory
|
|
268
|
+
import(join(__dirname, 'config.json')).then((loadedConfig) => {
|
|
269
|
+
localConfig = loadedConfig.default || loadedConfig;
|
|
258
270
|
merge(envConfig, localConfig);
|
|
259
|
-
}
|
|
260
|
-
try
|
|
261
|
-
|
|
262
|
-
localConfig =
|
|
271
|
+
}).catch(() => {
|
|
272
|
+
// if not found try to find in project directory
|
|
273
|
+
import(join(__dirname, '..', 'config.json')).then((loadedConfig) => {
|
|
274
|
+
localConfig = loadedConfig.default || loadedConfig;
|
|
263
275
|
merge(envConfig, localConfig);
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
}
|
|
267
|
-
}
|
|
276
|
+
}).catch(() => {
|
|
277
|
+
console.info('No local config.json found!');
|
|
278
|
+
});
|
|
279
|
+
});
|
|
268
280
|
}
|
|
269
281
|
}
|
|
270
282
|
|
|
@@ -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
|
}
|
|
@@ -28,7 +28,7 @@ export function addIds(
|
|
|
28
28
|
target: any,
|
|
29
29
|
ids: StringOrObjectId | StringOrObjectId[],
|
|
30
30
|
convert: 'string' | 'object' | 'auto' | false = 'auto',
|
|
31
|
-
options?: { unique?: boolean }
|
|
31
|
+
options?: { unique?: boolean },
|
|
32
32
|
): any[] {
|
|
33
33
|
// Set config
|
|
34
34
|
const config = {
|
|
@@ -54,17 +54,14 @@ export function addIds(
|
|
|
54
54
|
if (ids.length) {
|
|
55
55
|
// Add autoconverted ID
|
|
56
56
|
if (
|
|
57
|
-
result.length
|
|
58
|
-
convert === 'auto'
|
|
59
|
-
((result[0] instanceof Types.ObjectId && !(ids instanceof Types.ObjectId))
|
|
60
|
-
(typeof result[0] === 'string' && typeof ids !== 'string'))
|
|
57
|
+
result.length
|
|
58
|
+
&& convert === 'auto'
|
|
59
|
+
&& ((result[0] instanceof Types.ObjectId && !(ids instanceof Types.ObjectId))
|
|
60
|
+
|| (typeof result[0] === 'string' && typeof ids !== 'string'))
|
|
61
61
|
) {
|
|
62
62
|
const converted = result[0] instanceof Types.ObjectId ? getObjectIds(ids) : getStringIds(ids);
|
|
63
63
|
result.push(...(converted as any));
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
// Add ID
|
|
67
|
-
else {
|
|
64
|
+
} else { // Add ID
|
|
68
65
|
result.push(...ids);
|
|
69
66
|
}
|
|
70
67
|
}
|
|
@@ -109,7 +106,7 @@ export function equalIds(...ids: IdsType[]): boolean {
|
|
|
109
106
|
if (!compare) {
|
|
110
107
|
return false;
|
|
111
108
|
}
|
|
112
|
-
return ids.every(
|
|
109
|
+
return ids.every(id => getStringIds(id) === compare);
|
|
113
110
|
}
|
|
114
111
|
|
|
115
112
|
/**
|
|
@@ -124,7 +121,7 @@ export function getIncludedIds(includes: IdsType, ids: IdsType, convert?: 'objec
|
|
|
124
121
|
export function getIncludedIds<T = IdsType>(
|
|
125
122
|
includes: IdsType,
|
|
126
123
|
ids: T | IdsType,
|
|
127
|
-
convert?: 'string' | 'object'
|
|
124
|
+
convert?: 'string' | 'object',
|
|
128
125
|
): T[] | null | undefined {
|
|
129
126
|
if (!includes || !ids) {
|
|
130
127
|
return undefined;
|
|
@@ -189,7 +186,7 @@ export function getStringIds(elements: any[], options?: { deep?: boolean; unique
|
|
|
189
186
|
export function getStringIds(elements: any, options?: { deep?: boolean; unique?: boolean }): string;
|
|
190
187
|
export function getStringIds<T extends any | any[]>(
|
|
191
188
|
elements: T,
|
|
192
|
-
options?: { deep?: boolean; unique?: boolean }
|
|
189
|
+
options?: { deep?: boolean; unique?: boolean },
|
|
193
190
|
): string | string[] {
|
|
194
191
|
// Process options
|
|
195
192
|
const { deep, unique } = {
|
|
@@ -236,7 +233,7 @@ export function getObjectIds(ids: any[]): Types.ObjectId[];
|
|
|
236
233
|
export function getObjectIds(ids: any): Types.ObjectId;
|
|
237
234
|
export function getObjectIds<T extends any | any[]>(ids: T): Types.ObjectId | Types.ObjectId[] {
|
|
238
235
|
if (Array.isArray(ids)) {
|
|
239
|
-
return ids.map(
|
|
236
|
+
return ids.map(id => new Types.ObjectId(getStringId(id)));
|
|
240
237
|
}
|
|
241
238
|
return new Types.ObjectId(getStringId(ids));
|
|
242
239
|
}
|
|
@@ -250,7 +247,7 @@ export function getElementsViaIds<T = any>(
|
|
|
250
247
|
options: {
|
|
251
248
|
splice?: boolean;
|
|
252
249
|
unique?: boolean;
|
|
253
|
-
} = {}
|
|
250
|
+
} = {},
|
|
254
251
|
): T[] {
|
|
255
252
|
// Config
|
|
256
253
|
const config = {
|
|
@@ -283,7 +280,7 @@ export function getElementsViaIds<T = any>(
|
|
|
283
280
|
// Unique elements
|
|
284
281
|
if (config.unique) {
|
|
285
282
|
return elements.filter((value, index, self) => {
|
|
286
|
-
return self.findIndex(
|
|
283
|
+
return self.findIndex(e => getStringIds(e)) === index;
|
|
287
284
|
});
|
|
288
285
|
}
|
|
289
286
|
|
|
@@ -354,10 +351,9 @@ export function getPopulatOptionsFromSelections(selectionNodes: readonly Selecti
|
|
|
354
351
|
// Subfield is a primitive
|
|
355
352
|
if (!innerNode.selectionSet?.selections?.length) {
|
|
356
353
|
option.select ? option.select.push(innerNode.name.value) : (option.select = [innerNode.name.value]);
|
|
357
|
-
}
|
|
358
354
|
|
|
359
|
-
|
|
360
|
-
else {
|
|
355
|
+
// Subfield ist an object
|
|
356
|
+
} else {
|
|
361
357
|
const innerPopulate = getPopulatOptionsFromSelections([innerNode]);
|
|
362
358
|
option.populate = option.populate
|
|
363
359
|
? (option.populate as PopulateOptions[]).concat(innerPopulate)
|
|
@@ -399,7 +395,7 @@ export function objectIdsToStrings(element: any, prepared: WeakMap<any, any> = n
|
|
|
399
395
|
|
|
400
396
|
// Process array
|
|
401
397
|
if (Array.isArray(element)) {
|
|
402
|
-
return element.map(
|
|
398
|
+
return element.map(e => objectIdsToStrings(e, prepared));
|
|
403
399
|
}
|
|
404
400
|
|
|
405
401
|
// Process object
|
|
@@ -425,7 +421,7 @@ export function objectIdsToStrings(element: any, prepared: WeakMap<any, any> = n
|
|
|
425
421
|
export function removeUnresolvedReferences<T = any>(
|
|
426
422
|
populated: T,
|
|
427
423
|
populatedOptions: string | PopulateOptions | PopulateOptions[] | (string | PopulateOptions)[],
|
|
428
|
-
ignoreFirst = true
|
|
424
|
+
ignoreFirst = true,
|
|
429
425
|
): T {
|
|
430
426
|
// Check parameter
|
|
431
427
|
if (!populated || !populatedOptions) {
|
|
@@ -434,7 +430,7 @@ export function removeUnresolvedReferences<T = any>(
|
|
|
434
430
|
|
|
435
431
|
// Process array
|
|
436
432
|
if (Array.isArray(populated)) {
|
|
437
|
-
populated.forEach(
|
|
433
|
+
populated.forEach(p => removeUnresolvedReferences(p, populatedOptions, false));
|
|
438
434
|
return populated;
|
|
439
435
|
}
|
|
440
436
|
|
|
@@ -442,8 +438,8 @@ export function removeUnresolvedReferences<T = any>(
|
|
|
442
438
|
if (typeof populated === 'object') {
|
|
443
439
|
// populatedOptions is an array
|
|
444
440
|
if (Array.isArray(populatedOptions)) {
|
|
445
|
-
populatedOptions.forEach(
|
|
446
|
-
removeUnresolvedReferences(populated, ignoreFirst && typeof po === 'object' ? po.populate : po, false)
|
|
441
|
+
populatedOptions.forEach(po =>
|
|
442
|
+
removeUnresolvedReferences(populated, ignoreFirst && typeof po === 'object' ? po.populate : po, false),
|
|
447
443
|
);
|
|
448
444
|
return populated;
|
|
449
445
|
}
|
|
@@ -481,15 +477,15 @@ export async function popAndMap<T extends CoreModel>(
|
|
|
481
477
|
mongooseModel?: Model<any>,
|
|
482
478
|
options?: {
|
|
483
479
|
ignoreSelections?: boolean;
|
|
484
|
-
}
|
|
480
|
+
},
|
|
485
481
|
): Promise<T | T[]> {
|
|
486
482
|
let result;
|
|
487
483
|
let populateOptions: PopulateOptions[] = [];
|
|
488
484
|
const ignoreSelections = options?.ignoreSelections;
|
|
489
485
|
if (populate) {
|
|
490
486
|
if (
|
|
491
|
-
Array.isArray(populate)
|
|
492
|
-
(typeof (populate as string[])[0] === 'string' || typeof (populate as PopulateOptions[])[0]?.path === 'string')
|
|
487
|
+
Array.isArray(populate)
|
|
488
|
+
&& (typeof (populate as string[])[0] === 'string' || typeof (populate as PopulateOptions[])[0]?.path === 'string')
|
|
493
489
|
) {
|
|
494
490
|
populateOptions = populate as PopulateOptions[];
|
|
495
491
|
} else if (Array.isArray(populate) && typeof (populate as SelectionNode[])[0]?.kind === 'string') {
|
|
@@ -509,19 +505,19 @@ export async function popAndMap<T extends CoreModel>(
|
|
|
509
505
|
|
|
510
506
|
// Map result
|
|
511
507
|
if (Array.isArray(result)) {
|
|
512
|
-
result = result.map(
|
|
508
|
+
result = result.map(item => (modelClass as any).map(item));
|
|
513
509
|
} else {
|
|
514
510
|
result = (modelClass as any).map(result);
|
|
515
511
|
}
|
|
516
|
-
|
|
512
|
+
|
|
517
513
|
// Process documents
|
|
514
|
+
} else {
|
|
518
515
|
if (Array.isArray(queryOrDocument)) {
|
|
519
516
|
await setPopulates(queryOrDocument, populateOptions, mongooseModel, { ignoreSelections });
|
|
520
|
-
result = queryOrDocument.map(
|
|
521
|
-
}
|
|
517
|
+
result = queryOrDocument.map(item => (modelClass as any).map(item));
|
|
522
518
|
|
|
523
|
-
|
|
524
|
-
else {
|
|
519
|
+
// Process document
|
|
520
|
+
} else {
|
|
525
521
|
await setPopulates(queryOrDocument, populateOptions, mongooseModel, { ignoreSelections });
|
|
526
522
|
result = (modelClass as any).map(queryOrDocument);
|
|
527
523
|
}
|
|
@@ -568,7 +564,7 @@ export async function setPopulates<T = Query<any, any> | Document>(
|
|
|
568
564
|
queryOrDocument: T,
|
|
569
565
|
populateOptions: string[] | PopulateOptions[] | (string | PopulateOptions)[],
|
|
570
566
|
mongooseModel: Model<any>,
|
|
571
|
-
options?: { ignoreSelections: boolean }
|
|
567
|
+
options?: { ignoreSelections: boolean },
|
|
572
568
|
): Promise<T> {
|
|
573
569
|
// Check parameters
|
|
574
570
|
if (!populateOptions?.length || !queryOrDocument) {
|
|
@@ -595,11 +591,10 @@ export async function setPopulates<T = Query<any, any> | Document>(
|
|
|
595
591
|
for (const options of populateOptions) {
|
|
596
592
|
queryOrDocument = (queryOrDocument as any).populate(options);
|
|
597
593
|
}
|
|
598
|
-
}
|
|
599
594
|
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
else if (Array.isArray(queryOrDocument)) {
|
|
595
|
+
// Document => Non chaining
|
|
596
|
+
// Array with documents
|
|
597
|
+
} else if (Array.isArray(queryOrDocument)) {
|
|
603
598
|
const promises = [];
|
|
604
599
|
queryOrDocument.forEach((item) => {
|
|
605
600
|
if (item.populate) {
|
|
@@ -609,9 +604,9 @@ export async function setPopulates<T = Query<any, any> | Document>(
|
|
|
609
604
|
}
|
|
610
605
|
});
|
|
611
606
|
await Promise.all(promises);
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
else if ((queryOrDocument as any).populate) {
|
|
607
|
+
|
|
608
|
+
// Single document
|
|
609
|
+
} else if ((queryOrDocument as any).populate) {
|
|
615
610
|
await (queryOrDocument as any).populate(populateOptions);
|
|
616
611
|
} else {
|
|
617
612
|
return (await mongooseModel.populate(queryOrDocument as any, populateOptions as any)) as any;
|
|
@@ -28,7 +28,7 @@ export function currentUserDec(data, ctx: ExecutionContext) {
|
|
|
28
28
|
*/
|
|
29
29
|
export function graphqlPopulateDec(
|
|
30
30
|
data: { gqlPath?: string; ignoreSelections?: boolean },
|
|
31
|
-
ctx: ExecutionContext
|
|
31
|
+
ctx: ExecutionContext,
|
|
32
32
|
): PopulateOptions[] {
|
|
33
33
|
// Check context type
|
|
34
34
|
if (ctx.getType<GqlContextType>() !== 'graphql') {
|