nodejs-quickstart-structure 1.18.1 → 1.19.1

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 (235) hide show
  1. package/CHANGELOG.md +309 -294
  2. package/LICENSE +15 -15
  3. package/README.md +2 -1
  4. package/lib/generator.js +139 -139
  5. package/lib/modules/app-setup.js +401 -401
  6. package/lib/modules/caching-setup.js +76 -73
  7. package/lib/modules/config-files.js +151 -151
  8. package/lib/modules/database-setup.js +116 -116
  9. package/lib/modules/kafka-setup.js +249 -191
  10. package/lib/modules/project-setup.js +32 -31
  11. package/lib/prompts.js +100 -100
  12. package/package.json +78 -67
  13. package/templates/clean-architecture/js/src/domain/models/User.js +9 -9
  14. package/templates/clean-architecture/js/src/errors/ApiError.js +14 -14
  15. package/templates/clean-architecture/js/src/errors/BadRequestError.js +11 -10
  16. package/templates/clean-architecture/js/src/errors/BadRequestError.spec.js.ejs +22 -21
  17. package/templates/clean-architecture/js/src/errors/NotFoundError.js +11 -10
  18. package/templates/clean-architecture/js/src/errors/NotFoundError.spec.js.ejs +22 -21
  19. package/templates/clean-architecture/js/src/index.js.ejs +55 -55
  20. package/templates/clean-architecture/js/src/infrastructure/config/env.js.ejs +47 -47
  21. package/templates/clean-architecture/js/src/infrastructure/log/logger.js +36 -36
  22. package/templates/clean-architecture/js/src/infrastructure/log/logger.spec.js.ejs +63 -63
  23. package/templates/clean-architecture/js/src/infrastructure/repositories/UserRepository.js.ejs +69 -39
  24. package/templates/clean-architecture/js/src/infrastructure/repositories/UserRepository.spec.js.ejs +142 -81
  25. package/templates/clean-architecture/js/src/infrastructure/webserver/middleware/errorMiddleware.js +30 -30
  26. package/templates/clean-architecture/js/src/infrastructure/webserver/server.js.ejs +89 -89
  27. package/templates/clean-architecture/js/src/infrastructure/webserver/swagger.js.ejs +6 -6
  28. package/templates/clean-architecture/js/src/interfaces/controllers/userController.js.ejs +156 -75
  29. package/templates/clean-architecture/js/src/interfaces/controllers/userController.spec.js.ejs +234 -138
  30. package/templates/clean-architecture/js/src/interfaces/graphql/context.js.ejs +13 -13
  31. package/templates/clean-architecture/js/src/interfaces/graphql/context.spec.js.ejs +31 -31
  32. package/templates/clean-architecture/js/src/interfaces/graphql/index.js.ejs +5 -5
  33. package/templates/clean-architecture/js/src/interfaces/graphql/resolvers/index.js.ejs +6 -6
  34. package/templates/clean-architecture/js/src/interfaces/graphql/resolvers/user.resolvers.js.ejs +27 -21
  35. package/templates/clean-architecture/js/src/interfaces/graphql/resolvers/user.resolvers.spec.js.ejs +66 -49
  36. package/templates/clean-architecture/js/src/interfaces/graphql/typeDefs/index.js.ejs +6 -6
  37. package/templates/clean-architecture/js/src/interfaces/graphql/typeDefs/user.types.js.ejs +19 -17
  38. package/templates/clean-architecture/js/src/interfaces/routes/api.js +12 -10
  39. package/templates/clean-architecture/js/src/interfaces/routes/api.spec.js.ejs +38 -38
  40. package/templates/clean-architecture/js/src/usecases/CreateUser.js +14 -14
  41. package/templates/clean-architecture/js/src/usecases/CreateUser.spec.js.ejs +51 -51
  42. package/templates/clean-architecture/js/src/usecases/DeleteUser.js +11 -0
  43. package/templates/clean-architecture/js/src/usecases/DeleteUser.spec.js.ejs +47 -0
  44. package/templates/clean-architecture/js/src/usecases/GetAllUsers.js +12 -12
  45. package/templates/clean-architecture/js/src/usecases/GetAllUsers.spec.js.ejs +61 -61
  46. package/templates/clean-architecture/js/src/usecases/UpdateUser.js +11 -0
  47. package/templates/clean-architecture/js/src/usecases/UpdateUser.spec.js.ejs +48 -0
  48. package/templates/clean-architecture/js/src/utils/errorMessages.js +14 -0
  49. package/templates/clean-architecture/js/src/utils/httpCodes.js +9 -9
  50. package/templates/clean-architecture/ts/src/config/env.ts.ejs +46 -46
  51. package/templates/clean-architecture/ts/src/config/swagger.ts.ejs +6 -6
  52. package/templates/clean-architecture/ts/src/domain/user.ts +7 -7
  53. package/templates/clean-architecture/ts/src/errors/ApiError.ts +15 -15
  54. package/templates/clean-architecture/ts/src/errors/BadRequestError.spec.ts.ejs +22 -21
  55. package/templates/clean-architecture/ts/src/errors/BadRequestError.ts +9 -8
  56. package/templates/clean-architecture/ts/src/errors/NotFoundError.spec.ts.ejs +22 -21
  57. package/templates/clean-architecture/ts/src/errors/NotFoundError.ts +9 -8
  58. package/templates/clean-architecture/ts/src/index.ts.ejs +139 -139
  59. package/templates/clean-architecture/ts/src/infrastructure/log/logger.spec.ts.ejs +63 -63
  60. package/templates/clean-architecture/ts/src/infrastructure/log/logger.ts +36 -36
  61. package/templates/clean-architecture/ts/src/infrastructure/repositories/UserRepository.spec.ts.ejs +175 -85
  62. package/templates/clean-architecture/ts/src/infrastructure/repositories/userRepository.ts.ejs +74 -0
  63. package/templates/clean-architecture/ts/src/interfaces/controllers/userController.spec.ts.ejs +331 -185
  64. package/templates/clean-architecture/ts/src/interfaces/controllers/userController.ts.ejs +173 -84
  65. package/templates/clean-architecture/ts/src/interfaces/graphql/context.spec.ts.ejs +32 -32
  66. package/templates/clean-architecture/ts/src/interfaces/graphql/context.ts.ejs +17 -17
  67. package/templates/clean-architecture/ts/src/interfaces/graphql/index.ts.ejs +3 -3
  68. package/templates/clean-architecture/ts/src/interfaces/graphql/resolvers/index.ts.ejs +4 -4
  69. package/templates/clean-architecture/ts/src/interfaces/graphql/resolvers/user.resolvers.spec.ts.ejs +68 -51
  70. package/templates/clean-architecture/ts/src/interfaces/graphql/resolvers/user.resolvers.ts.ejs +29 -21
  71. package/templates/clean-architecture/ts/src/interfaces/graphql/typeDefs/index.ts.ejs +4 -4
  72. package/templates/clean-architecture/ts/src/interfaces/graphql/typeDefs/user.types.ts.ejs +17 -15
  73. package/templates/clean-architecture/ts/src/interfaces/routes/userRoutes.spec.ts.ejs +40 -40
  74. package/templates/clean-architecture/ts/src/interfaces/routes/userRoutes.ts +13 -11
  75. package/templates/clean-architecture/ts/src/usecases/createUser.spec.ts.ejs +51 -51
  76. package/templates/clean-architecture/ts/src/usecases/createUser.ts +13 -13
  77. package/templates/clean-architecture/ts/src/usecases/deleteUser.spec.ts.ejs +47 -0
  78. package/templates/clean-architecture/ts/src/usecases/deleteUser.ts +9 -0
  79. package/templates/clean-architecture/ts/src/usecases/getAllUsers.spec.ts.ejs +63 -63
  80. package/templates/clean-architecture/ts/src/usecases/getAllUsers.ts +10 -10
  81. package/templates/clean-architecture/ts/src/usecases/updateUser.spec.ts.ejs +48 -0
  82. package/templates/clean-architecture/ts/src/usecases/updateUser.ts +9 -0
  83. package/templates/clean-architecture/ts/src/utils/errorMessages.ts +12 -0
  84. package/templates/clean-architecture/ts/src/utils/errorMiddleware.ts.ejs +27 -27
  85. package/templates/clean-architecture/ts/src/utils/httpCodes.ts +7 -7
  86. package/templates/common/.cursorrules.ejs +60 -60
  87. package/templates/common/.dockerignore +12 -12
  88. package/templates/common/.env.example.ejs +41 -41
  89. package/templates/common/.gitattributes +46 -0
  90. package/templates/common/.gitlab-ci.yml.ejs +86 -86
  91. package/templates/common/.lintstagedrc +6 -6
  92. package/templates/common/.prettierrc +7 -7
  93. package/templates/common/Dockerfile +73 -73
  94. package/templates/common/Jenkinsfile.ejs +87 -87
  95. package/templates/common/README.md.ejs +294 -270
  96. package/templates/common/SECURITY.md +20 -20
  97. package/templates/common/_github/workflows/ci.yml.ejs +46 -46
  98. package/templates/common/_github/workflows/security.yml.ejs +36 -36
  99. package/templates/common/_gitignore +5 -5
  100. package/templates/common/_husky/pre-commit +4 -4
  101. package/templates/common/caching/clean/js/CreateUser.js.ejs +29 -29
  102. package/templates/common/caching/clean/js/DeleteUser.js.ejs +27 -0
  103. package/templates/common/caching/clean/js/GetAllUsers.js.ejs +37 -37
  104. package/templates/common/caching/clean/js/UpdateUser.js.ejs +27 -0
  105. package/templates/common/caching/clean/ts/createUser.ts.ejs +27 -27
  106. package/templates/common/caching/clean/ts/deleteUser.ts.ejs +24 -0
  107. package/templates/common/caching/clean/ts/getAllUsers.ts.ejs +34 -34
  108. package/templates/common/caching/clean/ts/updateUser.ts.ejs +25 -0
  109. package/templates/common/caching/js/memoryCache.js.ejs +60 -60
  110. package/templates/common/caching/js/memoryCache.spec.js.ejs +101 -101
  111. package/templates/common/caching/js/redisClient.js.ejs +75 -75
  112. package/templates/common/caching/js/redisClient.spec.js.ejs +147 -147
  113. package/templates/common/caching/ts/memoryCache.spec.ts.ejs +102 -102
  114. package/templates/common/caching/ts/memoryCache.ts.ejs +73 -64
  115. package/templates/common/caching/ts/redisClient.spec.ts.ejs +157 -157
  116. package/templates/common/caching/ts/redisClient.ts.ejs +89 -80
  117. package/templates/common/database/js/database.js.ejs +19 -19
  118. package/templates/common/database/js/database.spec.js.ejs +56 -56
  119. package/templates/common/database/js/models/User.js.ejs +79 -53
  120. package/templates/common/database/js/models/User.js.mongoose.ejs +23 -19
  121. package/templates/common/database/js/models/User.spec.js.ejs +94 -84
  122. package/templates/common/database/js/mongoose.js.ejs +33 -33
  123. package/templates/common/database/js/mongoose.spec.js.ejs +43 -43
  124. package/templates/common/database/ts/database.spec.ts.ejs +56 -56
  125. package/templates/common/database/ts/database.ts.ejs +21 -21
  126. package/templates/common/database/ts/models/User.spec.ts.ejs +100 -84
  127. package/templates/common/database/ts/models/User.ts.ejs +87 -61
  128. package/templates/common/database/ts/models/User.ts.mongoose.ejs +30 -25
  129. package/templates/common/database/ts/mongoose.spec.ts.ejs +42 -42
  130. package/templates/common/database/ts/mongoose.ts.ejs +28 -28
  131. package/templates/common/docker-compose.yml.ejs +159 -159
  132. package/templates/common/ecosystem.config.js.ejs +40 -40
  133. package/templates/common/eslint.config.mjs.ejs +77 -77
  134. package/templates/common/health/js/healthRoute.js.ejs +50 -47
  135. package/templates/common/health/js/healthRoute.spec.js.ejs +70 -70
  136. package/templates/common/health/ts/healthRoute.spec.ts.ejs +76 -76
  137. package/templates/common/health/ts/healthRoute.ts.ejs +49 -46
  138. package/templates/common/jest.config.js.ejs +32 -32
  139. package/templates/common/jest.e2e.config.js.ejs +8 -8
  140. package/templates/common/kafka/js/config/kafka.js +9 -9
  141. package/templates/common/kafka/js/config/kafka.spec.js.ejs +27 -27
  142. package/templates/common/kafka/js/messaging/baseConsumer.js.ejs +30 -30
  143. package/templates/common/kafka/js/messaging/baseConsumer.spec.js.ejs +58 -58
  144. package/templates/common/kafka/js/messaging/userEventSchema.js.ejs +12 -11
  145. package/templates/common/kafka/js/messaging/userEventSchema.spec.js.ejs +27 -27
  146. package/templates/common/kafka/js/messaging/welcomeEmailConsumer.js.ejs +44 -31
  147. package/templates/common/kafka/js/messaging/welcomeEmailConsumer.spec.js.ejs +86 -49
  148. package/templates/common/kafka/js/services/kafkaService.js.ejs +93 -93
  149. package/templates/common/kafka/js/services/kafkaService.spec.js.ejs +106 -106
  150. package/templates/common/kafka/js/utils/kafkaEvents.js.ejs +7 -0
  151. package/templates/common/kafka/ts/config/kafka.spec.ts.ejs +27 -27
  152. package/templates/common/kafka/ts/config/kafka.ts +7 -7
  153. package/templates/common/kafka/ts/messaging/baseConsumer.spec.ts.ejs +50 -50
  154. package/templates/common/kafka/ts/messaging/baseConsumer.ts.ejs +27 -27
  155. package/templates/common/kafka/ts/messaging/userEventSchema.spec.ts.ejs +51 -51
  156. package/templates/common/kafka/ts/messaging/userEventSchema.ts.ejs +12 -11
  157. package/templates/common/kafka/ts/messaging/welcomeEmailConsumer.spec.ts.ejs +86 -49
  158. package/templates/common/kafka/ts/messaging/welcomeEmailConsumer.ts.ejs +38 -25
  159. package/templates/common/kafka/ts/services/kafkaService.spec.ts.ejs +81 -81
  160. package/templates/common/kafka/ts/services/kafkaService.ts.ejs +95 -95
  161. package/templates/common/kafka/ts/utils/kafkaEvents.ts.ejs +5 -0
  162. package/templates/common/migrate-mongo-config.js.ejs +31 -31
  163. package/templates/common/migrations/init.js.ejs +23 -23
  164. package/templates/common/package.json.ejs +119 -118
  165. package/templates/common/prompts/add-feature.md.ejs +26 -26
  166. package/templates/common/prompts/project-context.md.ejs +43 -43
  167. package/templates/common/prompts/troubleshoot.md.ejs +28 -28
  168. package/templates/common/public/css/style.css +147 -147
  169. package/templates/common/scripts/run-e2e.js.ejs +63 -63
  170. package/templates/common/shutdown/js/gracefulShutdown.js.ejs +65 -61
  171. package/templates/common/shutdown/js/gracefulShutdown.spec.js.ejs +149 -160
  172. package/templates/common/shutdown/ts/gracefulShutdown.spec.ts.ejs +179 -158
  173. package/templates/common/shutdown/ts/gracefulShutdown.ts.ejs +59 -55
  174. package/templates/common/sonar-project.properties.ejs +27 -27
  175. package/templates/common/src/tests/e2e/e2e.users.test.js.ejs +120 -49
  176. package/templates/common/src/tests/e2e/e2e.users.test.ts.ejs +120 -49
  177. package/templates/common/src/utils/errorMiddleware.spec.js.ejs +79 -79
  178. package/templates/common/src/utils/errorMiddleware.spec.ts.ejs +94 -94
  179. package/templates/common/swagger.yml.ejs +118 -66
  180. package/templates/common/tsconfig.json +22 -22
  181. package/templates/common/views/ejs/index.ejs +55 -55
  182. package/templates/common/views/pug/index.pug +40 -40
  183. package/templates/db/mysql/V1__Initial_Setup.sql.ejs +10 -9
  184. package/templates/db/postgres/V1__Initial_Setup.sql.ejs +10 -9
  185. package/templates/mvc/js/src/config/env.js.ejs +46 -46
  186. package/templates/mvc/js/src/config/swagger.js.ejs +6 -6
  187. package/templates/mvc/js/src/controllers/userController.js.ejs +246 -105
  188. package/templates/mvc/js/src/controllers/userController.spec.js.ejs +481 -209
  189. package/templates/mvc/js/src/errors/ApiError.js +14 -14
  190. package/templates/mvc/js/src/errors/BadRequestError.js +11 -10
  191. package/templates/mvc/js/src/errors/BadRequestError.spec.js.ejs +22 -21
  192. package/templates/mvc/js/src/errors/NotFoundError.js +11 -10
  193. package/templates/mvc/js/src/errors/NotFoundError.spec.js.ejs +22 -21
  194. package/templates/mvc/js/src/graphql/context.js.ejs +7 -7
  195. package/templates/mvc/js/src/graphql/context.spec.js.ejs +29 -29
  196. package/templates/mvc/js/src/graphql/index.js.ejs +5 -5
  197. package/templates/mvc/js/src/graphql/resolvers/index.js.ejs +6 -6
  198. package/templates/mvc/js/src/graphql/resolvers/user.resolvers.js.ejs +25 -19
  199. package/templates/mvc/js/src/graphql/resolvers/user.resolvers.spec.js.ejs +64 -47
  200. package/templates/mvc/js/src/graphql/typeDefs/index.js.ejs +6 -6
  201. package/templates/mvc/js/src/graphql/typeDefs/user.types.js.ejs +19 -17
  202. package/templates/mvc/js/src/index.js.ejs +136 -136
  203. package/templates/mvc/js/src/routes/api.js +10 -8
  204. package/templates/mvc/js/src/routes/api.spec.js.ejs +41 -36
  205. package/templates/mvc/js/src/utils/errorMessages.js +14 -0
  206. package/templates/mvc/js/src/utils/errorMiddleware.js +29 -29
  207. package/templates/mvc/js/src/utils/httpCodes.js +9 -9
  208. package/templates/mvc/js/src/utils/logger.js +40 -40
  209. package/templates/mvc/js/src/utils/logger.spec.js.ejs +63 -63
  210. package/templates/mvc/ts/src/config/env.ts.ejs +45 -45
  211. package/templates/mvc/ts/src/config/swagger.ts.ejs +6 -6
  212. package/templates/mvc/ts/src/controllers/userController.spec.ts.ejs +481 -203
  213. package/templates/mvc/ts/src/controllers/userController.ts.ejs +248 -107
  214. package/templates/mvc/ts/src/errors/ApiError.ts +15 -15
  215. package/templates/mvc/ts/src/errors/BadRequestError.spec.ts.ejs +22 -21
  216. package/templates/mvc/ts/src/errors/BadRequestError.ts +9 -8
  217. package/templates/mvc/ts/src/errors/NotFoundError.spec.ts.ejs +27 -21
  218. package/templates/mvc/ts/src/errors/NotFoundError.ts +9 -8
  219. package/templates/mvc/ts/src/graphql/context.spec.ts.ejs +30 -30
  220. package/templates/mvc/ts/src/graphql/context.ts.ejs +12 -12
  221. package/templates/mvc/ts/src/graphql/index.ts.ejs +3 -3
  222. package/templates/mvc/ts/src/graphql/resolvers/index.ts.ejs +4 -4
  223. package/templates/mvc/ts/src/graphql/resolvers/user.resolvers.spec.ts.ejs +68 -51
  224. package/templates/mvc/ts/src/graphql/resolvers/user.resolvers.ts.ejs +29 -21
  225. package/templates/mvc/ts/src/graphql/typeDefs/index.ts.ejs +4 -4
  226. package/templates/mvc/ts/src/graphql/typeDefs/user.types.ts.ejs +17 -15
  227. package/templates/mvc/ts/src/index.ts.ejs +156 -153
  228. package/templates/mvc/ts/src/routes/api.spec.ts.ejs +59 -40
  229. package/templates/mvc/ts/src/routes/api.ts +12 -10
  230. package/templates/mvc/ts/src/utils/errorMessages.ts +12 -0
  231. package/templates/mvc/ts/src/utils/errorMiddleware.ts.ejs +27 -27
  232. package/templates/mvc/ts/src/utils/httpCodes.ts +7 -7
  233. package/templates/mvc/ts/src/utils/logger.spec.ts.ejs +63 -63
  234. package/templates/mvc/ts/src/utils/logger.ts +36 -36
  235. package/templates/clean-architecture/ts/src/infrastructure/repositories/UserRepository.ts.ejs +0 -37
