@lenne.tech/nest-server 10.0.2 → 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.
Files changed (214) hide show
  1. package/dist/config.env.js +29 -17
  2. package/dist/config.env.js.map +1 -1
  3. package/dist/core/common/args/filter.args.js +3 -3
  4. package/dist/core/common/args/filter.args.js.map +1 -1
  5. package/dist/core/common/args/pagination.args.js +6 -6
  6. package/dist/core/common/args/pagination.args.js.map +1 -1
  7. package/dist/core/common/decorators/restricted.decorator.js +15 -17
  8. package/dist/core/common/decorators/restricted.decorator.js.map +1 -1
  9. package/dist/core/common/filters/http-exception-log.filter.js +1 -3
  10. package/dist/core/common/filters/http-exception-log.filter.js.map +1 -1
  11. package/dist/core/common/helpers/db.helper.js +14 -14
  12. package/dist/core/common/helpers/db.helper.js.map +1 -1
  13. package/dist/core/common/helpers/file.helper.js +2 -2
  14. package/dist/core/common/helpers/file.helper.js.map +1 -1
  15. package/dist/core/common/helpers/filter.helper.d.ts +2 -2
  16. package/dist/core/common/helpers/filter.helper.js +1 -1
  17. package/dist/core/common/helpers/filter.helper.js.map +1 -1
  18. package/dist/core/common/helpers/graphql.helper.js +1 -1
  19. package/dist/core/common/helpers/graphql.helper.js.map +1 -1
  20. package/dist/core/common/helpers/input.helper.js +31 -38
  21. package/dist/core/common/helpers/input.helper.js.map +1 -1
  22. package/dist/core/common/helpers/model.helper.js +7 -7
  23. package/dist/core/common/helpers/model.helper.js.map +1 -1
  24. package/dist/core/common/helpers/service.helper.js +2 -2
  25. package/dist/core/common/helpers/service.helper.js.map +1 -1
  26. package/dist/core/common/inputs/combined-filter.input.js +3 -3
  27. package/dist/core/common/inputs/combined-filter.input.js.map +1 -1
  28. package/dist/core/common/inputs/core-input.input.js +1 -1
  29. package/dist/core/common/inputs/core-input.input.js.map +1 -1
  30. package/dist/core/common/inputs/filter.input.js +3 -3
  31. package/dist/core/common/inputs/filter.input.js.map +1 -1
  32. package/dist/core/common/inputs/single-filter.input.js +4 -4
  33. package/dist/core/common/inputs/single-filter.input.js.map +1 -1
  34. package/dist/core/common/inputs/sort.input.js +1 -1
  35. package/dist/core/common/inputs/sort.input.js.map +1 -1
  36. package/dist/core/common/interceptors/check-security.interceptor.d.ts +1 -1
  37. package/dist/core/common/interceptors/check-security.interceptor.js +2 -2
  38. package/dist/core/common/interceptors/check-security.interceptor.js.map +1 -1
  39. package/dist/core/common/interfaces/server-options.interface.d.ts +27 -0
  40. package/dist/core/common/models/core-model.model.js.map +1 -1
  41. package/dist/core/common/models/core-persistence.model.js +3 -3
  42. package/dist/core/common/models/core-persistence.model.js.map +1 -1
  43. package/dist/core/common/pipes/map-and-validate.pipe.d.ts +1 -1
  44. package/dist/core/common/pipes/map-and-validate.pipe.js +1 -1
  45. package/dist/core/common/pipes/map-and-validate.pipe.js.map +1 -1
  46. package/dist/core/common/scalars/any.scalar.js +2 -2
  47. package/dist/core/common/scalars/any.scalar.js.map +1 -1
  48. package/dist/core/common/scalars/date-timestamp.scalar.js +1 -1
  49. package/dist/core/common/scalars/date-timestamp.scalar.js.map +1 -1
  50. package/dist/core/common/scalars/date.scalar.js +1 -1
  51. package/dist/core/common/scalars/date.scalar.js.map +1 -1
  52. package/dist/core/common/scalars/json.scalar.js +2 -2
  53. package/dist/core/common/scalars/json.scalar.js.map +1 -1
  54. package/dist/core/common/services/config.service.js +7 -7
  55. package/dist/core/common/services/config.service.js.map +1 -1
  56. package/dist/core/common/services/core-cron-jobs.service.js +5 -5
  57. package/dist/core/common/services/core-cron-jobs.service.js.map +1 -1
  58. package/dist/core/common/services/crud.service.js +1 -1
  59. package/dist/core/common/services/crud.service.js.map +1 -1
  60. package/dist/core/common/services/mailjet.service.js +5 -5
  61. package/dist/core/common/services/mailjet.service.js.map +1 -1
  62. package/dist/core/common/services/module.service.js.map +1 -1
  63. package/dist/core/common/services/template.service.js +3 -3
  64. package/dist/core/common/services/template.service.js.map +1 -1
  65. package/dist/core/common/types/core-model-constructor.type.d.ts +2 -2
  66. package/dist/core/modules/auth/core-auth.module.js +3 -3
  67. package/dist/core/modules/auth/core-auth.module.js.map +1 -1
  68. package/dist/core/modules/auth/core-auth.resolver.js +5 -5
  69. package/dist/core/modules/auth/core-auth.resolver.js.map +1 -1
  70. package/dist/core/modules/auth/guards/auth.guard.js +4 -4
  71. package/dist/core/modules/auth/guards/auth.guard.js.map +1 -1
  72. package/dist/core/modules/auth/guards/roles.guard.js +1 -1
  73. package/dist/core/modules/auth/guards/roles.guard.js.map +1 -1
  74. package/dist/core/modules/auth/services/core-auth.service.js +5 -5
  75. package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
  76. package/dist/core/modules/auth/strategies/jwt.strategy.js.map +1 -1
  77. package/dist/core/modules/auth/tokens.decorator.js +2 -2
  78. package/dist/core/modules/auth/tokens.decorator.js.map +1 -1
  79. package/dist/core/modules/file/core-file-info.model.js +2 -2
  80. package/dist/core/modules/file/core-file-info.model.js.map +1 -1
  81. package/dist/core/modules/file/core-file.controller.d.ts +1 -2
  82. package/dist/core/modules/file/core-file.controller.js +3 -6
  83. package/dist/core/modules/file/core-file.controller.js.map +1 -1
  84. package/dist/core/modules/file/core-file.service.js +1 -1
  85. package/dist/core/modules/file/core-file.service.js.map +1 -1
  86. package/dist/core/modules/file/interfaces/file-upload.interface.d.ts +1 -1
  87. package/dist/core/modules/health-check/core-health-check-result.model.d.ts +8 -0
  88. package/dist/core/modules/health-check/core-health-check-result.model.js +53 -0
  89. package/dist/core/modules/health-check/core-health-check-result.model.js.map +1 -0
  90. package/dist/core/modules/health-check/core-health-check.controller.d.ts +6 -0
  91. package/dist/core/modules/health-check/core-health-check.controller.js +33 -0
  92. package/dist/core/modules/health-check/core-health-check.controller.js.map +1 -0
  93. package/dist/core/modules/health-check/core-health-check.module.d.ts +2 -0
  94. package/dist/core/modules/health-check/core-health-check.module.js +24 -0
  95. package/dist/core/modules/health-check/core-health-check.module.js.map +1 -0
  96. package/dist/core/modules/health-check/core-health-check.resolver.d.ts +6 -0
  97. package/dist/core/modules/health-check/core-health-check.resolver.js +38 -0
  98. package/dist/core/modules/health-check/core-health-check.resolver.js.map +1 -0
  99. package/dist/core/modules/health-check/core-health-check.service.d.ts +11 -0
  100. package/dist/core/modules/health-check/core-health-check.service.js +52 -0
  101. package/dist/core/modules/health-check/core-health-check.service.js.map +1 -0
  102. package/dist/core/modules/user/core-user.model.js +4 -4
  103. package/dist/core/modules/user/core-user.model.js.map +1 -1
  104. package/dist/core/modules/user/core-user.service.js +2 -2
  105. package/dist/core/modules/user/core-user.service.js.map +1 -1
  106. package/dist/core/modules/user/inputs/core-user.input.js +1 -1
  107. package/dist/core/modules/user/inputs/core-user.input.js.map +1 -1
  108. package/dist/core.module.js +10 -5
  109. package/dist/core.module.js.map +1 -1
  110. package/dist/index.d.ts +5 -0
  111. package/dist/index.js +5 -0
  112. package/dist/index.js.map +1 -1
  113. package/dist/main.js +1 -1
  114. package/dist/main.js.map +1 -1
  115. package/dist/server/modules/auth/auth.service.js +1 -1
  116. package/dist/server/modules/auth/auth.service.js.map +1 -1
  117. package/dist/server/modules/file/file.controller.js +1 -1
  118. package/dist/server/modules/file/file.controller.js.map +1 -1
  119. package/dist/server/modules/file/file.resolver.js +2 -2
  120. package/dist/server/modules/file/file.resolver.js.map +1 -1
  121. package/dist/server/modules/file/file.service.js +1 -1
  122. package/dist/server/modules/file/file.service.js.map +1 -1
  123. package/dist/server/modules/file/multer-config.service.js +1 -1
  124. package/dist/server/modules/file/multer-config.service.js.map +1 -1
  125. package/dist/server/modules/user/avatar.controller.js +1 -1
  126. package/dist/server/modules/user/avatar.controller.js.map +1 -1
  127. package/dist/server/modules/user/user.resolver.js +1 -1
  128. package/dist/server/modules/user/user.resolver.js.map +1 -1
  129. package/dist/server/modules/user/user.service.js +3 -3
  130. package/dist/server/modules/user/user.service.js.map +1 -1
  131. package/dist/templates/index.ejs +2 -0
  132. package/dist/templates/password-reset.ejs +3 -0
  133. package/dist/templates/welcome.ejs +3 -0
  134. package/dist/test/test.helper.d.ts +1 -1
  135. package/dist/test/test.helper.js +7 -7
  136. package/dist/test/test.helper.js.map +1 -1
  137. package/dist/tsconfig.build.tsbuildinfo +1 -1
  138. package/package.json +26 -23
  139. package/src/config.env.ts +32 -20
  140. package/src/core/common/args/filter.args.ts +4 -4
  141. package/src/core/common/args/pagination.args.ts +7 -7
  142. package/src/core/common/decorators/graphql-service-options.decorator.ts +2 -2
  143. package/src/core/common/decorators/graphql-user.decorator.ts +1 -1
  144. package/src/core/common/decorators/rest-user.decorator.ts +1 -1
  145. package/src/core/common/decorators/restricted.decorator.ts +18 -18
  146. package/src/core/common/filters/http-exception-log.filter.ts +4 -4
  147. package/src/core/common/helpers/db.helper.ts +35 -40
  148. package/src/core/common/helpers/decorator.helper.ts +1 -1
  149. package/src/core/common/helpers/file.helper.ts +2 -2
  150. package/src/core/common/helpers/filter.helper.ts +7 -8
  151. package/src/core/common/helpers/graphql.helper.ts +6 -6
  152. package/src/core/common/helpers/input.helper.ts +54 -61
  153. package/src/core/common/helpers/model.helper.ts +33 -41
  154. package/src/core/common/helpers/service.helper.ts +8 -8
  155. package/src/core/common/inputs/combined-filter.input.ts +4 -4
  156. package/src/core/common/inputs/core-input.input.ts +2 -2
  157. package/src/core/common/inputs/filter.input.ts +4 -4
  158. package/src/core/common/inputs/single-filter.input.ts +4 -4
  159. package/src/core/common/inputs/sort.input.ts +1 -1
  160. package/src/core/common/interceptors/check-response.interceptor.ts +1 -1
  161. package/src/core/common/interceptors/check-security.interceptor.ts +5 -5
  162. package/src/core/common/interfaces/server-options.interface.ts +31 -0
  163. package/src/core/common/models/core-model.model.ts +6 -4
  164. package/src/core/common/models/core-persistence.model.ts +3 -3
  165. package/src/core/common/pipes/map-and-validate.pipe.ts +2 -2
  166. package/src/core/common/scalars/any.scalar.ts +2 -2
  167. package/src/core/common/scalars/date-timestamp.scalar.ts +1 -2
  168. package/src/core/common/scalars/date.scalar.ts +1 -2
  169. package/src/core/common/scalars/json.scalar.ts +4 -4
  170. package/src/core/common/services/config.service.ts +16 -16
  171. package/src/core/common/services/core-cron-jobs.service.ts +7 -7
  172. package/src/core/common/services/crud.service.ts +22 -22
  173. package/src/core/common/services/email.service.ts +1 -1
  174. package/src/core/common/services/mailjet.service.ts +8 -8
  175. package/src/core/common/services/module.service.ts +5 -6
  176. package/src/core/common/services/template.service.ts +4 -4
  177. package/src/core/common/types/core-model-constructor.type.ts +2 -2
  178. package/src/core/modules/auth/core-auth.controller.ts +2 -2
  179. package/src/core/modules/auth/core-auth.module.ts +4 -4
  180. package/src/core/modules/auth/core-auth.resolver.ts +9 -9
  181. package/src/core/modules/auth/guards/auth.guard.ts +8 -7
  182. package/src/core/modules/auth/guards/roles.guard.ts +1 -1
  183. package/src/core/modules/auth/services/core-auth.service.ts +9 -9
  184. package/src/core/modules/auth/strategies/jwt-refresh.strategy.ts +1 -1
  185. package/src/core/modules/auth/strategies/jwt.strategy.ts +1 -1
  186. package/src/core/modules/auth/tokens.decorator.ts +6 -7
  187. package/src/core/modules/file/core-file-info.model.ts +2 -2
  188. package/src/core/modules/file/core-file.controller.ts +2 -4
  189. package/src/core/modules/file/core-file.service.ts +6 -5
  190. package/src/core/modules/file/interfaces/file-upload.interface.ts +1 -1
  191. package/src/core/modules/health-check/core-health-check-result.model.ts +46 -0
  192. package/src/core/modules/health-check/core-health-check.controller.ts +24 -0
  193. package/src/core/modules/health-check/core-health-check.module.ts +17 -0
  194. package/src/core/modules/health-check/core-health-check.resolver.ts +32 -0
  195. package/src/core/modules/health-check/core-health-check.service.ts +60 -0
  196. package/src/core/modules/user/core-user.model.ts +5 -5
  197. package/src/core/modules/user/core-user.service.ts +10 -9
  198. package/src/core/modules/user/inputs/core-user.input.ts +1 -2
  199. package/src/core.module.ts +16 -10
  200. package/src/index.ts +10 -0
  201. package/src/main.ts +2 -2
  202. package/src/server/modules/auth/auth.controller.ts +1 -1
  203. package/src/server/modules/auth/auth.resolver.ts +3 -3
  204. package/src/server/modules/auth/auth.service.ts +2 -2
  205. package/src/server/modules/file/file.controller.ts +1 -2
  206. package/src/server/modules/file/file.module.ts +1 -1
  207. package/src/server/modules/file/file.resolver.ts +4 -3
  208. package/src/server/modules/file/file.service.ts +1 -1
  209. package/src/server/modules/file/multer-config.service.ts +1 -1
  210. package/src/server/modules/user/avatar.controller.ts +3 -3
  211. package/src/server/modules/user/user.model.ts +1 -1
  212. package/src/server/modules/user/user.resolver.ts +4 -4
  213. package/src/server/modules/user/user.service.ts +4 -4
  214. 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.2",
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 format && npm run lint && npm run test:ci",
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.4.9",
65
+ "@apollo/gateway": "2.5.1",
66
66
  "@nestjs/apollo": "12.0.7",
