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,30 +1,30 @@
1
- const logger = require('../../log/logger');
2
- const { ApiError } = require('../../../errors/ApiError');
3
- const HTTP_STATUS = require('../../../utils/httpCodes');
4
-
5
- // eslint-disable-next-line no-unused-vars
6
- const errorMiddleware = (err, req, res, next) => {
7
- let error = err;
8
-
9
- if (!(error instanceof ApiError)) {
10
- const statusCode = err.statusCode || HTTP_STATUS.INTERNAL_SERVER_ERROR;
11
- const message = error.message || 'Internal Server Error';
12
- error = new ApiError(statusCode, message, false, err.stack);
13
- }
14
-
15
- const { statusCode, message } = error;
16
-
17
- if (statusCode === HTTP_STATUS.INTERNAL_SERVER_ERROR) {
18
- logger.error(`${statusCode} - ${message} - ${req.originalUrl} - ${req.method} - ${req.ip}`);
19
- logger.error(error.stack || 'No stack trace');
20
- }
21
-
22
- res.status(statusCode).json({
23
- statusCode,
24
- message,
25
- ...(process.env.NODE_ENV === 'development' && { stack: error.stack }),
26
- });
27
- };
28
-
29
- module.exports = { errorMiddleware };
30
-
1
+ const logger = require('../../log/logger');
2
+ const { ApiError } = require('../../../errors/ApiError');
3
+ const HTTP_STATUS = require('../../../utils/httpCodes');
4
+
5
+ // eslint-disable-next-line no-unused-vars
6
+ const errorMiddleware = (err, req, res, next) => {
7
+ let error = err;
8
+
9
+ if (!(error instanceof ApiError)) {
10
+ const statusCode = err.statusCode || HTTP_STATUS.INTERNAL_SERVER_ERROR;
11
+ const message = error.message || 'Internal Server Error';
12
+ error = new ApiError(statusCode, message, false, err.stack);
13
+ }
14
+
15
+ const { statusCode, message } = error;
16
+
17
+ if (statusCode === HTTP_STATUS.INTERNAL_SERVER_ERROR) {
18
+ logger.error(`${statusCode} - ${message} - ${req.originalUrl} - ${req.method} - ${req.ip}`);
19
+ logger.error(error.stack || 'No stack trace');
20
+ }
21
+
22
+ res.status(statusCode).json({
23
+ statusCode,
24
+ message,
25
+ ...(process.env.NODE_ENV === 'development' && { stack: error.stack }),
26
+ });
27
+ };
28
+
29
+ module.exports = { errorMiddleware };
30
+
@@ -1,89 +1,89 @@
1
- const express = require('express');
2
- const cors = require('cors');
3
- const logger = require('../log/logger');
4
- const morgan = require('morgan');
5
- const { errorMiddleware } = require('./middleware/errorMiddleware');
6
- const healthRoutes = require('../../interfaces/routes/healthRoute');
7
- const setupGracefulShutdown = require('../../utils/gracefulShutdown');
8
- <%_ if (communication === 'REST APIs' || communication === 'Kafka') { -%>
9
- const apiRoutes = require('../../interfaces/routes/api');
10
- const swaggerUi = require('swagger-ui-express');
11
- const swaggerSpecs = require('./swagger');
12
- <%_ } -%>
13
- <%_ if (communication === 'GraphQL') { -%>
14
- const { ApolloServer } = require('@apollo/server');
15
- const { expressMiddleware } = require('@as-integrations/express4');
16
- const { ApolloServerPluginLandingPageLocalDefault } = require('@apollo/server/plugin/landingPage/default');
17
- const { unwrapResolverError } = require('@apollo/server/errors');
18
- const { ApiError } = require('../../errors/ApiError');
19
- const { typeDefs, resolvers } = require('../../interfaces/graphql');
20
- const { gqlContext } = require('../../interfaces/graphql/context');
21
- <%_ } -%>
22
-
23
- const { env } = require('../config/env');
24
-
25
- const startServer = async () => {
26
- // Determine port using the validated env
27
- const port = env.PORT;
28
- const app = express();
29
-
30
- app.use(cors());
31
- app.use(express.json());
32
- app.use(morgan('combined', { stream: { write: message => logger.info(message.trim()) } }));
33
- <%_ if (communication === 'REST APIs' || communication === 'Kafka') { -%>
34
- app.use('/api', apiRoutes);
35
- <%_ } -%>
36
- <%_ if (communication === 'REST APIs' || communication === 'Kafka') { -%>
37
- app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpecs));
38
- <%_ } -%>
39
- <%_ if (communication === 'GraphQL') { -%>
40
- // GraphQL Setup
41
- const apolloServer = new ApolloServer({
42
- typeDefs,
43
- resolvers,
44
- plugins: [ApolloServerPluginLandingPageLocalDefault({ embed: true })],
45
- formatError: (formattedError, error) => {
46
- const originalError = unwrapResolverError(error);
47
- if (originalError instanceof ApiError) {
48
- return {
49
- ...formattedError,
50
- message: originalError.message,
51
- extensions: {
52
- ...formattedError.extensions,
53
- code: originalError.statusCode.toString(),
54
- }
55
- };
56
- }
57
-
58
- logger.error(`GraphQL Error: ${formattedError.message}`);
59
- if (originalError && originalError.stack && process.env.NODE_ENV === 'development') {
60
- logger.error(originalError.stack);
61
- }
62
- return formattedError;
63
- },
64
- });
65
- await apolloServer.start();
66
- app.use('/graphql', expressMiddleware(apolloServer, { context: gqlContext }));
67
- <%_ } -%>
68
- app.use('/health', healthRoutes);
69
-
70
- app.use(errorMiddleware);
71
-
72
- const server = app.listen(port, () => {
73
- logger.info(`Server running on port ${port}`);
74
- <%_ if (communication === 'Kafka') { -%>
75
- const { connectKafka } = require('../../infrastructure/messaging/kafkaClient');
76
- connectKafka()
77
- .then(async () => {
78
- logger.info('Kafka connected');
79
- })
80
- .catch(err => {
81
- logger.error('Failed to connect to Kafka after retries:', err.message);
82
- });
83
- <%_ } -%>
84
- });
85
-
86
- setupGracefulShutdown(server);
87
- };
88
-
89
- module.exports = startServer;
1
+ const express = require('express');
2
+ const cors = require('cors');
3
+ const logger = require('../log/logger');
4
+ const morgan = require('morgan');
5
+ const { errorMiddleware } = require('./middleware/errorMiddleware');
6
+ const healthRoutes = require('../../interfaces/routes/healthRoute');
7
+ const setupGracefulShutdown = require('../../utils/gracefulShutdown');
8
+ <%_ if (communication === 'REST APIs' || communication === 'Kafka') { -%>
9
+ const apiRoutes = require('../../interfaces/routes/api');
10
+ const swaggerUi = require('swagger-ui-express');
11
+ const swaggerSpecs = require('./swagger');
12
+ <%_ } -%>
13
+ <%_ if (communication === 'GraphQL') { -%>
14
+ const { ApolloServer } = require('@apollo/server');
15
+ const { expressMiddleware } = require('@as-integrations/express4');
16
+ const { ApolloServerPluginLandingPageLocalDefault } = require('@apollo/server/plugin/landingPage/default');
17
+ const { unwrapResolverError } = require('@apollo/server/errors');
18
+ const { ApiError } = require('../../errors/ApiError');
19
+ const { typeDefs, resolvers } = require('../../interfaces/graphql');
20
+ const { gqlContext } = require('../../interfaces/graphql/context');
21
+ <%_ } -%>
22
+
23
+ const { env } = require('../config/env');
24
+
25
+ const startServer = async () => {
26
+ // Determine port using the validated env
27
+ const port = env.PORT;
28
+ const app = express();
29
+
30
+ app.use(cors());
31
+ app.use(express.json());
32
+ app.use(morgan('combined', { stream: { write: message => logger.info(message.trim()) } }));
33
+ <%_ if (communication === 'REST APIs' || communication === 'Kafka') { -%>
34
+ app.use('/api', apiRoutes);
35
+ <%_ } -%>
36
+ <%_ if (communication === 'REST APIs' || communication === 'Kafka') { -%>
37
+ app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpecs));
38
+ <%_ } -%>
39
+ <%_ if (communication === 'GraphQL') { -%>
40
+ // GraphQL Setup
41
+ const apolloServer = new ApolloServer({
42
+ typeDefs,
43
+ resolvers,
44
+ plugins: [ApolloServerPluginLandingPageLocalDefault({ embed: true })],
45
+ formatError: (formattedError, error) => {
46
+ const originalError = unwrapResolverError(error);
47
+ if (originalError instanceof ApiError) {
48
+ return {
49
+ ...formattedError,
50
+ message: originalError.message,
51
+ extensions: {
52
+ ...formattedError.extensions,
53
+ code: originalError.statusCode.toString(),
54
+ }
55
+ };
56
+ }
57
+
58
+ logger.error(`GraphQL Error: ${formattedError.message}`);
59
+ if (originalError && originalError.stack && process.env.NODE_ENV === 'development') {
60
+ logger.error(originalError.stack);
61
+ }
62
+ return formattedError;
63
+ },
64
+ });
65
+ await apolloServer.start();
66
+ app.use('/graphql', expressMiddleware(apolloServer, { context: gqlContext }));
67
+ <%_ } -%>
68
+ app.use('/health', healthRoutes);
69
+
70
+ app.use(errorMiddleware);
71
+
72
+ const server = app.listen(port, () => {
73
+ logger.info(`Server running on port ${port}`);
74
+ <%_ if (communication === 'Kafka') { -%>
75
+ const { connectKafka } = require('../../infrastructure/messaging/kafkaClient');
76
+ connectKafka()
77
+ .then(async () => {
78
+ logger.info('Kafka connected');
79
+ })
80
+ .catch(err => {
81
+ logger.error('Failed to connect to Kafka after retries:', err.message);
82
+ });
83
+ <%_ } -%>
84
+ });
85
+
86
+ setupGracefulShutdown(server);
87
+ };
88
+
89
+ module.exports = startServer;
@@ -1,6 +1,6 @@
1
- const path = require('path');
2
- const YAML = require('yamljs');
3
-
4
- const swaggerDocument = YAML.load(path.join(__dirname, 'swagger.yml'));
5
-
6
- module.exports = swaggerDocument;
1
+ const path = require('path');
2
+ const YAML = require('yamljs');
3
+
4
+ const swaggerDocument = YAML.load(path.join(__dirname, 'swagger.yml'));
5
+
6
+ module.exports = swaggerDocument;
@@ -1,75 +1,156 @@
1
- const CreateUser = require('../../usecases/CreateUser');
2
- const GetAllUsers = require('../../usecases/GetAllUsers');
3
- const UserRepository = require('../../infrastructure/repositories/UserRepository');
4
- <% if (communication !== 'GraphQL') { -%>
5
- const HTTP_STATUS = require('../../utils/httpCodes');
6
- <% } -%>
7
- const logger = require('../../infrastructure/log/logger');
8
- <%_ if (communication === 'Kafka') { -%>
9
- const { sendMessage } = require('../../infrastructure/messaging/kafkaClient');
10
- <%_ } -%>
11
-
12
- class UserController {
13
- constructor() {
14
- this.userRepository = new UserRepository();
15
- this.createUserUseCase = new CreateUser(this.userRepository);
16
- this.getAllUsersUseCase = new GetAllUsers(this.userRepository);
17
- }
18
-
19
- <% if (communication === 'GraphQL') { -%>
20
- async getUsers() {
21
- try {
22
- return await this.getAllUsersUseCase.execute();
23
- } catch (error) {
24
- logger.error('Error getting users:', error);
25
- throw error;
26
- }
27
- }
28
-
29
- async createUser(data) {
30
- const { name, email } = data;
31
- try {
32
- const user = await this.createUserUseCase.execute(name, email);
33
- <%_ if (communication === 'Kafka') { -%>
34
- await sendMessage('user-topic', JSON.stringify({
35
- action: 'USER_CREATED',
36
- payload: { id: user.id || user._id, email: user.email }
37
- }));
38
- <%_ } -%>
39
- return user;
40
- } catch (error) {
41
- logger.error('Error creating user:', error);
42
- throw error;
43
- }
44
- }
45
- <% } else { -%>
46
- async getUsers(req, res, next) {
47
- try {
48
- const users = await this.getAllUsersUseCase.execute();
49
- res.json(users);
50
- } catch (error) {
51
- logger.error('Error getting users:', error);
52
- next(error);
53
- }
54
- }
55
-
56
- async createUser(req, res, next) {
57
- const { name, email } = req.body;
58
- try {
59
- const user = await this.createUserUseCase.execute(name, email);
60
- <%_ if (communication === 'Kafka') { -%>
61
- await sendMessage('user-topic', JSON.stringify({
62
- action: 'USER_CREATED',
63
- payload: { id: user.id || user._id, email: user.email }
64
- }));
65
- <%_ } -%>
66
- res.status(HTTP_STATUS.CREATED).json(user);
67
- } catch (error) {
68
- logger.error('Error creating user:', error);
69
- next(error);
70
- }
71
- }
72
- <% } -%>
73
- }
74
-
75
- module.exports = UserController;
1
+ const CreateUser = require('../../usecases/CreateUser');
2
+ const GetAllUsers = require('../../usecases/GetAllUsers');
3
+ const UpdateUser = require('../../usecases/UpdateUser');
4
+ const DeleteUser = require('../../usecases/DeleteUser');
5
+ const UserRepository = require('../../infrastructure/repositories/UserRepository');
6
+ const ERROR_MESSAGES = require('../../utils/errorMessages');
7
+ <% if (communication !== 'GraphQL') { -%>
8
+ const HTTP_STATUS = require('../../utils/httpCodes');
9
+ <% } -%>
10
+ const logger = require('../../infrastructure/log/logger');
11
+ <%_ if (communication === 'Kafka') { -%>
12
+ const { sendMessage } = require('../../infrastructure/messaging/kafkaClient');
13
+ const { KAFKA_ACTIONS } = require('../../utils/kafkaEvents');
14
+ <%_ } -%>
15
+
16
+ class UserController {
17
+ constructor() {
18
+ this.userRepository = new UserRepository();
19
+ this.createUserUseCase = new CreateUser(this.userRepository);
20
+ this.getAllUsersUseCase = new GetAllUsers(this.userRepository);
21
+ this.updateUserUseCase = new UpdateUser(this.userRepository);
22
+ this.deleteUserUseCase = new DeleteUser(this.userRepository);
23
+ }
24
+
25
+ <% if (communication === 'GraphQL') { -%>
26
+ async getUsers() {
27
+ try {
28
+ return await this.getAllUsersUseCase.execute();
29
+ } catch (error) {
30
+ logger.error(`${ERROR_MESSAGES.FETCH_USERS_ERROR}:`, error);
31
+ throw error;
32
+ }
33
+ }
34
+
35
+ async createUser(data) {
36
+ const { name, email } = data;
37
+ try {
38
+ const user = await this.createUserUseCase.execute(name, email);
39
+ <%_ if (communication === 'Kafka') { -%>
40
+ await sendMessage('user-topic', JSON.stringify({
41
+ action: KAFKA_ACTIONS.USER_CREATED,
42
+ payload: { id: user.id || user._id, email: user.email }
43
+ }), (user.id || user._id).toString());
44
+ <%_ } -%>
45
+ return user;
46
+ } catch (error) {
47
+ logger.error(`${ERROR_MESSAGES.CREATE_USER_ERROR}:`, error);
48
+ throw error;
49
+ }
50
+ }
51
+
52
+ async updateUser(id, data) {
53
+ try {
54
+ const user = await this.updateUserUseCase.execute(id, data);
55
+ if (!user) throw new Error(ERROR_MESSAGES.USER_NOT_FOUND);
56
+ <%_ if (communication === 'Kafka') { -%>
57
+ await sendMessage('user-topic', JSON.stringify({
58
+ action: KAFKA_ACTIONS.USER_UPDATED,
59
+ payload: { id, email: user.email }
60
+ }), id);
61
+ <%_ } -%>
62
+ return user;
63
+ } catch (error) {
64
+ logger.error(`${ERROR_MESSAGES.UPDATE_USER_ERROR}:`, error);
65
+ throw error;
66
+ }
67
+ }
68
+
69
+ async deleteUser(id) {
70
+ try {
71
+ const deleted = await this.deleteUserUseCase.execute(id);
72
+ if (!deleted) throw new Error(ERROR_MESSAGES.USER_NOT_FOUND);
73
+ <%_ if (communication === 'Kafka') { -%>
74
+ await sendMessage('user-topic', JSON.stringify({
75
+ action: KAFKA_ACTIONS.USER_DELETED,
76
+ payload: { id }
77
+ }), id);
78
+ <%_ } -%>
79
+ return true;
80
+ } catch (error) {
81
+ logger.error(`${ERROR_MESSAGES.DELETE_USER_ERROR}:`, error);
82
+ throw error;
83
+ }
84
+ }
85
+ <% } else { -%>
86
+ async getUsers(req, res, next) {
87
+ try {
88
+ const users = await this.getAllUsersUseCase.execute();
89
+ res.json(users);
90
+ } catch (error) {
91
+ logger.error(`${ERROR_MESSAGES.FETCH_USERS_ERROR}:`, error);
92
+ next(error);
93
+ }
94
+ }
95
+
96
+ async createUser(req, res, next) {
97
+ const { name, email } = req.body || {};
98
+ try {
99
+ const user = await this.createUserUseCase.execute(name, email);
100
+ <%_ if (communication === 'Kafka') { -%>
101
+ await sendMessage('user-topic', JSON.stringify({
102
+ action: KAFKA_ACTIONS.USER_CREATED,
103
+ payload: { id: user.id || user._id, email: user.email }
104
+ }), (user.id || user._id).toString());
105
+ <%_ } -%>
106
+ res.status(HTTP_STATUS.CREATED).json(user);
107
+ } catch (error) {
108
+ logger.error(`${ERROR_MESSAGES.CREATE_USER_ERROR}:`, error);
109
+ next(error);
110
+ }
111
+ }
112
+
113
+ async updateUser(req, res, next) {
114
+ const { id } = req.params;
115
+ const { name, email } = req.body || {};
116
+ try {
117
+ const user = await this.updateUserUseCase.execute(id, { name, email });
118
+ if (!user) {
119
+ return res.status(HTTP_STATUS.NOT_FOUND).json({ error: ERROR_MESSAGES.USER_NOT_FOUND });
120
+ }
121
+ <%_ if (communication === 'Kafka') { -%>
122
+ await sendMessage('user-topic', JSON.stringify({
123
+ action: KAFKA_ACTIONS.USER_UPDATED,
124
+ payload: { id, email: user.email }
125
+ }), id);
126
+ <%_ } -%>
127
+ res.json(user);
128
+ } catch (error) {
129
+ logger.error(`${ERROR_MESSAGES.UPDATE_USER_ERROR}:`, error);
130
+ next(error);
131
+ }
132
+ }
133
+
134
+ async deleteUser(req, res, next) {
135
+ const { id } = req.params;
136
+ try {
137
+ const deleted = await this.deleteUserUseCase.execute(id);
138
+ if (!deleted) {
139
+ return res.status(HTTP_STATUS.NOT_FOUND).json({ error: ERROR_MESSAGES.USER_NOT_FOUND });
140
+ }
141
+ <%_ if (communication === 'Kafka') { -%>
142
+ await sendMessage('user-topic', JSON.stringify({
143
+ action: KAFKA_ACTIONS.USER_DELETED,
144
+ payload: { id }
145
+ }), id);
146
+ <%_ } -%>
147
+ res.status(HTTP_STATUS.OK).json({ message: 'User deleted successfully' });
148
+ } catch (error) {
149
+ logger.error(`${ERROR_MESSAGES.DELETE_USER_ERROR}:`, error);
150
+ next(error);
151
+ }
152
+ }
153
+ <% } -%>
154
+ }
155
+
156
+ module.exports = UserController;