@paralect/hive 0.1.50-alpha.2 → 0.1.50

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 (291) hide show
  1. package/.claude/settings.local.json +13 -0
  2. package/cli/helpers/execCommand.js +10 -10
  3. package/cli/helpers/isProjectInit.js +3 -3
  4. package/cli/helpers/mergeDirs.js +1 -1
  5. package/cli/hive.js +105 -105
  6. package/{test-app → framework}/.cursor/commands/add-service.md +6 -6
  7. package/{test-app → framework}/.cursor/skills/hive-overview/SKILL.md +1 -1
  8. package/{test-app → framework}/.cursor/skills/hive-service/SKILL.md +2 -2
  9. package/framework/bin/start.sh +2 -0
  10. package/{.hive/bootstrap-hive.js → framework/bootstrap-hive.ts} +4 -4
  11. package/{.hive → framework}/package-lock.json +212 -156
  12. package/framework/package.json +42 -0
  13. package/{.hive/src/app.js → framework/src/app.ts} +1 -1
  14. package/{.hive/src/bullMqBus.js → framework/src/bullMqBus.ts} +1 -1
  15. package/{.hive/src/bullMqWrapper.js → framework/src/bullMqWrapper.ts} +1 -1
  16. package/{.hive/src/app-config/index.js → framework/src/config/index.ts} +7 -7
  17. package/{.hive/src/db.js → framework/src/db.ts} +21 -6
  18. package/framework/src/endpoint.ts +132 -0
  19. package/framework/src/helpers/generateDbTypes.ts +47 -0
  20. package/{.hive/src/helpers/getMiddlewares.js → framework/src/helpers/getMiddlewares.ts} +1 -1
  21. package/{.hive/src/helpers/getResourceEndpoints.js → framework/src/helpers/getResourceEndpoints.ts} +8 -8
  22. package/{.hive/src/helpers/getResources.js → framework/src/helpers/getResources.ts} +1 -1
  23. package/{.hive/src/helpers/getSchemas.js → framework/src/helpers/getSchemas.ts} +13 -13
  24. package/framework/src/index.ts +3 -0
  25. package/{.hive/src/ioEmitter.js → framework/src/ioEmitter.ts} +1 -1
  26. package/{.hive/src/lib/node-mongo/src/mongo-query-service.js → framework/src/lib/node-mongo/src/mongo-query-service.ts} +18 -7
  27. package/{.hive/src/lib/node-mongo/src/mongo-service.js → framework/src/lib/node-mongo/src/mongo-service.ts} +17 -9
  28. package/{starter/src/logger.js → framework/src/logger.ts} +4 -3
  29. package/{.hive/src/migrations/migrations-log/migration-log.schema.js → framework/src/migrations/migrations-log/migration-log.schema.ts} +1 -1
  30. package/{.hive/src/migrations/migrations-log/migration-log.service.js → framework/src/migrations/migrations-log/migration-log.service.ts} +1 -1
  31. package/{.hive/src/migrations/migrations.schema.js → framework/src/migrations/migrations.schema.ts} +1 -1
  32. package/{.hive/src/resources/_dev/endpoints/triggerSchedulerHandler.js → framework/src/resources/_dev/endpoints/triggerSchedulerHandler.ts} +2 -1
  33. package/framework/src/resources/health/endpoints/get.ts +14 -0
  34. package/{.hive/src/resources/schemaMappings/schemaMappings.schema.js → framework/src/resources/schemaMappings/schemaMappings.schema.ts} +1 -1
  35. package/{.hive/src/routes/index.js → framework/src/routes/index.ts} +23 -27
  36. package/framework/src/schema.ts +3 -0
  37. package/{.hive/src/services/emailService.js → framework/src/services/emailService.ts} +1 -1
  38. package/{.hive/src/socketIo.js → framework/src/socketIo.ts} +1 -1
  39. package/{.hive → framework}/tsconfig.json +17 -13
  40. package/package.json +43 -51
  41. package/starter/hive/autoMap/schemaMappings.json +1 -0
  42. package/starter/hive/config/.env.example +11 -0
  43. package/starter/hive/config/app.ts +19 -0
  44. package/{.hive/src/services/setCookie.js → starter/hive/helpers/setCookie.ts} +1 -2
  45. package/starter/hive/middlewares/_global.ts +9 -0
  46. package/{.hive/src/middlewares/attachUser.js → starter/hive/middlewares/attachUser.ts} +2 -2
  47. package/{.hive/src/middlewares/shouldExist.js → starter/hive/middlewares/shouldExist.ts} +1 -1
  48. package/{.hive/src/middlewares/shouldNotExist.js → starter/hive/middlewares/shouldNotExist.ts} +1 -1
  49. package/starter/hive/resources/files/endpoints/upload.ts +25 -0
  50. package/starter/hive/resources/files/files.schema.ts +20 -0
  51. package/{.hive/src/resources/tokens/methods/storeToken.js → starter/hive/resources/tokens/methods/storeToken.ts} +3 -3
  52. package/{.hive/src/resources/tokens/tokens.schema.js → starter/hive/resources/tokens/tokens.schema.ts} +1 -2
  53. package/starter/hive/resources/users/endpoints/getCurrentUser.ts +12 -0
  54. package/starter/hive/resources/users/endpoints/getUserProfile.ts +17 -0
  55. package/{.hive/src/resources/users/users.schema.js → starter/hive/resources/users/users.schema.ts} +1 -2
  56. package/starter/hive/services/cloudStorage.ts +102 -0
  57. package/starter/package.json +9 -97
  58. package/starter/tsconfig.json +16 -20
  59. package/.cursor/commands/deslop.md +0 -12
  60. package/.hive/.cursor/commands/add-service.md +0 -188
  61. package/.hive/.cursor/skills/hive-overview/SKILL.md +0 -50
  62. package/.hive/.cursor/skills/hive-service/SKILL.md +0 -90
  63. package/.hive/bin/start.sh +0 -2
  64. package/.hive/package.json +0 -98
  65. package/.hive/src/logger.js +0 -43
  66. package/.hive/src/middlewares/global/tryToAttachUser.js +0 -33
  67. package/.hive/src/resources/health/endpoints/get.js +0 -19
  68. package/.hive/src/resources/tokens/methods/setToken.js +0 -8
  69. package/.hive/src/resources/users/endpoints/getCurrentUser.js +0 -14
  70. package/.hive/src/resources/users/endpoints/getUserProfile.js +0 -19
  71. package/.hive/src/resources/users/methods/ensureUserCreated.js +0 -68
  72. package/.hive/src/security.util.js +0 -38
  73. package/.hive/src/services/globalTest.js +0 -0
  74. package/cli/helpers/docker.js +0 -59
  75. package/cli/helpers/envCheck.js +0 -127
  76. package/cli/helpers/findPort.js +0 -32
  77. package/starter/.babelrc +0 -3
  78. package/starter/.cursor/commands/add-endpoint.md +0 -262
  79. package/starter/.cursor/commands/add-handler.md +0 -137
  80. package/starter/.cursor/commands/add-middleware.md +0 -95
  81. package/starter/.cursor/commands/add-resource.md +0 -71
  82. package/starter/.cursor/commands/add-scheduler.md +0 -138
  83. package/starter/.cursor/commands/add-service.md +0 -188
  84. package/starter/.cursor/skills/hive-auth/SKILL.md +0 -134
  85. package/starter/.cursor/skills/hive-database/SKILL.md +0 -103
  86. package/starter/.cursor/skills/hive-endpoint/SKILL.md +0 -103
  87. package/starter/.cursor/skills/hive-handler/SKILL.md +0 -88
  88. package/starter/.cursor/skills/hive-mapping/SKILL.md +0 -85
  89. package/starter/.cursor/skills/hive-middleware/SKILL.md +0 -104
  90. package/starter/.cursor/skills/hive-overview/SKILL.md +0 -50
  91. package/starter/.cursor/skills/hive-scheduler/SKILL.md +0 -94
  92. package/starter/.cursor/skills/hive-schema/SKILL.md +0 -73
  93. package/starter/.cursor/skills/hive-service/SKILL.md +0 -90
  94. package/starter/.dockerignore +0 -1
  95. package/starter/Dockerfile +0 -22
  96. package/starter/Dockerfile.dev +0 -33
  97. package/starter/Dockerfile.prod +0 -29
  98. package/starter/README.md +0 -11
  99. package/starter/bin/deploy.sh +0 -5
  100. package/starter/bin/start.sh +0 -2
  101. package/starter/bootstrap-hive.js +0 -118
  102. package/starter/deploy/api/Chart.yaml +0 -6
  103. package/starter/deploy/api/staging.yaml +0 -3
  104. package/starter/deploy/api/templates/deployment.yaml +0 -44
  105. package/starter/deploy/api/templates/ingress.yaml +0 -26
  106. package/starter/deploy/api/templates/service.yaml +0 -14
  107. package/starter/deploy/script/Dockerfile +0 -39
  108. package/starter/deploy/script/package-lock.json +0 -1499
  109. package/starter/deploy/script/package.json +0 -12
  110. package/starter/deploy/script/src/config.js +0 -48
  111. package/starter/deploy/script/src/index.js +0 -108
  112. package/starter/deploy/script/src/util.js +0 -19
  113. package/starter/initial-data.json +0 -176
  114. package/starter/loader.mjs +0 -40
  115. package/starter/package-lock.json +0 -13492
  116. package/starter/register.mjs +0 -6
  117. package/starter/ship_logo.png +0 -0
  118. package/starter/src/app-config/app.js +0 -3
  119. package/starter/src/app-config/assertEnv.js +0 -15
  120. package/starter/src/app-config/index.js +0 -65
  121. package/starter/src/app.js +0 -65
  122. package/starter/src/assets/emails/components/header.mjml +0 -13
  123. package/starter/src/assets/emails/dist/.gitkeep +0 -0
  124. package/starter/src/assets/emails/signup-welcome.mjml +0 -34
  125. package/starter/src/assets/emails/styles/index.mjml +0 -77
  126. package/starter/src/autoMap/addHandlers.js +0 -142
  127. package/starter/src/autoMap/getDependentFields.js +0 -37
  128. package/starter/src/autoMap/mapSchema.js +0 -99
  129. package/starter/src/autoMap/schemaMappings.js +0 -13
  130. package/starter/src/autoMap/schemaMappings.json +0 -3
  131. package/starter/src/bullMqBus.js +0 -21
  132. package/starter/src/bullMqWrapper.js +0 -23
  133. package/starter/src/db.js +0 -53
  134. package/starter/src/emails/MyEmailComponent.jsx +0 -14
  135. package/starter/src/emails/compiled/MyEmailComponent.js +0 -18
  136. package/starter/src/emails/compiled/compiled/MyEmailComponent.js +0 -18
  137. package/starter/src/helpers/db/ifUpdated.js +0 -22
  138. package/starter/src/helpers/esm.js +0 -56
  139. package/starter/src/helpers/getMiddlewares.js +0 -41
  140. package/starter/src/helpers/getResourceEndpoints.js +0 -31
  141. package/starter/src/helpers/getResources.js +0 -35
  142. package/starter/src/helpers/getSchemas.js +0 -53
  143. package/starter/src/helpers/importHandlers.js +0 -20
  144. package/starter/src/helpers/isZodArray.js +0 -13
  145. package/starter/src/helpers/prettierFormat.js +0 -8
  146. package/starter/src/helpers/schema/db.schema.js +0 -9
  147. package/starter/src/helpers/schema/pagination.schema.js +0 -14
  148. package/starter/src/ioEmitter.js +0 -9
  149. package/starter/src/jsconfig.json +0 -5
  150. package/starter/src/lib/node-mongo/.github/workflows/npm-publish.yml +0 -32
  151. package/starter/src/lib/node-mongo/API.md +0 -654
  152. package/starter/src/lib/node-mongo/CHANGELOG.md +0 -98
  153. package/starter/src/lib/node-mongo/README.md +0 -97
  154. package/starter/src/lib/node-mongo/package-lock.json +0 -3682
  155. package/starter/src/lib/node-mongo/package.json +0 -74
  156. package/starter/src/lib/node-mongo/src/index.js +0 -64
  157. package/starter/src/lib/node-mongo/src/mongo-query-service.js +0 -78
  158. package/starter/src/lib/node-mongo/src/mongo-service-error.js +0 -15
  159. package/starter/src/lib/node-mongo/src/mongo-service.js +0 -303
  160. package/starter/src/middlewares/attachUser.js +0 -41
  161. package/starter/src/middlewares/global/extractUserTokens.js +0 -15
  162. package/starter/src/middlewares/global/tryToAttachUser.js +0 -33
  163. package/starter/src/middlewares/isAuthorized.js +0 -18
  164. package/starter/src/middlewares/shouldExist.js +0 -37
  165. package/starter/src/middlewares/shouldNotExist.js +0 -19
  166. package/starter/src/middlewares/uploadFile.js +0 -5
  167. package/starter/src/middlewares/validate.js +0 -32
  168. package/starter/src/migrations/migration.js +0 -8
  169. package/starter/src/migrations/migration.service.js +0 -76
  170. package/starter/src/migrations/migrations/1.js +0 -22
  171. package/starter/src/migrations/migrations-log/migration-log.schema.js +0 -13
  172. package/starter/src/migrations/migrations-log/migration-log.service.js +0 -50
  173. package/starter/src/migrations/migrations.schema.js +0 -6
  174. package/starter/src/migrations/migrator.js +0 -75
  175. package/starter/src/migrator.js +0 -3
  176. package/starter/src/resources/_dev/endpoints/triggerSchedulerHandler.js +0 -32
  177. package/starter/src/resources/health/endpoints/get.js +0 -19
  178. package/starter/src/resources/schemaMappings/schemaMappings.schema.js +0 -6
  179. package/starter/src/resources/tokens/methods/generateSecureToken.js +0 -9
  180. package/starter/src/resources/tokens/methods/setToken.js +0 -8
  181. package/starter/src/resources/tokens/methods/storeToken.js +0 -35
  182. package/starter/src/resources/tokens/tokens.schema.js +0 -11
  183. package/starter/src/resources/users/endpoints/getCurrentUser.js +0 -14
  184. package/starter/src/resources/users/endpoints/getUserProfile.js +0 -19
  185. package/starter/src/resources/users/handlers/test.js +0 -1
  186. package/starter/src/resources/users/methods/ensureUserCreated.js +0 -68
  187. package/starter/src/resources/users/users.schema.js +0 -16
  188. package/starter/src/routes/index.js +0 -172
  189. package/starter/src/routes/middlewares/attachCustomErrors.js +0 -28
  190. package/starter/src/routes/middlewares/routeErrorHandler.js +0 -27
  191. package/starter/src/scheduler.js +0 -35
  192. package/starter/src/security.util.js +0 -38
  193. package/starter/src/services/emailService.js +0 -15
  194. package/starter/src/services/globalTest.js +0 -0
  195. package/starter/src/services/setCookie.js +0 -21
  196. package/starter/src/socketIo.js +0 -99
  197. package/test-app/.cursor/commands/add-endpoint.md +0 -262
  198. package/test-app/.cursor/commands/add-handler.md +0 -137
  199. package/test-app/.cursor/commands/add-middleware.md +0 -95
  200. package/test-app/.cursor/commands/add-resource.md +0 -71
  201. package/test-app/.cursor/commands/add-scheduler.md +0 -138
  202. package/test-app/.cursor/skills/hive-auth/SKILL.md +0 -134
  203. package/test-app/.cursor/skills/hive-database/SKILL.md +0 -103
  204. package/test-app/.cursor/skills/hive-endpoint/SKILL.md +0 -103
  205. package/test-app/.cursor/skills/hive-handler/SKILL.md +0 -88
  206. package/test-app/.cursor/skills/hive-mapping/SKILL.md +0 -85
  207. package/test-app/.cursor/skills/hive-middleware/SKILL.md +0 -104
  208. package/test-app/.cursor/skills/hive-scheduler/SKILL.md +0 -94
  209. package/test-app/.cursor/skills/hive-schema/SKILL.md +0 -73
  210. package/test-app/package-lock.json +0 -462
  211. package/test-app/package.json +0 -21
  212. /package/{.hive → framework}/.babelrc +0 -0
  213. /package/{.hive → framework}/.cursor/commands/add-endpoint.md +0 -0
  214. /package/{.hive → framework}/.cursor/commands/add-handler.md +0 -0
  215. /package/{.hive → framework}/.cursor/commands/add-middleware.md +0 -0
  216. /package/{.hive → framework}/.cursor/commands/add-resource.md +0 -0
  217. /package/{.hive → framework}/.cursor/commands/add-scheduler.md +0 -0
  218. /package/{.hive → framework}/.cursor/skills/hive-auth/SKILL.md +0 -0
  219. /package/{.hive → framework}/.cursor/skills/hive-database/SKILL.md +0 -0
  220. /package/{.hive → framework}/.cursor/skills/hive-endpoint/SKILL.md +0 -0
  221. /package/{.hive → framework}/.cursor/skills/hive-handler/SKILL.md +0 -0
  222. /package/{.hive → framework}/.cursor/skills/hive-mapping/SKILL.md +0 -0
  223. /package/{.hive → framework}/.cursor/skills/hive-middleware/SKILL.md +0 -0
  224. /package/{.hive → framework}/.cursor/skills/hive-scheduler/SKILL.md +0 -0
  225. /package/{.hive → framework}/.cursor/skills/hive-schema/SKILL.md +0 -0
  226. /package/{.hive → framework}/.dockerignore +0 -0
  227. /package/{.hive → framework}/Dockerfile +0 -0
  228. /package/{.hive → framework}/Dockerfile.dev +0 -0
  229. /package/{.hive → framework}/Dockerfile.prod +0 -0
  230. /package/{.hive → framework}/README.md +0 -0
  231. /package/{.hive → framework}/bin/deploy.sh +0 -0
  232. /package/{.hive → framework}/deploy/api/Chart.yaml +0 -0
  233. /package/{.hive → framework}/deploy/api/staging.yaml +0 -0
  234. /package/{.hive → framework}/deploy/api/templates/deployment.yaml +0 -0
  235. /package/{.hive → framework}/deploy/api/templates/ingress.yaml +0 -0
  236. /package/{.hive → framework}/deploy/api/templates/service.yaml +0 -0
  237. /package/{.hive → framework}/deploy/script/Dockerfile +0 -0
  238. /package/{.hive → framework}/deploy/script/package-lock.json +0 -0
  239. /package/{.hive → framework}/deploy/script/package.json +0 -0
  240. /package/{.hive/deploy/script/src/config.js → framework/deploy/script/src/config.ts} +0 -0
  241. /package/{.hive/deploy/script/src/index.js → framework/deploy/script/src/index.ts} +0 -0
  242. /package/{.hive/deploy/script/src/util.js → framework/deploy/script/src/util.ts} +0 -0
  243. /package/{.hive → framework}/initial-data.json +0 -0
  244. /package/{.hive → framework}/ship_logo.png +0 -0
  245. /package/{.hive → framework}/src/assets/emails/components/header.mjml +0 -0
  246. /package/{.hive → framework}/src/assets/emails/dist/.gitkeep +0 -0
  247. /package/{.hive → framework}/src/assets/emails/signup-welcome.mjml +0 -0
  248. /package/{.hive → framework}/src/assets/emails/styles/index.mjml +0 -0
  249. /package/{.hive/src/autoMap/addHandlers.js → framework/src/autoMap/addHandlers.ts} +0 -0
  250. /package/{.hive/src/autoMap/getDependentFields.js → framework/src/autoMap/getDependentFields.ts} +0 -0
  251. /package/{.hive/src/autoMap/mapSchema.js → framework/src/autoMap/mapSchema.ts} +0 -0
  252. /package/{.hive → framework}/src/autoMap/schemaMappings.json +0 -0
  253. /package/{.hive/src/autoMap/schemaMappings.js → framework/src/autoMap/schemaMappings.ts} +0 -0
  254. /package/{.hive/src/helpers/schema/db.schema.js → framework/src/common/schema/db.schema.ts} +0 -0
  255. /package/{.hive/src/helpers/schema/pagination.schema.js → framework/src/common/schema/pagination.schema.ts} +0 -0
  256. /package/{.hive/src/app-config/app.js → framework/src/config/app.ts} +0 -0
  257. /package/{.hive/src/app-config/assertEnv.js → framework/src/config/assertEnv.ts} +0 -0
  258. /package/{.hive/src/emails/MyEmailComponent.jsx → framework/src/emails/MyEmailComponent.tsx} +0 -0
  259. /package/{.hive/src/emails/compiled/MyEmailComponent.js → framework/src/emails/compiled/MyEmailComponent.ts} +0 -0
  260. /package/{.hive/src/emails/compiled/compiled/MyEmailComponent.js → framework/src/emails/compiled/compiled/MyEmailComponent.ts} +0 -0
  261. /package/{.hive/src/helpers/db/ifUpdated.js → framework/src/helpers/db/ifUpdated.ts} +0 -0
  262. /package/{.hive/src/helpers/importHandlers.js → framework/src/helpers/importHandlers.ts} +0 -0
  263. /package/{.hive/src/helpers/isZodArray.js → framework/src/helpers/isZodArray.ts} +0 -0
  264. /package/{.hive/src/helpers/prettierFormat.js → framework/src/helpers/prettierFormat.ts} +0 -0
  265. /package/{.hive → framework}/src/jsconfig.json +0 -0
  266. /package/{.hive → framework}/src/lib/node-mongo/.github/workflows/npm-publish.yml +0 -0
  267. /package/{.hive → framework}/src/lib/node-mongo/API.md +0 -0
  268. /package/{.hive → framework}/src/lib/node-mongo/CHANGELOG.md +0 -0
  269. /package/{.hive → framework}/src/lib/node-mongo/README.md +0 -0
  270. /package/{.hive → framework}/src/lib/node-mongo/package-lock.json +0 -0
  271. /package/{.hive → framework}/src/lib/node-mongo/package.json +0 -0
  272. /package/{.hive/src/lib/node-mongo/src/index.js → framework/src/lib/node-mongo/src/index.ts} +0 -0
  273. /package/{.hive/src/lib/node-mongo/src/mongo-service-error.js → framework/src/lib/node-mongo/src/mongo-service-error.ts} +0 -0
  274. /package/{.hive/src/middlewares/allowNoAuth.js → framework/src/middlewares/allowNoAuth.ts} +0 -0
  275. /package/{.hive/src/middlewares/global/extractUserTokens.js → framework/src/middlewares/global/extractUserTokens.ts} +0 -0
  276. /package/{.hive/src/middlewares/validate.js → framework/src/middlewares/validate.ts} +0 -0
  277. /package/{.hive/src/migrations/migration.service.js → framework/src/migrations/migration.service.ts} +0 -0
  278. /package/{.hive/src/migrations/migration.js → framework/src/migrations/migration.ts} +0 -0
  279. /package/{.hive/src/migrations/migrations/1.js → framework/src/migrations/migrations/1.ts} +0 -0
  280. /package/{.hive/src/migrations/migrator.js → framework/src/migrations/migrator.ts} +0 -0
  281. /package/{.hive/src/migrator.js → framework/src/migrator.ts} +0 -0
  282. /package/{.hive/src/routes/middlewares/attachCustomErrors.js → framework/src/routes/middlewares/attachCustomErrors.ts} +0 -0
  283. /package/{.hive/src/routes/middlewares/routeErrorHandler.js → framework/src/routes/middlewares/routeErrorHandler.ts} +0 -0
  284. /package/{.hive/src/scheduler/handlers/sendDailyReport.example.js → framework/src/scheduler/handlers/sendDailyReport.example.ts} +0 -0
  285. /package/{.hive/src/scheduler.js → framework/src/scheduler.ts} +0 -0
  286. /package/starter/{src/middlewares/allowNoAuth.js → hive/middlewares/allowNoAuth.ts} +0 -0
  287. /package/{.hive/src/middlewares/isAuthorized.js → starter/hive/middlewares/isAuthorized.ts} +0 -0
  288. /package/{.hive/src/middlewares/uploadFile.js → starter/hive/middlewares/uploadFile.ts} +0 -0
  289. /package/{.hive/src/resources/tokens/methods/generateSecureToken.js → starter/hive/resources/tokens/methods/generateSecureToken.ts} +0 -0
  290. /package/{.hive/src/resources/users/handlers/test.js → starter/hive/resources/users/handlers/test.ts} +0 -0
  291. /package/starter/{src/scheduler/handlers/sendDailyReport.example.js → hive/scheduler/handlers/dailyExample.ts} +0 -0