@@ -1,55 +1,59 @@
1
- import { Server } from 'http';
2
- <%_ if (architecture === 'MVC') { -%>
3
- import logger from '@/utils/logger';
4
- <%_ } else { -%>
5
- import logger from '@/infrastructure/log/logger';
6
- <%_ } -%>
7
- <%_ if (database === 'MongoDB') { -%>
8
- import mongoose from 'mongoose';
9
- <%_ } else if (database !== 'None') { -%>
10
- import sequelize from '<% if (architecture === "MVC") { %>@/config/database<% } else { %>@/infrastructure/database/database<% } %>';
11
- <%_ } -%>
12
- <%_ if (caching === 'Redis') { -%>
13
- import redisService from '<% if (architecture === "MVC") { %>@/config/redisClient<% } else { %>@/infrastructure/caching/redisClient<% } %>';
14
- <%_ } -%>
15
-
16
- export const setupGracefulShutdown = (server: Server<% if (communication === 'Kafka') { %>, kafkaService: { disconnect: () => Promise<void> }<% } %>) => {
17
- const gracefulShutdown = async (signal: string) => {
18
- logger.info(`Received ${signal}. Shutting down gracefully...`);
19
- server.close(async () => {
20
- logger.info('HTTP server closed.');
21
- try {
22
- <%_ if (database !== 'None') { -%>
23
- <%_ if (database === 'MongoDB') { -%>
24
- await mongoose.connection.close(false);
25
- logger.info('MongoDB connection closed.');
26
- <%_ } else { -%>
27
- await sequelize.close();
28
- logger.info('Database connection closed.');
29
- <%_ } -%>
30
- <%_ } -%>
31
- <%_ if (caching === 'Redis') { -%>
32
- await redisService.quit();
33
- logger.info('Redis connection closed.');
34
- <%_ } -%>
35
- <%_ if (communication === 'Kafka') { -%>
36
- await kafkaService.disconnect();
37
- logger.info('Kafka connection closed.');
38
- <%_ } -%>
39
- logger.info('Graceful shutdown fully completed.');
40
- process.exit(0);
41
- } catch (err) {
42
- logger.error('Error during shutdown:', err);
43
- process.exit(1);
44
- }
45
- });
46
-
47
- setTimeout(() => {
48
- logger.error('Could not close connections in time, forcefully shutting down');
49
- process.exit(1);
50
- }, 15000);
51
- };
52
-
53
- process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
54
- process.on('SIGINT', () => gracefulShutdown('SIGINT'));
55
- };
1
+ import { Server } from 'http';
2
+ <%_ if (architecture === 'MVC') { -%>
3
+ import logger from '@/utils/logger';
4
+ <%_ } else { -%>
5
+ import logger from '@/infrastructure/log/logger';
6
+ <%_ } -%>
7
+ <%_ if (database === 'MongoDB') { -%>
8
+ import mongoose from 'mongoose';
9
+ <%_ } else if (database !== 'None') { -%>
10
+ import sequelize from '<% if (architecture === "MVC") { %>@/config/database<% } else { %>@/infrastructure/database/database<% } %>';
11
+ <%_ } -%>
12
+ <%_ if (caching === 'Redis') { -%>
13
+ import redisService from '<% if (architecture === "MVC") { %>@/config/redisClient<% } else { %>@/infrastructure/caching/redisClient<% } %>';
14
+ <%_ } -%>
15
+
16
+ export const setupGracefulShutdown = (server: Server<% if (communication === 'Kafka') { %>, kafkaService: { disconnect: () => Promise<void> }<% } %>) => {
17
+ const gracefulShutdown = async (signal: string) => {
18
+ logger.info(`Received ${signal}. Shutting down gracefully...`);
19
+ server.close(async (err: Error | undefined) => {
20
+ if (err) {
21
+ logger.error('Error closing HTTP server:', err);
22
+ process.exit(1);
23
+ }
24
+ logger.info('HTTP server closed.');
25
+ try {
26
+ <%_ if (database !== 'None') { -%>
27
+ <%_ if (database === 'MongoDB') { -%>
28
+ await mongoose.connection.close(false);
29
+ logger.info('MongoDB connection closed.');
30
+ <%_ } else { -%>
31
+ await sequelize.close();
32
+ logger.info('Database connection closed.');
33
+ <%_ } -%>
34
+ <%_ } -%>
35
+ <%_ if (caching === 'Redis') { -%>
36
+ await redisService.quit();
37
+ logger.info('Redis connection closed.');
38
+ <%_ } -%>
39
+ <%_ if (communication === 'Kafka') { -%>
40
+ await kafkaService.disconnect();
41
+ logger.info('Kafka connection closed.');
42
+ <%_ } -%>
43
+ logger.info('Graceful shutdown fully completed.');
44
+ process.exit(0);
45
+ } catch (err) {
46
+ logger.error('Error during shutdown:', err);
47
+ process.exit(1);
48
+ }
49
+ });
50
+
51
+ setTimeout(() => {
52
+ logger.error('Could not close connections in time, forcefully shutting down');
53
+ process.exit(1);
54
+ }, 15000);
55
+ };
56
+
57
+ process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
58
+ process.on('SIGINT', () => gracefulShutdown('SIGINT'));
59
+ };
@@ -1,27 +1,27 @@
1
- # SonarCloud/SonarQube Project Configuration
2
- # See https://docs.sonarqube.org/latest/analysis/analysis-parameters/
3
-
4
- sonar.projectKey=your-org-key_<%= projectName %>
5
- sonar.projectName=<%= projectName %>
6
- sonar.organization=your-org-key
7
- sonar.projectVersion=1.0.0
8
-
9
- # Path to the source directories
10
- sonar.sources=src
11
- # Path to the test directories
12
- sonar.tests=tests
13
-
14
- # Language specific settings
15
- sonar.javascript.environments=node
16
- sonar.typescript.tsconfigPath=tsconfig.json
17
- sonar.javascript.lcov.reportPaths=coverage/lcov.info
18
-
19
- # Exclusions
20
- sonar.exclusions=node_modules/**, dist/**, coverage/**, tests/**
21
-
22
- # Quality Gates
23
- sonar.qualitygate.wait=true
24
- sonar.qualitygate.timeout=300
25
-
26
- # Security Hotspots
27
- sonar.security.reportPaths=snyk-report.json
1
+ # SonarCloud/SonarQube Project Configuration
2
+ # See https://docs.sonarqube.org/latest/analysis/analysis-parameters/
3
+
4
+ sonar.projectKey=your-org-key_<%= projectName %>
5
+ sonar.projectName=<%= projectName %>
6
+ sonar.organization=your-org-key
7
+ sonar.projectVersion=1.0.0
8
+
9
+ # Path to the source directories
10
+ sonar.sources=src
11
+ # Path to the test directories
12
+ sonar.tests=tests
13
+
14
+ # Language specific settings
15
+ sonar.javascript.environments=node
16
+ sonar.typescript.tsconfigPath=tsconfig.json
17
+ sonar.javascript.lcov.reportPaths=coverage/lcov.info
18
+
19
+ # Exclusions
20
+ sonar.exclusions=node_modules/**, dist/**, coverage/**, tests/**
21
+
22
+ # Quality Gates
23
+ sonar.qualitygate.wait=true
24
+ sonar.qualitygate.timeout=300
25
+
26
+ # Security Hotspots
27
+ sonar.security.reportPaths=snyk-report.json
@@ -1,49 +1,120 @@
1
- const request = require('supertest');
2
-
3
- const SERVER_URL = process.env.TEST_URL || `http://127.0.0.1:${process.env.PORT || 3001}`;
4
-
5
- describe('E2E User Tests', () => {
6
- // Global setup and teardown hooks can be added here
7
- // typically for database seeding or external authentication checks prior to E2E.
8
- const uniqueEmail = `test_${Date.now()}@example.com`;
9
-
10
- <%_ if (communication === 'GraphQL') { _%>
11
- it('should create a user and verify flow via GraphQL', async () => {
12
- const query = `
13
- mutation {
14
- createUser(name: "Test User", email: "${uniqueEmail}") {
15
- id
16
- name
17
- email
18
- }
19
- }
20
- `;
21
- const response = await request(SERVER_URL)
22
- .post('/graphql')
23
- .send({ query });
24
-
25
- expect(response.statusCode).toBe(200);
26
- });
27
- <%_ } else if (communication === 'Kafka') { _%>
28
- it('should trigger Kafka event for user creation', async () => {
29
- const response = await request(SERVER_URL)
30
- .post('/api/users')
31
- .send({ name: 'Test User', email: uniqueEmail });
32
-
33
- // Assuming the API returns 201 or 404 (if no REST endpoint is exposed in Kafka skeleton)
34
- expect([201, 202, 404]).toContain(response.statusCode);
35
-
36
- // Wait for Kafka to process...
37
- await new Promise(resolve => setTimeout(resolve, 1000));
38
- });
39
- <%_ } else { _%>
40
- it('should create a user successfully via REST', async () => {
41
- const response = await request(SERVER_URL)
42
- .post('/api/users')
43
- .send({ name: 'Test User', email: uniqueEmail });
44
-
45
- // E2E Tests must have strict and deterministic assertions
46
- expect(response.statusCode).toBe(201);
47
- });
48
- <%_ } _%>
49
- });
1
+ const request = require('supertest');
2
+
3
+ const SERVER_URL = process.env.TEST_URL || `http://127.0.0.1:${process.env.PORT || 3001}`;
4
+
5
+ describe('E2E User Tests', () => {
6
+ // Global setup and teardown hooks can be added here
7
+ // typically for database seeding or external authentication checks prior to E2E.
8
+ let userId;
9
+ const uniqueEmail = `test_${Date.now()}@example.com`;
10
+
11
+ <%_ if (communication === 'GraphQL') { -%>
12
+ it('should create a user via GraphQL', async () => {
13
+ const query = `
14
+ mutation {
15
+ createUser(name: "Test User", email: "${uniqueEmail}") {
16
+ id
17
+ name
18
+ email
19
+ }
20
+ }
21
+ `;
22
+ const response = await request(SERVER_URL)
23
+ .post('/graphql')
24
+ .send({ query });
25
+
26
+ expect(response.statusCode).toBe(200);
27
+ userId = response.body.data.createUser.id;
28
+ expect(userId).toBeDefined();
29
+ });
30
+
31
+ it('should update a user via GraphQL', async () => {
32
+ const query = `
33
+ mutation {
34
+ updateUser(id: "${userId}", name: "Updated User") {
35
+ id
36
+ name
37
+ }
38
+ }
39
+ `;
40
+ const response = await request(SERVER_URL)
41
+ .post('/graphql')
42
+ .send({ query });
43
+
44
+ expect(response.statusCode).toBe(200);
45
+ expect(response.body.data.updateUser.name).toBe("Updated User");
46
+ });
47
+
48
+ it('should delete a user via GraphQL', async () => {
49
+ const query = `
50
+ mutation {
51
+ deleteUser(id: "${userId}")
52
+ }
53
+ `;
54
+ const response = await request(SERVER_URL)
55
+ .post('/graphql')
56
+ .send({ query });
57
+
58
+ expect(response.statusCode).toBe(200);
59
+ expect(response.body.data.deleteUser).toBe(true);
60
+ });
61
+ <%_ } else if (communication === 'Kafka') { -%>
62
+ it('should trigger Kafka event for user creation', async () => {
63
+ const response = await request(SERVER_URL)
64
+ .post('/api/users')
65
+ .send({ name: 'Test User', email: uniqueEmail });
66
+
67
+ expect([201, 202]).toContain(response.statusCode);
68
+ userId = response.body.id || response.body._id;
69
+ expect(userId).toBeDefined();
70
+
71
+ // Wait for Kafka to process...
72
+ await new Promise(resolve => setTimeout(resolve, 500));
73
+ });
74
+
75
+ it('should trigger Kafka event for user update', async () => {
76
+ const response = await request(SERVER_URL)
77
+ .patch(`/api/users/${userId}`)
78
+ .send({ name: 'Updated User' });
79
+
80
+ expect([200, 202, 204]).toContain(response.statusCode);
81
+
82
+ // Wait for Kafka to process...
83
+ await new Promise(resolve => setTimeout(resolve, 500));
84
+ });
85
+
86
+ it('should trigger Kafka event for user deletion', async () => {
87
+ const response = await request(SERVER_URL)
88
+ .delete(`/api/users/${userId}`);
89
+
90
+ expect([200, 202, 204]).toContain(response.statusCode);
91
+
92
+ // Wait for Kafka to process...
93
+ await new Promise(resolve => setTimeout(resolve, 500));
94
+ });
95
+ <%_ } else { -%>
96
+ it('should create a user successfully via REST', async () => {
97
+ const response = await request(SERVER_URL)
98
+ .post('/api/users')
99
+ .send({ name: 'Test User', email: uniqueEmail });
100
+
101
+ expect(response.statusCode).toBe(201);
102
+ userId = response.body.id || response.body._id;
103
+ });
104
+
105
+ it('should update a user successfully via REST', async () => {
106
+ const response = await request(SERVER_URL)
107
+ .patch(`/api/users/${userId}`)
108
+ .send({ name: 'Updated User' });
109
+
110
+ expect(response.statusCode).toBe(200);
111
+ });
112
+
113
+ it('should delete a user successfully via REST', async () => {
114
+ const response = await request(SERVER_URL)
115
+ .delete(`/api/users/${userId}`);
116
+
117
+ expect(response.statusCode).toBe(200);
118
+ });
119
+ <%_ } -%>
120
+ });
@@ -1,49 +1,120 @@
1
- import request from 'supertest';
2
-
3
- const SERVER_URL = process.env.TEST_URL || `http://127.0.0.1:${process.env.PORT || 3001}`;
4
-
5
- describe('E2E User Tests', () => {
6
- // Global setup and teardown hooks can be added here
7
- // typically for database seeding or external authentication checks prior to E2E.
8
- const uniqueEmail = `test_${Date.now()}@example.com`;
9
-
10
- <%_ if (communication === 'GraphQL') { _%>
11
- it('should create a user and verify flow via GraphQL', async () => {
12
- const query = `
13
- mutation {
14
- createUser(name: "Test User", email: "${uniqueEmail}") {
15
- id
16
- name
17
- email
18
- }
19
- }
20
- `;
21
- const response = await request(SERVER_URL)
22
- .post('/graphql')
23
- .send({ query });
24
-
25
- expect(response.statusCode).toBe(200);
26
- });
27
- <%_ } else if (communication === 'Kafka') { _%>
28
- it('should trigger Kafka event for user creation', async () => {
29
- const response = await request(SERVER_URL)
30
- .post('/api/users')
31
- .send({ name: 'Test User', email: uniqueEmail });
32
-
33
- // Assuming the API returns 201 or 404 (if no REST endpoint is exposed in Kafka skeleton)
34
- expect([201, 202, 404]).toContain(response.statusCode);
35
-
36
- // Wait for Kafka to process...
37
- await new Promise(resolve => setTimeout(resolve, 1000));
38
- });
39
- <%_ } else { _%>
40
- it('should create a user successfully via REST', async () => {
41
- const response = await request(SERVER_URL)
42
- .post('/api/users')
43
- .send({ name: 'Test User', email: uniqueEmail });
44
-
45
- // E2E Tests must have strict and deterministic assertions
46
- expect(response.statusCode).toBe(201);
47
- });
48
- <%_ } _%>
49
- });
1
+ import request from 'supertest';
2
+
3
+ const SERVER_URL = process.env.TEST_URL || `http://127.0.0.1:${process.env.PORT || 3001}`;
4
+
5
+ describe('E2E User Tests', () => {
6
+ // Global setup and teardown hooks can be added here
7
+ // typically for database seeding or external authentication checks prior to E2E.
8
+ let userId: string;
9
+ const uniqueEmail = `test_${Date.now()}@example.com`;
10
+
11
+ <%_ if (communication === 'GraphQL') { -%>
12
+ it('should create a user via GraphQL', async () => {
13
+ const query = `
14
+ mutation {
15
+ createUser(name: "Test User", email: "${uniqueEmail}") {
16
+ id
17
+ name
18
+ email
19
+ }
20
+ }
21
+ `;
22
+ const response = await request(SERVER_URL)
23
+ .post('/graphql')
24
+ .send({ query });
25
+
26
+ expect(response.statusCode).toBe(200);
27
+ userId = response.body.data.createUser.id;
28
+ expect(userId).toBeDefined();
29
+ });
30
+
31
+ it('should update a user via GraphQL', async () => {
32
+ const query = `
33
+ mutation {
34
+ updateUser(id: "${userId}", name: "Updated User") {
35
+ id
36
+ name
37
+ }
38
+ }
39
+ `;
40
+ const response = await request(SERVER_URL)
41
+ .post('/graphql')
42
+ .send({ query });
43
+
44
+ expect(response.statusCode).toBe(200);
45
+ expect(response.body.data.updateUser.name).toBe("Updated User");
46
+ });
47
+
48
+ it('should delete a user via GraphQL', async () => {
49
+ const query = `
50
+ mutation {
51
+ deleteUser(id: "${userId}")
52
+ }
53
+ `;
54
+ const response = await request(SERVER_URL)
55
+ .post('/graphql')
56
+ .send({ query });
57
+
58
+ expect(response.statusCode).toBe(200);
59
+ expect(response.body.data.deleteUser).toBe(true);
60
+ });
61
+ <%_ } else if (communication === 'Kafka') { -%>
62
+ it('should trigger Kafka event for user creation', async () => {
63
+ const response = await request(SERVER_URL)
64
+ .post('/api/users')
65
+ .send({ name: 'Test User', email: uniqueEmail });
66
+
67
+ expect([201, 202]).toContain(response.statusCode);
68
+ userId = response.body.id || response.body._id;
69
+ expect(userId).toBeDefined();
70
+
71
+ // Wait for Kafka to process...
72
+ await new Promise(resolve => setTimeout(resolve, 500));
73
+ });
74
+
75
+ it('should trigger Kafka event for user update', async () => {
76
+ const response = await request(SERVER_URL)
77
+ .patch(`/api/users/${userId}`)
78
+ .send({ name: 'Updated User' });
79
+
80
+ expect([200, 202, 204]).toContain(response.statusCode);
81
+
82
+ // Wait for Kafka to process...
83
+ await new Promise(resolve => setTimeout(resolve, 500));
84
+ });
85
+
86
+ it('should trigger Kafka event for user deletion', async () => {
87
+ const response = await request(SERVER_URL)
88
+ .delete(`/api/users/${userId}`);
89
+
90
+ expect([200, 202, 204]).toContain(response.statusCode);
91
+
92
+ // Wait for Kafka to process...
93
+ await new Promise(resolve => setTimeout(resolve, 500));
94
+ });
95
+ <%_ } else { -%>
96
+ it('should create a user successfully via REST', async () => {
97
+ const response = await request(SERVER_URL)
98
+ .post('/api/users')
99
+ .send({ name: 'Test User', email: uniqueEmail });
100
+
101
+ expect(response.statusCode).toBe(201);
102
+ userId = response.body.id || response.body._id;
103
+ });
104
+
105
+ it('should update a user successfully via REST', async () => {
106
+ const response = await request(SERVER_URL)
107
+ .patch(`/api/users/${userId}`)
108
+ .send({ name: 'Updated User' });
109
+
110
+ expect(response.statusCode).toBe(200);
111
+ });
112
+
113
+ it('should delete a user successfully via REST', async () => {
114
+ const response = await request(SERVER_URL)
115
+ .delete(`/api/users/${userId}`);
116
+
117
+ expect(response.statusCode).toBe(200);
118
+ });
119
+ <%_ } -%>
120
+ });