67
- "@nestjs/common": "10.0.5",
68
- "@nestjs/core": "10.0.5",
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.0",
71
+ "@nestjs/mongoose": "10.0.1",
72
72
  "@nestjs/passport": "10.0.0",
73
- "@nestjs/platform-express": "10.0.5",
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.3",
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.3",
97
- "nodemailer": "6.9.3",
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
- "@nestjs/cli": "10.1.8",
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.0.5",
111
+ "@nestjs/testing": "10.1.3",
110
112
  "@swc/cli": "0.1.62",
111
- "@swc/core": "1.3.69",
112
- "@swc/jest": "0.2.26",
113
+ "@swc/core": "1.3.73",
114
+ "@swc/jest": "0.2.27",
113
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.195",
121
+ "@types/lodash": "4.14.196",
120
122
  "@types/multer": "1.4.7",
121
- "@types/node": "20.4.2",
122
- "@types/nodemailer": "6.4.8",
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.0.0",
126
- "@typescript-eslint/parser": "6.0.0",
127
+ "@typescript-eslint/eslint-plugin": "6.2.1",
128
+ "@typescript-eslint/parser": "6.2.1",
127
129
  "coffeescript": "2.7.0",
128
- "eslint": "8.45.0",
129
- "eslint-config-prettier": "8.8.0",
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.1",
140
+ "jest": "29.6.2",
138
141
  "npm-watch": "0.11.0",