@@ -1,137 +0,0 @@
1
- # Add Handler
2
-
3
- Creates a new event handler that reacts to database changes.
4
-
5
- ## Command Format
6
-
7
- ```
8
- add-handler {resource}
9
- ```
10
-
11
- **Examples:**
12
- - `add-handler tasks`
13
- - `add-handler invoices`
14
- - `add-handler messages`
15
-
16
- ## Location
17
-
18
- `src/resources/{resource}/handlers/{handlerName}.js`
19
-
20
- ## Events
21
-
22
- | Event | Payload | Trigger |
23
- |-------|---------|---------|
24
- | `created` | `{ doc }` | After `service.create()` |
25
- | `updated` | `{ doc, prevDoc }` | After `service.updateOne/Many()` |
26
- | `removed` | `{ doc }` | After `service.remove()` |
27
-
28
- ## Template
29
-
30
- ```javascript
31
- import db from 'db';
32
- import ifUpdated from 'helpers/db/ifUpdated';
33
- // import ioEmitter from 'ioEmitter';
34
-
35
- const {resource}Service = db.services.{resource};
36
-
37
- {resource}Service.on('created', async ({ doc }) => {
38
- });
39
-
40
- {resource}Service.on('updated', ifUpdated(['field'], async ({ doc, prevDoc }) => {
41
- }));
42
-
43
- {resource}Service.on('removed', async ({ doc }) => {
44
- });
45
-
46
- /*
47
- {resource}Service.on('created', async ({ doc }) => {
48
- ioEmitter.to(`room-${doc._id}`).emit('{resource}:created', { doc });
49
- });
50
- */
51
- ```
52
-
53
- ## Examples
54
-
55
- ### React to specific field changes
56
-
57
- ```javascript
58
- import db from 'db';
59
- import ifUpdated from 'helpers/db/ifUpdated';
60
-
61
- const tasksService = db.services.tasks;
62
-
63
- tasksService.on('updated', ifUpdated(['status'], async ({ doc, prevDoc }) => {
64
- // Only runs when status changed
65
- }));
66
- ```
67
-
68
- ### Emit socket event
69
-
70
- ```javascript
71
- import db from 'db';
72
- import ioEmitter from 'ioEmitter';
73
-
74
- const messagesService = db.services.messages;
75
-
76
- messagesService.on('created', async ({ doc: message }) => {
77
- ioEmitter.to(`project-${message.project._id}`).emit('message:created', {
78
- message,
79
- });
80
- });
81
- ```
82
-
83
- ### Add related record
84
-
85
- ```javascript
86
- import db from 'db';
87
-
88
- const tasksService = db.services.tasks;
89
- const notificationsService = db.services.notifications;
90
-
91
- tasksService.on('created', async ({ doc }) => {
92
- if (!doc.assignee?._id) return;
93
-
94
- await notificationsService.create({
95
- user: doc.assignee,
96
- type: 'task.assigned',
97
- data: { task: doc },
98
- });
99
- });
100
- ```
101
-
102
- ### Cleanup on delete
103
-
104
- ```javascript
105
- import db from 'db';
106
-
107
- const invoicesService = db.services.invoices;
108
- const paymentsService = db.services.payments;
109
-
110
- invoicesService.on('removed', async ({ doc }) => {
111
- await paymentsService.remove({ 'invoice._id': doc._id });
112
- });
113
- ```
114
-
115
- ### Bulk update (silent, no events)
116
-
117
- ```javascript
118
- import db from 'db';
119
- import ifUpdated from 'helpers/db/ifUpdated';
120
-
121
- const usersService = db.services.users;
122
- const tasksService = db.services.tasks;
123
-
124
- usersService.on('updated', ifUpdated(['fullName', 'avatarUrl'], async ({ doc }) => {
125
- await tasksService.atomic.update(
126
- { 'assignee._id': doc._id },
127
- { $set: { 'assignee.fullName': doc.fullName, 'assignee.avatarUrl': doc.avatarUrl } },
128
- { multi: true }
129
- );
130
- }));
131
- ```
132
-
133
- ## Tips
134
-
135
- - Use `ifUpdated` helper to react only when specific fields change
136
- - Use `atomic.update` for bulk updates (no events triggered)
137
- - Keep handlers fast — don't block the response
@@ -1,95 +0,0 @@
1
- # Add Middleware
2
-
3
- Creates a new middleware for endpoints.
4
-
5
- ## Command Format
6
-
7
- ```
8
- add-middleware {name}
9
- ```
10
-
11
- **Examples:**
12
- - `add-middleware isAdmin`
13
- - `add-middleware canEditProject`
14
- - `add-middleware rateLimit`
15
-
16
- ## Location
17
-
18
- `src/middlewares/{name}.js`
19
-
20
- ## Template (simple)
21
-
22
- ```javascript
23
- export default async (ctx, next) => {
24
- // Middleware logic here
25
-
26
- return next();
27
- };
28
- ```
29
-
30
- ## Template (with parameters)
31
-
32
- ```javascript
33
- export default (param) => async (ctx, next) => {
34
- // Use param here
35
-
36
- return next();
37
- };
38
- ```
39
-
40
- ## Examples
41
-
42
- ### Access control
43
-
44
- ```javascript
45
- export default async (ctx, next) => {
46
- if (!ctx.state.user?.isAdmin) {
47
- ctx.throw(403, 'Admin access required');
48
- }
49
-
50
- return next();
51
- };
52
- ```
53
-
54
- ### With parameters
55
-
56
- ```javascript
57
- import db from 'db';
58
-
59
- export default (resource, getId = (ctx) => ctx.params.id) => async (ctx, next) => {
60
- const id = getId(ctx);
61
- const doc = await db.services[resource].findOne({ _id: id });
62
-
63
- if (!doc) {
64
- ctx.throw(404, `${resource} not found`);
65
- }
66
-
67
- ctx.state[resource] = doc;
68
- return next();
69
- };
70
- ```
71
-
72
- ### With runOrder (lower runs first)
73
-
74
- ```javascript
75
- const middleware = async (ctx, next) => {
76
- ctx.state.isSkipAuth = true;
77
- return next();
78
- };
79
-
80
- middleware.runOrder = -1;
81
-
82
- export default middleware;
83
- ```
84
-
85
- ## Usage in endpoints
86
-
87
- ```javascript
88
- // Import and use directly
89
- import isAdmin from 'middlewares/isAdmin';
90
- export const middlewares = [isAdmin];
91
-
92
- // With parameters
93
- import canEdit from 'middlewares/canEdit';
94
- export const middlewares = [canEdit('projects', (ctx) => ctx.params.projectId)];
95
- ```
@@ -1,71 +0,0 @@
1
- # Add Resource
2
-
3
- Creates a complete resource with schema and folder structure.
4
-
5
- ## Steps
6
-
7
- 1. Create folder: `src/resources/{name}/`
8
- 2. Create schema file: `src/resources/{name}/{name}.schema.js`
9
- 3. Create folders: `endpoints/`, `handlers/`, `methods/`
10
- 4. Create first endpoint: `src/resources/{name}/endpoints/list.js`
11
-
12
- ## Schema Template
13
-
14
- **File:** `src/resources/{name}/{name}.schema.js`
15
-
16
- ```javascript
17
- import { z } from 'zod';
18
- import dbSchema from 'helpers/schema/db.schema.js';
19
-
20
- const schema = dbSchema.extend({
21
- // Add fields here
22
- title: z.coerce.string().nullable().optional(),
23
- });
24
-
25
- export default schema;
26
-
27
- export const secureFields = [];
28
- ```
29
-
30
- ## First Endpoint Template
31
-
32
- **File:** `src/resources/{name}/endpoints/list.js`
33
-
34
- ```javascript
35
- import { z } from 'zod';
36
- import db from 'db';
37
-
38
- const {name}Service = db.services.{name};
39
-
40
- export const middlewares = [];
41
-
42
- export const requestSchema = z.object({
43
- page: z.coerce.number().default(1),
44
- perPage: z.coerce.number().default(20),
45
- });
46
-
47
- export const handler = async (ctx) => {
48
- const { page, perPage } = ctx.validatedData;
49
-
50
- return {name}Service.find(
51
- {},
52
- { page, perPage, sort: '-createdOn' }
53
- );
54
- };
55
-
56
- export const endpoint = {
57
- url: '/',
58
- method: 'get',
59
- };
60
- ```
61
-
62
- ## Result
63
-
64
- ```
65
- src/resources/{name}/
66
- ├── {name}.schema.js
67
- ├── endpoints/
68
- │ └── list.js
69
- ├── handlers/
70
- └── methods/
71
- ```
@@ -1,138 +0,0 @@
1
- # Add Scheduler
2
-
3
- Creates a new scheduled background job.
4
-
5
- ## Command Format
6
-
7
- ```
8
- add-scheduler {name} [{schedule}]
9
- ```
10
-
11
- **Examples:**
12
- - `add-scheduler syncExternalData every 5 minutes`
13
- - `add-scheduler sendDailyReport daily at 9am`
14
- - `add-scheduler markOverdueInvoices every day at midnight`
15
- - `add-scheduler weeklyCleanup every monday at 3am`
16
-
17
- ## Schedule to Cron
18
-
19
- Translate natural language to cron:
20
-
21
- | User says | Cron |
22
- |-----------|------|
23
- | every minute | `* * * * *` |
24
- | every 5 minutes | `*/5 * * * *` |
25
- | every hour | `0 * * * *` |
26
- | every 6 hours | `0 */6 * * *` |
27
- | daily at midnight | `0 0 * * *` |
28
- | daily at 9am | `0 9 * * *` |
29
- | every monday at 9am | `0 9 * * 1` |
30
- | first of month | `0 0 1 * *` |
31
-
32
- ## Location
33
-
34
- `src/scheduler/handlers/{name}.js`
35
-
36
- ## Template
37
-
38
- ```javascript
39
- import db from 'db';
40
-
41
- export const handler = async () => {
42
- // Job logic here
43
- };
44
-
45
- export const cron = '0 * * * *'; // Every hour
46
- ```
47
-
48
- ## Examples
49
-
50
- ### Sync external data
51
-
52
- ```javascript
53
- import db from 'db';
54
- import moment from 'moment';
55
- import externalApi from 'services/externalApi';
56
-
57
- const itemsService = db.services.items;
58
-
59
- export const handler = async () => {
60
- const items = await externalApi.list({
61
- updatedSince: moment().subtract(5, 'minutes').toDate(),
62
- });
63
-
64
- for (const item of items) {
65
- await itemsService.updateOne(
66
- { externalId: item.id },
67
- (doc) => ({ ...doc, ...item })
68
- );
69
- }
70
- };
71
-
72
- export const cron = '*/5 * * * *';
73
- ```
74
-
75
- ### Send daily report
76
-
77
- ```javascript
78
- import db from 'db';
79
- import slack from 'services/slack';
80
-
81
- const tasksService = db.services.tasks;
82
-
83
- export const handler = async () => {
84
- const { count: completed } = await tasksService.find({ status: 'completed' });
85
- const { count: pending } = await tasksService.find({ status: 'pending' });
86
-
87
- await slack.sendChannelMessage({
88
- channel: '#reports',
89
- text: `Daily report: ${completed} completed, ${pending} pending`,
90
- });
91
- };
92
-
93
- export const cron = '0 9 * * *';
94
- ```
95
-
96
- ### Mark overdue invoices
97
-
98
- ```javascript
99
- import db from 'db';
100
-
101
- const invoicesService = db.services.invoices;
102
-
103
- export const handler = async () => {
104
- await invoicesService.updateMany(
105
- {
106
- isPaid: { $ne: true },
107
- isOverdue: { $ne: true },
108
- dueOn: { $lt: new Date() },
109
- },
110
- (doc) => ({ ...doc, isOverdue: true })
111
- );
112
- };
113
-
114
- export const cron = '0 0 * * *';
115
- ```
116
-
117
- ### Cleanup old records
118
-
119
- ```javascript
120
- import db from 'db';
121
- import moment from 'moment';
122
-
123
- const logsService = db.services.logs;
124
-
125
- export const handler = async () => {
126
- await logsService.remove({
127
- createdOn: { $lt: moment().subtract(30, 'days').toDate() },
128
- });
129
- };
130
-
131
- export const cron = '0 3 * * *';
132
- ```
133
-
134
- ## Tips
135
-
136
- - Keep jobs idempotent (safe to re-run)
137
- - Log progress for debugging
138
- - Use `atomic.update` for bulk operations
@@ -1,188 +0,0 @@
1
- # Add Service
2
-
3
- Creates a new service for external APIs or utilities.
4
-
5
- ## Command Format
6
-
7
- ```
8
- add-service {name} [{methods}]
9
- ```
10
-
11
- **Examples:**
12
- - `add-service slack sendChannelMessage, replyToThread`
13
- - `add-service stripe createCustomer, createPaymentIntent, listInvoices`
14
- - `add-service openai chat, generateImage`
15
- - `add-service sendgrid sendEmail, sendTemplateEmail`
16
-
17
- ## Location
18
-
19
- `src/services/{name}.js`
20
-
21
- ## Known Services & Libraries
22
-
23
- When creating a service, use these go-to libraries:
24
-
25
- | Service | Library | Install |
26
- |---------|---------|---------|
27
- | Slack | `@slack/web-api` | `npm i @slack/web-api` |
28
- | Stripe | `stripe` | `npm i stripe` |
29
- | OpenAI | `openai` | `npm i openai` |
30
- | SendGrid | `@sendgrid/mail` | `npm i @sendgrid/mail` |
31
- | Twilio | `twilio` | `npm i twilio` |
32
- | AWS S3 | `@aws-sdk/client-s3` | `npm i @aws-sdk/client-s3` |
33
- | Resend | `resend` | `npm i resend` |
34
- | Postmark | `postmark` | `npm i postmark` |
35
-
36
- ## Template
37
-
38
- ```javascript
39
- import config from 'app-config';
40
-
41
- // Initialize client here
42
-
43
- export default {
44
- client,
45
-
46
- // Methods here
47
- };
48
- ```
49
-
50
- ## Full Examples
51
-
52
- ### `add-service slack sendChannelMessage, replyToThread`
53
-
54
- ```javascript
55
- import config from 'app-config';
56
- import { WebClient } from '@slack/web-api';
57
-
58
- const client = new WebClient(config.slack.botToken);
59
-
60
- export default {
61
- client,
62
-
63
- sendChannelMessage: async ({ channel, text, blocks }) => {
64
- return client.chat.postMessage({ channel, text, blocks });
65
- },
66
-
67
- replyToThread: async ({ channel, threadTs, text }) => {
68
- return client.chat.postMessage({ channel, text, thread_ts: threadTs });
69
- },
70
- };
71
- ```
72
-
73
- ### `add-service stripe createCustomer, createPaymentIntent, listInvoices`
74
-
75
- ```javascript
76
- import config from 'app-config';
77
- import Stripe from 'stripe';
78
-
79
- const client = new Stripe(config.stripe.secretKey);
80
-
81
- export default {
82
- client,
83
-
84
- createCustomer: async ({ email, name, metadata }) => {
85
- return client.customers.create({ email, name, metadata });
86
- },
87
-
88
- createPaymentIntent: async ({ amount, currency, customerId }) => {
89
- return client.paymentIntents.create({
90
- amount,
91
- currency,
92
- customer: customerId,
93
- });
94
- },
95
-
96
- listInvoices: async ({ customerId, limit = 10 }) => {
97
- return client.invoices.list({ customer: customerId, limit });
98
- },
99
- };
100
- ```
101
-
102
- ### `add-service openai chat, generateImage`
103
-
104
- ```javascript
105
- import config from 'app-config';
106
- import OpenAI from 'openai';
107
-
108
- const client = new OpenAI({ apiKey: config.openai.apiKey });
109
-
110
- export default {
111
- client,
112
-
113
- chat: async ({ messages, model = 'gpt-4' }) => {
114
- const response = await client.chat.completions.create({ model, messages });
115
- return response.choices[0].message;
116
- },
117
-
118
- generateImage: async ({ prompt, size = '1024x1024' }) => {
119
- const response = await client.images.generate({ prompt, size, n: 1 });
120
- return response.data[0].url;
121
- },
122
- };
123
- ```
124
-
125
- ### `add-service sendgrid sendEmail, sendTemplateEmail`
126
-
127
- ```javascript
128
- import config from 'app-config';
129
- import sgMail from '@sendgrid/mail';
130
-
131
- sgMail.setApiKey(config.sendgrid.apiKey);
132
-
133
- export default {
134
- sendEmail: async ({ to, from, subject, html }) => {
135
- return sgMail.send({ to, from, subject, html });
136
- },
137
-
138
- sendTemplateEmail: async ({ to, from, templateId, dynamicTemplateData }) => {
139
- return sgMail.send({ to, from, templateId, dynamicTemplateData });
140
- },
141
- };
142
- ```
143
-
144
- ### `add-service s3 upload, getSignedUrl, delete`
145
-
146
- ```javascript
147
- import config from 'app-config';
148
- import { S3Client, PutObjectCommand, GetObjectCommand, DeleteObjectCommand } from '@aws-sdk/client-s3';
149
- import { getSignedUrl } from '@aws-sdk/s3-request-presigner';
150
-
151
- const client = new S3Client({
152
- region: config.aws.region,
153
- credentials: {
154
- accessKeyId: config.aws.accessKeyId,
155
- secretAccessKey: config.aws.secretAccessKey,
156
- },
157
- });
158
-
159
- export default {
160
- client,
161
-
162
- upload: async ({ bucket, key, body, contentType }) => {
163
- const command = new PutObjectCommand({ Bucket: bucket, Key: key, Body: body, ContentType: contentType });
164
- return client.send(command);
165
- },
166
-
167
- getSignedUrl: async ({ bucket, key, expiresIn = 3600 }) => {
168
- const command = new GetObjectCommand({ Bucket: bucket, Key: key });
169
- return getSignedUrl(client, command, { expiresIn });
170
- },
171
-
172
- delete: async ({ bucket, key }) => {
173
- const command = new DeleteObjectCommand({ Bucket: bucket, Key: key });
174
- return client.send(command);
175
- },
176
- };
177
- ```
178
-
179
- ## Usage
180
-
181
- ```javascript
182
- import slack from 'services/slack';
183
- import stripe from 'services/stripe';
184
-
185
- await slack.sendChannelMessage({ channel: '#general', text: 'Hello' });
186
-
187
- const customer = await stripe.createCustomer({ email: 'user@example.com' });
188
- ```