@kelpie/server 0.12.0 → 0.14.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 (420) hide show
  1. package/dist/app.d.ts +13 -0
  2. package/dist/app.d.ts.map +1 -1
  3. package/dist/app.js +8 -1
  4. package/dist/app.js.map +1 -1
  5. package/dist/boot.d.ts +9 -0
  6. package/dist/boot.d.ts.map +1 -1
  7. package/dist/boot.js +12 -2
  8. package/dist/boot.js.map +1 -1
  9. package/dist/index.d.ts +6 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +3 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/lib/apiKeyScopes.d.ts.map +1 -1
  14. package/dist/lib/apiKeyScopes.js +6 -0
  15. package/dist/lib/apiKeyScopes.js.map +1 -1
  16. package/dist/lib/columns.d.ts +6 -0
  17. package/dist/lib/columns.d.ts.map +1 -1
  18. package/dist/lib/columns.js +5 -3
  19. package/dist/lib/columns.js.map +1 -1
  20. package/dist/lib/config.d.ts +17 -0
  21. package/dist/lib/config.d.ts.map +1 -1
  22. package/dist/lib/config.js +3 -0
  23. package/dist/lib/config.js.map +1 -1
  24. package/dist/lib/egress.d.ts.map +1 -1
  25. package/dist/lib/egress.js +8 -4
  26. package/dist/lib/egress.js.map +1 -1
  27. package/dist/lib/errors.d.ts +3 -3
  28. package/dist/lib/errors.d.ts.map +1 -1
  29. package/dist/lib/errors.js +13 -5
  30. package/dist/lib/errors.js.map +1 -1
  31. package/dist/lib/ids.d.ts +11 -0
  32. package/dist/lib/ids.d.ts.map +1 -1
  33. package/dist/lib/ids.js +11 -0
  34. package/dist/lib/ids.js.map +1 -1
  35. package/dist/lib/jobs.d.ts +110 -0
  36. package/dist/lib/jobs.d.ts.map +1 -0
  37. package/dist/lib/jobs.js +5 -0
  38. package/dist/lib/jobs.js.map +1 -0
  39. package/dist/lib/kelpieConfigFile.d.ts +15 -1
  40. package/dist/lib/kelpieConfigFile.d.ts.map +1 -1
  41. package/dist/lib/kelpieConfigFile.js +33 -1
  42. package/dist/lib/kelpieConfigFile.js.map +1 -1
  43. package/dist/modules/agent-tasks/catalog.d.ts.map +1 -1
  44. package/dist/modules/agent-tasks/catalog.js +32 -1
  45. package/dist/modules/agent-tasks/catalog.js.map +1 -1
  46. package/dist/modules/agent-tasks/index.d.ts.map +1 -1
  47. package/dist/modules/agent-tasks/index.js +1 -0
  48. package/dist/modules/agent-tasks/index.js.map +1 -1
  49. package/dist/modules/agent-tasks/resolve.d.ts.map +1 -1
  50. package/dist/modules/agent-tasks/resolve.js +5 -0
  51. package/dist/modules/agent-tasks/resolve.js.map +1 -1
  52. package/dist/modules/agent-tasks/routes.d.ts +2 -0
  53. package/dist/modules/agent-tasks/routes.d.ts.map +1 -1
  54. package/dist/modules/attachedRecords.d.ts +22 -8
  55. package/dist/modules/attachedRecords.d.ts.map +1 -1
  56. package/dist/modules/attachedRecords.js +42 -5
  57. package/dist/modules/attachedRecords.js.map +1 -1
  58. package/dist/modules/auth/index.d.ts.map +1 -1
  59. package/dist/modules/auth/index.js +1 -0
  60. package/dist/modules/auth/index.js.map +1 -1
  61. package/dist/modules/auth/repository.d.ts +14 -0
  62. package/dist/modules/auth/repository.d.ts.map +1 -1
  63. package/dist/modules/auth/repository.js +20 -2
  64. package/dist/modules/auth/repository.js.map +1 -1
  65. package/dist/modules/auth/routes.d.ts.map +1 -1
  66. package/dist/modules/auth/routes.js +30 -0
  67. package/dist/modules/auth/routes.js.map +1 -1
  68. package/dist/modules/auth/service.d.ts +28 -0
  69. package/dist/modules/auth/service.d.ts.map +1 -1
  70. package/dist/modules/auth/service.js +72 -4
  71. package/dist/modules/auth/service.js.map +1 -1
  72. package/dist/modules/companies/repository.d.ts.map +1 -1
  73. package/dist/modules/companies/repository.js +1 -1
  74. package/dist/modules/companies/repository.js.map +1 -1
  75. package/dist/modules/companies/routes.d.ts +2 -4
  76. package/dist/modules/companies/routes.d.ts.map +1 -1
  77. package/dist/modules/companies/routes.js +6 -11
  78. package/dist/modules/companies/routes.js.map +1 -1
  79. package/dist/modules/companies/schema.d.ts +13 -28
  80. package/dist/modules/companies/schema.d.ts.map +1 -1
  81. package/dist/modules/companies/schema.js +2 -2
  82. package/dist/modules/companies/schema.js.map +1 -1
  83. package/dist/modules/companies/service.d.ts +2 -3
  84. package/dist/modules/companies/service.d.ts.map +1 -1
  85. package/dist/modules/companies/service.js +4 -7
  86. package/dist/modules/companies/service.js.map +1 -1
  87. package/dist/modules/core.d.ts.map +1 -1
  88. package/dist/modules/core.js +2 -0
  89. package/dist/modules/core.js.map +1 -1
  90. package/dist/modules/custom-fields/repository.d.ts.map +1 -1
  91. package/dist/modules/custom-fields/repository.js +2 -0
  92. package/dist/modules/custom-fields/repository.js.map +1 -1
  93. package/dist/modules/custom-fields/routes.d.ts +1 -0
  94. package/dist/modules/custom-fields/routes.d.ts.map +1 -1
  95. package/dist/modules/dashboard/index.d.ts.map +1 -1
  96. package/dist/modules/dashboard/index.js +1 -0
  97. package/dist/modules/dashboard/index.js.map +1 -1
  98. package/dist/modules/dashboard/repository.d.ts +13 -0
  99. package/dist/modules/dashboard/repository.d.ts.map +1 -1
  100. package/dist/modules/dashboard/repository.js +36 -0
  101. package/dist/modules/dashboard/repository.js.map +1 -1
  102. package/dist/modules/dashboard/routes.d.ts.map +1 -1
  103. package/dist/modules/dashboard/routes.js +13 -0
  104. package/dist/modules/dashboard/routes.js.map +1 -1
  105. package/dist/modules/dashboard/service.d.ts +11 -0
  106. package/dist/modules/dashboard/service.d.ts.map +1 -1
  107. package/dist/modules/dashboard/service.js +24 -1
  108. package/dist/modules/dashboard/service.js.map +1 -1
  109. package/dist/modules/decisions/repository.d.ts.map +1 -1
  110. package/dist/modules/decisions/repository.js +2 -0
  111. package/dist/modules/decisions/repository.js.map +1 -1
  112. package/dist/modules/decisions/routes.d.ts +2 -0
  113. package/dist/modules/decisions/routes.d.ts.map +1 -1
  114. package/dist/modules/events/attendances.d.ts +35 -0
  115. package/dist/modules/events/attendances.d.ts.map +1 -0
  116. package/dist/modules/events/attendances.js +157 -0
  117. package/dist/modules/events/attendances.js.map +1 -0
  118. package/dist/modules/events/catalog.d.ts +35 -0
  119. package/dist/modules/events/catalog.d.ts.map +1 -0
  120. package/dist/modules/events/catalog.js +11 -0
  121. package/dist/modules/events/catalog.js.map +1 -0
  122. package/dist/modules/events/index.d.ts +10 -0
  123. package/dist/modules/events/index.d.ts.map +1 -0
  124. package/dist/modules/events/index.js +47 -0
  125. package/dist/modules/events/index.js.map +1 -0
  126. package/dist/modules/events/repository.d.ts +67 -0
  127. package/dist/modules/events/repository.d.ts.map +1 -0
  128. package/dist/modules/events/repository.js +212 -0
  129. package/dist/modules/events/repository.js.map +1 -0
  130. package/dist/modules/events/routes.d.ts +136 -0
  131. package/dist/modules/events/routes.d.ts.map +1 -0
  132. package/dist/modules/events/routes.js +280 -0
  133. package/dist/modules/events/routes.js.map +1 -0
  134. package/dist/modules/events/schema.d.ts +626 -0
  135. package/dist/modules/events/schema.d.ts.map +1 -0
  136. package/dist/modules/events/schema.js +93 -0
  137. package/dist/modules/events/schema.js.map +1 -0
  138. package/dist/modules/events/service.d.ts +68 -0
  139. package/dist/modules/events/service.d.ts.map +1 -0
  140. package/dist/modules/events/service.js +262 -0
  141. package/dist/modules/events/service.js.map +1 -0
  142. package/dist/modules/events/tools.d.ts +8 -0
  143. package/dist/modules/events/tools.d.ts.map +1 -0
  144. package/dist/modules/events/tools.js +80 -0
  145. package/dist/modules/events/tools.js.map +1 -0
  146. package/dist/modules/forms/applySubmissionFields.d.ts.map +1 -1
  147. package/dist/modules/forms/applySubmissionFields.js +7 -5
  148. package/dist/modules/forms/applySubmissionFields.js.map +1 -1
  149. package/dist/modules/forms/fillAddresses.d.ts +4 -0
  150. package/dist/modules/forms/fillAddresses.d.ts.map +1 -0
  151. package/dist/modules/forms/fillAddresses.js +93 -0
  152. package/dist/modules/forms/fillAddresses.js.map +1 -0
  153. package/dist/modules/forms/repository.d.ts +2 -2
  154. package/dist/modules/forms/repository.d.ts.map +1 -1
  155. package/dist/modules/forms/repository.js.map +1 -1
  156. package/dist/modules/forms/routes.d.ts +2 -0
  157. package/dist/modules/forms/routes.d.ts.map +1 -1
  158. package/dist/modules/forms/routes.js +2 -2
  159. package/dist/modules/forms/routes.js.map +1 -1
  160. package/dist/modules/forms/schema.js +2 -2
  161. package/dist/modules/forms/schema.js.map +1 -1
  162. package/dist/modules/forms/service.js +2 -2
  163. package/dist/modules/forms/service.js.map +1 -1
  164. package/dist/modules/forms/submission.d.ts +1 -0
  165. package/dist/modules/forms/submission.d.ts.map +1 -1
  166. package/dist/modules/forms/submission.js +27 -4
  167. package/dist/modules/forms/submission.js.map +1 -1
  168. package/dist/modules/hiring/roles.d.ts.map +1 -1
  169. package/dist/modules/hiring/roles.js +2 -1
  170. package/dist/modules/hiring/roles.js.map +1 -1
  171. package/dist/modules/import-export/addresses.d.ts +22 -0
  172. package/dist/modules/import-export/addresses.d.ts.map +1 -0
  173. package/dist/modules/import-export/addresses.js +83 -0
  174. package/dist/modules/import-export/addresses.js.map +1 -0
  175. package/dist/modules/import-export/drafts.d.ts +3 -4
  176. package/dist/modules/import-export/drafts.d.ts.map +1 -1
  177. package/dist/modules/import-export/drafts.js +4 -5
  178. package/dist/modules/import-export/drafts.js.map +1 -1
  179. package/dist/modules/import-export/exportRows.d.ts.map +1 -1
  180. package/dist/modules/import-export/exportRows.js +3 -3
  181. package/dist/modules/import-export/exportRows.js.map +1 -1
  182. package/dist/modules/import-export/plan.d.ts.map +1 -1
  183. package/dist/modules/import-export/plan.js +17 -2
  184. package/dist/modules/import-export/plan.js.map +1 -1
  185. package/dist/modules/import-export/presets.d.ts.map +1 -1
  186. package/dist/modules/import-export/presets.js +52 -7
  187. package/dist/modules/import-export/presets.js.map +1 -1
  188. package/dist/modules/import-export/repository.d.ts +3 -4
  189. package/dist/modules/import-export/repository.d.ts.map +1 -1
  190. package/dist/modules/import-export/repository.js +2 -3
  191. package/dist/modules/import-export/repository.js.map +1 -1
  192. package/dist/modules/import-export/writes.d.ts.map +1 -1
  193. package/dist/modules/import-export/writes.js +8 -4
  194. package/dist/modules/import-export/writes.js.map +1 -1
  195. package/dist/modules/lists/routes.d.ts +4 -0
  196. package/dist/modules/lists/routes.d.ts.map +1 -1
  197. package/dist/modules/notes/routes.d.ts +2 -0
  198. package/dist/modules/notes/routes.d.ts.map +1 -1
  199. package/dist/modules/people/repository.d.ts.map +1 -1
  200. package/dist/modules/people/repository.js +1 -1
  201. package/dist/modules/people/repository.js.map +1 -1
  202. package/dist/modules/people/routes.d.ts +2 -2
  203. package/dist/modules/people/routes.js +6 -6
  204. package/dist/modules/people/routes.js.map +1 -1
  205. package/dist/modules/people/schema.d.ts +17 -14
  206. package/dist/modules/people/schema.d.ts.map +1 -1
  207. package/dist/modules/people/schema.js +6 -4
  208. package/dist/modules/people/schema.js.map +1 -1
  209. package/dist/modules/people/service.d.ts +2 -2
  210. package/dist/modules/people/service.d.ts.map +1 -1
  211. package/dist/modules/people/service.js +5 -4
  212. package/dist/modules/people/service.js.map +1 -1
  213. package/dist/modules/plans/repository.d.ts +2 -2
  214. package/dist/modules/plans/repository.d.ts.map +1 -1
  215. package/dist/modules/plans/routes.d.ts +1 -0
  216. package/dist/modules/plans/routes.d.ts.map +1 -1
  217. package/dist/modules/plans/routes.js +4 -4
  218. package/dist/modules/plans/routes.js.map +1 -1
  219. package/dist/modules/plans/schema.d.ts +2 -2
  220. package/dist/modules/plans/schema.d.ts.map +1 -1
  221. package/dist/modules/plans/schema.js +3 -3
  222. package/dist/modules/plans/schema.js.map +1 -1
  223. package/dist/modules/plans/service.d.ts +2 -2
  224. package/dist/modules/plans/service.d.ts.map +1 -1
  225. package/dist/modules/plans/service.js.map +1 -1
  226. package/dist/modules/plans/tools.js +2 -2
  227. package/dist/modules/plans/tools.js.map +1 -1
  228. package/dist/modules/recordTargets.d.ts.map +1 -1
  229. package/dist/modules/recordTargets.js +11 -0
  230. package/dist/modules/recordTargets.js.map +1 -1
  231. package/dist/modules/references.d.ts.map +1 -1
  232. package/dist/modules/references.js +2 -0
  233. package/dist/modules/references.js.map +1 -1
  234. package/dist/modules/sample-data/fixture.d.ts +26 -4
  235. package/dist/modules/sample-data/fixture.d.ts.map +1 -1
  236. package/dist/modules/sample-data/fixture.js +157 -23
  237. package/dist/modules/sample-data/fixture.js.map +1 -1
  238. package/dist/modules/sample-data/index.d.ts +5 -2
  239. package/dist/modules/sample-data/index.d.ts.map +1 -1
  240. package/dist/modules/sample-data/index.js +7 -2
  241. package/dist/modules/sample-data/index.js.map +1 -1
  242. package/dist/modules/sample-data/routes.d.ts.map +1 -1
  243. package/dist/modules/sample-data/routes.js +2 -0
  244. package/dist/modules/sample-data/routes.js.map +1 -1
  245. package/dist/modules/sample-data/service.d.ts +11 -3
  246. package/dist/modules/sample-data/service.d.ts.map +1 -1
  247. package/dist/modules/sample-data/service.js +452 -363
  248. package/dist/modules/sample-data/service.js.map +1 -1
  249. package/dist/modules/sample-data/tools.d.ts.map +1 -1
  250. package/dist/modules/sample-data/tools.js +4 -3
  251. package/dist/modules/sample-data/tools.js.map +1 -1
  252. package/dist/modules/search/index.d.ts +1 -1
  253. package/dist/modules/search/index.d.ts.map +1 -1
  254. package/dist/modules/search/index.js +2 -1
  255. package/dist/modules/search/index.js.map +1 -1
  256. package/dist/modules/search/repository.d.ts +1 -0
  257. package/dist/modules/search/repository.d.ts.map +1 -1
  258. package/dist/modules/search/repository.js +22 -0
  259. package/dist/modules/search/repository.js.map +1 -1
  260. package/dist/modules/search/service.d.ts +2 -2
  261. package/dist/modules/search/service.d.ts.map +1 -1
  262. package/dist/modules/search/service.js +4 -3
  263. package/dist/modules/search/service.js.map +1 -1
  264. package/dist/modules/smtp-email/index.d.ts +12 -4
  265. package/dist/modules/smtp-email/index.d.ts.map +1 -1
  266. package/dist/modules/smtp-email/index.js +25 -5
  267. package/dist/modules/smtp-email/index.js.map +1 -1
  268. package/dist/modules/workspace/repository.d.ts +2 -0
  269. package/dist/modules/workspace/repository.d.ts.map +1 -1
  270. package/dist/modules/workspace/repository.js +12 -0
  271. package/dist/modules/workspace/repository.js.map +1 -1
  272. package/dist/modules/workspace/routes.d.ts.map +1 -1
  273. package/dist/modules/workspace/routes.js +13 -0
  274. package/dist/modules/workspace/routes.js.map +1 -1
  275. package/dist/modules/workspace/service.d.ts +10 -0
  276. package/dist/modules/workspace/service.d.ts.map +1 -1
  277. package/dist/modules/workspace/service.js +34 -10
  278. package/dist/modules/workspace/service.js.map +1 -1
  279. package/dist/modules/workspace/starters.d.ts +17 -2
  280. package/dist/modules/workspace/starters.d.ts.map +1 -1
  281. package/dist/modules/workspace/starters.js +141 -14
  282. package/dist/modules/workspace/starters.js.map +1 -1
  283. package/dist/modules/workspace/workspaceAccessMiddleware.d.ts.map +1 -1
  284. package/dist/modules/workspace/workspaceAccessMiddleware.js +3 -4
  285. package/dist/modules/workspace/workspaceAccessMiddleware.js.map +1 -1
  286. package/dist/runtime/events.d.ts +1 -1
  287. package/dist/runtime/events.d.ts.map +1 -1
  288. package/dist/runtime/events.js +2 -0
  289. package/dist/runtime/events.js.map +1 -1
  290. package/dist/runtime/jobs.d.ts +63 -0
  291. package/dist/runtime/jobs.d.ts.map +1 -0
  292. package/dist/runtime/jobs.js +231 -0
  293. package/dist/runtime/jobs.js.map +1 -0
  294. package/dist/runtime/module.d.ts +20 -0
  295. package/dist/runtime/module.d.ts.map +1 -1
  296. package/dist/runtime/registry.d.ts +8 -0
  297. package/dist/runtime/registry.d.ts.map +1 -1
  298. package/dist/runtime/registry.js +117 -7
  299. package/dist/runtime/registry.js.map +1 -1
  300. package/dist/runtime/transaction.d.ts +19 -0
  301. package/dist/runtime/transaction.d.ts.map +1 -1
  302. package/dist/runtime/transaction.js +7 -0
  303. package/dist/runtime/transaction.js.map +1 -1
  304. package/dist/schema/index.d.ts +1 -0
  305. package/dist/schema/index.d.ts.map +1 -1
  306. package/dist/schema/index.js +1 -0
  307. package/dist/schema/index.js.map +1 -1
  308. package/dist/testing/app.d.ts +15 -0
  309. package/dist/testing/app.d.ts.map +1 -1
  310. package/dist/testing/app.js +7 -1
  311. package/dist/testing/app.js.map +1 -1
  312. package/dist/testing/client.d.ts.map +1 -1
  313. package/dist/testing/client.js +9 -1
  314. package/dist/testing/client.js.map +1 -1
  315. package/dist/testing/database.d.ts +7 -0
  316. package/dist/testing/database.d.ts.map +1 -1
  317. package/dist/testing/database.js +26 -2
  318. package/dist/testing/database.js.map +1 -1
  319. package/dist/testing/services.d.ts +7 -0
  320. package/dist/testing/services.d.ts.map +1 -1
  321. package/dist/testing/services.js +8 -1
  322. package/dist/testing/services.js.map +1 -1
  323. package/dist/worker.d.ts +15 -0
  324. package/dist/worker.d.ts.map +1 -0
  325. package/dist/worker.js +19 -0
  326. package/dist/worker.js.map +1 -0
  327. package/migrations/0044_events.sql +79 -0
  328. package/migrations/0045_addresses.sql +66 -0
  329. package/migrations/0046_drop_company_website.sql +66 -0
  330. package/migrations/meta/_journal.json +21 -0
  331. package/package.json +4 -3
  332. package/src/app.ts +25 -1
  333. package/src/boot.ts +21 -2
  334. package/src/index.ts +17 -0
  335. package/src/lib/apiKeyScopes.ts +6 -0
  336. package/src/lib/columns.ts +12 -3
  337. package/src/lib/config.ts +21 -0
  338. package/src/lib/egress.ts +8 -4
  339. package/src/lib/errors.ts +16 -9
  340. package/src/lib/ids.ts +11 -0
  341. package/src/lib/jobs.ts +126 -0
  342. package/src/lib/kelpieConfigFile.ts +69 -1
  343. package/src/modules/agent-tasks/catalog.ts +33 -1
  344. package/src/modules/agent-tasks/index.ts +1 -0
  345. package/src/modules/agent-tasks/resolve.ts +11 -0
  346. package/src/modules/attachedRecords.ts +85 -13
  347. package/src/modules/auth/index.ts +1 -0
  348. package/src/modules/auth/repository.ts +34 -3
  349. package/src/modules/auth/routes.ts +44 -1
  350. package/src/modules/auth/service.ts +118 -4
  351. package/src/modules/companies/repository.ts +1 -0
  352. package/src/modules/companies/routes.ts +6 -11
  353. package/src/modules/companies/schema.ts +3 -3
  354. package/src/modules/companies/service.ts +6 -10
  355. package/src/modules/core.ts +2 -0
  356. package/src/modules/custom-fields/repository.ts +2 -0
  357. package/src/modules/dashboard/index.ts +1 -0
  358. package/src/modules/dashboard/repository.ts +64 -0
  359. package/src/modules/dashboard/routes.ts +15 -0
  360. package/src/modules/dashboard/service.ts +48 -0
  361. package/src/modules/decisions/repository.ts +2 -0
  362. package/src/modules/events/attendances.ts +245 -0
  363. package/src/modules/events/catalog.ts +36 -0
  364. package/src/modules/events/index.ts +54 -0
  365. package/src/modules/events/repository.ts +396 -0
  366. package/src/modules/events/routes.ts +405 -0
  367. package/src/modules/events/schema.ts +148 -0
  368. package/src/modules/events/service.ts +443 -0
  369. package/src/modules/events/tools.ts +118 -0
  370. package/src/modules/forms/applySubmissionFields.ts +7 -5
  371. package/src/modules/forms/fillAddresses.ts +185 -0
  372. package/src/modules/forms/repository.ts +3 -3
  373. package/src/modules/forms/routes.ts +2 -2
  374. package/src/modules/forms/schema.ts +2 -2
  375. package/src/modules/forms/service.ts +2 -2
  376. package/src/modules/forms/submission.ts +34 -4
  377. package/src/modules/hiring/roles.ts +2 -1
  378. package/src/modules/import-export/addresses.ts +150 -0
  379. package/src/modules/import-export/drafts.ts +7 -9
  380. package/src/modules/import-export/exportRows.ts +3 -3
  381. package/src/modules/import-export/plan.ts +30 -2
  382. package/src/modules/import-export/presets.ts +55 -7
  383. package/src/modules/import-export/repository.ts +5 -7
  384. package/src/modules/import-export/writes.ts +8 -4
  385. package/src/modules/people/repository.ts +1 -0
  386. package/src/modules/people/routes.ts +6 -6
  387. package/src/modules/people/schema.ts +7 -5
  388. package/src/modules/people/service.ts +7 -5
  389. package/src/modules/plans/repository.ts +2 -2
  390. package/src/modules/plans/routes.ts +6 -6
  391. package/src/modules/plans/schema.ts +4 -4
  392. package/src/modules/plans/service.ts +3 -3
  393. package/src/modules/plans/tools.ts +2 -2
  394. package/src/modules/recordTargets.ts +14 -0
  395. package/src/modules/references.ts +2 -0
  396. package/src/modules/sample-data/fixture.ts +208 -27
  397. package/src/modules/sample-data/index.ts +7 -2
  398. package/src/modules/sample-data/routes.ts +2 -0
  399. package/src/modules/sample-data/service.ts +166 -49
  400. package/src/modules/sample-data/tools.ts +4 -3
  401. package/src/modules/search/index.ts +2 -1
  402. package/src/modules/search/repository.ts +32 -1
  403. package/src/modules/search/service.ts +6 -4
  404. package/src/modules/smtp-email/index.ts +32 -10
  405. package/src/modules/workspace/repository.ts +18 -0
  406. package/src/modules/workspace/routes.ts +16 -0
  407. package/src/modules/workspace/service.ts +59 -14
  408. package/src/modules/workspace/starters.ts +275 -14
  409. package/src/modules/workspace/workspaceAccessMiddleware.ts +3 -4
  410. package/src/runtime/events.ts +2 -0
  411. package/src/runtime/jobs.ts +358 -0
  412. package/src/runtime/module.ts +20 -0
  413. package/src/runtime/registry.ts +146 -8
  414. package/src/runtime/transaction.ts +43 -0
  415. package/src/schema/index.ts +1 -0
  416. package/src/testing/app.ts +22 -1
  417. package/src/testing/client.ts +11 -1
  418. package/src/testing/database.ts +35 -2
  419. package/src/testing/services.ts +15 -1
  420. package/src/worker.ts +20 -0