139
142
  "pm2": "5.3.0",
140
- "prettier": "2.8.8",
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: false,
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: development
251
+ * default: local
243
252
  */
244
- const env = process.env['NODE' + '_ENV'] || 'development';
245
- const envConfig = config[env] || config.development;
246
- console.info('Configured for: ' + envConfig.env + (env !== envConfig.env ? ' (requested: ' + env + ')' : ''));
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
- localConfig = require(envConfig.loadLocalConfig);
253
- merge(envConfig, localConfig);
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
- try {
256
- // get config from src directory
257
- localConfig = require(__dirname + '/config.json');
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
- } catch {
260
- try {
261
- // if not found try to find in project directory
262
- localConfig = require(__dirname + '/../config.json');
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
- } catch (e) {
265
- // No config.json found => nothing to do
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((type) => FilterInput, {
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((type) => Number, {
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((key) => this[key] === undefined && delete this[key]);
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((type) => Int, {
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((type) => Int, {
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((type) => Int, {
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((type) => [SortInput], {
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((type) => Int, {
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((key) => this[key] === undefined && delete this[key]);
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 { createParamDecorator, ExecutionContext } from '@nestjs/common';
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,4 +1,4 @@
1
- import { createParamDecorator, ExecutionContext } from '@nestjs/common';
1
+ import { ExecutionContext, createParamDecorator } from '@nestjs/common';
2
2
  import { GqlExecutionContext } from '@nestjs/graphql';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { createParamDecorator, ExecutionContext } from '@nestjs/common';
1
+ import { ExecutionContext, createParamDecorator } from '@nestjs/common';
2
2
 
3
3
  /**
4
4
  * User decorator for REST request
@@ -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((item) => checkRestricted(item, user, config, processedObjects));
95
+ let result = data.map(item => checkRestricted(item, user, config, processedObjects));
96
96
  if (!config.throwError && config.removeUndefinedFromResultArray) {
97
- result = result.filter((item) => item !== undefined);
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('The current user has no access rights for ' + data.constructor?.name);
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
- 'The current user has no access rights for ' +
229
- propertyKey +
230
- (data.constructor?.name ? ' of ' + data.constructor.name : '')
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((id) => getStringIds(id) === compare);
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((id) => new Types.ObjectId(getStringId(id)));
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((e) => getStringIds(e)) === index;
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
- // Subfield ist an object
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((e) => objectIdsToStrings(e, prepared));
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((p) => removeUnresolvedReferences(p, populatedOptions, false));
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((po) =>
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((item) => (modelClass as any).map(item));
508
+ result = result.map(item => (modelClass as any).map(item));
513
509
  } else {
514
510
  result = (modelClass as any).map(result);
515
511
  }
516
- } else {
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((item) => (modelClass as any).map(item));
521
- }
517
+ result = queryOrDocument.map(item => (modelClass as any).map(item));
522
518
 
523
- // Process document
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
- // Document => Non chaining
601
- // Array with documents
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
- // Single document
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') {