create-easy-stack 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/bin/create.mjs +244 -0
  2. package/infra/email/files/src/core/config/email.env.ts +73 -0
  3. package/infra/email/files/src/core/infrastructure/email/email-dispatcher.port.ts +13 -0
  4. package/infra/email/files/src/core/infrastructure/email/email-layout.spec.ts +83 -0
  5. package/infra/email/files/src/core/infrastructure/email/email-layout.ts +88 -0
  6. package/infra/email/files/src/core/infrastructure/email/email-sender.factory.spec.ts +87 -0
  7. package/infra/email/files/src/core/infrastructure/email/email-sender.factory.ts +35 -0
  8. package/infra/email/files/src/core/infrastructure/email/email-sender.port.ts +19 -0
  9. package/infra/email/files/src/core/infrastructure/email/email.job.spec.ts +101 -0
  10. package/infra/email/files/src/core/infrastructure/email/email.job.ts +64 -0
  11. package/infra/email/files/src/core/infrastructure/email/email.module.spec.ts +60 -0
  12. package/infra/email/files/src/core/infrastructure/email/email.module.ts +34 -0
  13. package/infra/email/files/src/core/infrastructure/email/log-email-sender.spec.ts +34 -0
  14. package/infra/email/files/src/core/infrastructure/email/log-email-sender.ts +17 -0
  15. package/infra/email/files/src/core/infrastructure/email/smtp-email-sender.spec.ts +99 -0
  16. package/infra/email/files/src/core/infrastructure/email/smtp-email-sender.ts +63 -0
  17. package/infra/email/infra.json +58 -0
  18. package/infra/prisma-postgres/docker.service.yml +12 -0
  19. package/infra/prisma-postgres/files/prisma/schema.prisma +10 -0
  20. package/infra/prisma-postgres/files/prisma.config.mjs +10 -0
  21. package/infra/prisma-postgres/files/src/core/config/database.env.ts +13 -0
  22. package/infra/prisma-postgres/files/src/core/infrastructure/database/database.module.ts +9 -0
  23. package/infra/prisma-postgres/files/src/core/infrastructure/database/prisma.service.ts +26 -0
  24. package/infra/prisma-postgres/infra.json +60 -0
  25. package/infra/rabbitmq/docker.service.yml +16 -0
  26. package/infra/rabbitmq/files/src/core/config/messaging.env.ts +29 -0
  27. package/infra/rabbitmq/files/src/core/infrastructure/messaging/jobs/inline-job-queue.spec.ts +60 -0
  28. package/infra/rabbitmq/files/src/core/infrastructure/messaging/jobs/inline-job-queue.ts +33 -0
  29. package/infra/rabbitmq/files/src/core/infrastructure/messaging/jobs/job-failure.spec.ts +23 -0
  30. package/infra/rabbitmq/files/src/core/infrastructure/messaging/jobs/job-failure.ts +19 -0
  31. package/infra/rabbitmq/files/src/core/infrastructure/messaging/jobs/job-payload-cipher.spec.ts +80 -0
  32. package/infra/rabbitmq/files/src/core/infrastructure/messaging/jobs/job-payload-cipher.ts +66 -0
  33. package/infra/rabbitmq/files/src/core/infrastructure/messaging/jobs/job-queue.boundary.spec.ts +34 -0
  34. package/infra/rabbitmq/files/src/core/infrastructure/messaging/jobs/job-queue.factory.ts +21 -0
  35. package/infra/rabbitmq/files/src/core/infrastructure/messaging/jobs/job-queue.module.spec.ts +75 -0
  36. package/infra/rabbitmq/files/src/core/infrastructure/messaging/jobs/job-queue.module.ts +30 -0
  37. package/infra/rabbitmq/files/src/core/infrastructure/messaging/jobs/job-queue.port.ts +59 -0
  38. package/infra/rabbitmq/files/src/core/infrastructure/messaging/jobs/rabbitmq-job-queue.spec.ts +510 -0
  39. package/infra/rabbitmq/files/src/core/infrastructure/messaging/jobs/rabbitmq-job-queue.ts +353 -0
  40. package/infra/rabbitmq/files/src/core/infrastructure/messaging/rabbitmq/rabbitmq.module.ts +9 -0
  41. package/infra/rabbitmq/files/src/core/infrastructure/messaging/rabbitmq/rabbitmq.service.spec.ts +289 -0
  42. package/infra/rabbitmq/files/src/core/infrastructure/messaging/rabbitmq/rabbitmq.service.ts +207 -0
  43. package/infra/rabbitmq/infra.json +55 -0
  44. package/infra/redis/docker.service.yml +10 -0
  45. package/infra/redis/files/src/core/http/decorators/rate-limit.decorator.ts +26 -0
  46. package/infra/redis/files/src/core/http/interceptors/rate-limit.interceptor.spec.ts +180 -0
  47. package/infra/redis/files/src/core/http/interceptors/rate-limit.interceptor.ts +105 -0
  48. package/infra/redis/files/src/core/infrastructure/redis/cache.constants.ts +67 -0
  49. package/infra/redis/files/src/core/infrastructure/redis/idempotency/idempotency.module.ts +9 -0
  50. package/infra/redis/files/src/core/infrastructure/redis/idempotency/idempotency.service.spec.ts +146 -0
  51. package/infra/redis/files/src/core/infrastructure/redis/idempotency/idempotency.service.ts +131 -0
  52. package/infra/redis/files/src/core/infrastructure/redis/lock/lock.module.ts +9 -0
  53. package/infra/redis/files/src/core/infrastructure/redis/lock/lock.service.integration-spec.ts +111 -0
  54. package/infra/redis/files/src/core/infrastructure/redis/lock/lock.service.ts +82 -0
  55. package/infra/redis/files/src/core/infrastructure/redis/rate-limit/rate-limit.module.ts +15 -0
  56. package/infra/redis/files/src/core/infrastructure/redis/rate-limit/rate-limit.service.spec.ts +45 -0
  57. package/infra/redis/files/src/core/infrastructure/redis/rate-limit/rate-limit.service.ts +38 -0
  58. package/infra/redis/files/src/core/infrastructure/redis/redis.module.ts +9 -0
  59. package/infra/redis/files/src/core/infrastructure/redis/redis.service.ts +196 -0
  60. package/infra/redis/infra.json +53 -0
  61. package/infra/storage-cloudinary/files/src/core/config/storage.env.ts +43 -0
  62. package/infra/storage-cloudinary/files/src/core/infrastructure/storage/cloudinary-image-storage.spec.ts +275 -0
  63. package/infra/storage-cloudinary/files/src/core/infrastructure/storage/cloudinary-image-storage.ts +158 -0
  64. package/infra/storage-cloudinary/files/src/core/infrastructure/storage/image-storage.factory.ts +30 -0
  65. package/infra/storage-cloudinary/files/src/core/infrastructure/storage/image-storage.module.ts +17 -0
  66. package/infra/storage-cloudinary/files/src/core/infrastructure/storage/image-storage.port.ts +38 -0
  67. package/infra/storage-cloudinary/files/src/core/infrastructure/storage/image-type.spec.ts +48 -0
  68. package/infra/storage-cloudinary/files/src/core/infrastructure/storage/image-type.ts +25 -0
  69. package/infra/storage-cloudinary/files/src/core/infrastructure/storage/unconfigured-image-storage.ts +19 -0
  70. package/infra/storage-cloudinary/infra.json +73 -0
  71. package/lib/fs-utils.mjs +115 -0
  72. package/lib/registry.mjs +50 -0
  73. package/lib/scaffold.mjs +157 -0
  74. package/package.json +37 -0
  75. package/templates/nest-ddd/files/.env.example +5 -0
  76. package/templates/nest-ddd/files/.husky/commit-msg +1 -0
  77. package/templates/nest-ddd/files/.husky/pre-commit +1 -0
  78. package/templates/nest-ddd/files/.oxlintrc.json +10 -0
  79. package/templates/nest-ddd/files/.prettierrc +4 -0
  80. package/templates/nest-ddd/files/_gitignore +40 -0
  81. package/templates/nest-ddd/files/commitlint.config.js +3 -0
  82. package/templates/nest-ddd/files/nest-cli.json +8 -0
  83. package/templates/nest-ddd/files/package.json +66 -0
  84. package/templates/nest-ddd/files/plop-templates/command/command.ts.hbs +5 -0
  85. package/templates/nest-ddd/files/plop-templates/command/handler.ts.hbs +30 -0
  86. package/templates/nest-ddd/files/plop-templates/module/application/commands/create-{{kebab}}.command.ts.hbs +5 -0
  87. package/templates/nest-ddd/files/plop-templates/module/application/commands/create-{{kebab}}.handler.spec.ts.hbs +35 -0
  88. package/templates/nest-ddd/files/plop-templates/module/application/commands/create-{{kebab}}.handler.ts.hbs +25 -0
  89. package/templates/nest-ddd/files/plop-templates/module/application/index.ts.hbs +5 -0
  90. package/templates/nest-ddd/files/plop-templates/module/application/queries/get-{{kebab}}-by-id.handler.ts.hbs +29 -0
  91. package/templates/nest-ddd/files/plop-templates/module/application/queries/get-{{kebab}}-by-id.query.ts.hbs +5 -0
  92. package/templates/nest-ddd/files/plop-templates/module/domain/entities/{{kebab}}.entity.ts.hbs +37 -0
  93. package/templates/nest-ddd/files/plop-templates/module/domain/events/{{kebab}}-created.event.ts.hbs +10 -0
  94. package/templates/nest-ddd/files/plop-templates/module/domain/exceptions/{{kebab}}.exception.ts.hbs +11 -0
  95. package/templates/nest-ddd/files/plop-templates/module/domain/index.ts.hbs +4 -0
  96. package/templates/nest-ddd/files/plop-templates/module/domain/repositories/{{kebab}}.repository.ts.hbs +7 -0
  97. package/templates/nest-ddd/files/plop-templates/module/presentation/controllers/{{kebab}}.controller.ts.hbs +53 -0
  98. package/templates/nest-ddd/files/plop-templates/module/presentation/dtos/create-{{kebab}}.dto.ts.hbs +10 -0
  99. package/templates/nest-ddd/files/plop-templates/module/presentation/dtos/{{kebab}}-response.dto.ts.hbs +15 -0
  100. package/templates/nest-ddd/files/plop-templates/module/presentation/index.ts.hbs +4 -0
  101. package/templates/nest-ddd/files/plop-templates/module/presentation/mappers/{{kebab}}.mapper.ts.hbs +13 -0
  102. package/templates/nest-ddd/files/plop-templates/module/{{kebab}}.module.ts.hbs +40 -0
  103. package/templates/nest-ddd/files/plop-templates/persistence-memory/infrastructure/database/repositories/in-memory-{{kebab}}.repository.ts.hbs +17 -0
  104. package/templates/nest-ddd/files/plop-templates/persistence-memory/infrastructure/index.ts.hbs +1 -0
  105. package/templates/nest-ddd/files/plop-templates/persistence-prisma/infrastructure/database/mappers/{{kebab}}.mapper.ts.hbs +29 -0
  106. package/templates/nest-ddd/files/plop-templates/persistence-prisma/infrastructure/database/repositories/prisma-{{kebab}}.repository.ts.hbs +28 -0
  107. package/templates/nest-ddd/files/plop-templates/persistence-prisma/infrastructure/index.ts.hbs +2 -0
  108. package/templates/nest-ddd/files/plop-templates/query/handler.ts.hbs +28 -0
  109. package/templates/nest-ddd/files/plop-templates/query/query.ts.hbs +5 -0
  110. package/templates/nest-ddd/files/plop-templates/snippets/error-codes.hbs +14 -0
  111. package/templates/nest-ddd/files/plop-templates/snippets/prisma-model.hbs +7 -0
  112. package/templates/nest-ddd/files/plopfile.mjs +186 -0
  113. package/templates/nest-ddd/files/src/app.controller.ts +13 -0
  114. package/templates/nest-ddd/files/src/app.module.ts +26 -0
  115. package/templates/nest-ddd/files/src/core/config/app.config.ts +9 -0
  116. package/templates/nest-ddd/files/src/core/config/env.validation.ts +30 -0
  117. package/templates/nest-ddd/files/src/core/domain/base/aggregate-root.base.ts +18 -0
  118. package/templates/nest-ddd/files/src/core/domain/base/domain-event.base.ts +7 -0
  119. package/templates/nest-ddd/files/src/core/domain/base/entity.base.ts +36 -0
  120. package/templates/nest-ddd/files/src/core/domain/base/value-object.base.ts +17 -0
  121. package/templates/nest-ddd/files/src/core/domain/exceptions/domain.exception.ts +16 -0
  122. package/templates/nest-ddd/files/src/core/domain/exceptions/error-codes.ts +28 -0
  123. package/templates/nest-ddd/files/src/core/domain/types/pagination.ts +9 -0
  124. package/templates/nest-ddd/files/src/core/http/decorators/client-info.decorator.ts +24 -0
  125. package/templates/nest-ddd/files/src/core/http/decorators/current-user.decorator.ts +19 -0
  126. package/templates/nest-ddd/files/src/core/http/dtos/paginated-response.dto.ts +29 -0
  127. package/templates/nest-ddd/files/src/core/http/dtos/pagination-query.dto.ts +17 -0
  128. package/templates/nest-ddd/files/src/core/http/filters/all-exceptions.filter.spec.ts +163 -0
  129. package/templates/nest-ddd/files/src/core/http/filters/all-exceptions.filter.ts +97 -0
  130. package/templates/nest-ddd/files/src/core/http/guards/max-body-size.guard.spec.ts +47 -0
  131. package/templates/nest-ddd/files/src/core/http/guards/max-body-size.guard.ts +31 -0
  132. package/templates/nest-ddd/files/src/core/http/interceptors/logging.interceptor.ts +37 -0
  133. package/templates/nest-ddd/files/src/core/http/interceptors/response.interceptor.ts +53 -0
  134. package/templates/nest-ddd/files/src/core/http/logging/app.logger.ts +34 -0
  135. package/templates/nest-ddd/files/src/core/index.ts +33 -0
  136. package/templates/nest-ddd/files/src/core/utils/correlation-id.util.spec.ts +29 -0
  137. package/templates/nest-ddd/files/src/core/utils/correlation-id.util.ts +15 -0
  138. package/templates/nest-ddd/files/src/core/utils/hash.util.spec.ts +61 -0
  139. package/templates/nest-ddd/files/src/core/utils/hash.util.ts +47 -0
  140. package/templates/nest-ddd/files/src/core/utils/snowflake.util.spec.ts +40 -0
  141. package/templates/nest-ddd/files/src/core/utils/snowflake.util.ts +99 -0
  142. package/templates/nest-ddd/files/src/core/utils/string.util.spec.ts +20 -0
  143. package/templates/nest-ddd/files/src/core/utils/string.util.ts +21 -0
  144. package/templates/nest-ddd/files/src/core/utils/time.util.spec.ts +25 -0
  145. package/templates/nest-ddd/files/src/core/utils/time.util.ts +25 -0
  146. package/templates/nest-ddd/files/src/core/utils/ttl.util.ts +22 -0
  147. package/templates/nest-ddd/files/src/main.ts +61 -0
  148. package/templates/nest-ddd/files/test/setup.ts +6 -0
  149. package/templates/nest-ddd/files/tsconfig.build.json +9 -0
  150. package/templates/nest-ddd/files/tsconfig.json +28 -0
  151. package/templates/nest-ddd/files/vitest.config.e2e.ts +15 -0
  152. package/templates/nest-ddd/files/vitest.config.ts +16 -0
  153. package/templates/nest-ddd/template.json +8 -0
  154. package/templates/node-express/files/.env.example +28 -0
  155. package/templates/node-express/files/docker-compose.yml +52 -0
  156. package/templates/node-express/files/package-lock.json +11880 -0
  157. package/templates/node-express/files/package.json +43 -0
  158. package/templates/node-express/files/server.js +13 -0
  159. package/templates/node-express/files/src/app.js +72 -0
  160. package/templates/node-express/files/src/auth/authUtils.js +116 -0
  161. package/templates/node-express/files/src/auth/checkAuth.js +61 -0
  162. package/templates/node-express/files/src/bucket_pattern/comment.model.js +27 -0
  163. package/templates/node-express/files/src/bucket_pattern/comment.service.js +50 -0
  164. package/templates/node-express/files/src/config/config.aws-s3.js +28 -0
  165. package/templates/node-express/files/src/config/config.cloudinary.js +13 -0
  166. package/templates/node-express/files/src/config/config.mongodb.js +25 -0
  167. package/templates/node-express/files/src/config/config.multer.js +25 -0
  168. package/templates/node-express/files/src/config/config.nodemailer.js +16 -0
  169. package/templates/node-express/files/src/controllers/access.controller.js +49 -0
  170. package/templates/node-express/files/src/controllers/cart.controller.js +38 -0
  171. package/templates/node-express/files/src/controllers/checkout.controller.js +15 -0
  172. package/templates/node-express/files/src/controllers/comment.controller.js +29 -0
  173. package/templates/node-express/files/src/controllers/discount.controller.js +68 -0
  174. package/templates/node-express/files/src/controllers/email.controller.js +16 -0
  175. package/templates/node-express/files/src/controllers/inventory.controller.js +15 -0
  176. package/templates/node-express/files/src/controllers/notification.controller.js +15 -0
  177. package/templates/node-express/files/src/controllers/product.controller.js +175 -0
  178. package/templates/node-express/files/src/controllers/profile.controller.js +65 -0
  179. package/templates/node-express/files/src/controllers/rbac.controller.js +41 -0
  180. package/templates/node-express/files/src/controllers/template.controller.js +20 -0
  181. package/templates/node-express/files/src/controllers/upload.controller.js +56 -0
  182. package/templates/node-express/files/src/controllers/user.controller.js +36 -0
  183. package/templates/node-express/files/src/core/error.response.js +84 -0
  184. package/templates/node-express/files/src/core/success.response.js +44 -0
  185. package/templates/node-express/files/src/database/init.mongodb.level0.js +16 -0
  186. package/templates/node-express/files/src/database/init.mongodb.level1.js +36 -0
  187. package/templates/node-express/files/src/database/init.redis.js +119 -0
  188. package/templates/node-express/files/src/helpers/asyncHandler.js +7 -0
  189. package/templates/node-express/files/src/helpers/check.connect.js +29 -0
  190. package/templates/node-express/files/src/keys/private_key.pem +28 -0
  191. package/templates/node-express/files/src/keys/public_key.pem +9 -0
  192. package/templates/node-express/files/src/logger/discord.log.js +26 -0
  193. package/templates/node-express/files/src/logger/discord.log.v2.js +56 -0
  194. package/templates/node-express/files/src/logger/mylogger.log.js +130 -0
  195. package/templates/node-express/files/src/logger/winston.log.js +27 -0
  196. package/templates/node-express/files/src/middlewares/index.js +21 -0
  197. package/templates/node-express/files/src/middlewares/rbac.js +37 -0
  198. package/templates/node-express/files/src/middlewares/role.middleware.js +12 -0
  199. package/templates/node-express/files/src/models/KeyToken.model.js +37 -0
  200. package/templates/node-express/files/src/models/apiKey.model.js +31 -0
  201. package/templates/node-express/files/src/models/cart.model.js +47 -0
  202. package/templates/node-express/files/src/models/comment.model.js +43 -0
  203. package/templates/node-express/files/src/models/discount.model.js +92 -0
  204. package/templates/node-express/files/src/models/inventory.model.js +42 -0
  205. package/templates/node-express/files/src/models/notification.model.js +52 -0
  206. package/templates/node-express/files/src/models/order.model.js +68 -0
  207. package/templates/node-express/files/src/models/otp.model.js +32 -0
  208. package/templates/node-express/files/src/models/product.model.js +144 -0
  209. package/templates/node-express/files/src/models/repository/cart.repo.js +71 -0
  210. package/templates/node-express/files/src/models/repository/discount.repo.js +63 -0
  211. package/templates/node-express/files/src/models/repository/inventory.repo.js +45 -0
  212. package/templates/node-express/files/src/models/repository/product.repo.js +145 -0
  213. package/templates/node-express/files/src/models/repository/shop.repo.js +18 -0
  214. package/templates/node-express/files/src/models/repository/spu.repo.js +18 -0
  215. package/templates/node-express/files/src/models/repository/user.repo.js +20 -0
  216. package/templates/node-express/files/src/models/resource.model.js +32 -0
  217. package/templates/node-express/files/src/models/role.model.js +57 -0
  218. package/templates/node-express/files/src/models/shop.model.js +43 -0
  219. package/templates/node-express/files/src/models/sku.model.js +81 -0
  220. package/templates/node-express/files/src/models/spu.model.js +101 -0
  221. package/templates/node-express/files/src/models/template.model.js +25 -0
  222. package/templates/node-express/files/src/models/user.model.js +82 -0
  223. package/templates/node-express/files/src/postman/access.post.http +22 -0
  224. package/templates/node-express/files/src/routes/access/index.route.js +21 -0
  225. package/templates/node-express/files/src/routes/cart/index.route.js +20 -0
  226. package/templates/node-express/files/src/routes/checkout/index.route.js +10 -0
  227. package/templates/node-express/files/src/routes/comment/index.route.js +16 -0
  228. package/templates/node-express/files/src/routes/discount/index.route.js +26 -0
  229. package/templates/node-express/files/src/routes/index.route.js +27 -0
  230. package/templates/node-express/files/src/routes/inventory/index.route.js +11 -0
  231. package/templates/node-express/files/src/routes/notification/index.route.js +14 -0
  232. package/templates/node-express/files/src/routes/product/index.route.js +38 -0
  233. package/templates/node-express/files/src/routes/profile/index.route.js +15 -0
  234. package/templates/node-express/files/src/routes/rbac/index.route.js +21 -0
  235. package/templates/node-express/files/src/routes/template/index.route.js +11 -0
  236. package/templates/node-express/files/src/routes/upload/index.route.js +28 -0
  237. package/templates/node-express/files/src/routes/user/index.route.js +13 -0
  238. package/templates/node-express/files/src/services/access.service.js +257 -0
  239. package/templates/node-express/files/src/services/apiKey.service.js +15 -0
  240. package/templates/node-express/files/src/services/cart.service.js +115 -0
  241. package/templates/node-express/files/src/services/checkout.service.js +218 -0
  242. package/templates/node-express/files/src/services/comment.service.js +185 -0
  243. package/templates/node-express/files/src/services/discount.service.js +282 -0
  244. package/templates/node-express/files/src/services/email.service.js +71 -0
  245. package/templates/node-express/files/src/services/inventory.service.js +35 -0
  246. package/templates/node-express/files/src/services/keyToken.service.js +77 -0
  247. package/templates/node-express/files/src/services/notification.service.js +58 -0
  248. package/templates/node-express/files/src/services/otp.service.js +36 -0
  249. package/templates/node-express/files/src/services/product.service.js +228 -0
  250. package/templates/node-express/files/src/services/rbac.service.js +143 -0
  251. package/templates/node-express/files/src/services/redis.service.js +57 -0
  252. package/templates/node-express/files/src/services/redisPubSub.service.js +72 -0
  253. package/templates/node-express/files/src/services/shop.service.js +21 -0
  254. package/templates/node-express/files/src/services/sku.service.js +52 -0
  255. package/templates/node-express/files/src/services/spu.service.js +89 -0
  256. package/templates/node-express/files/src/services/template.service.js +41 -0
  257. package/templates/node-express/files/src/services/upload.s3.service.js +55 -0
  258. package/templates/node-express/files/src/services/upload.service.js +74 -0
  259. package/templates/node-express/files/src/services/user.service.js +92 -0
  260. package/templates/node-express/files/src/temp/1734420604996-ci-cd.png +0 -0
  261. package/templates/node-express/files/src/temp/1734421222213-cover-fb.jpg +0 -0
  262. package/templates/node-express/files/src/temp/1734421222214-cover-fb-01.jpg +0 -0
  263. package/templates/node-express/files/src/temp/1734421293437-cover-fb-01.jpg +0 -0
  264. package/templates/node-express/files/src/temp/1734421293437-cover-fb.jpg +0 -0
  265. package/templates/node-express/files/src/tests/inventory.test.js +21 -0
  266. package/templates/node-express/files/src/tests/message_queue/kafka/consumer.js +23 -0
  267. package/templates/node-express/files/src/tests/message_queue/kafka/producer.js +21 -0
  268. package/templates/node-express/files/src/tests/message_queue/rabbitMQ/consumer.js +28 -0
  269. package/templates/node-express/files/src/tests/message_queue/rabbitMQ/ordered.consumer.js +26 -0
  270. package/templates/node-express/files/src/tests/message_queue/rabbitMQ/ordered.producer.js +31 -0
  271. package/templates/node-express/files/src/tests/message_queue/rabbitMQ/producer.js +26 -0
  272. package/templates/node-express/files/src/tests/message_queue/rabbitMQ/producerDLX.js +44 -0
  273. package/templates/node-express/files/src/tests/mysql/connect.js +59 -0
  274. package/templates/node-express/files/src/tests/product.test.js +14 -0
  275. package/templates/node-express/files/src/utils/index.js +78 -0
  276. package/templates/node-express/files/src/utils/reasonPhrases.js +344 -0
  277. package/templates/node-express/files/src/utils/statusCodes.js +344 -0
  278. package/templates/node-express/files/src/utils/template.html.js +38 -0
  279. package/templates/node-express/template.json +11 -0
  280. package/templates/react-fsd/files/index.html +13 -0
  281. package/templates/react-fsd/files/package.json +15 -0
  282. package/templates/react-fsd/files/public/favicon.svg +1 -0
  283. package/templates/react-fsd/files/public/icons.svg +24 -0
  284. package/templates/react-fsd/files/src/assets/hero.png +0 -0
  285. package/templates/react-fsd/files/src/assets/typescript.svg +1 -0
  286. package/templates/react-fsd/files/src/assets/vite.svg +1 -0
  287. package/templates/react-fsd/files/src/counter.ts +9 -0
  288. package/templates/react-fsd/files/src/main.ts +60 -0
  289. package/templates/react-fsd/files/src/style.css +296 -0
  290. package/templates/react-fsd/files/tsconfig.json +24 -0
  291. package/templates/react-fsd/template.json +11 -0
  292. package/templates/react-monolithic/files/index.html +13 -0
  293. package/templates/react-monolithic/files/package.json +15 -0
  294. package/templates/react-monolithic/files/public/favicon.svg +1 -0
  295. package/templates/react-monolithic/files/public/icons.svg +24 -0
  296. package/templates/react-monolithic/files/src/assets/hero.png +0 -0
  297. package/templates/react-monolithic/files/src/assets/typescript.svg +1 -0
  298. package/templates/react-monolithic/files/src/assets/vite.svg +1 -0
  299. package/templates/react-monolithic/files/src/counter.ts +9 -0
  300. package/templates/react-monolithic/files/src/main.ts +60 -0
  301. package/templates/react-monolithic/files/src/style.css +296 -0
  302. package/templates/react-monolithic/files/tsconfig.json +24 -0
  303. package/templates/react-monolithic/template.json +11 -0
  304. package/templates/vue-fsd/files/index.html +13 -0
  305. package/templates/vue-fsd/files/package.json +15 -0
  306. package/templates/vue-fsd/files/public/favicon.svg +1 -0
  307. package/templates/vue-fsd/files/public/icons.svg +24 -0
  308. package/templates/vue-fsd/files/src/assets/hero.png +0 -0
  309. package/templates/vue-fsd/files/src/assets/typescript.svg +1 -0
  310. package/templates/vue-fsd/files/src/assets/vite.svg +1 -0
  311. package/templates/vue-fsd/files/src/counter.ts +9 -0
  312. package/templates/vue-fsd/files/src/main.ts +60 -0
  313. package/templates/vue-fsd/files/src/style.css +296 -0
  314. package/templates/vue-fsd/files/tsconfig.json +24 -0
  315. package/templates/vue-fsd/template.json +11 -0
  316. package/templates/vue-monolithic/files/index.html +13 -0
  317. package/templates/vue-monolithic/files/package.json +15 -0
  318. package/templates/vue-monolithic/files/public/favicon.svg +1 -0
  319. package/templates/vue-monolithic/files/public/icons.svg +24 -0
  320. package/templates/vue-monolithic/files/src/assets/hero.png +0 -0
  321. package/templates/vue-monolithic/files/src/assets/typescript.svg +1 -0
  322. package/templates/vue-monolithic/files/src/assets/vite.svg +1 -0
  323. package/templates/vue-monolithic/files/src/counter.ts +9 -0
  324. package/templates/vue-monolithic/files/src/main.ts +60 -0
  325. package/templates/vue-monolithic/files/src/style.css +296 -0
  326. package/templates/vue-monolithic/files/tsconfig.json +24 -0
  327. package/templates/vue-monolithic/template.json +11 -0