@@ -0,0 +1,157 @@
1
+ import { ATTENDANCE_STATUS_LABELS } from '@kelpie/schemas';
2
+ import { changedKeys } from '../../lib/changes.js';
3
+ import { UNIQUE_VIOLATION, postgresErrorCode } from '../../lib/database.js';
4
+ import { AppError } from '../../lib/errors.js';
5
+ import { mapPage, readListWindow, toPage } from '../../lib/pagination.js';
6
+ import { toEventActor } from '../../lib/actor.js';
7
+ import { describeLink, describeUnlink, describeUpdate } from '../activities/wording.js';
8
+ import { requireWorkspaceId } from '../auth/actor.js';
9
+ import { deleteRecordsAttachedTo } from '../attachedRecords.js';
10
+ import * as personLinks from '../personLinks.js';
11
+ import './catalog.js';
12
+ import * as repository from './repository.js';
13
+ import { ATTENDANCE_SORTS, DEFAULT_ATTENDANCE_SORT } from './repository.js';
14
+ const ATTENDANCE_FIELD_LABELS = {
15
+ status: 'Attendance status',
16
+ };
17
+ function toView(record) {
18
+ const { workspaceId: _workspaceId, ...view } = record;
19
+ return view;
20
+ }
21
+ function duplicateAttendance() {
22
+ return AppError.conflict('That person is already registered for that event', [
23
+ { field: 'person_id', message: 'Already registered for this event' },
24
+ ]);
25
+ }
26
+ export function createAttendancesService(dependencies) {
27
+ async function require(workspaceId, id) {
28
+ const row = await repository.findAttendance(dependencies.db, workspaceId, id);
29
+ if (row === undefined) {
30
+ throw AppError.notFound('Attendance not found');
31
+ }
32
+ return row;
33
+ }
34
+ async function requireEvent(workspaceId, eventId) {
35
+ const event = await repository.findEvent(dependencies.db, workspaceId, eventId);
36
+ if (event === undefined) {
37
+ throw AppError.notFound('Event not found');
38
+ }
39
+ return event.name;
40
+ }
41
+ async function requirePerson(workspaceId, personId) {
42
+ const named = await personLinks.findPeopleNamed(dependencies.db, workspaceId, [personId]);
43
+ const name = named.get(personId);
44
+ if (name === undefined) {
45
+ throw AppError.notFound('Person not found');
46
+ }
47
+ return name;
48
+ }
49
+ return {
50
+ async list(actor, filters, query) {
51
+ const workspaceId = requireWorkspaceId(actor);
52
+ const window = readListWindow(query, ATTENDANCE_SORTS, DEFAULT_ATTENDANCE_SORT);
53
+ const rows = await repository.listAttendances(dependencies.db, workspaceId, filters, window);
54
+ return mapPage(toPage(rows, window, (row) => row.id), toView);
55
+ },
56
+ async get(actor, id) {
57
+ return toView(await require(requireWorkspaceId(actor), id));
58
+ },
59
+ async create(actor, input) {
60
+ const workspaceId = requireWorkspaceId(actor);
61
+ const eventName = await requireEvent(workspaceId, input.eventId);
62
+ const personName = await requirePerson(workspaceId, input.personId);
63
+ const id = dependencies.createId('attendance');
64
+ return dependencies.transaction(async ({ tx, events }) => {
65
+ let created;
66
+ try {
67
+ created = await repository.insertAttendance(tx, {
68
+ id,
69
+ workspaceId,
70
+ eventId: input.eventId,
71
+ personId: input.personId,
72
+ status: input.status,
73
+ source: input.source,
74
+ });
75
+ }
76
+ catch (error) {
77
+ if (postgresErrorCode(error) === UNIQUE_VIOLATION) {
78
+ throw duplicateAttendance();
79
+ }
80
+ throw error;
81
+ }
82
+ await dependencies.recordActivity(tx, workspaceId, actor, {
83
+ targetType: 'event',
84
+ targetId: input.eventId,
85
+ kind: 'linked',
86
+ ...describeLink('person', personName),
87
+ });
88
+ await dependencies.recordActivity(tx, workspaceId, actor, {
89
+ targetType: 'person',
90
+ targetId: input.personId,
91
+ kind: 'linked',
92
+ ...describeLink('event', eventName),
93
+ });
94
+ events.emit('events.attendance.created', { type: 'attendance', id }, {});
95
+ return toView(created);
96
+ }, { workspaceId, actor: toEventActor(actor) });
97
+ },
98
+ async update(actor, id, changes) {
99
+ const workspaceId = requireWorkspaceId(actor);
100
+ const existing = await require(workspaceId, id);
101
+ const columns = {
102
+ ...(changes.status === undefined ? {} : { status: changes.status }),
103
+ };
104
+ const changed = changedKeys(existing, columns);
105
+ if (changed.length === 0) {
106
+ return toView(existing);
107
+ }
108
+ return dependencies.transaction(async ({ tx, events }) => {
109
+ const updated = await repository.updateAttendance(tx, workspaceId, id, {
110
+ ...columns,
111
+ updatedAt: dependencies.now(),
112
+ });
113
+ if (updated === undefined) {
114
+ throw AppError.notFound('Attendance not found');
115
+ }
116
+ const before = {
117
+ status: ATTENDANCE_STATUS_LABELS[existing.status],
118
+ };
119
+ const after = {
120
+ status: ATTENDANCE_STATUS_LABELS[columns.status ?? existing.status],
121
+ };
122
+ await dependencies.recordActivity(tx, workspaceId, actor, {
123
+ targetType: 'attendance',
124
+ targetId: id,
125
+ kind: 'updated',
126
+ ...describeUpdate(changed, ATTENDANCE_FIELD_LABELS, before, after),
127
+ });
128
+ events.emit('events.attendance.updated', { type: 'attendance', id }, { changed });
129
+ return toView(updated);
130
+ }, { workspaceId, actor: toEventActor(actor) });
131
+ },
132
+ async remove(actor, id) {
133
+ const workspaceId = requireWorkspaceId(actor);
134
+ const existing = await require(workspaceId, id);
135
+ const eventName = await requireEvent(workspaceId, existing.eventId);
136
+ const personName = await requirePerson(workspaceId, existing.personId);
137
+ await dependencies.transaction(async ({ tx, events }) => {
138
+ await deleteRecordsAttachedTo(tx, workspaceId, 'attendance', id);
139
+ await repository.deleteAttendance(tx, workspaceId, id);
140
+ await dependencies.recordActivity(tx, workspaceId, actor, {
141
+ targetType: 'event',
142
+ targetId: existing.eventId,
143
+ kind: 'unlinked',
144
+ ...describeUnlink('person', personName),
145
+ });
146
+ await dependencies.recordActivity(tx, workspaceId, actor, {
147
+ targetType: 'person',
148
+ targetId: existing.personId,
149
+ kind: 'unlinked',
150
+ ...describeUnlink('event', eventName),
151
+ });
152
+ events.emit('events.attendance.deleted', { type: 'attendance', id }, {});
153
+ }, { workspaceId, actor: toEventActor(actor) });
154
+ },
155
+ };
156
+ }
157
+ //# sourceMappingURL=attendances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attendances.js","sourceRoot":"","sources":["../../../src/modules/events/attendances.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { z } from 'zod';
2
+ /** Domain events published by the events module (CRM gatherings + attendances). */
3
+ export declare const crmEventsCatalog: {
4
+ 'events.event.created': z.ZodObject<{}, z.core.$strict>;
5
+ 'events.event.updated': z.ZodObject<{
6
+ changed: z.ZodReadonly<z.ZodArray<z.ZodString>>;
7
+ }, z.core.$strip>;
8
+ 'events.event.deleted': z.ZodObject<{}, z.core.$strict>;
9
+ 'events.attendance.created': z.ZodObject<{}, z.core.$strict>;
10
+ 'events.attendance.updated': z.ZodObject<{
11
+ changed: z.ZodReadonly<z.ZodArray<z.ZodString>>;
12
+ }, z.core.$strip>;
13
+ 'events.attendance.deleted': z.ZodObject<{}, z.core.$strict>;
14
+ };
15
+ export type CrmEventCreatedData = Record<string, never>;
16
+ export interface CrmEventUpdatedData {
17
+ readonly changed: readonly string[];
18
+ }
19
+ export type CrmEventDeletedData = Record<string, never>;
20
+ export type AttendanceCreatedData = Record<string, never>;
21
+ export interface AttendanceUpdatedData {
22
+ readonly changed: readonly string[];
23
+ }
24
+ export type AttendanceDeletedData = Record<string, never>;
25
+ declare module '../../runtime/events.ts' {
26
+ interface KelpieEventMap {
27
+ 'events.event.created': CrmEventCreatedData;
28
+ 'events.event.updated': CrmEventUpdatedData;
29
+ 'events.event.deleted': CrmEventDeletedData;
30
+ 'events.attendance.created': AttendanceCreatedData;
31
+ 'events.attendance.updated': AttendanceUpdatedData;
32
+ 'events.attendance.deleted': AttendanceDeletedData;
33
+ }
34
+ }
35
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/modules/events/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,mFAAmF;AAEnF,eAAO,MAAM,gBAAgB;;;;;;;;;;;CAOC,CAAA;AAE9B,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AACvD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AACD,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AACvD,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AACzD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AACD,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;AAEzD,OAAO,QAAQ,yBAAyB,CAAC;IACvC,UAAU,cAAc;QACtB,sBAAsB,EAAE,mBAAmB,CAAA;QAC3C,sBAAsB,EAAE,mBAAmB,CAAA;QAC3C,sBAAsB,EAAE,mBAAmB,CAAA;QAC3C,2BAA2B,EAAE,qBAAqB,CAAA;QAClD,2BAA2B,EAAE,qBAAqB,CAAA;QAClD,2BAA2B,EAAE,qBAAqB,CAAA;KACnD;CACF"}
@@ -0,0 +1,11 @@
1
+ import { z } from 'zod';
2
+ /** Domain events published by the events module (CRM gatherings + attendances). */
3
+ export const crmEventsCatalog = {
4
+ 'events.event.created': z.object({}).strict(),
5
+ 'events.event.updated': z.object({ changed: z.array(z.string()).readonly() }),
6
+ 'events.event.deleted': z.object({}).strict(),
7
+ 'events.attendance.created': z.object({}).strict(),
8
+ 'events.attendance.updated': z.object({ changed: z.array(z.string()).readonly() }),
9
+ 'events.attendance.deleted': z.object({}).strict(),
10
+ };
11
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/modules/events/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,mFAAmF;AAEnF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,sBAAsB,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;IAC7C,sBAAsB,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC7E,sBAAsB,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;IAC7C,2BAA2B,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;IAClD,2BAA2B,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;IAClF,2BAA2B,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAA"}
@@ -0,0 +1,10 @@
1
+ import type { KelpieModule } from '../../runtime/module.ts';
2
+ /**
3
+ * Events: dated gatherings, attendances, and Event-only associations.
4
+ *
5
+ * Requires people (attendees), activities (timeline), and custom-fields
6
+ * (workspace-defined attributes on the Event). Associations resolve other
7
+ * modules' tables directly, the way notes resolve polymorphic targets.
8
+ */
9
+ export declare function createEventsModule(migrationsDirectory: string): KelpieModule;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/events/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAU3D;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,mBAAmB,EAAE,MAAM,GAAG,YAAY,CAoC5E"}
@@ -0,0 +1,47 @@
1
+ import { createActivityRecorder } from '../activities/index.js';
2
+ import { createCustomFieldValues } from '../custom-fields/index.js';
3
+ import { createAttendancesService } from './attendances.js';
4
+ import { crmEventsCatalog } from './catalog.js';
5
+ import { mountEventsRoutes } from './routes.js';
6
+ import * as schema from './schema.js';
7
+ import { createEventsService } from './service.js';
8
+ import { registerEventsTools } from './tools.js';
9
+ /**
10
+ * Events: dated gatherings, attendances, and Event-only associations.
11
+ *
12
+ * Requires people (attendees), activities (timeline), and custom-fields
13
+ * (workspace-defined attributes on the Event). Associations resolve other
14
+ * modules' tables directly, the way notes resolve polymorphic targets.
15
+ */
16
+ export function createEventsModule(migrationsDirectory) {
17
+ return {
18
+ id: 'events',
19
+ requires: ['people', 'activities', 'custom-fields'],
20
+ events: crmEventsCatalog,
21
+ register(context) {
22
+ const recordActivity = createActivityRecorder({
23
+ createId: context.createId,
24
+ now: context.now,
25
+ });
26
+ const shared = {
27
+ db: context.db,
28
+ transaction: context.transaction,
29
+ createId: context.createId,
30
+ now: context.now,
31
+ recordActivity,
32
+ };
33
+ context.schema(schema, migrationsDirectory);
34
+ const events = createEventsService({
35
+ ...shared,
36
+ customFields: createCustomFieldValues({ db: context.db }),
37
+ });
38
+ const attendances = createAttendancesService(shared);
39
+ context.routes((router) => {
40
+ mountEventsRoutes(router, { db: context.db, now: context.now, events, attendances });
41
+ });
42
+ registerEventsTools(context.mcp, { events, attendances });
43
+ return Promise.resolve();
44
+ },
45
+ };
46
+ }
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/events/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAA;AACnE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEhD;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,mBAA2B;IAC5D,OAAO;QACL,EAAE,EAAE,QAAQ;QACZ,QAAQ,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,eAAe,CAAC;QACnD,MAAM,EAAE,gBAAgB;QAExB,QAAQ,CAAC,OAAO;YACd,MAAM,cAAc,GAAG,sBAAsB,CAAC;gBAC5C,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;aACjB,CAAC,CAAA;YACF,MAAM,MAAM,GAAG;gBACb,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,WAAW,EAAE,OAAO,CAAC,WAAW;gBAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,cAAc;aACf,CAAA;YAED,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;YAE3C,MAAM,MAAM,GAAG,mBAAmB,CAAC;gBACjC,GAAG,MAAM;gBACT,YAAY,EAAE,uBAAuB,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;aAC1D,CAAC,CAAA;YACF,MAAM,WAAW,GAAG,wBAAwB,CAAC,MAAM,CAAC,CAAA;YAEpD,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;gBACxB,iBAAiB,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAA;YACtF,CAAC,CAAC,CAAA;YAEF,mBAAmB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAA;YAEzD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;QAC1B,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,67 @@
1
+ import { sql } from 'drizzle-orm';
2
+ import type { IdFactory } from '../../lib/ids.ts';
3
+ import type { ListWindow, SortableFields } from '../../lib/pagination.ts';
4
+ import type { Queryable } from '../../runtime/transaction.ts';
5
+ import { attendances, eventAssociations, events } from './schema.ts';
6
+ import type { EventAssociationTargetType } from './schema.ts';
7
+ export type EventRecord = typeof events.$inferSelect;
8
+ export type EventColumns = typeof events.$inferInsert;
9
+ export type AttendanceRecord = typeof attendances.$inferSelect;
10
+ export type AttendanceColumns = typeof attendances.$inferInsert;
11
+ export type EventAssociationRecord = typeof eventAssociations.$inferSelect;
12
+ export declare const EVENT_SORTS: SortableFields<EventRecord>;
13
+ export declare const DEFAULT_EVENT_SORT = "starts_at";
14
+ export interface EventFilters {
15
+ readonly term?: string | undefined;
16
+ readonly statuses?: readonly string[] | undefined;
17
+ readonly formats?: readonly string[] | undefined;
18
+ readonly ownerIds?: readonly string[] | undefined;
19
+ readonly from?: Date | undefined;
20
+ readonly to?: Date | undefined;
21
+ }
22
+ export declare function listEvents(db: Queryable, workspaceId: string, filters: EventFilters, window: ListWindow<EventRecord>): Promise<EventRecord[]>;
23
+ export declare function findEvent(db: Queryable, workspaceId: string, id: string): Promise<EventRecord | undefined>;
24
+ export declare function insertEvent(db: Queryable, values: EventColumns): Promise<EventRecord>;
25
+ export declare function updateEvent(db: Queryable, workspaceId: string, id: string, changes: Partial<EventColumns>): Promise<EventRecord | undefined>;
26
+ export declare function deleteEvent(db: Queryable, workspaceId: string, id: string): Promise<number>;
27
+ export declare function memberExists(db: Queryable, workspaceId: string, memberId: string): Promise<boolean>;
28
+ export interface AssociationRef {
29
+ readonly targetType: EventAssociationTargetType;
30
+ readonly targetId: string;
31
+ }
32
+ export declare function listAssociations(db: Queryable, workspaceId: string, eventId: string): Promise<readonly AssociationRef[]>;
33
+ export declare function listAssociationsByTarget(db: Queryable, workspaceId: string, targetType: EventAssociationTargetType, targetId: string): Promise<readonly {
34
+ readonly eventId: string;
35
+ readonly eventName: string;
36
+ }[]>;
37
+ export declare function replaceAssociations(db: Queryable, createId: IdFactory, workspaceId: string, eventId: string, next: readonly AssociationRef[]): Promise<void>;
38
+ export declare function deleteAssociationsForTarget(db: Queryable, workspaceId: string, targetType: string, targetId: string): Promise<number>;
39
+ export declare const ATTENDANCE_SORTS: SortableFields<AttendanceRecord>;
40
+ export declare const DEFAULT_ATTENDANCE_SORT = "-created_at";
41
+ export interface AttendanceFilters {
42
+ readonly eventIds?: readonly string[] | undefined;
43
+ readonly personIds?: readonly string[] | undefined;
44
+ readonly statuses?: readonly string[] | undefined;
45
+ }
46
+ export declare function listAttendances(db: Queryable, workspaceId: string, filters: AttendanceFilters, window: ListWindow<AttendanceRecord>): Promise<AttendanceRecord[]>;
47
+ export declare function findAttendance(db: Queryable, workspaceId: string, id: string): Promise<AttendanceRecord | undefined>;
48
+ export declare function insertAttendance(db: Queryable, values: AttendanceColumns): Promise<AttendanceRecord>;
49
+ /**
50
+ * Insert or return the existing row. Used by form submit so a retry is ok.
51
+ *
52
+ * Uses `ON CONFLICT DO NOTHING` rather than catching a unique violation: a
53
+ * caught 23505 still aborts the surrounding savepoint, and the follow-up
54
+ * select would then fail.
55
+ *
56
+ * @returns The row and whether it was newly inserted.
57
+ */
58
+ export declare function insertAttendanceIfAbsent(db: Queryable, values: AttendanceColumns): Promise<{
59
+ readonly record: AttendanceRecord;
60
+ readonly inserted: boolean;
61
+ }>;
62
+ export declare function updateAttendance(db: Queryable, workspaceId: string, id: string, changes: Partial<AttendanceColumns>): Promise<AttendanceRecord | undefined>;
63
+ export declare function deleteAttendance(db: Queryable, workspaceId: string, id: string): Promise<number>;
64
+ export declare function listAttendanceIdsForEvent(db: Queryable, workspaceId: string, eventId: string): Promise<readonly string[]>;
65
+ export declare function listAttendanceIdsForPerson(db: Queryable, workspaceId: string, personId: string): Promise<readonly string[]>;
66
+ export { sql };
67
+ //# sourceMappingURL=repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/modules/events/repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,212 @@
1
+ import { and, asc, eq, gte, ilike, inArray, lte, or, sql } from 'drizzle-orm';
2
+ import { keysetCondition, orderByWindow, textSort, timestampSort } from '../../lib/pagination.js';
3
+ import { arrayContainsPattern, containsPattern } from '../../lib/search.js';
4
+ import { workspaceMembers } from '../workspace/schema.js';
5
+ import { attendances, eventAssociations, events } from './schema.js';
6
+ export const EVENT_SORTS = {
7
+ name: textSort(events.name, (event) => event.name),
8
+ starts_at: timestampSort(events.startsAt, (event) => event.startsAt),
9
+ created_at: timestampSort(events.createdAt, (event) => event.createdAt),
10
+ updated_at: timestampSort(events.updatedAt, (event) => event.updatedAt),
11
+ };
12
+ export const DEFAULT_EVENT_SORT = 'starts_at';
13
+ function matchesTerm(term) {
14
+ const pattern = containsPattern(term);
15
+ return or(ilike(events.name, pattern), ilike(events.summary, pattern), ilike(events.kind, pattern), ilike(events.location, pattern), ilike(events.details, pattern), arrayContainsPattern(events.tags, pattern));
16
+ }
17
+ function eventConditionsFor(workspaceId, filters) {
18
+ return [
19
+ eq(events.workspaceId, workspaceId),
20
+ filters.term === undefined ? undefined : matchesTerm(filters.term),
21
+ filters.statuses === undefined ? undefined : inArray(events.status, filters.statuses),
22
+ filters.formats === undefined ? undefined : inArray(events.format, filters.formats),
23
+ filters.ownerIds === undefined ? undefined : inArray(events.ownerId, filters.ownerIds),
24
+ filters.from === undefined ? undefined : gte(events.startsAt, filters.from),
25
+ filters.to === undefined ? undefined : lte(events.startsAt, filters.to),
26
+ ];
27
+ }
28
+ export function listEvents(db, workspaceId, filters, window) {
29
+ return db
30
+ .select()
31
+ .from(events)
32
+ .where(and(...eventConditionsFor(workspaceId, filters), keysetCondition(window, events.id)))
33
+ .orderBy(...orderByWindow(window, events.id))
34
+ .limit(window.fetchLimit);
35
+ }
36
+ export async function findEvent(db, workspaceId, id) {
37
+ const [found] = await db
38
+ .select()
39
+ .from(events)
40
+ .where(and(eq(events.workspaceId, workspaceId), eq(events.id, id)))
41
+ .limit(1);
42
+ return found;
43
+ }
44
+ export async function insertEvent(db, values) {
45
+ const [created] = await db.insert(events).values(values).returning();
46
+ if (created === undefined) {
47
+ throw new Error(`Inserting event ${values.id} returned no row`);
48
+ }
49
+ return created;
50
+ }
51
+ export async function updateEvent(db, workspaceId, id, changes) {
52
+ const [updated] = await db
53
+ .update(events)
54
+ .set(changes)
55
+ .where(and(eq(events.workspaceId, workspaceId), eq(events.id, id)))
56
+ .returning();
57
+ return updated;
58
+ }
59
+ export async function deleteEvent(db, workspaceId, id) {
60
+ const deleted = await db
61
+ .delete(events)
62
+ .where(and(eq(events.workspaceId, workspaceId), eq(events.id, id)))
63
+ .returning({ id: events.id });
64
+ return deleted.length;
65
+ }
66
+ export async function memberExists(db, workspaceId, memberId) {
67
+ const [found] = await db
68
+ .select({ id: workspaceMembers.id })
69
+ .from(workspaceMembers)
70
+ .where(and(eq(workspaceMembers.workspaceId, workspaceId), eq(workspaceMembers.id, memberId)))
71
+ .limit(1);
72
+ return found !== undefined;
73
+ }
74
+ export async function listAssociations(db, workspaceId, eventId) {
75
+ const rows = await db
76
+ .select({
77
+ targetType: eventAssociations.targetType,
78
+ targetId: eventAssociations.targetId,
79
+ })
80
+ .from(eventAssociations)
81
+ .where(and(eq(eventAssociations.workspaceId, workspaceId), eq(eventAssociations.eventId, eventId)))
82
+ .orderBy(asc(eventAssociations.targetType), asc(eventAssociations.targetId));
83
+ return rows.map((row) => ({
84
+ targetType: row.targetType,
85
+ targetId: row.targetId,
86
+ }));
87
+ }
88
+ export async function listAssociationsByTarget(db, workspaceId, targetType, targetId) {
89
+ return db
90
+ .select({ eventId: events.id, eventName: events.name })
91
+ .from(eventAssociations)
92
+ .innerJoin(events, eq(events.id, eventAssociations.eventId))
93
+ .where(and(eq(eventAssociations.workspaceId, workspaceId), eq(eventAssociations.targetType, targetType), eq(eventAssociations.targetId, targetId)))
94
+ .orderBy(asc(events.startsAt), asc(events.id));
95
+ }
96
+ export async function replaceAssociations(db, createId, workspaceId, eventId, next) {
97
+ await db
98
+ .delete(eventAssociations)
99
+ .where(and(eq(eventAssociations.workspaceId, workspaceId), eq(eventAssociations.eventId, eventId)));
100
+ if (next.length === 0) {
101
+ return;
102
+ }
103
+ await db.insert(eventAssociations).values(next.map((row) => ({
104
+ id: createId('eventAssociation'),
105
+ workspaceId,
106
+ eventId,
107
+ targetType: row.targetType,
108
+ targetId: row.targetId,
109
+ })));
110
+ }
111
+ export async function deleteAssociationsForTarget(db, workspaceId, targetType, targetId) {
112
+ const deleted = await db
113
+ .delete(eventAssociations)
114
+ .where(and(eq(eventAssociations.workspaceId, workspaceId), eq(eventAssociations.targetType, targetType), eq(eventAssociations.targetId, targetId)))
115
+ .returning({ id: eventAssociations.id });
116
+ return deleted.length;
117
+ }
118
+ export const ATTENDANCE_SORTS = {
119
+ created_at: timestampSort(attendances.createdAt, (row) => row.createdAt),
120
+ updated_at: timestampSort(attendances.updatedAt, (row) => row.updatedAt),
121
+ };
122
+ export const DEFAULT_ATTENDANCE_SORT = '-created_at';
123
+ function attendanceConditionsFor(workspaceId, filters) {
124
+ return [
125
+ eq(attendances.workspaceId, workspaceId),
126
+ filters.eventIds === undefined ? undefined : inArray(attendances.eventId, filters.eventIds),
127
+ filters.personIds === undefined ? undefined : inArray(attendances.personId, filters.personIds),
128
+ filters.statuses === undefined ? undefined : inArray(attendances.status, filters.statuses),
129
+ ];
130
+ }
131
+ export function listAttendances(db, workspaceId, filters, window) {
132
+ return db
133
+ .select()
134
+ .from(attendances)
135
+ .where(and(...attendanceConditionsFor(workspaceId, filters), keysetCondition(window, attendances.id)))
136
+ .orderBy(...orderByWindow(window, attendances.id))
137
+ .limit(window.fetchLimit);
138
+ }
139
+ export async function findAttendance(db, workspaceId, id) {
140
+ const [found] = await db
141
+ .select()
142
+ .from(attendances)
143
+ .where(and(eq(attendances.workspaceId, workspaceId), eq(attendances.id, id)))
144
+ .limit(1);
145
+ return found;
146
+ }
147
+ export async function insertAttendance(db, values) {
148
+ const [created] = await db.insert(attendances).values(values).returning();
149
+ if (created === undefined) {
150
+ throw new Error(`Inserting attendance ${values.id} returned no row`);
151
+ }
152
+ return created;
153
+ }
154
+ /**
155
+ * Insert or return the existing row. Used by form submit so a retry is ok.
156
+ *
157
+ * Uses `ON CONFLICT DO NOTHING` rather than catching a unique violation: a
158
+ * caught 23505 still aborts the surrounding savepoint, and the follow-up
159
+ * select would then fail.
160
+ *
161
+ * @returns The row and whether it was newly inserted.
162
+ */
163
+ export async function insertAttendanceIfAbsent(db, values) {
164
+ const inserted = await db
165
+ .insert(attendances)
166
+ .values(values)
167
+ .onConflictDoNothing({ target: [attendances.eventId, attendances.personId] })
168
+ .returning();
169
+ if (inserted[0] !== undefined) {
170
+ return { record: inserted[0], inserted: true };
171
+ }
172
+ const [existing] = await db
173
+ .select()
174
+ .from(attendances)
175
+ .where(and(eq(attendances.eventId, values.eventId), eq(attendances.personId, values.personId)))
176
+ .limit(1);
177
+ if (existing === undefined) {
178
+ throw new Error(`Attendance for ${values.eventId} and ${values.personId} was neither inserted nor found`);
179
+ }
180
+ return { record: existing, inserted: false };
181
+ }
182
+ export async function updateAttendance(db, workspaceId, id, changes) {
183
+ const [updated] = await db
184
+ .update(attendances)
185
+ .set(changes)
186
+ .where(and(eq(attendances.workspaceId, workspaceId), eq(attendances.id, id)))
187
+ .returning();
188
+ return updated;
189
+ }
190
+ export async function deleteAttendance(db, workspaceId, id) {
191
+ const deleted = await db
192
+ .delete(attendances)
193
+ .where(and(eq(attendances.workspaceId, workspaceId), eq(attendances.id, id)))
194
+ .returning({ id: attendances.id });
195
+ return deleted.length;
196
+ }
197
+ export async function listAttendanceIdsForEvent(db, workspaceId, eventId) {
198
+ const rows = await db
199
+ .select({ id: attendances.id })
200
+ .from(attendances)
201
+ .where(and(eq(attendances.workspaceId, workspaceId), eq(attendances.eventId, eventId)));
202
+ return rows.map((row) => row.id);
203
+ }
204
+ export async function listAttendanceIdsForPerson(db, workspaceId, personId) {
205
+ const rows = await db
206
+ .select({ id: attendances.id })
207
+ .from(attendances)
208
+ .where(and(eq(attendances.workspaceId, workspaceId), eq(attendances.personId, personId)));
209
+ return rows.map((row) => row.id);
210
+ }
211
+ export { sql };
212
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/modules/events/repository.ts"],"names":[],"mappings":"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"}