@dyrected/core 2.6.2 → 2.6.4

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 (352) hide show
  1. package/dist/__tests__/access-features.test.d.ts +2 -0
  2. package/dist/__tests__/access-features.test.d.ts.map +1 -0
  3. package/dist/__tests__/access-features.test.js +159 -0
  4. package/dist/__tests__/access-features.test.js.map +1 -0
  5. package/dist/__tests__/access-parity.test.d.ts +2 -0
  6. package/dist/__tests__/access-parity.test.d.ts.map +1 -0
  7. package/dist/__tests__/access-parity.test.js +338 -0
  8. package/dist/__tests__/access-parity.test.js.map +1 -0
  9. package/dist/__tests__/access.test.d.ts +2 -0
  10. package/dist/__tests__/access.test.d.ts.map +1 -0
  11. package/dist/__tests__/access.test.js +137 -0
  12. package/dist/__tests__/access.test.js.map +1 -0
  13. package/dist/__tests__/admin-auth.test.d.ts +2 -0
  14. package/dist/__tests__/admin-auth.test.d.ts.map +1 -0
  15. package/dist/__tests__/admin-auth.test.js +440 -0
  16. package/dist/__tests__/admin-auth.test.js.map +1 -0
  17. package/dist/__tests__/app.test.d.ts +2 -0
  18. package/dist/__tests__/app.test.d.ts.map +1 -0
  19. package/dist/__tests__/app.test.js +112 -0
  20. package/dist/__tests__/app.test.js.map +1 -0
  21. package/dist/__tests__/audit.test.d.ts +2 -0
  22. package/dist/__tests__/audit.test.d.ts.map +1 -0
  23. package/dist/__tests__/audit.test.js +125 -0
  24. package/dist/__tests__/audit.test.js.map +1 -0
  25. package/dist/__tests__/auth-hydration.test.d.ts +2 -0
  26. package/dist/__tests__/auth-hydration.test.d.ts.map +1 -0
  27. package/dist/__tests__/auth-hydration.test.js +90 -0
  28. package/dist/__tests__/auth-hydration.test.js.map +1 -0
  29. package/dist/__tests__/auth-invite.test.d.ts +2 -0
  30. package/dist/__tests__/auth-invite.test.d.ts.map +1 -0
  31. package/dist/__tests__/auth-invite.test.js +152 -0
  32. package/dist/__tests__/auth-invite.test.js.map +1 -0
  33. package/dist/__tests__/auth-lockout.test.d.ts +2 -0
  34. package/dist/__tests__/auth-lockout.test.d.ts.map +1 -0
  35. package/dist/__tests__/auth-lockout.test.js +154 -0
  36. package/dist/__tests__/auth-lockout.test.js.map +1 -0
  37. package/dist/__tests__/auth-sessions.test.d.ts +2 -0
  38. package/dist/__tests__/auth-sessions.test.d.ts.map +1 -0
  39. package/dist/__tests__/auth-sessions.test.js +118 -0
  40. package/dist/__tests__/auth-sessions.test.js.map +1 -0
  41. package/dist/__tests__/config.test.d.ts +2 -0
  42. package/dist/__tests__/config.test.d.ts.map +1 -0
  43. package/dist/__tests__/config.test.js +402 -0
  44. package/dist/__tests__/config.test.js.map +1 -0
  45. package/dist/__tests__/define-field.test.d.ts +2 -0
  46. package/dist/__tests__/define-field.test.d.ts.map +1 -0
  47. package/dist/__tests__/define-field.test.js +121 -0
  48. package/dist/__tests__/define-field.test.js.map +1 -0
  49. package/dist/__tests__/deleteMany.test.d.ts +2 -0
  50. package/dist/__tests__/deleteMany.test.d.ts.map +1 -0
  51. package/dist/__tests__/deleteMany.test.js +75 -0
  52. package/dist/__tests__/deleteMany.test.js.map +1 -0
  53. package/dist/__tests__/depth.test.d.ts +2 -0
  54. package/dist/__tests__/depth.test.d.ts.map +1 -0
  55. package/dist/__tests__/depth.test.js +115 -0
  56. package/dist/__tests__/depth.test.js.map +1 -0
  57. package/dist/__tests__/dynamic-options.test.d.ts +2 -0
  58. package/dist/__tests__/dynamic-options.test.d.ts.map +1 -0
  59. package/dist/__tests__/dynamic-options.test.js +168 -0
  60. package/dist/__tests__/dynamic-options.test.js.map +1 -0
  61. package/dist/__tests__/email.service.test.d.ts +2 -0
  62. package/dist/__tests__/email.service.test.d.ts.map +1 -0
  63. package/dist/__tests__/email.service.test.js +52 -0
  64. package/dist/__tests__/email.service.test.js.map +1 -0
  65. package/dist/__tests__/field-inference.test-types.d.ts +161 -0
  66. package/dist/__tests__/field-inference.test-types.d.ts.map +1 -0
  67. package/dist/__tests__/field-inference.test-types.js +87 -0
  68. package/dist/__tests__/field-inference.test-types.js.map +1 -0
  69. package/dist/__tests__/fixtures/editorial-workflow.d.ts +14 -0
  70. package/dist/__tests__/fixtures/editorial-workflow.d.ts.map +1 -0
  71. package/dist/__tests__/fixtures/editorial-workflow.js +12 -0
  72. package/dist/__tests__/fixtures/editorial-workflow.js.map +1 -0
  73. package/dist/__tests__/hooks.test.d.ts +2 -0
  74. package/dist/__tests__/hooks.test.d.ts.map +1 -0
  75. package/dist/__tests__/hooks.test.js +320 -0
  76. package/dist/__tests__/hooks.test.js.map +1 -0
  77. package/dist/__tests__/mocks.d.ts +75 -0
  78. package/dist/__tests__/mocks.d.ts.map +1 -0
  79. package/dist/__tests__/mocks.js +170 -0
  80. package/dist/__tests__/mocks.js.map +1 -0
  81. package/dist/__tests__/observability.test.d.ts +2 -0
  82. package/dist/__tests__/observability.test.d.ts.map +1 -0
  83. package/dist/__tests__/observability.test.js +233 -0
  84. package/dist/__tests__/observability.test.js.map +1 -0
  85. package/dist/__tests__/openapi.test.d.ts +2 -0
  86. package/dist/__tests__/openapi.test.d.ts.map +1 -0
  87. package/dist/__tests__/openapi.test.js +105 -0
  88. package/dist/__tests__/openapi.test.js.map +1 -0
  89. package/dist/__tests__/parse-sort.test.d.ts +2 -0
  90. package/dist/__tests__/parse-sort.test.d.ts.map +1 -0
  91. package/dist/__tests__/parse-sort.test.js +24 -0
  92. package/dist/__tests__/parse-sort.test.js.map +1 -0
  93. package/dist/__tests__/preferences.test.d.ts +2 -0
  94. package/dist/__tests__/preferences.test.d.ts.map +1 -0
  95. package/dist/__tests__/preferences.test.js +168 -0
  96. package/dist/__tests__/preferences.test.js.map +1 -0
  97. package/dist/__tests__/router.test.d.ts +2 -0
  98. package/dist/__tests__/router.test.d.ts.map +1 -0
  99. package/dist/__tests__/router.test.js +70 -0
  100. package/dist/__tests__/router.test.js.map +1 -0
  101. package/dist/__tests__/search.test.d.ts +2 -0
  102. package/dist/__tests__/search.test.d.ts.map +1 -0
  103. package/dist/__tests__/search.test.js +174 -0
  104. package/dist/__tests__/search.test.js.map +1 -0
  105. package/dist/__tests__/upload-validation.test.d.ts +2 -0
  106. package/dist/__tests__/upload-validation.test.d.ts.map +1 -0
  107. package/dist/__tests__/upload-validation.test.js +41 -0
  108. package/dist/__tests__/upload-validation.test.js.map +1 -0
  109. package/dist/__tests__/where.test.d.ts +2 -0
  110. package/dist/__tests__/where.test.d.ts.map +1 -0
  111. package/dist/__tests__/where.test.js +105 -0
  112. package/dist/__tests__/where.test.js.map +1 -0
  113. package/dist/__tests__/workflow.test.d.ts +2 -0
  114. package/dist/__tests__/workflow.test.d.ts.map +1 -0
  115. package/dist/__tests__/workflow.test.js +684 -0
  116. package/dist/__tests__/workflow.test.js.map +1 -0
  117. package/dist/app-config-C9VJ6rTv.d.cts +2092 -0
  118. package/dist/app-config-C9VJ6rTv.d.ts +2092 -0
  119. package/dist/app-config-CYV70eoF.d.cts +2100 -0
  120. package/dist/app-config-CYV70eoF.d.ts +2100 -0
  121. package/dist/app.d.ts +35 -0
  122. package/dist/app.d.ts.map +1 -0
  123. package/dist/app.js +164 -0
  124. package/dist/app.js.map +1 -0
  125. package/dist/auth/access.d.ts +5 -0
  126. package/dist/auth/access.d.ts.map +1 -0
  127. package/dist/auth/access.js +59 -0
  128. package/dist/auth/access.js.map +1 -0
  129. package/dist/auth/jexl.d.ts +13 -0
  130. package/dist/auth/jexl.d.ts.map +1 -0
  131. package/dist/auth/jexl.js +30 -0
  132. package/dist/auth/jexl.js.map +1 -0
  133. package/dist/auth/lockout.d.ts +11 -0
  134. package/dist/auth/lockout.d.ts.map +1 -0
  135. package/dist/auth/lockout.js +37 -0
  136. package/dist/auth/lockout.js.map +1 -0
  137. package/dist/auth/password.d.ts +10 -0
  138. package/dist/auth/password.d.ts.map +1 -0
  139. package/dist/auth/password.js +28 -0
  140. package/dist/auth/password.js.map +1 -0
  141. package/dist/auth/sessions.d.ts +39 -0
  142. package/dist/auth/sessions.d.ts.map +1 -0
  143. package/dist/auth/sessions.js +126 -0
  144. package/dist/auth/sessions.js.map +1 -0
  145. package/dist/auth/token.d.ts +23 -0
  146. package/dist/auth/token.d.ts.map +1 -0
  147. package/dist/auth/token.js +40 -0
  148. package/dist/auth/token.js.map +1 -0
  149. package/dist/chunk-23NM4LDU.js +2883 -0
  150. package/dist/chunk-2TKDCCIR.js +2622 -0
  151. package/dist/chunk-3SFITPX4.js +2628 -0
  152. package/dist/chunk-CQVTQ67D.js +2632 -0
  153. package/dist/chunk-ELHRRPKX.js +2863 -0
  154. package/dist/chunk-HRLSFTLR.js +3061 -0
  155. package/dist/chunk-QTIAQBNH.js +3097 -0
  156. package/dist/chunk-T2DGC4MD.js +3008 -0
  157. package/dist/chunk-TLU77TLE.js +3203 -0
  158. package/dist/chunk-YEBCT77K.js +3269 -0
  159. package/dist/chunk-YXEKNN5X.js +3085 -0
  160. package/dist/controllers/admin-auth.controller.d.ts +71 -0
  161. package/dist/controllers/admin-auth.controller.d.ts.map +1 -0
  162. package/dist/controllers/admin-auth.controller.js +450 -0
  163. package/dist/controllers/admin-auth.controller.js.map +1 -0
  164. package/dist/controllers/audit.controller.d.ts +42 -0
  165. package/dist/controllers/audit.controller.d.ts.map +1 -0
  166. package/dist/controllers/audit.controller.js +149 -0
  167. package/dist/controllers/audit.controller.js.map +1 -0
  168. package/dist/controllers/auth.controller.d.ts +143 -0
  169. package/dist/controllers/auth.controller.d.ts.map +1 -0
  170. package/dist/controllers/auth.controller.js +572 -0
  171. package/dist/controllers/auth.controller.js.map +1 -0
  172. package/dist/controllers/collection.controller.d.ts +170 -0
  173. package/dist/controllers/collection.controller.d.ts.map +1 -0
  174. package/dist/controllers/collection.controller.js +1033 -0
  175. package/dist/controllers/collection.controller.js.map +1 -0
  176. package/dist/controllers/global.controller.d.ts +20 -0
  177. package/dist/controllers/global.controller.d.ts.map +1 -0
  178. package/dist/controllers/global.controller.js +182 -0
  179. package/dist/controllers/global.controller.js.map +1 -0
  180. package/dist/controllers/media.controller.d.ts +39 -0
  181. package/dist/controllers/media.controller.d.ts.map +1 -0
  182. package/dist/controllers/media.controller.js +178 -0
  183. package/dist/controllers/media.controller.js.map +1 -0
  184. package/dist/controllers/preview.controller.d.ts +37 -0
  185. package/dist/controllers/preview.controller.d.ts.map +1 -0
  186. package/dist/controllers/preview.controller.js +48 -0
  187. package/dist/controllers/preview.controller.js.map +1 -0
  188. package/dist/index.cjs +707 -27
  189. package/dist/index.d.cts +77 -5
  190. package/dist/index.d.ts +77 -5
  191. package/dist/index.d.ts.map +1 -0
  192. package/dist/index.js +37 -1
  193. package/dist/index.js.map +1 -0
  194. package/dist/middleware/auth.d.ts +19 -0
  195. package/dist/middleware/auth.d.ts.map +1 -0
  196. package/dist/middleware/auth.js +157 -0
  197. package/dist/middleware/auth.js.map +1 -0
  198. package/dist/middleware/rate-limit.d.ts +9 -0
  199. package/dist/middleware/rate-limit.d.ts.map +1 -0
  200. package/dist/middleware/rate-limit.js +75 -0
  201. package/dist/middleware/rate-limit.js.map +1 -0
  202. package/dist/network.d.ts +6 -0
  203. package/dist/network.d.ts.map +1 -0
  204. package/dist/network.js +70 -0
  205. package/dist/network.js.map +1 -0
  206. package/dist/observability.d.ts +113 -0
  207. package/dist/observability.d.ts.map +1 -0
  208. package/dist/observability.js +497 -0
  209. package/dist/observability.js.map +1 -0
  210. package/dist/router.d.ts +8 -0
  211. package/dist/router.d.ts.map +1 -0
  212. package/dist/router.js +704 -0
  213. package/dist/router.js.map +1 -0
  214. package/dist/server.cjs +861 -54
  215. package/dist/server.d.cts +9 -1
  216. package/dist/server.d.ts +9 -1
  217. package/dist/server.d.ts.map +1 -0
  218. package/dist/server.js +189 -26
  219. package/dist/server.js.map +1 -0
  220. package/dist/services/audit.service.d.ts +23 -0
  221. package/dist/services/audit.service.d.ts.map +1 -0
  222. package/dist/services/audit.service.js +39 -0
  223. package/dist/services/audit.service.js.map +1 -0
  224. package/dist/services/defaults.service.d.ts +8 -0
  225. package/dist/services/defaults.service.d.ts.map +1 -0
  226. package/dist/services/defaults.service.js +55 -0
  227. package/dist/services/defaults.service.js.map +1 -0
  228. package/dist/services/email-template.d.ts +46 -0
  229. package/dist/services/email-template.d.ts.map +1 -0
  230. package/dist/services/email-template.js +88 -0
  231. package/dist/services/email-template.js.map +1 -0
  232. package/dist/services/email.service.d.ts +34 -0
  233. package/dist/services/email.service.d.ts.map +1 -0
  234. package/dist/services/email.service.js +129 -0
  235. package/dist/services/email.service.js.map +1 -0
  236. package/dist/services/media.service.d.ts +20 -0
  237. package/dist/services/media.service.d.ts.map +1 -0
  238. package/dist/services/media.service.js +49 -0
  239. package/dist/services/media.service.js.map +1 -0
  240. package/dist/services/population.service.d.ts +20 -0
  241. package/dist/services/population.service.d.ts.map +1 -0
  242. package/dist/services/population.service.js +224 -0
  243. package/dist/services/population.service.js.map +1 -0
  244. package/dist/types/access.d.ts +48 -0
  245. package/dist/types/access.d.ts.map +1 -0
  246. package/dist/types/access.js +2 -0
  247. package/dist/types/access.js.map +1 -0
  248. package/dist/types/adapters.d.ts +152 -0
  249. package/dist/types/adapters.d.ts.map +1 -0
  250. package/dist/types/adapters.js +2 -0
  251. package/dist/types/adapters.js.map +1 -0
  252. package/dist/types/admin-auth.d.ts +132 -0
  253. package/dist/types/admin-auth.d.ts.map +1 -0
  254. package/dist/types/admin-auth.js +2 -0
  255. package/dist/types/admin-auth.js.map +1 -0
  256. package/dist/types/admin.d.ts +86 -0
  257. package/dist/types/admin.d.ts.map +1 -0
  258. package/dist/types/admin.js +2 -0
  259. package/dist/types/admin.js.map +1 -0
  260. package/dist/types/app-config.d.ts +279 -0
  261. package/dist/types/app-config.d.ts.map +1 -0
  262. package/dist/types/app-config.js +2 -0
  263. package/dist/types/app-config.js.map +1 -0
  264. package/dist/types/documents.d.ts +65 -0
  265. package/dist/types/documents.d.ts.map +1 -0
  266. package/dist/types/documents.js +2 -0
  267. package/dist/types/documents.js.map +1 -0
  268. package/dist/types/hooks.d.ts +122 -0
  269. package/dist/types/hooks.d.ts.map +1 -0
  270. package/dist/types/hooks.js +2 -0
  271. package/dist/types/hooks.js.map +1 -0
  272. package/dist/types/index.d.ts +13 -0
  273. package/dist/types/index.d.ts.map +1 -0
  274. package/dist/types/index.js +13 -0
  275. package/dist/types/index.js.map +1 -0
  276. package/dist/types/request.d.ts +42 -0
  277. package/dist/types/request.d.ts.map +1 -0
  278. package/dist/types/request.js +2 -0
  279. package/dist/types/request.js.map +1 -0
  280. package/dist/types/schema-config.d.ts +443 -0
  281. package/dist/types/schema-config.d.ts.map +1 -0
  282. package/dist/types/schema-config.js +2 -0
  283. package/dist/types/schema-config.js.map +1 -0
  284. package/dist/types/schema-core.d.ts +628 -0
  285. package/dist/types/schema-core.d.ts.map +1 -0
  286. package/dist/types/schema-core.js +2 -0
  287. package/dist/types/schema-core.js.map +1 -0
  288. package/dist/types/schema-inference.d.ts +73 -0
  289. package/dist/types/schema-inference.d.ts.map +1 -0
  290. package/dist/types/schema-inference.js +2 -0
  291. package/dist/types/schema-inference.js.map +1 -0
  292. package/dist/types/workflows.d.ts +121 -0
  293. package/dist/types/workflows.d.ts.map +1 -0
  294. package/dist/types/workflows.js +7 -0
  295. package/dist/types/workflows.js.map +1 -0
  296. package/dist/utils/access-control.d.ts +35 -0
  297. package/dist/utils/access-control.d.ts.map +1 -0
  298. package/dist/utils/access-control.js +161 -0
  299. package/dist/utils/access-control.js.map +1 -0
  300. package/dist/utils/admin-auth.d.ts +5 -0
  301. package/dist/utils/admin-auth.d.ts.map +1 -0
  302. package/dist/utils/admin-auth.js +39 -0
  303. package/dist/utils/admin-auth.js.map +1 -0
  304. package/dist/utils/block-references.d.ts +10 -0
  305. package/dist/utils/block-references.d.ts.map +1 -0
  306. package/dist/utils/block-references.js +100 -0
  307. package/dist/utils/block-references.js.map +1 -0
  308. package/dist/utils/collection-search.d.ts +11 -0
  309. package/dist/utils/collection-search.d.ts.map +1 -0
  310. package/dist/utils/collection-search.js +204 -0
  311. package/dist/utils/collection-search.js.map +1 -0
  312. package/dist/utils/config.d.ts +8 -0
  313. package/dist/utils/config.d.ts.map +1 -0
  314. package/dist/utils/config.js +336 -0
  315. package/dist/utils/config.js.map +1 -0
  316. package/dist/utils/hooks.d.ts +41 -0
  317. package/dist/utils/hooks.d.ts.map +1 -0
  318. package/dist/utils/hooks.js +177 -0
  319. package/dist/utils/hooks.js.map +1 -0
  320. package/dist/utils/openapi.d.ts +6 -0
  321. package/dist/utils/openapi.d.ts.map +1 -0
  322. package/dist/utils/openapi.js +981 -0
  323. package/dist/utils/openapi.js.map +1 -0
  324. package/dist/utils/parse-sort.d.ts +43 -0
  325. package/dist/utils/parse-sort.d.ts.map +1 -0
  326. package/dist/utils/parse-sort.js +70 -0
  327. package/dist/utils/parse-sort.js.map +1 -0
  328. package/dist/utils/parse-where.d.ts +69 -0
  329. package/dist/utils/parse-where.d.ts.map +1 -0
  330. package/dist/utils/parse-where.js +202 -0
  331. package/dist/utils/parse-where.js.map +1 -0
  332. package/dist/utils/readonly-db.d.ts +9 -0
  333. package/dist/utils/readonly-db.d.ts.map +1 -0
  334. package/dist/utils/readonly-db.js +21 -0
  335. package/dist/utils/readonly-db.js.map +1 -0
  336. package/dist/utils/swagger.d.ts +11 -0
  337. package/dist/utils/swagger.d.ts.map +1 -0
  338. package/dist/utils/swagger.js +62 -0
  339. package/dist/utils/swagger.js.map +1 -0
  340. package/dist/utils/upload-validation.d.ts +23 -0
  341. package/dist/utils/upload-validation.d.ts.map +1 -0
  342. package/dist/utils/upload-validation.js +46 -0
  343. package/dist/utils/upload-validation.js.map +1 -0
  344. package/dist/utils/where-sanitizer.d.ts +10 -0
  345. package/dist/utils/where-sanitizer.d.ts.map +1 -0
  346. package/dist/utils/where-sanitizer.js +67 -0
  347. package/dist/utils/where-sanitizer.js.map +1 -0
  348. package/dist/workflows.d.ts +86 -0
  349. package/dist/workflows.d.ts.map +1 -0
  350. package/dist/workflows.js +405 -0
  351. package/dist/workflows.js.map +1 -0
  352. package/package.json +1 -1