@@ -0,0 +1,68 @@
1
+ const { SuccessResponse } = require("../core/success.response");
2
+ const DiscountService = require("../services/discount.service");
3
+
4
+ class DiscountController {
5
+ createDiscount = async (req, res, next) => {
6
+ new SuccessResponse({
7
+ message: "Success",
8
+ metadata: await DiscountService.createDiscountCode({
9
+ ...req.body,
10
+ shop_id: req.user.userId,
11
+ }),
12
+ }).send(res);
13
+ };
14
+
15
+ updateDiscount = async (req, res, next) => {
16
+ new SuccessResponse({
17
+ message: "Success",
18
+ metadata: await DiscountService.updateDiscountCode(req.body),
19
+ }).send(res);
20
+ };
21
+
22
+ getAllDiscountCodeByShop = async (req, res, next) => {
23
+ new SuccessResponse({
24
+ message: "Success",
25
+ metadata: await DiscountService.getAllDiscountCodeByShop({
26
+ limit: req.query.limit || 50,
27
+ page: req.query.page || 1,
28
+ shop_id: req.user.userId,
29
+ }),
30
+ }).send(res);
31
+ };
32
+
33
+ getProductsByDiscount = async (req, res, next) => {
34
+ new SuccessResponse({
35
+ message: "Success",
36
+ metadata: await DiscountService.getProductsByDiscount({
37
+ limit: req.query.limit,
38
+ page: req.query.page,
39
+ shop_id: req.params.shopId,
40
+ code: req.params.code,
41
+ user_id: "",
42
+ }),
43
+ }).send(res);
44
+ };
45
+
46
+ getDiscountAmount = async (req, res, next) => {
47
+ new SuccessResponse({
48
+ message: "Success",
49
+ metadata: await DiscountService.getDiscountAmount(req.body),
50
+ }).send(res);
51
+ };
52
+
53
+ deleteDiscount = async (req, res, next) => {
54
+ new SuccessResponse({
55
+ message: "Success",
56
+ metadata: await DiscountService.deleteDiscount(req.body),
57
+ }).send(res);
58
+ };
59
+
60
+ cancelDiscount = async (req, res, next) => {
61
+ new SuccessResponse({
62
+ message: "Success",
63
+ metadata: await DiscountService.cancelDiscount(req.body),
64
+ });
65
+ };
66
+ }
67
+
68
+ module.exports = new DiscountController();
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ const EmailService = require("../services/email.service");
4
+ const { SuccessResponse } = require("../core/success.response");
5
+
6
+ class EmailController {
7
+ static async sendEmail(req, res, next) {
8
+ const { email } = req.body;
9
+ new SuccessResponse({
10
+ message: "Email sent successfully",
11
+ metadata: await EmailService.sendEmail({ email }),
12
+ }).send(res);
13
+ }
14
+ }
15
+
16
+ module.exports = EmailController;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ const { SuccessResponse } = require("../core/success.response");
4
+ const InventoryService = require("../services/inventory.service");
5
+
6
+ class InventoryController {
7
+ async addStockToInventory(req, res, next) {
8
+ new SuccessResponse({
9
+ message: "Success",
10
+ metadata: await InventoryService.addStockToInventory(req.body),
11
+ }).send(res);
12
+ }
13
+ }
14
+
15
+ module.exports = new InventoryController();
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ const { SuccessResponse } = require("../core/success.response");
4
+ const NotificationService = require("../services/notification.service");
5
+
6
+ class NotificationController {
7
+ async getListNotiByUser(req, res, next) {
8
+ new SuccessResponse({
9
+ message: "Success",
10
+ metadata: await NotificationService.listNotiByUser(req.body),
11
+ }).send(res);
12
+ }
13
+ }
14
+
15
+ module.exports = new NotificationController();
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+
3
+ const { SuccessResponse } = require("../core/success.response");
4
+ const ProductService = require("../services/product.service.js");
5
+ const SPUService = require("../services/spu.service");
6
+ const SKUService = require("../services/sku.service");
7
+ const { BadRequestError } = require("../core/error.response");
8
+ class ProductController {
9
+ /** SPU, SKU */
10
+ /*
11
+ {
12
+ spu_name: "string",
13
+ spu_description: "string",
14
+ spu_images: ["string"],
15
+ spu_category: "string",
16
+ spu_price: 1000,
17
+ spu_shop: "string",
18
+ spu_category: [number],
19
+ spu_attributes: [
20
+ {
21
+ "attribute_id": "string",
22
+ "attribute_values": ["string"]
23
+ }
24
+ ],
25
+ spu_variations: [
26
+ {
27
+ "images": ["string"],
28
+ "name": "string",
29
+ "options": ["string"]
30
+ },
31
+ {
32
+ "images": ["string"],
33
+ "name": "string",
34
+ "options": ["string"]
35
+ }
36
+ ],
37
+ sku_list: [
38
+ {
39
+ "sku_id": "string",
40
+ "sku_name": "string",
41
+ "sku_price": 1000,
42
+ "sku_tier_index": [number, number],
43
+ "sku_shop": "string",
44
+ }
45
+ ]
46
+ }
47
+ */
48
+ createNewSpu = async (req, res, next) => {
49
+ new SuccessResponse({
50
+ message: "Created a new spu successfully",
51
+ metadata: await SPUService.createNewSpu(req.body),
52
+ }).send(res);
53
+ };
54
+
55
+ getDetailSpu = async (req, res, next) => {
56
+ const { spu_id } = req.query;
57
+ if (!spu_id) {
58
+ throw BadRequestError("Missing query params");
59
+ }
60
+ new SuccessResponse({
61
+ message: "Get detail spu successfully",
62
+ metadata: await SPUService.getDetailSpu({ spu_id }),
63
+ }).send(res);
64
+ };
65
+
66
+ getListSkuBySpuId = async (req, res, next) => {
67
+ const { spu_id } = req.query;
68
+ if (!spu_id) {
69
+ throw BadRequestError("Missing query params");
70
+ }
71
+ new SuccessResponse({
72
+ message: "Get list sku by spu id successfully",
73
+ metadata: await SKUService.getListSkuBySpuId({ spu_id }),
74
+ }).send(res);
75
+ };
76
+
77
+ getDetailSku = async (req, res, next) => {
78
+ const { sku_id, spu_id } = req.query;
79
+ if (!sku_id || !spu_id) {
80
+ throw BadRequestError("Missing query params");
81
+ }
82
+ new SuccessResponse({
83
+ message: "Get detail sku successfully",
84
+ metadata: await SKUService.getDetailSku({ sku_id, spu_id }),
85
+ }).send(res);
86
+ };
87
+
88
+ /** END SPU, SKU */
89
+
90
+ createNewProduct = async (req, res, next) => {
91
+ new SuccessResponse({
92
+ message: "Created a new product successfully",
93
+ metadata: await ProductService.createProduct(req.body.product_type, {
94
+ ...req.body,
95
+ product_shop: req.user.userId,
96
+ }),
97
+ }).send(res);
98
+ };
99
+
100
+ getAllDraftProducts = async (req, res, next) => {
101
+ new SuccessResponse({
102
+ message: "Success",
103
+ metadata: await ProductService.findAllDraftProducts({
104
+ product_shop: req.user.userId,
105
+ }),
106
+ }).send(res);
107
+ };
108
+
109
+ getAllPulishedProducts = async (req, res, next) => {
110
+ new SuccessResponse({
111
+ message: "Success",
112
+ metadata: await ProductService.findAllPublishedProducts({
113
+ product_shop: req.user.userId,
114
+ }),
115
+ }).send(res);
116
+ };
117
+
118
+ publishProduct = async (req, res, next) => {
119
+ new SuccessResponse({
120
+ message: "Success",
121
+ metadata: await ProductService.publishProductByShop({
122
+ product_shop: req.user.userId,
123
+ product_id: req.params.id,
124
+ }),
125
+ }).send(res);
126
+ };
127
+
128
+ unpublishProduct = async (req, res, next) => {
129
+ new SuccessResponse({
130
+ message: "Success",
131
+ metadata: await ProductService.unpublishProductByShop({
132
+ product_shop: req.user.userId,
133
+ product_id: req.params.id,
134
+ }),
135
+ }).send(res);
136
+ };
137
+
138
+ searchProductsByUser = async (req, res, next) => {
139
+ new SuccessResponse({
140
+ message: "Success",
141
+ metadata: await ProductService.searchProducts({
142
+ keySearch: req.params.keySearch,
143
+ }),
144
+ }).send(res);
145
+ };
146
+
147
+ findAllProducts = async (req, res, next) => {
148
+ new SuccessResponse({
149
+ message: "Success",
150
+ metadata: await ProductService.findAllProducts(req.query),
151
+ }).send(res);
152
+ };
153
+
154
+ findDetailProduct = async (req, res, next) => {
155
+ new SuccessResponse({
156
+ message: "Success",
157
+ metadata: await ProductService.findDetailProduct({
158
+ product_id: req.params.id,
159
+ }),
160
+ }).send(res);
161
+ };
162
+
163
+ updateProductById = async (req, res, next) => {
164
+ new SuccessResponse({
165
+ message: "Success",
166
+ metadata: await ProductService.updateProduct({
167
+ product_type: req.body.product_type,
168
+ product_id: req.params.id,
169
+ bodyUpdate: req.body.bodyUpdate,
170
+ }),
171
+ }).send(res);
172
+ };
173
+ }
174
+
175
+ module.exports = new ProductController();
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+
3
+ const { SuccessResponse } = require("../core/success.response");
4
+
5
+ const dataProfiles = [
6
+ {
7
+ user_id: 1,
8
+ user_name: "CR7",
9
+ user_avatar:
10
+ "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png",
11
+ user_email: "cr7@gmail.com",
12
+ user_phone: "0987654321",
13
+ user_address: "123 Main St, Anytown, USA",
14
+ user_role: "admin",
15
+ },
16
+ {
17
+ user_id: 2,
18
+ user_name: "Messi",
19
+ user_avatar:
20
+ "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png",
21
+ user_email: "messi@gmail.com",
22
+ user_phone: "0987654321",
23
+ user_address: "123 Main St, Anytown, USA",
24
+ user_role: "admin",
25
+ },
26
+ {
27
+ user_id: 3,
28
+ user_name: "Ronaldo",
29
+ user_avatar:
30
+ "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png",
31
+ user_email: "ronaldo@gmail.com",
32
+ user_phone: "0987654321",
33
+ user_address: "123 Main St, Anytown, USA",
34
+ user_role: "admin",
35
+ },
36
+ ];
37
+
38
+ class ProfileController {
39
+ // admin
40
+ profiles = async (req, res, next) => {
41
+ new SuccessResponse({
42
+ message: "Success",
43
+ metadata: dataProfiles,
44
+ }).send(res);
45
+ };
46
+
47
+ // shop
48
+ profile = async (req, res, next) => {
49
+ new SuccessResponse({
50
+ message: "Success",
51
+ metadata: {
52
+ user_id: 2,
53
+ user_name: "Messi",
54
+ user_avatar:
55
+ "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png",
56
+ user_email: "messi@gmail.com",
57
+ user_phone: "0987654321",
58
+ user_address: "123 Main St, Anytown, USA",
59
+ user_role: "admin",
60
+ },
61
+ }).send(res);
62
+ };
63
+ }
64
+
65
+ module.exports = new ProfileController();
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ const { CREATED, SuccessResponse } = require("../core/success.response");
4
+ const {
5
+ createRole,
6
+ createResource,
7
+ resourceList,
8
+ roleList,
9
+ } = require("../services/rbac.service");
10
+
11
+ class AccessController {
12
+ createNewRole = async (req, res, next) => {
13
+ new CREATED({
14
+ message: "Successfully created new role",
15
+ metadata: await createRole(req.body),
16
+ }).send(res);
17
+ };
18
+
19
+ createNewResource = async (req, res, next) => {
20
+ new CREATED({
21
+ message: "Successfully created new resource",
22
+ metadata: await createResource(req.body),
23
+ }).send(res);
24
+ };
25
+
26
+ getResourceList = async (req, res, next) => {
27
+ new SuccessResponse({
28
+ message: "Successfully fetched resource list",
29
+ metadata: await resourceList(req.body),
30
+ }).send(res);
31
+ };
32
+
33
+ getRoleList = async (req, res, next) => {
34
+ new SuccessResponse({
35
+ message: "Successfully fetched role list",
36
+ metadata: await roleList(req.body),
37
+ }).send(res);
38
+ };
39
+ }
40
+
41
+ module.exports = new AccessController();
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ const TemplateService = require("../services/template.service");
4
+ const { SuccessResponse } = require("../core/success.response");
5
+
6
+ class TemplateController {
7
+ static async createTemplate(req, res, next) {
8
+ const { template_id, template_name, template_html } = req.body;
9
+ new SuccessResponse({
10
+ message: "Template created successfully",
11
+ metadata: await TemplateService.createTemplate({
12
+ template_name,
13
+ template_html,
14
+ template_id,
15
+ }),
16
+ }).send(res);
17
+ }
18
+ }
19
+
20
+ module.exports = new TemplateController();
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+
3
+ const { BadRequestError } = require("../core/error.response");
4
+ const { SuccessResponse } = require("../core/success.response");
5
+ const UploadAwsService = require("../services/upload.s3.service");
6
+ const UploadService = require("../services/upload.service");
7
+
8
+ class UploadController {
9
+ async uploadImgFromUrl(req, res, next) {
10
+ new SuccessResponse({
11
+ message: "Success",
12
+ metadata: await UploadService.uploadImageFromUrl(req.body),
13
+ }).send(res);
14
+ }
15
+
16
+ async uploadImgFromLocal(req, res, next) {
17
+ const { file } = req;
18
+ if (!file) {
19
+ throw new BadRequestError("Error uploading image from local");
20
+ }
21
+ new SuccessResponse({
22
+ message: "Success",
23
+ metadata: await UploadService.uploadImageFromLocal({
24
+ path: file.path,
25
+ }),
26
+ }).send(res);
27
+ }
28
+
29
+ async uploadImagesFromLocal(req, res, next) {
30
+ const { files } = req;
31
+ if (!files) {
32
+ throw new BadRequestError("Error uploading image from local");
33
+ }
34
+ new SuccessResponse({
35
+ message: "Success",
36
+ metadata: await UploadService.uploadImagesFromLocal({
37
+ files,
38
+ }),
39
+ }).send(res);
40
+ }
41
+
42
+ async uploadImgFromLocalS3(req, res, next) {
43
+ const { file } = req;
44
+ if (!file) {
45
+ throw new BadRequestError("Error uploading image from local");
46
+ }
47
+ new SuccessResponse({
48
+ message: "Success",
49
+ metadata: await UploadAwsService.uploadImageFromLocalS3({
50
+ file,
51
+ }),
52
+ }).send(res);
53
+ }
54
+ }
55
+
56
+ module.exports = new UploadController();
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ const EmailService = require("../services/email.service");
4
+ const { SuccessResponse } = require("../core/success.response");
5
+ const { User } = require("../models/user.model");
6
+ const { BadRequestError } = require("../core/error.response");
7
+
8
+ class UserController {
9
+ // new User
10
+ async newUser(req, res, next) {
11
+ const { email } = req.body;
12
+ const user = await User.findOne({ email }).lean().exec();
13
+ if (user) {
14
+ throw new BadRequestError("Email already registered");
15
+ }
16
+ new SuccessResponse({
17
+ message: "User created successfully",
18
+ metadata: await EmailService.sendEmail({ email }),
19
+ }).send(res);
20
+ }
21
+ // check user token via email
22
+ async checkRegisterEmailToken(req, res, next) {
23
+ const { email, token } = req.query;
24
+
25
+ if (!email || !token) {
26
+ throw new BadRequestError("Invalid email or token");
27
+ }
28
+
29
+ new SuccessResponse({
30
+ message: "Verify email successfully",
31
+ metadata: await UserService.checkRegisterEmailToken({ email, token }),
32
+ }).send(res);
33
+ }
34
+ }
35
+
36
+ module.exports = new UserController();
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ const myloggerLog = require("../logger/mylogger.log.js");
3
+ const logger = require("../logger/winston.log.js");
4
+ const reasonPhrases = require("../utils/reasonPhrases.js");
5
+ const statusCodes = require("../utils/statusCodes.js");
6
+
7
+ class ErrorResponse extends Error {
8
+ constructor(message, status) {
9
+ super(message);
10
+ this.status = status;
11
+
12
+ // TODO: log error use winston
13
+ // logger.error(`[${this.status}] - ${this.message}`);
14
+ myloggerLog.error(`[${this.status}] - ${this.message}`, {
15
+ context: "/path",
16
+ requestId: "ID_REQUEST",
17
+ message: this.message,
18
+ status: this.status,
19
+ metadata: {},
20
+ });
21
+ }
22
+ }
23
+
24
+ class ConflictRequestError extends ErrorResponse {
25
+ constructor(
26
+ message = reasonPhrases.CONFLICT,
27
+ statusCode = statusCodes.CONFLICT
28
+ ) {
29
+ super(message, statusCode);
30
+ }
31
+ }
32
+
33
+ class BadRequestError extends ErrorResponse {
34
+ constructor(
35
+ message = reasonPhrases.BAD_REQUEST,
36
+ statusCode = statusCodes.BAD_REQUEST
37
+ ) {
38
+ super(message, statusCode);
39
+ }
40
+ }
41
+
42
+ class AuthFailureError extends ErrorResponse {
43
+ constructor(
44
+ message = reasonPhrases.UNAUTHORIZED,
45
+ statusCode = statusCodes.UNAUTHORIZED
46
+ ) {
47
+ super(message, statusCode);
48
+ }
49
+ }
50
+
51
+ class NotFoundError extends ErrorResponse {
52
+ constructor(
53
+ message = reasonPhrases.NOT_FOUND,
54
+ statusCode = statusCodes.NOT_FOUND
55
+ ) {
56
+ super(message, statusCode);
57
+ }
58
+ }
59
+
60
+ class ForbiddenError extends ErrorResponse {
61
+ constructor(
62
+ message = reasonPhrases.FORBIDDEN,
63
+ statusCode = statusCodes.FORBIDDEN
64
+ ) {
65
+ super(message, statusCode);
66
+ }
67
+ }
68
+
69
+ class RedisConnectionError extends ErrorResponse {
70
+ constructor(
71
+ message = reasonPhrases.INTERNAL_SERVER_ERROR,
72
+ statusCode = statusCodes.INTERNAL_SERVER_ERROR
73
+ ) {
74
+ super(message, statusCode);
75
+ }
76
+ }
77
+
78
+ module.exports = {
79
+ ConflictRequestError,
80
+ BadRequestError,
81
+ AuthFailureError,
82
+ NotFoundError,
83
+ ForbiddenError,
84
+ };
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ const reasonPhrases = require("../utils/reasonPhrases.js");
3
+ const statusCodes = require("../utils/statusCodes.js");
4
+
5
+ class SuccessResponse {
6
+ constructor({
7
+ message,
8
+ statusCode = statusCodes.OK,
9
+ reasonPhrase = reasonPhrases.OK,
10
+ metadata = {},
11
+ }) {
12
+ this.message = message ? message : reasonPhrase;
13
+ this.statusCode = statusCode;
14
+ this.reasonPhrase = reasonPhrase;
15
+ this.metadata = metadata;
16
+ }
17
+
18
+ send(res, headers = {}) {
19
+ return res.status(this.statusCode).json(this);
20
+ }
21
+ }
22
+
23
+ class OK extends SuccessResponse {
24
+ constructor({ message, metadata = {} }) {
25
+ super({ message, metadata });
26
+ }
27
+ }
28
+
29
+ class CREATED extends SuccessResponse {
30
+ constructor({
31
+ message,
32
+ statusCode = statusCodes.CREATED,
33
+ reasonPhrase = reasonPhrases.CREATED,
34
+ metadata = {},
35
+ }) {
36
+ super({ message, reasonPhrase, statusCode, metadata });
37
+ }
38
+ }
39
+
40
+ module.exports = {
41
+ OK,
42
+ CREATED,
43
+ SuccessResponse
44
+ };
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+
3
+ const mongoose = require("mongoose");
4
+ const dotenv = require("dotenv");
5
+ dotenv.config();
6
+
7
+ const connectDB = async () => {
8
+ try {
9
+ const conn = await mongoose.connect(process.env.MONGO_URI);
10
+ console.log(`MongoDB connected success: ${conn.connection.host}`);
11
+ } catch (error) {
12
+ console.log("Error connect to mongo db");
13
+ }
14
+ };
15
+
16
+ module.exports = connectDB;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ const mongoose = require("mongoose");
4
+ const dotenv = require("dotenv");
5
+ const { countConnect } = require("../helpers/check.connect");
6
+ dotenv.config();
7
+
8
+ class Database {
9
+ constructor() {
10
+ this.connect();
11
+ }
12
+
13
+ async connect(type = "mongodb") {
14
+ try {
15
+ if (1 === 1) {
16
+ mongoose.set("debug", true);
17
+ mongoose.set("debug", { color: true });
18
+ }
19
+ const conn = await mongoose.connect(process.env.MONGO_URI);
20
+ console.log(`MongoDB connected success: ${conn.connection.host}`);
21
+ countConnect();
22
+ } catch (error) {
23
+ console.log("Error connect to mongo db");
24
+ }
25
+ }
26
+
27
+ static getInstance() {
28
+ if (!Database.instance) {
29
+ Database.instance = new Database();
30
+ }
31
+ return Database.instance;
32
+ }
33
+ }
34
+
35
+ const instanceMongodb = Database.getInstance();
36
+ module.exports = instanceMongodb;