nodejs-structure-cli 1.0.0

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 (243) hide show
  1. package/README.md +32 -0
  2. package/bin/index.js +143 -0
  3. package/lib/generator.js +145 -0
  4. package/lib/modules/app-setup.js +479 -0
  5. package/lib/modules/caching-setup.js +76 -0
  6. package/lib/modules/config-files.js +151 -0
  7. package/lib/modules/database-setup.js +116 -0
  8. package/lib/modules/kafka-setup.js +249 -0
  9. package/lib/modules/project-setup.js +32 -0
  10. package/lib/prompts.js +128 -0
  11. package/package.json +66 -0
  12. package/templates/clean-architecture/js/src/domain/models/User.js.ejs +11 -0
  13. package/templates/clean-architecture/js/src/errors/ApiError.js +14 -0
  14. package/templates/clean-architecture/js/src/errors/BadRequestError.js +11 -0
  15. package/templates/clean-architecture/js/src/errors/BadRequestError.spec.js.ejs +22 -0
  16. package/templates/clean-architecture/js/src/errors/NotFoundError.js +11 -0
  17. package/templates/clean-architecture/js/src/errors/NotFoundError.spec.js.ejs +22 -0
  18. package/templates/clean-architecture/js/src/index.js.ejs +56 -0
  19. package/templates/clean-architecture/js/src/infrastructure/config/env.js.ejs +47 -0
  20. package/templates/clean-architecture/js/src/infrastructure/log/logger.js +36 -0
  21. package/templates/clean-architecture/js/src/infrastructure/log/logger.spec.js.ejs +63 -0
  22. package/templates/clean-architecture/js/src/infrastructure/repositories/UserRepository.js.ejs +88 -0
  23. package/templates/clean-architecture/js/src/infrastructure/repositories/UserRepository.spec.js.ejs +142 -0
  24. package/templates/clean-architecture/js/src/infrastructure/webserver/middleware/errorMiddleware.js +30 -0
  25. package/templates/clean-architecture/js/src/infrastructure/webserver/server.js.ejs +93 -0
  26. package/templates/clean-architecture/js/src/infrastructure/webserver/swagger.js.ejs +6 -0
  27. package/templates/clean-architecture/js/src/interfaces/controllers/userController.js.ejs +190 -0
  28. package/templates/clean-architecture/js/src/interfaces/controllers/userController.spec.js.ejs +234 -0
  29. package/templates/clean-architecture/js/src/interfaces/graphql/context.js.ejs +13 -0
  30. package/templates/clean-architecture/js/src/interfaces/graphql/context.spec.js.ejs +31 -0
  31. package/templates/clean-architecture/js/src/interfaces/graphql/index.js.ejs +5 -0
  32. package/templates/clean-architecture/js/src/interfaces/graphql/resolvers/index.js.ejs +6 -0
  33. package/templates/clean-architecture/js/src/interfaces/graphql/resolvers/user.resolvers.js.ejs +27 -0
  34. package/templates/clean-architecture/js/src/interfaces/graphql/resolvers/user.resolvers.spec.js.ejs +66 -0
  35. package/templates/clean-architecture/js/src/interfaces/graphql/typeDefs/index.js.ejs +6 -0
  36. package/templates/clean-architecture/js/src/interfaces/graphql/typeDefs/user.types.js.ejs +19 -0
  37. package/templates/clean-architecture/js/src/interfaces/routes/api.js.ejs +17 -0
  38. package/templates/clean-architecture/js/src/interfaces/routes/api.spec.js.ejs +38 -0
  39. package/templates/clean-architecture/js/src/usecases/CreateUser.js.ejs +14 -0
  40. package/templates/clean-architecture/js/src/usecases/CreateUser.spec.js.ejs +51 -0
  41. package/templates/clean-architecture/js/src/usecases/DeleteUser.js +11 -0
  42. package/templates/clean-architecture/js/src/usecases/DeleteUser.spec.js.ejs +47 -0
  43. package/templates/clean-architecture/js/src/usecases/GetAllUsers.js +12 -0
  44. package/templates/clean-architecture/js/src/usecases/GetAllUsers.spec.js.ejs +61 -0
  45. package/templates/clean-architecture/js/src/usecases/UpdateUser.js.ejs +11 -0
  46. package/templates/clean-architecture/js/src/usecases/UpdateUser.spec.js.ejs +48 -0
  47. package/templates/clean-architecture/js/src/utils/errorMessages.js +14 -0
  48. package/templates/clean-architecture/js/src/utils/httpCodes.js +9 -0
  49. package/templates/clean-architecture/ts/src/config/env.ts.ejs +46 -0
  50. package/templates/clean-architecture/ts/src/config/swagger.ts.ejs +6 -0
  51. package/templates/clean-architecture/ts/src/domain/user.ts.ejs +9 -0
  52. package/templates/clean-architecture/ts/src/errors/ApiError.ts +15 -0
  53. package/templates/clean-architecture/ts/src/errors/BadRequestError.spec.ts.ejs +22 -0
  54. package/templates/clean-architecture/ts/src/errors/BadRequestError.ts +9 -0
  55. package/templates/clean-architecture/ts/src/errors/NotFoundError.spec.ts.ejs +22 -0
  56. package/templates/clean-architecture/ts/src/errors/NotFoundError.ts +9 -0
  57. package/templates/clean-architecture/ts/src/index.ts.ejs +144 -0
  58. package/templates/clean-architecture/ts/src/infrastructure/log/logger.spec.ts.ejs +63 -0
  59. package/templates/clean-architecture/ts/src/infrastructure/log/logger.ts +36 -0
  60. package/templates/clean-architecture/ts/src/infrastructure/repositories/UserRepository.spec.ts.ejs +175 -0
  61. package/templates/clean-architecture/ts/src/infrastructure/repositories/userRepository.ts.ejs +125 -0
  62. package/templates/clean-architecture/ts/src/interfaces/controllers/userController.spec.ts.ejs +331 -0
  63. package/templates/clean-architecture/ts/src/interfaces/controllers/userController.ts.ejs +208 -0
  64. package/templates/clean-architecture/ts/src/interfaces/graphql/context.spec.ts.ejs +32 -0
  65. package/templates/clean-architecture/ts/src/interfaces/graphql/context.ts.ejs +17 -0
  66. package/templates/clean-architecture/ts/src/interfaces/graphql/index.ts.ejs +3 -0
  67. package/templates/clean-architecture/ts/src/interfaces/graphql/resolvers/index.ts.ejs +4 -0
  68. package/templates/clean-architecture/ts/src/interfaces/graphql/resolvers/user.resolvers.spec.ts.ejs +68 -0
  69. package/templates/clean-architecture/ts/src/interfaces/graphql/resolvers/user.resolvers.ts.ejs +29 -0
  70. package/templates/clean-architecture/ts/src/interfaces/graphql/typeDefs/index.ts.ejs +4 -0
  71. package/templates/clean-architecture/ts/src/interfaces/graphql/typeDefs/user.types.ts.ejs +17 -0
  72. package/templates/clean-architecture/ts/src/interfaces/routes/userRoutes.spec.ts.ejs +40 -0
  73. package/templates/clean-architecture/ts/src/interfaces/routes/userRoutes.ts.ejs +18 -0
  74. package/templates/clean-architecture/ts/src/usecases/createUser.spec.ts.ejs +51 -0
  75. package/templates/clean-architecture/ts/src/usecases/createUser.ts.ejs +11 -0
  76. package/templates/clean-architecture/ts/src/usecases/deleteUser.spec.ts.ejs +47 -0
  77. package/templates/clean-architecture/ts/src/usecases/deleteUser.ts +9 -0
  78. package/templates/clean-architecture/ts/src/usecases/getAllUsers.spec.ts.ejs +63 -0
  79. package/templates/clean-architecture/ts/src/usecases/getAllUsers.ts +10 -0
  80. package/templates/clean-architecture/ts/src/usecases/updateUser.spec.ts.ejs +48 -0
  81. package/templates/clean-architecture/ts/src/usecases/updateUser.ts.ejs +10 -0
  82. package/templates/clean-architecture/ts/src/utils/errorMessages.ts +12 -0
  83. package/templates/clean-architecture/ts/src/utils/errorMiddleware.ts.ejs +27 -0
  84. package/templates/clean-architecture/ts/src/utils/httpCodes.ts +7 -0
  85. package/templates/common/.cursorrules.ejs +60 -0
  86. package/templates/common/.dockerignore +12 -0
  87. package/templates/common/.env.example.ejs +60 -0
  88. package/templates/common/.gitattributes +46 -0
  89. package/templates/common/.gitlab-ci.yml.ejs +86 -0
  90. package/templates/common/.lintstagedrc +6 -0
  91. package/templates/common/.prettierrc +7 -0
  92. package/templates/common/.snyk.ejs +45 -0
  93. package/templates/common/Dockerfile +73 -0
  94. package/templates/common/Jenkinsfile.ejs +87 -0
  95. package/templates/common/README.md.ejs +148 -0
  96. package/templates/common/_github/workflows/ci.yml.ejs +46 -0
  97. package/templates/common/_github/workflows/security.yml.ejs +36 -0
  98. package/templates/common/_gitignore +5 -0
  99. package/templates/common/_husky/pre-commit +4 -0
  100. package/templates/common/caching/clean/js/CreateUser.js.ejs +29 -0
  101. package/templates/common/caching/clean/js/DeleteUser.js.ejs +27 -0
  102. package/templates/common/caching/clean/js/GetAllUsers.js.ejs +37 -0
  103. package/templates/common/caching/clean/js/UpdateUser.js.ejs +27 -0
  104. package/templates/common/caching/clean/ts/createUser.ts.ejs +27 -0
  105. package/templates/common/caching/clean/ts/deleteUser.ts.ejs +24 -0
  106. package/templates/common/caching/clean/ts/getAllUsers.ts.ejs +34 -0
  107. package/templates/common/caching/clean/ts/updateUser.ts.ejs +25 -0
  108. package/templates/common/caching/js/memoryCache.js.ejs +60 -0
  109. package/templates/common/caching/js/memoryCache.spec.js.ejs +101 -0
  110. package/templates/common/caching/js/redisClient.js.ejs +75 -0
  111. package/templates/common/caching/js/redisClient.spec.js.ejs +147 -0
  112. package/templates/common/caching/ts/memoryCache.spec.ts.ejs +102 -0
  113. package/templates/common/caching/ts/memoryCache.ts.ejs +73 -0
  114. package/templates/common/caching/ts/redisClient.spec.ts.ejs +157 -0
  115. package/templates/common/caching/ts/redisClient.ts.ejs +89 -0
  116. package/templates/common/database/js/database.js.ejs +19 -0
  117. package/templates/common/database/js/database.spec.js.ejs +56 -0
  118. package/templates/common/database/js/models/User.js.ejs +91 -0
  119. package/templates/common/database/js/models/User.js.mongoose.ejs +35 -0
  120. package/templates/common/database/js/models/User.spec.js.ejs +94 -0
  121. package/templates/common/database/js/mongoose.js.ejs +33 -0
  122. package/templates/common/database/js/mongoose.spec.js.ejs +43 -0
  123. package/templates/common/database/ts/database.spec.ts.ejs +56 -0
  124. package/templates/common/database/ts/database.ts.ejs +21 -0
  125. package/templates/common/database/ts/models/User.spec.ts.ejs +100 -0
  126. package/templates/common/database/ts/models/User.ts.ejs +102 -0
  127. package/templates/common/database/ts/models/User.ts.mongoose.ejs +34 -0
  128. package/templates/common/database/ts/mongoose.spec.ts.ejs +42 -0
  129. package/templates/common/database/ts/mongoose.ts.ejs +28 -0
  130. package/templates/common/docker-compose.yml.ejs +159 -0
  131. package/templates/common/ecosystem.config.js.ejs +40 -0
  132. package/templates/common/eslint.config.mjs.ejs +77 -0
  133. package/templates/common/health/js/healthRoute.js.ejs +50 -0
  134. package/templates/common/health/js/healthRoute.spec.js.ejs +70 -0
  135. package/templates/common/health/ts/healthRoute.spec.ts.ejs +76 -0
  136. package/templates/common/health/ts/healthRoute.ts.ejs +49 -0
  137. package/templates/common/jest.config.js.ejs +32 -0
  138. package/templates/common/jest.e2e.config.js.ejs +8 -0
  139. package/templates/common/kafka/js/config/kafka.js +9 -0
  140. package/templates/common/kafka/js/config/kafka.spec.js.ejs +27 -0
  141. package/templates/common/kafka/js/messaging/baseConsumer.js.ejs +30 -0
  142. package/templates/common/kafka/js/messaging/baseConsumer.spec.js.ejs +58 -0
  143. package/templates/common/kafka/js/messaging/userEventSchema.js.ejs +12 -0
  144. package/templates/common/kafka/js/messaging/userEventSchema.spec.js.ejs +27 -0
  145. package/templates/common/kafka/js/messaging/welcomeEmailConsumer.js.ejs +44 -0
  146. package/templates/common/kafka/js/messaging/welcomeEmailConsumer.spec.js.ejs +86 -0
  147. package/templates/common/kafka/js/services/kafkaService.js.ejs +93 -0
  148. package/templates/common/kafka/js/services/kafkaService.spec.js.ejs +106 -0
  149. package/templates/common/kafka/js/utils/kafkaEvents.js.ejs +7 -0
  150. package/templates/common/kafka/ts/config/kafka.spec.ts.ejs +27 -0
  151. package/templates/common/kafka/ts/config/kafka.ts +7 -0
  152. package/templates/common/kafka/ts/messaging/baseConsumer.spec.ts.ejs +50 -0
  153. package/templates/common/kafka/ts/messaging/baseConsumer.ts.ejs +27 -0
  154. package/templates/common/kafka/ts/messaging/userEventSchema.spec.ts.ejs +51 -0
  155. package/templates/common/kafka/ts/messaging/userEventSchema.ts.ejs +12 -0
  156. package/templates/common/kafka/ts/messaging/welcomeEmailConsumer.spec.ts.ejs +86 -0
  157. package/templates/common/kafka/ts/messaging/welcomeEmailConsumer.ts.ejs +38 -0
  158. package/templates/common/kafka/ts/services/kafkaService.spec.ts.ejs +81 -0
  159. package/templates/common/kafka/ts/services/kafkaService.ts.ejs +95 -0
  160. package/templates/common/kafka/ts/utils/kafkaEvents.ts.ejs +5 -0
  161. package/templates/common/migrate-mongo-config.js.ejs +31 -0
  162. package/templates/common/migrations/init.js.ejs +23 -0
  163. package/templates/common/package.json.ejs +137 -0
  164. package/templates/common/prompts/add-feature.md.ejs +26 -0
  165. package/templates/common/prompts/project-context.md.ejs +43 -0
  166. package/templates/common/prompts/troubleshoot.md.ejs +28 -0
  167. package/templates/common/public/css/style.css +147 -0
  168. package/templates/common/scripts/run-e2e.js.ejs +63 -0
  169. package/templates/common/shutdown/js/gracefulShutdown.js.ejs +65 -0
  170. package/templates/common/shutdown/js/gracefulShutdown.spec.js.ejs +149 -0
  171. package/templates/common/shutdown/ts/gracefulShutdown.spec.ts.ejs +179 -0
  172. package/templates/common/shutdown/ts/gracefulShutdown.ts.ejs +59 -0
  173. package/templates/common/sonar-project.properties.ejs +27 -0
  174. package/templates/common/src/config/auth.js.ejs +19 -0
  175. package/templates/common/src/config/auth.ts.ejs +19 -0
  176. package/templates/common/src/controllers/authController.js.ejs +101 -0
  177. package/templates/common/src/controllers/authController.ts.ejs +101 -0
  178. package/templates/common/src/middleware/auth.js.ejs +20 -0
  179. package/templates/common/src/middleware/auth.ts.ejs +25 -0
  180. package/templates/common/src/middleware/upload.js.ejs +31 -0
  181. package/templates/common/src/middleware/upload.ts.ejs +32 -0
  182. package/templates/common/src/routes/authRoutes.js.ejs +20 -0
  183. package/templates/common/src/routes/authRoutes.ts.ejs +20 -0
  184. package/templates/common/src/tests/e2e/e2e.users.test.js.ejs +120 -0
  185. package/templates/common/src/tests/e2e/e2e.users.test.ts.ejs +120 -0
  186. package/templates/common/src/utils/errorMiddleware.spec.js.ejs +79 -0
  187. package/templates/common/src/utils/errorMiddleware.spec.ts.ejs +94 -0
  188. package/templates/common/swagger.yml.ejs +118 -0
  189. package/templates/common/tsconfig.json +23 -0
  190. package/templates/common/views/ejs/index.ejs +55 -0
  191. package/templates/common/views/pug/index.pug +40 -0
  192. package/templates/db/mysql/V1__Initial_Setup.sql.ejs +10 -0
  193. package/templates/db/postgres/V1__Initial_Setup.sql.ejs +10 -0
  194. package/templates/mvc/js/src/config/env.js.ejs +46 -0
  195. package/templates/mvc/js/src/config/swagger.js.ejs +6 -0
  196. package/templates/mvc/js/src/controllers/userController.js.ejs +288 -0
  197. package/templates/mvc/js/src/controllers/userController.spec.js.ejs +481 -0
  198. package/templates/mvc/js/src/errors/ApiError.js +14 -0
  199. package/templates/mvc/js/src/errors/BadRequestError.js +11 -0
  200. package/templates/mvc/js/src/errors/BadRequestError.spec.js.ejs +22 -0
  201. package/templates/mvc/js/src/errors/NotFoundError.js +11 -0
  202. package/templates/mvc/js/src/errors/NotFoundError.spec.js.ejs +22 -0
  203. package/templates/mvc/js/src/graphql/context.js.ejs +7 -0
  204. package/templates/mvc/js/src/graphql/context.spec.js.ejs +29 -0
  205. package/templates/mvc/js/src/graphql/index.js.ejs +5 -0
  206. package/templates/mvc/js/src/graphql/resolvers/index.js.ejs +6 -0
  207. package/templates/mvc/js/src/graphql/resolvers/user.resolvers.js.ejs +25 -0
  208. package/templates/mvc/js/src/graphql/resolvers/user.resolvers.spec.js.ejs +64 -0
  209. package/templates/mvc/js/src/graphql/typeDefs/index.js.ejs +6 -0
  210. package/templates/mvc/js/src/graphql/typeDefs/user.types.js.ejs +19 -0
  211. package/templates/mvc/js/src/index.js.ejs +141 -0
  212. package/templates/mvc/js/src/routes/api.js.ejs +15 -0
  213. package/templates/mvc/js/src/routes/api.spec.js.ejs +41 -0
  214. package/templates/mvc/js/src/utils/errorMessages.js +14 -0
  215. package/templates/mvc/js/src/utils/errorMiddleware.js +29 -0
  216. package/templates/mvc/js/src/utils/httpCodes.js +9 -0
  217. package/templates/mvc/js/src/utils/logger.js +40 -0
  218. package/templates/mvc/js/src/utils/logger.spec.js.ejs +63 -0
  219. package/templates/mvc/ts/src/config/env.ts.ejs +45 -0
  220. package/templates/mvc/ts/src/config/swagger.ts.ejs +6 -0
  221. package/templates/mvc/ts/src/controllers/userController.spec.ts.ejs +481 -0
  222. package/templates/mvc/ts/src/controllers/userController.ts.ejs +292 -0
  223. package/templates/mvc/ts/src/errors/ApiError.ts +15 -0
  224. package/templates/mvc/ts/src/errors/BadRequestError.spec.ts.ejs +22 -0
  225. package/templates/mvc/ts/src/errors/BadRequestError.ts +9 -0
  226. package/templates/mvc/ts/src/errors/NotFoundError.spec.ts.ejs +27 -0
  227. package/templates/mvc/ts/src/errors/NotFoundError.ts +9 -0
  228. package/templates/mvc/ts/src/graphql/context.spec.ts.ejs +30 -0
  229. package/templates/mvc/ts/src/graphql/context.ts.ejs +12 -0
  230. package/templates/mvc/ts/src/graphql/index.ts.ejs +3 -0
  231. package/templates/mvc/ts/src/graphql/resolvers/index.ts.ejs +4 -0
  232. package/templates/mvc/ts/src/graphql/resolvers/user.resolvers.spec.ts.ejs +68 -0
  233. package/templates/mvc/ts/src/graphql/resolvers/user.resolvers.ts.ejs +29 -0
  234. package/templates/mvc/ts/src/graphql/typeDefs/index.ts.ejs +4 -0
  235. package/templates/mvc/ts/src/graphql/typeDefs/user.types.ts.ejs +17 -0
  236. package/templates/mvc/ts/src/index.ts.ejs +157 -0
  237. package/templates/mvc/ts/src/routes/api.spec.ts.ejs +59 -0
  238. package/templates/mvc/ts/src/routes/api.ts.ejs +17 -0
  239. package/templates/mvc/ts/src/utils/errorMessages.ts +12 -0
  240. package/templates/mvc/ts/src/utils/errorMiddleware.ts.ejs +27 -0
  241. package/templates/mvc/ts/src/utils/httpCodes.ts +7 -0
  242. package/templates/mvc/ts/src/utils/logger.spec.ts.ejs +63 -0
  243. package/templates/mvc/ts/src/utils/logger.ts +36 -0