@@ -0,0 +1,572 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { getLockedUntilMs, resolveAuthLockoutConfig } from "../auth/lockout.js";
3
+ import { hashPassword, verifyPassword } from "../auth/password.js";
4
+ import { signCollectionToken, verifyCollectionToken } from "../auth/token.js";
5
+ import { issueAuthSessionToken, revokeAllAuthSessions, revokeAuthSession, } from "../auth/sessions.js";
6
+ import { sendEmail, buildWelcomeEmail, buildInviteEmail, buildResetPasswordEmail, buildPasswordChangedEmail, } from "../services/email.service.js";
7
+ import { getRequestLogger } from "../observability.js";
8
+ /**
9
+ * Handles auth endpoints for collections with `auth: true`.
10
+ *
11
+ * Routes registered (relative to `/api/collections/:slug`):
12
+ * POST /login
13
+ * POST /logout
14
+ * GET /me
15
+ * POST /refresh-token
16
+ * POST /forgot-password
17
+ * POST /reset-password
18
+ * POST /invite
19
+ * POST /accept-invite
20
+ */
21
+ export class AuthController {
22
+ collection;
23
+ constructor(collection) {
24
+ this.collection = collection;
25
+ }
26
+ sanitizeUser(user) {
27
+ const { password: _password, loginAttempts: _loginAttempts, lockedUntil: _lockedUntil, ...safeUser } = user;
28
+ return safeUser;
29
+ }
30
+ hasField(name) {
31
+ return (this.collection.fields || []).some((field) => field.name === name);
32
+ }
33
+ async buildPendingInviteData(email) {
34
+ const data = {
35
+ email,
36
+ password: await hashPassword(randomBytes(32).toString("hex")),
37
+ };
38
+ if (this.hasField("status")) {
39
+ data.status = "pending";
40
+ }
41
+ return data;
42
+ }
43
+ buildAcceptedInviteData(hashedPassword, extraFields) {
44
+ const data = {
45
+ ...extraFields,
46
+ password: hashedPassword,
47
+ };
48
+ if (this.hasField("status")) {
49
+ data.status = "active";
50
+ }
51
+ return data;
52
+ }
53
+ clearLockoutState(c, userId) {
54
+ const db = c.get("config").db;
55
+ if (!db)
56
+ return Promise.resolve(null);
57
+ return db.update({
58
+ collection: this.collection.slug,
59
+ id: userId,
60
+ data: {
61
+ loginAttempts: 0,
62
+ lockedUntil: null,
63
+ },
64
+ });
65
+ }
66
+ async recordFailedLogin(c, user) {
67
+ const db = c.get("config").db;
68
+ if (!db)
69
+ return { justLocked: false, retryAfterSeconds: null };
70
+ const lockout = resolveAuthLockoutConfig(this.collection);
71
+ if (!lockout.enabled) {
72
+ return { justLocked: false, retryAfterSeconds: null };
73
+ }
74
+ const now = Date.now();
75
+ const lockedUntilMs = getLockedUntilMs(user.lockedUntil);
76
+ const lockExpired = lockedUntilMs !== null && lockedUntilMs <= now;
77
+ const currentAttempts = !lockExpired &&
78
+ typeof user.loginAttempts === "number" &&
79
+ user.loginAttempts > 0
80
+ ? user.loginAttempts
81
+ : 0;
82
+ const loginAttempts = currentAttempts + 1;
83
+ const justLocked = loginAttempts >= lockout.maxLoginAttempts;
84
+ const nextLockedUntil = justLocked
85
+ ? new Date(now + lockout.lockTime).toISOString()
86
+ : null;
87
+ await db.update({
88
+ collection: this.collection.slug,
89
+ id: String(user.id),
90
+ data: {
91
+ loginAttempts,
92
+ lockedUntil: nextLockedUntil,
93
+ },
94
+ });
95
+ return {
96
+ justLocked,
97
+ retryAfterSeconds: justLocked
98
+ ? Math.max(1, Math.ceil(lockout.lockTime / 1000))
99
+ : null,
100
+ };
101
+ }
102
+ // ---------------------------------------------------------------------------
103
+ // GET /init
104
+ // Checks if the first user needs to be created.
105
+ // ---------------------------------------------------------------------------
106
+ async init(c) {
107
+ const db = c.get("config").db;
108
+ if (!db)
109
+ return c.json({ message: "Database not configured" }, 500);
110
+ const result = await db.find({
111
+ collection: this.collection.slug,
112
+ limit: 1,
113
+ });
114
+ return c.json({
115
+ initialized: result.total > 0,
116
+ });
117
+ }
118
+ // ---------------------------------------------------------------------------
119
+ // POST /first-user
120
+ // Creates the first user if none exist.
121
+ // ---------------------------------------------------------------------------
122
+ async registerFirstUser(c) {
123
+ const config = c.get("config");
124
+ const db = config.db;
125
+ if (!db)
126
+ return c.json({ message: "Database not configured" }, 500);
127
+ // 1. Check if users already exist
128
+ const check = await db.find({
129
+ collection: this.collection.slug,
130
+ limit: 1,
131
+ });
132
+ if (check.total > 0) {
133
+ return c.json({ error: true, message: "Initial user already exists." }, 403);
134
+ }
135
+ const body = await c.req.json().catch(() => null);
136
+ if (!body?.email || !body?.password) {
137
+ return c.json({ error: true, message: "email and password are required." }, 400);
138
+ }
139
+ // 2. Create the user
140
+ const hashedPassword = await hashPassword(body.password);
141
+ const user = await db.create({
142
+ collection: this.collection.slug,
143
+ data: {
144
+ ...body,
145
+ password: hashedPassword,
146
+ roles: ["admin"], // Default first user to admin
147
+ },
148
+ });
149
+ // 3. Log them in immediately
150
+ const token = await issueAuthSessionToken({
151
+ config,
152
+ userId: user.id,
153
+ email: user.email,
154
+ collection: this.collection.slug,
155
+ ip: c.get("clientIp"),
156
+ authSource: "local",
157
+ });
158
+ // Send welcome email (best-effort — never block login)
159
+ const { subject, html } = buildWelcomeEmail(config, { email: body.email });
160
+ sendEmail(config, { to: body.email, subject, html }).catch((err) => getRequestLogger(c, "auth").error({
161
+ err,
162
+ msg: "Failed to send welcome email",
163
+ email: body.email,
164
+ }));
165
+ const safeUser = this.sanitizeUser(user);
166
+ return c.json({ token, user: safeUser });
167
+ }
168
+ // ---------------------------------------------------------------------------
169
+ // POST /login
170
+ // ---------------------------------------------------------------------------
171
+ async login(c) {
172
+ const db = c.get("config").db;
173
+ if (!db)
174
+ return c.json({ message: "Database not configured" }, 500);
175
+ const body = await c.req.json().catch(() => null);
176
+ if (!body?.email || !body?.password) {
177
+ return c.json({ error: true, message: "email and password are required." }, 400);
178
+ }
179
+ const result = await db.find({
180
+ collection: this.collection.slug,
181
+ where: { email: body.email },
182
+ limit: 1,
183
+ });
184
+ const user = result.docs[0];
185
+ if (!user) {
186
+ return c.json({ error: true, message: "Invalid email or password." }, 401);
187
+ }
188
+ if (user.status === "pending") {
189
+ return c.json({ error: true, message: "This invitation has not been accepted yet." }, 403);
190
+ }
191
+ const lockedUntilMs = getLockedUntilMs(user.lockedUntil);
192
+ if (lockedUntilMs !== null && lockedUntilMs > Date.now()) {
193
+ const retryAfterSeconds = Math.max(1, Math.ceil((lockedUntilMs - Date.now()) / 1000));
194
+ c.header("Retry-After", String(retryAfterSeconds));
195
+ return c.json({
196
+ error: true,
197
+ message: "Too many login attempts. Try again later.",
198
+ retryAfterSeconds,
199
+ }, 429);
200
+ }
201
+ const valid = await verifyPassword(body.password, user.password);
202
+ if (!valid) {
203
+ const { justLocked, retryAfterSeconds } = await this.recordFailedLogin(c, user);
204
+ if (justLocked && retryAfterSeconds) {
205
+ c.header("Retry-After", String(retryAfterSeconds));
206
+ return c.json({
207
+ error: true,
208
+ message: "Too many login attempts. Try again later.",
209
+ retryAfterSeconds,
210
+ }, 429);
211
+ }
212
+ return c.json({ error: true, message: "Invalid email or password." }, 401);
213
+ }
214
+ if ((typeof user.loginAttempts === "number" && user.loginAttempts > 0) ||
215
+ user.lockedUntil != null) {
216
+ await this.clearLockoutState(c, String(user.id));
217
+ }
218
+ const token = await issueAuthSessionToken({
219
+ config: c.get("config"),
220
+ userId: user.id,
221
+ email: user.email,
222
+ collection: this.collection.slug,
223
+ ip: c.get("clientIp"),
224
+ authSource: "local",
225
+ });
226
+ // Strip password before returning
227
+ const safeUser = this.sanitizeUser(user);
228
+ return c.json({ token, user: safeUser });
229
+ }
230
+ // ---------------------------------------------------------------------------
231
+ // POST /logout
232
+ // Revoke the current session by default. Pass `?allSessions=true` to revoke
233
+ // every active session for the current account.
234
+ // ---------------------------------------------------------------------------
235
+ async logout(c) {
236
+ const requestUser = c.get("user");
237
+ const tokenPayload = c.get("authTokenPayload");
238
+ const allSessions = ["1", "true", "yes"].includes((c.req.query("allSessions") || "").toLowerCase());
239
+ if (!requestUser) {
240
+ if (allSessions) {
241
+ return c.json({ error: true, message: "Authentication required." }, 401);
242
+ }
243
+ return c.json({
244
+ success: true,
245
+ message: "Logged out. Discard your token.",
246
+ });
247
+ }
248
+ if (allSessions) {
249
+ await revokeAllAuthSessions(c.get("config"), {
250
+ userId: requestUser.sub,
251
+ collection: this.collection.slug,
252
+ });
253
+ return c.json({
254
+ success: true,
255
+ message: "All sessions have been logged out.",
256
+ });
257
+ }
258
+ if (tokenPayload?.sid) {
259
+ await revokeAuthSession(c.get("config"), tokenPayload.sid);
260
+ return c.json({
261
+ success: true,
262
+ message: "Logged out.",
263
+ });
264
+ }
265
+ return c.json({
266
+ success: true,
267
+ message: "Logged out. Discard your token.",
268
+ });
269
+ }
270
+ // ---------------------------------------------------------------------------
271
+ // GET /me
272
+ // ---------------------------------------------------------------------------
273
+ async me(c) {
274
+ const db = c.get("config").db;
275
+ if (!db)
276
+ return c.json({ message: "Database not configured" }, 500);
277
+ const requestUser = c.get("user");
278
+ if (!requestUser) {
279
+ return c.json({ error: true, message: "Authentication required." }, 401);
280
+ }
281
+ const user = await db.findOne({
282
+ collection: this.collection.slug,
283
+ id: requestUser.sub,
284
+ });
285
+ if (!user) {
286
+ return c.json({ error: true, message: "User not found." }, 404);
287
+ }
288
+ const safeUser = this.sanitizeUser(user);
289
+ return c.json(safeUser);
290
+ }
291
+ // ---------------------------------------------------------------------------
292
+ // POST /refresh-token
293
+ // ---------------------------------------------------------------------------
294
+ async refreshToken(c) {
295
+ const requestUser = c.get("user");
296
+ if (!requestUser) {
297
+ return c.json({ error: true, message: "Authentication required." }, 401);
298
+ }
299
+ if (!requestUser.email) {
300
+ return c.json({ error: true, message: "Authenticated user is missing an email." }, 400);
301
+ }
302
+ const tokenPayload = c.get("authTokenPayload");
303
+ if (tokenPayload?.sid) {
304
+ const token = await signCollectionToken({
305
+ sub: requestUser.sub,
306
+ email: requestUser.email,
307
+ collection: this.collection.slug,
308
+ sid: tokenPayload.sid,
309
+ });
310
+ return c.json({ token });
311
+ }
312
+ const token = await issueAuthSessionToken({
313
+ config: c.get("config"),
314
+ userId: requestUser.sub,
315
+ email: requestUser.email,
316
+ collection: this.collection.slug,
317
+ ip: c.get("clientIp"),
318
+ authSource: "local",
319
+ });
320
+ return c.json({ token });
321
+ }
322
+ // ---------------------------------------------------------------------------
323
+ // POST /forgot-password
324
+ // Requires config.email to be set. Silently succeeds if email not found
325
+ // to prevent email enumeration.
326
+ // ---------------------------------------------------------------------------
327
+ async forgotPassword(c) {
328
+ const config = c.get("config");
329
+ const db = config.db;
330
+ if (!db)
331
+ return c.json({ message: "Database not configured" }, 500);
332
+ const body = await c.req.json().catch(() => null);
333
+ if (!body?.email) {
334
+ return c.json({ error: true, message: "email is required." }, 400);
335
+ }
336
+ const result = await db.find({
337
+ collection: this.collection.slug,
338
+ where: { email: body.email },
339
+ limit: 1,
340
+ });
341
+ const user = result.docs[0];
342
+ if (user) {
343
+ // Issue a short-lived reset token (1-hour)
344
+ const resetToken = await signCollectionToken({
345
+ sub: user.id,
346
+ email: user.email,
347
+ collection: this.collection.slug,
348
+ purpose: "reset",
349
+ }, "1h");
350
+ // Append token to resetUrl if provided
351
+ const resetUrl = body?.resetUrl;
352
+ const url = resetUrl
353
+ ? `${resetUrl}${resetUrl.includes("?") ? "&" : "?"}token=${encodeURIComponent(resetToken)}`
354
+ : undefined;
355
+ try {
356
+ const { subject, html } = buildResetPasswordEmail(config, {
357
+ token: resetToken,
358
+ url,
359
+ });
360
+ await sendEmail(config, { to: user.email, subject, html });
361
+ }
362
+ catch (err) {
363
+ getRequestLogger(c, "auth").error({
364
+ err,
365
+ msg: "Failed to send password reset email",
366
+ email: user.email,
367
+ });
368
+ }
369
+ }
370
+ return c.json({
371
+ success: true,
372
+ message: "If an account with that email exists, a reset link has been sent.",
373
+ });
374
+ }
375
+ // ---------------------------------------------------------------------------
376
+ // POST /reset-password
377
+ // Expects { token: string, password: string } in body.
378
+ // The token is the reset JWT issued by /forgot-password.
379
+ // ---------------------------------------------------------------------------
380
+ async resetPassword(c) {
381
+ const config = c.get("config");
382
+ const db = config.db;
383
+ if (!db)
384
+ return c.json({ message: "Database not configured" }, 500);
385
+ const body = await c.req.json().catch(() => null);
386
+ if (!body?.token || !body?.password) {
387
+ return c.json({ error: true, message: "token and password are required." }, 400);
388
+ }
389
+ // Verify the reset token
390
+ let payload;
391
+ try {
392
+ payload = await verifyCollectionToken(body.token);
393
+ }
394
+ catch {
395
+ return c.json({ error: true, message: "Reset token is invalid or has expired." }, 400);
396
+ }
397
+ if (payload.collection !== this.collection.slug ||
398
+ payload.purpose !== "reset") {
399
+ return c.json({ error: true, message: "Reset token is invalid or has expired." }, 400);
400
+ }
401
+ const hashedPassword = await hashPassword(body.password);
402
+ await db.update({
403
+ collection: this.collection.slug,
404
+ id: payload.sub,
405
+ data: {
406
+ password: hashedPassword,
407
+ loginAttempts: 0,
408
+ lockedUntil: null,
409
+ },
410
+ });
411
+ await revokeAllAuthSessions(config, {
412
+ userId: payload.sub,
413
+ collection: this.collection.slug,
414
+ });
415
+ // Notify the user their password was changed (security alert)
416
+ const { subject, html } = buildPasswordChangedEmail(config, {
417
+ email: payload.email,
418
+ });
419
+ sendEmail(config, { to: payload.email, subject, html }).catch((err) => getRequestLogger(c, "auth").error({
420
+ err,
421
+ msg: "Failed to send password-changed email",
422
+ email: payload.email,
423
+ }));
424
+ return c.json({
425
+ success: true,
426
+ message: "Password has been reset. You can now log in.",
427
+ });
428
+ }
429
+ // ---------------------------------------------------------------------------
430
+ // POST /invite
431
+ // Requires auth. Issues a signed invite token and emails it to the invitee.
432
+ // If inviteUrl is provided, the email uses a clickable acceptance URL.
433
+ // ---------------------------------------------------------------------------
434
+ async invite(c) {
435
+ const config = c.get("config");
436
+ const db = config.db;
437
+ if (!db)
438
+ return c.json({ message: "Database not configured" }, 500);
439
+ const requestUser = c.get("user");
440
+ if (!requestUser) {
441
+ return c.json({ error: true, message: "Authentication required." }, 401);
442
+ }
443
+ const body = await c.req.json().catch(() => null);
444
+ if (!body?.email) {
445
+ return c.json({ error: true, message: "email is required." }, 400);
446
+ }
447
+ // Prevent inviting an email that already has an active account.
448
+ const existing = await db.find({
449
+ collection: this.collection.slug,
450
+ where: { email: body.email },
451
+ limit: 1,
452
+ });
453
+ const existingUser = existing.docs[0];
454
+ const existingIsPending = existingUser?.status === "pending";
455
+ if (existingUser && !existingIsPending) {
456
+ return c.json({ error: true, message: "An account with that email already exists." }, 409);
457
+ }
458
+ if (!existingUser) {
459
+ await db.create({
460
+ collection: this.collection.slug,
461
+ data: await this.buildPendingInviteData(body.email),
462
+ });
463
+ }
464
+ // sub = invitee email (no user doc yet); purpose = 'invite'
465
+ const inviteToken = await signCollectionToken({
466
+ sub: body.email,
467
+ email: body.email,
468
+ collection: this.collection.slug,
469
+ purpose: "invite",
470
+ }, "7d");
471
+ const inviteUrl = body?.inviteUrl;
472
+ const url = inviteUrl
473
+ ? `${inviteUrl}${inviteUrl.includes("?") ? "&" : "?"}inviteToken=${encodeURIComponent(inviteToken)}`
474
+ : undefined;
475
+ try {
476
+ const { subject, html } = buildInviteEmail(config, {
477
+ token: inviteToken,
478
+ invitedByEmail: requestUser.email,
479
+ url,
480
+ });
481
+ await sendEmail(config, { to: body.email, subject, html });
482
+ }
483
+ catch (err) {
484
+ getRequestLogger(c, "auth").error({
485
+ err,
486
+ msg: "Failed to send invite email",
487
+ email: body.email,
488
+ });
489
+ }
490
+ return c.json({
491
+ success: true,
492
+ message: `Invite sent to ${body.email}.`,
493
+ token: inviteToken,
494
+ inviteUrl: url,
495
+ });
496
+ }
497
+ // ---------------------------------------------------------------------------
498
+ // POST /accept-invite
499
+ // Public. Validates the invite token and creates the user account.
500
+ // Body: { token, password, ...extraFields }
501
+ // ---------------------------------------------------------------------------
502
+ async acceptInvite(c) {
503
+ const config = c.get("config");
504
+ const db = config.db;
505
+ if (!db)
506
+ return c.json({ message: "Database not configured" }, 500);
507
+ const body = await c.req.json().catch(() => null);
508
+ if (!body?.token || !body?.password) {
509
+ return c.json({ error: true, message: "token and password are required." }, 400);
510
+ }
511
+ let payload;
512
+ try {
513
+ payload = await verifyCollectionToken(body.token);
514
+ }
515
+ catch {
516
+ return c.json({ error: true, message: "Invite token is invalid or has expired." }, 400);
517
+ }
518
+ if (payload.collection !== this.collection.slug ||
519
+ payload.purpose !== "invite") {
520
+ return c.json({ error: true, message: "Invite token is invalid or has expired." }, 400);
521
+ }
522
+ const inviteeEmail = payload.sub;
523
+ // Guard against double-accept while still supporting pending pre-provisioned users.
524
+ const existing = await db.find({
525
+ collection: this.collection.slug,
526
+ where: { email: inviteeEmail },
527
+ limit: 1,
528
+ });
529
+ const existingUser = existing.docs[0];
530
+ const existingIsPending = existingUser?.status === "pending";
531
+ if (existingUser && !existingIsPending) {
532
+ return c.json({ error: true, message: "An account with that email already exists." }, 409);
533
+ }
534
+ const { token: _t, password: _p, ...extraFields } = body;
535
+ const hashedPassword = await hashPassword(body.password);
536
+ const user = existingUser
537
+ ? await db.update({
538
+ collection: this.collection.slug,
539
+ id: String(existingUser.id),
540
+ data: this.buildAcceptedInviteData(hashedPassword, extraFields),
541
+ })
542
+ : await db.create({
543
+ collection: this.collection.slug,
544
+ data: {
545
+ ...extraFields,
546
+ email: inviteeEmail,
547
+ ...this.buildAcceptedInviteData(hashedPassword, {}),
548
+ },
549
+ });
550
+ // Log them in immediately
551
+ const sessionToken = await issueAuthSessionToken({
552
+ config,
553
+ userId: user.id,
554
+ email: inviteeEmail,
555
+ collection: this.collection.slug,
556
+ ip: c.get("clientIp"),
557
+ authSource: "local",
558
+ });
559
+ // Send welcome email (best-effort)
560
+ const { subject, html } = buildWelcomeEmail(config, {
561
+ email: inviteeEmail,
562
+ });
563
+ sendEmail(config, { to: inviteeEmail, subject, html }).catch((err) => getRequestLogger(c, "auth").error({
564
+ err,
565
+ msg: "Failed to send welcome email",
566
+ email: inviteeEmail,
567
+ }));
568
+ const safeUser = this.sanitizeUser(user);
569
+ return c.json({ token: sessionToken, user: safeUser }, 201);
570
+ }
571
+ }
572
+ //# sourceMappingURL=auth.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.controller.js","sourceRoot":"","sources":["../../src/controllers/auth.controller.ts"],"names":[],"mappings":"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"}