@@ -0,0 +1,288 @@
1
+ const User = require('../models/User');
2
+ const ERROR_MESSAGES = require('../utils/errorMessages');
3
+ <% if (communication !== 'GraphQL') { -%>
4
+ const HTTP_STATUS = require('../utils/httpCodes');
5
+ <% } -%>
6
+ const logger = require('../utils/logger');
7
+ <%_ if (caching === 'Redis') { -%>
8
+ const cacheService = require('../config/redisClient');
9
+ <%_ } else if (caching === 'Memory Cache') { -%>
10
+ const cacheService = require('../config/memoryCache');
11
+ <%_ } -%>
12
+ <%_ if (communication === 'Kafka') { -%>
13
+ const { sendMessage } = require('../services/kafkaService');
14
+ const { KAFKA_ACTIONS } = require('../utils/kafkaEvents');
15
+ <%_ } -%>
16
+ <%_ if (auth && auth !== 'None') { _%>
17
+ const bcrypt = require('bcryptjs');
18
+ <%_ } _%>
19
+
20
+ <% if (communication === 'GraphQL') { -%>
21
+ const getUsers = async () => {
22
+ try {
23
+ <%_ if (caching === 'Redis' || caching === 'Memory Cache') { -%>
24
+ const users = await cacheService.getOrSet('users:all', async () => {
25
+ <%_ if (database === 'MongoDB' || database === 'None') { -%>
26
+ return await User.find();
27
+ <%_ } else { -%>
28
+ return await User.findAll();
29
+ <%_ } -%>
30
+ }, 60);
31
+ <%_ } else { -%>
32
+ <%_ if (database === 'MongoDB' || database === 'None') { -%>
33
+ const users = await User.find();
34
+ <%_ } else { -%>
35
+ const users = await User.findAll();
36
+ <%_ } -%>
37
+ <%_ } -%>
38
+ return users;
39
+ } catch (error) {
40
+ logger.error(`${ERROR_MESSAGES.FETCH_USERS_ERROR}:`, error);
41
+ throw error;
42
+ }
43
+ };
44
+
45
+ const createUser = async (data) => {
46
+ try {
47
+ const { name, email, password, imageUrl } = data;
48
+ const userData = { name, email };
49
+ <% if (auth && auth !== 'None') { %>
50
+ if (password) {
51
+ userData.password = await bcrypt.hash(password, 10);
52
+ }
53
+ <% } %>
54
+ <% if (includeMulter) { %>
55
+ if (imageUrl) {
56
+ userData.imageUrl = imageUrl;
57
+ }
58
+ <% } %>
59
+ const user = await User.create(userData);
60
+ <%_ if (caching === 'Redis' || caching === 'Memory Cache') { -%>
61
+ await cacheService.del('users:all');
62
+ <%_ } -%>
63
+ <%_ if (communication === 'Kafka') { -%>
64
+ await sendMessage('user-topic', JSON.stringify({
65
+ action: KAFKA_ACTIONS.USER_CREATED,
66
+ payload: { id: user.id || user._id, email: user.email }
67
+ }), (user.id || user._id).toString());
68
+ <%_ } -%>
69
+ return user;
70
+ } catch (error) {
71
+ logger.error(`${ERROR_MESSAGES.CREATE_USER_ERROR}:`, error);
72
+ throw error;
73
+ }
74
+ };
75
+
76
+ const updateUser = async (id, data) => {
77
+ try {
78
+ <%_ if (database === 'MongoDB') { -%>
79
+ const updatedUser = await User.findByIdAndUpdate(id, data, { new: true });
80
+ if (!updatedUser) throw new Error(ERROR_MESSAGES.USER_NOT_FOUND);
81
+ <%_ } else if (database === 'None') { -%>
82
+ const user = await User.findByPk(id);
83
+ if (!user) throw new Error(ERROR_MESSAGES.USER_NOT_FOUND);
84
+ await User.update(id, data);
85
+ const updatedUser = await User.findByPk(id);
86
+ <%_ } else { -%>
87
+ const user = await User.findByPk(id);
88
+ if (!user) throw new Error(ERROR_MESSAGES.USER_NOT_FOUND);
89
+ await user.update(data);
90
+ const updatedUser = user;
91
+ <%_ } -%>
92
+ <%_ if (caching === 'Redis' || caching === 'Memory Cache') { -%>
93
+ await cacheService.del('users:all');
94
+ <%_ } -%>
95
+ <%_ if (communication === 'Kafka') { -%>
96
+ await sendMessage('user-topic', JSON.stringify({
97
+ action: KAFKA_ACTIONS.USER_UPDATED,
98
+ payload: { id, email: updatedUser?.email }
99
+ }), id);
100
+ <%_ } -%>
101
+ return updatedUser;
102
+ } catch (error) {
103
+ logger.error(`${ERROR_MESSAGES.UPDATE_USER_ERROR}:`, error);
104
+ throw error;
105
+ }
106
+ };
107
+
108
+ const deleteUser = async (id) => {
109
+ try {
110
+ <%_ if (database === 'MongoDB') { -%>
111
+ const deleted = await User.findByIdAndDelete(id);
112
+ if (!deleted) throw new Error(ERROR_MESSAGES.USER_NOT_FOUND);
113
+ <%_ } else if (database === 'None') { -%>
114
+ const deleted = await User.destroy(id);
115
+ if (!deleted) throw new Error(ERROR_MESSAGES.USER_NOT_FOUND);
116
+ <%_ } else { -%>
117
+ const user = await User.findByPk(id);
118
+ if (!user) throw new Error(ERROR_MESSAGES.USER_NOT_FOUND);
119
+ await user.destroy();
120
+ <%_ } -%>
121
+ <%_ if (caching === 'Redis' || caching === 'Memory Cache') { -%>
122
+ await cacheService.del('users:all');
123
+ <%_ } -%>
124
+ <%_ if (communication === 'Kafka') { -%>
125
+ await sendMessage('user-topic', JSON.stringify({
126
+ action: KAFKA_ACTIONS.USER_DELETED,
127
+ payload: { id }
128
+ }), id);
129
+ <%_ } -%>
130
+ return true;
131
+ } catch (error) {
132
+ logger.error(`${ERROR_MESSAGES.DELETE_USER_ERROR}:`, error);
133
+ throw error;
134
+ }
135
+ };
136
+
137
+ module.exports = { getUsers, createUser, updateUser, deleteUser };
138
+ <% } else { -%>
139
+ const getUsers = async (req, res, next) => {
140
+ try {
141
+ <%_ if (caching === 'Redis' || caching === 'Memory Cache') { -%>
142
+ const users = await cacheService.getOrSet('users:all', async () => {
143
+ <%_ if (database === 'MongoDB' || database === 'None') { -%>
144
+ return await User.find();
145
+ <%_ } else { -%>
146
+ return await User.findAll();
147
+ <%_ } -%>
148
+ }, 60);
149
+ <%_ } else { -%>
150
+ <%_ if (database === 'MongoDB' || database === 'None') { -%>
151
+ const users = await User.find();
152
+ <%_ } else { -%>
153
+ const users = await User.findAll();
154
+ <%_ } -%>
155
+ <%_ } -%>
156
+ res.json(users);
157
+ } catch (error) {
158
+ logger.error(`${ERROR_MESSAGES.FETCH_USERS_ERROR}:`, error);
159
+ next(error);
160
+ }
161
+ };
162
+
163
+ const createUser = async (req, res, next) => {
164
+ try {
165
+ const { name, email, password } = req.body || {};
166
+ const userData = { name, email };
167
+
168
+ <% if (auth && auth !== 'None') { %>
169
+ if (password) {
170
+ userData.password = await bcrypt.hash(password, 10);
171
+ }
172
+ <% } %>
173
+
174
+ <% if (includeMulter) { %>
175
+ if (req.file) {
176
+ userData.imageUrl = `/uploads/${req.file.filename}`;
177
+ }
178
+ <% } %>
179
+
180
+ const user = await User.create(userData);
181
+ <%_ if (caching === 'Redis' || caching === 'Memory Cache') { -%>
182
+ await cacheService.del('users:all');
183
+ <%_ } -%>
184
+ <%_ if (communication === 'Kafka') { -%>
185
+ await sendMessage('user-topic', JSON.stringify({
186
+ action: KAFKA_ACTIONS.USER_CREATED,
187
+ payload: { id: user.id || user._id, email: user.email }
188
+ }), (user.id || user._id).toString());
189
+ <%_ } -%>
190
+ res.status(HTTP_STATUS.CREATED).json(user);
191
+ } catch (error) {
192
+ logger.error(`${ERROR_MESSAGES.CREATE_USER_ERROR}:`, error);
193
+ next(error);
194
+ }
195
+ };
196
+
197
+ const updateUser = async (req, res, next) => {
198
+ try {
199
+ const { id } = req.params;
200
+ const { name, email, password } = req.body || {};
201
+ const updateData = { name, email };
202
+
203
+ <% if (auth && auth !== 'None') { %>
204
+ if (password) {
205
+ updateData.password = await bcrypt.hash(password, 10);
206
+ }
207
+ <% } %>
208
+
209
+ <% if (includeMulter) { %>
210
+ if (req.file) {
211
+ updateData.imageUrl = `/uploads/${req.file.filename}`;
212
+ }
213
+ <% } %>
214
+
215
+ <%_ if (database === 'MongoDB') { -%>
216
+ const updatedUser = await User.findByIdAndUpdate(id, updateData, { new: true });
217
+ if (!updatedUser) {
218
+ return res.status(HTTP_STATUS.NOT_FOUND).json({ error: ERROR_MESSAGES.USER_NOT_FOUND });
219
+ }
220
+ <%_ } else if (database === 'None') { -%>
221
+ const user = await User.findByPk(id);
222
+ if (!user) {
223
+ return res.status(HTTP_STATUS.NOT_FOUND).json({ error: ERROR_MESSAGES.USER_NOT_FOUND });
224
+ }
225
+ await User.update(id, updateData);
226
+ const updatedUser = await User.findByPk(id);
227
+ <%_ } else { -%>
228
+ const user = await User.findByPk(id);
229
+ if (!user) {
230
+ return res.status(HTTP_STATUS.NOT_FOUND).json({ error: ERROR_MESSAGES.USER_NOT_FOUND });
231
+ }
232
+ await user.update(updateData);
233
+ const updatedUser = user;
234
+ <%_ } -%>
235
+ <%_ if (caching === 'Redis' || caching === 'Memory Cache') { -%>
236
+ await cacheService.del('users:all');
237
+ <%_ } -%>
238
+ <%_ if (communication === 'Kafka') { -%>
239
+ await sendMessage('user-topic', JSON.stringify({
240
+ action: KAFKA_ACTIONS.USER_UPDATED,
241
+ payload: { id, email: updatedUser?.email }
242
+ }), id);
243
+ <%_ } -%>
244
+ res.status(HTTP_STATUS.OK).json(updatedUser);
245
+ } catch (error) {
246
+ logger.error(`${ERROR_MESSAGES.UPDATE_USER_ERROR}:`, error);
247
+ next(error);
248
+ }
249
+ };
250
+
251
+ const deleteUser = async (req, res, next) => {
252
+ try {
253
+ const { id } = req.params;
254
+ <%_ if (database === 'MongoDB') { -%>
255
+ const deleted = await User.findByIdAndDelete(id);
256
+ if (!deleted) {
257
+ return res.status(HTTP_STATUS.NOT_FOUND).json({ error: ERROR_MESSAGES.USER_NOT_FOUND });
258
+ }
259
+ <%_ } else if (database === 'None') { -%>
260
+ const deleted = await User.destroy(id);
261
+ if (!deleted) {
262
+ return res.status(HTTP_STATUS.NOT_FOUND).json({ error: ERROR_MESSAGES.USER_NOT_FOUND });
263
+ }
264
+ <%_ } else { -%>
265
+ const user = await User.findByPk(id);
266
+ if (!user) {
267
+ return res.status(HTTP_STATUS.NOT_FOUND).json({ error: ERROR_MESSAGES.USER_NOT_FOUND });
268
+ }
269
+ await user.destroy();
270
+ <%_ } -%>
271
+ <%_ if (caching === 'Redis' || caching === 'Memory Cache') { -%>
272
+ await cacheService.del('users:all');
273
+ <%_ } -%>
274
+ <%_ if (communication === 'Kafka') { -%>
275
+ await sendMessage('user-topic', JSON.stringify({
276
+ action: KAFKA_ACTIONS.USER_DELETED,
277
+ payload: { id }
278
+ }), id);
279
+ <%_ } -%>
280
+ res.status(HTTP_STATUS.OK).json({ message: 'User deleted successfully' });
281
+ } catch (error) {
282
+ logger.error(`${ERROR_MESSAGES.DELETE_USER_ERROR}:`, error);
283
+ next(error);
284
+ }
285
+ };
286
+
287
+ module.exports = { getUsers, createUser, updateUser, deleteUser };
288
+ <% } -%>