@shipfox/api-auth 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (319) hide show
  1. package/.turbo/turbo-build.log +2 -0
  2. package/.turbo/turbo-type$colon$emit.log +1 -0
  3. package/.turbo/turbo-type.log +1 -0
  4. package/CHANGELOG.md +116 -0
  5. package/LICENSE +21 -0
  6. package/README.md +336 -0
  7. package/dist/config.d.ts +22 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +95 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/core/auth.d.ts +108 -0
  12. package/dist/core/auth.d.ts.map +1 -0
  13. package/dist/core/auth.js +476 -0
  14. package/dist/core/auth.js.map +1 -0
  15. package/dist/core/entities/email-verification.d.ts +9 -0
  16. package/dist/core/entities/email-verification.d.ts.map +1 -0
  17. package/dist/core/entities/email-verification.js +3 -0
  18. package/dist/core/entities/email-verification.js.map +1 -0
  19. package/dist/core/entities/password-reset.d.ts +9 -0
  20. package/dist/core/entities/password-reset.d.ts.map +1 -0
  21. package/dist/core/entities/password-reset.js +3 -0
  22. package/dist/core/entities/password-reset.js.map +1 -0
  23. package/dist/core/entities/refresh-token.d.ts +12 -0
  24. package/dist/core/entities/refresh-token.d.ts.map +1 -0
  25. package/dist/core/entities/refresh-token.js +3 -0
  26. package/dist/core/entities/refresh-token.js.map +1 -0
  27. package/dist/core/entities/user.d.ts +12 -0
  28. package/dist/core/entities/user.d.ts.map +1 -0
  29. package/dist/core/entities/user.js +3 -0
  30. package/dist/core/entities/user.js.map +1 -0
  31. package/dist/core/errors.d.ts +54 -0
  32. package/dist/core/errors.d.ts.map +1 -0
  33. package/dist/core/errors.js +106 -0
  34. package/dist/core/errors.js.map +1 -0
  35. package/dist/core/job-lease-token.d.ts +12 -0
  36. package/dist/core/job-lease-token.d.ts.map +1 -0
  37. package/dist/core/job-lease-token.js +58 -0
  38. package/dist/core/job-lease-token.js.map +1 -0
  39. package/dist/core/jwt.d.ts +37 -0
  40. package/dist/core/jwt.d.ts.map +1 -0
  41. package/dist/core/jwt.js +46 -0
  42. package/dist/core/jwt.js.map +1 -0
  43. package/dist/core/password.d.ts +10 -0
  44. package/dist/core/password.d.ts.map +1 -0
  45. package/dist/core/password.js +13 -0
  46. package/dist/core/password.js.map +1 -0
  47. package/dist/core/rate-limit.d.ts +34 -0
  48. package/dist/core/rate-limit.d.ts.map +1 -0
  49. package/dist/core/rate-limit.js +76 -0
  50. package/dist/core/rate-limit.js.map +1 -0
  51. package/dist/core/runner-session-token.d.ts +6 -0
  52. package/dist/core/runner-session-token.d.ts.map +1 -0
  53. package/dist/core/runner-session-token.js +37 -0
  54. package/dist/core/runner-session-token.js.map +1 -0
  55. package/dist/db/db.d.ts +1723 -0
  56. package/dist/db/db.d.ts.map +1 -0
  57. package/dist/db/db.js +28 -0
  58. package/dist/db/db.js.map +1 -0
  59. package/dist/db/email-verifications.d.ts +39 -0
  60. package/dist/db/email-verifications.d.ts.map +1 -0
  61. package/dist/db/email-verifications.js +95 -0
  62. package/dist/db/email-verifications.js.map +1 -0
  63. package/dist/db/migrations.d.ts +2 -0
  64. package/dist/db/migrations.d.ts.map +1 -0
  65. package/dist/db/migrations.js +5 -0
  66. package/dist/db/migrations.js.map +1 -0
  67. package/dist/db/password-resets.d.ts +23 -0
  68. package/dist/db/password-resets.d.ts.map +1 -0
  69. package/dist/db/password-resets.js +37 -0
  70. package/dist/db/password-resets.js.map +1 -0
  71. package/dist/db/rate-limits.d.ts +18 -0
  72. package/dist/db/rate-limits.d.ts.map +1 -0
  73. package/dist/db/rate-limits.js +44 -0
  74. package/dist/db/rate-limits.js.map +1 -0
  75. package/dist/db/refresh-tokens.d.ts +44 -0
  76. package/dist/db/refresh-tokens.d.ts.map +1 -0
  77. package/dist/db/refresh-tokens.js +71 -0
  78. package/dist/db/refresh-tokens.js.map +1 -0
  79. package/dist/db/schema/common.d.ts +2 -0
  80. package/dist/db/schema/common.d.ts.map +1 -0
  81. package/dist/db/schema/common.js +4 -0
  82. package/dist/db/schema/common.js.map +1 -0
  83. package/dist/db/schema/email-verifications.d.ts +114 -0
  84. package/dist/db/schema/email-verifications.d.ts.map +1 -0
  85. package/dist/db/schema/email-verifications.js +35 -0
  86. package/dist/db/schema/email-verifications.js.map +1 -0
  87. package/dist/db/schema/outbox.d.ts +195 -0
  88. package/dist/db/schema/outbox.d.ts.map +1 -0
  89. package/dist/db/schema/outbox.js +5 -0
  90. package/dist/db/schema/outbox.js.map +1 -0
  91. package/dist/db/schema/password-resets.d.ts +114 -0
  92. package/dist/db/schema/password-resets.d.ts.map +1 -0
  93. package/dist/db/schema/password-resets.js +35 -0
  94. package/dist/db/schema/password-resets.js.map +1 -0
  95. package/dist/db/schema/rate-limits.d.ts +145 -0
  96. package/dist/db/schema/rate-limits.d.ts.map +1 -0
  97. package/dist/db/schema/rate-limits.js +25 -0
  98. package/dist/db/schema/rate-limits.js.map +1 -0
  99. package/dist/db/schema/refresh-tokens.d.ts +165 -0
  100. package/dist/db/schema/refresh-tokens.d.ts.map +1 -0
  101. package/dist/db/schema/refresh-tokens.js +47 -0
  102. package/dist/db/schema/refresh-tokens.js.map +1 -0
  103. package/dist/db/schema/users.d.ts +149 -0
  104. package/dist/db/schema/users.d.ts.map +1 -0
  105. package/dist/db/schema/users.js +40 -0
  106. package/dist/db/schema/users.js.map +1 -0
  107. package/dist/db/users.d.ts +28 -0
  108. package/dist/db/users.d.ts.map +1 -0
  109. package/dist/db/users.js +83 -0
  110. package/dist/db/users.js.map +1 -0
  111. package/dist/index.d.ts +14 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +52 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/metrics/index.d.ts +2 -0
  116. package/dist/metrics/index.d.ts.map +1 -0
  117. package/dist/metrics/index.js +3 -0
  118. package/dist/metrics/index.js.map +1 -0
  119. package/dist/metrics/instance.d.ts +16 -0
  120. package/dist/metrics/instance.d.ts.map +1 -0
  121. package/dist/metrics/instance.js +52 -0
  122. package/dist/metrics/instance.js.map +1 -0
  123. package/dist/presentation/auth/bearer-token-auth.d.ts +15 -0
  124. package/dist/presentation/auth/bearer-token-auth.d.ts.map +1 -0
  125. package/dist/presentation/auth/bearer-token-auth.js +31 -0
  126. package/dist/presentation/auth/bearer-token-auth.js.map +1 -0
  127. package/dist/presentation/auth/jwt-auth.d.ts +10 -0
  128. package/dist/presentation/auth/jwt-auth.d.ts.map +1 -0
  129. package/dist/presentation/auth/jwt-auth.js +31 -0
  130. package/dist/presentation/auth/jwt-auth.js.map +1 -0
  131. package/dist/presentation/auth/lease-token-auth.d.ts +15 -0
  132. package/dist/presentation/auth/lease-token-auth.d.ts.map +1 -0
  133. package/dist/presentation/auth/lease-token-auth.js +27 -0
  134. package/dist/presentation/auth/lease-token-auth.js.map +1 -0
  135. package/dist/presentation/auth/refresh-cookie.d.ts +7 -0
  136. package/dist/presentation/auth/refresh-cookie.d.ts.map +1 -0
  137. package/dist/presentation/auth/refresh-cookie.js +29 -0
  138. package/dist/presentation/auth/refresh-cookie.js.map +1 -0
  139. package/dist/presentation/auth/runner-session-auth.d.ts +3 -0
  140. package/dist/presentation/auth/runner-session-auth.d.ts.map +1 -0
  141. package/dist/presentation/auth/runner-session-auth.js +16 -0
  142. package/dist/presentation/auth/runner-session-auth.js.map +1 -0
  143. package/dist/presentation/dto/user.d.ts +8 -0
  144. package/dist/presentation/dto/user.d.ts.map +1 -0
  145. package/dist/presentation/dto/user.js +19 -0
  146. package/dist/presentation/dto/user.js.map +1 -0
  147. package/dist/presentation/e2eRoutes/create-session.d.ts +2 -0
  148. package/dist/presentation/e2eRoutes/create-session.d.ts.map +1 -0
  149. package/dist/presentation/e2eRoutes/create-session.js +49 -0
  150. package/dist/presentation/e2eRoutes/create-session.js.map +1 -0
  151. package/dist/presentation/e2eRoutes/create-user.d.ts +2 -0
  152. package/dist/presentation/e2eRoutes/create-user.d.ts.map +1 -0
  153. package/dist/presentation/e2eRoutes/create-user.js +42 -0
  154. package/dist/presentation/e2eRoutes/create-user.js.map +1 -0
  155. package/dist/presentation/e2eRoutes/index.d.ts +3 -0
  156. package/dist/presentation/e2eRoutes/index.d.ts.map +1 -0
  157. package/dist/presentation/e2eRoutes/index.js +15 -0
  158. package/dist/presentation/e2eRoutes/index.js.map +1 -0
  159. package/dist/presentation/routes/email-verification/verify-email-confirm.d.ts +2 -0
  160. package/dist/presentation/routes/email-verification/verify-email-confirm.d.ts.map +1 -0
  161. package/dist/presentation/routes/email-verification/verify-email-confirm.js +35 -0
  162. package/dist/presentation/routes/email-verification/verify-email-confirm.js.map +1 -0
  163. package/dist/presentation/routes/email-verification/verify-email-resend.d.ts +2 -0
  164. package/dist/presentation/routes/email-verification/verify-email-resend.d.ts.map +1 -0
  165. package/dist/presentation/routes/email-verification/verify-email-resend.js +27 -0
  166. package/dist/presentation/routes/email-verification/verify-email-resend.js.map +1 -0
  167. package/dist/presentation/routes/index.d.ts +3 -0
  168. package/dist/presentation/routes/index.d.ts.map +1 -0
  169. package/dist/presentation/routes/index.js +31 -0
  170. package/dist/presentation/routes/index.js.map +1 -0
  171. package/dist/presentation/routes/password/change-password.d.ts +2 -0
  172. package/dist/presentation/routes/password/change-password.d.ts.map +1 -0
  173. package/dist/presentation/routes/password/change-password.js +50 -0
  174. package/dist/presentation/routes/password/change-password.js.map +1 -0
  175. package/dist/presentation/routes/password/password-reset-confirm.d.ts +2 -0
  176. package/dist/presentation/routes/password/password-reset-confirm.d.ts.map +1 -0
  177. package/dist/presentation/routes/password/password-reset-confirm.js +36 -0
  178. package/dist/presentation/routes/password/password-reset-confirm.js.map +1 -0
  179. package/dist/presentation/routes/password/password-reset-request.d.ts +2 -0
  180. package/dist/presentation/routes/password/password-reset-request.d.ts.map +1 -0
  181. package/dist/presentation/routes/password/password-reset-request.js +26 -0
  182. package/dist/presentation/routes/password/password-reset-request.js.map +1 -0
  183. package/dist/presentation/routes/rate-limit.d.ts +10 -0
  184. package/dist/presentation/routes/rate-limit.d.ts.map +1 -0
  185. package/dist/presentation/routes/rate-limit.js +101 -0
  186. package/dist/presentation/routes/rate-limit.js.map +1 -0
  187. package/dist/presentation/routes/registration/signup.d.ts +2 -0
  188. package/dist/presentation/routes/registration/signup.d.ts.map +1 -0
  189. package/dist/presentation/routes/registration/signup.js +82 -0
  190. package/dist/presentation/routes/registration/signup.js.map +1 -0
  191. package/dist/presentation/routes/session/login.d.ts +2 -0
  192. package/dist/presentation/routes/session/login.d.ts.map +1 -0
  193. package/dist/presentation/routes/session/login.js +48 -0
  194. package/dist/presentation/routes/session/login.js.map +1 -0
  195. package/dist/presentation/routes/session/logout.d.ts +2 -0
  196. package/dist/presentation/routes/session/logout.d.ts.map +1 -0
  197. package/dist/presentation/routes/session/logout.js +25 -0
  198. package/dist/presentation/routes/session/logout.js.map +1 -0
  199. package/dist/presentation/routes/session/me.d.ts +2 -0
  200. package/dist/presentation/routes/session/me.d.ts.map +1 -0
  201. package/dist/presentation/routes/session/me.js +42 -0
  202. package/dist/presentation/routes/session/me.js.map +1 -0
  203. package/dist/presentation/routes/session/refresh.d.ts +2 -0
  204. package/dist/presentation/routes/session/refresh.d.ts.map +1 -0
  205. package/dist/presentation/routes/session/refresh.js +49 -0
  206. package/dist/presentation/routes/session/refresh.js.map +1 -0
  207. package/dist/presentation/subscribers/index.d.ts +3 -0
  208. package/dist/presentation/subscribers/index.d.ts.map +1 -0
  209. package/dist/presentation/subscribers/index.js +4 -0
  210. package/dist/presentation/subscribers/index.js.map +1 -0
  211. package/dist/presentation/subscribers/on-email-verification-send-requested.d.ts +3 -0
  212. package/dist/presentation/subscribers/on-email-verification-send-requested.d.ts.map +1 -0
  213. package/dist/presentation/subscribers/on-email-verification-send-requested.js +13 -0
  214. package/dist/presentation/subscribers/on-email-verification-send-requested.js.map +1 -0
  215. package/dist/presentation/subscribers/on-password-reset-send-requested.d.ts +3 -0
  216. package/dist/presentation/subscribers/on-password-reset-send-requested.d.ts.map +1 -0
  217. package/dist/presentation/subscribers/on-password-reset-send-requested.js +14 -0
  218. package/dist/presentation/subscribers/on-password-reset-send-requested.js.map +1 -0
  219. package/dist/tsconfig.test.tsbuildinfo +1 -0
  220. package/drizzle/0000_initial.sql +81 -0
  221. package/drizzle/meta/0000_snapshot.json +643 -0
  222. package/drizzle/meta/_journal.json +13 -0
  223. package/drizzle.config.ts +7 -0
  224. package/package.json +88 -0
  225. package/src/config.ts +88 -0
  226. package/src/core/auth.test.ts +675 -0
  227. package/src/core/auth.ts +560 -0
  228. package/src/core/entities/email-verification.ts +8 -0
  229. package/src/core/entities/password-reset.ts +8 -0
  230. package/src/core/entities/refresh-token.ts +11 -0
  231. package/src/core/entities/user.ts +12 -0
  232. package/src/core/errors.ts +123 -0
  233. package/src/core/job-lease-token.test.ts +201 -0
  234. package/src/core/job-lease-token.ts +83 -0
  235. package/src/core/jwt.test.ts +180 -0
  236. package/src/core/jwt.ts +66 -0
  237. package/src/core/password.test.ts +28 -0
  238. package/src/core/password.ts +21 -0
  239. package/src/core/rate-limit.test.ts +462 -0
  240. package/src/core/rate-limit.ts +130 -0
  241. package/src/core/runner-session-token.test.ts +126 -0
  242. package/src/core/runner-session-token.ts +49 -0
  243. package/src/db/db.ts +28 -0
  244. package/src/db/email-verifications.test.ts +61 -0
  245. package/src/db/email-verifications.ts +160 -0
  246. package/src/db/migrations.ts +4 -0
  247. package/src/db/password-resets.test.ts +61 -0
  248. package/src/db/password-resets.ts +69 -0
  249. package/src/db/rate-limits.ts +69 -0
  250. package/src/db/refresh-tokens.test.ts +164 -0
  251. package/src/db/refresh-tokens.ts +149 -0
  252. package/src/db/schema/common.ts +3 -0
  253. package/src/db/schema/email-verifications.ts +37 -0
  254. package/src/db/schema/outbox.ts +4 -0
  255. package/src/db/schema/password-resets.ts +37 -0
  256. package/src/db/schema/rate-limits.ts +27 -0
  257. package/src/db/schema/refresh-tokens.ts +43 -0
  258. package/src/db/schema/users.ts +37 -0
  259. package/src/db/users.test.ts +75 -0
  260. package/src/db/users.ts +121 -0
  261. package/src/index.test.ts +39 -0
  262. package/src/index.ts +69 -0
  263. package/src/metrics/index.ts +13 -0
  264. package/src/metrics/instance.test.ts +69 -0
  265. package/src/metrics/instance.ts +77 -0
  266. package/src/presentation/auth/bearer-token-auth.test.ts +99 -0
  267. package/src/presentation/auth/bearer-token-auth.ts +51 -0
  268. package/src/presentation/auth/jwt-auth.test.ts +136 -0
  269. package/src/presentation/auth/jwt-auth.ts +39 -0
  270. package/src/presentation/auth/lease-token-auth.test.ts +56 -0
  271. package/src/presentation/auth/lease-token-auth.ts +25 -0
  272. package/src/presentation/auth/refresh-cookie.test.ts +39 -0
  273. package/src/presentation/auth/refresh-cookie.ts +34 -0
  274. package/src/presentation/auth/runner-session-auth.test.ts +54 -0
  275. package/src/presentation/auth/runner-session-auth.ts +13 -0
  276. package/src/presentation/dto/user.ts +21 -0
  277. package/src/presentation/e2eRoutes/create-session.ts +39 -0
  278. package/src/presentation/e2eRoutes/create-user.ts +38 -0
  279. package/src/presentation/e2eRoutes/index.test.ts +102 -0
  280. package/src/presentation/e2eRoutes/index.ts +10 -0
  281. package/src/presentation/routes/email-verification/verify-email-confirm.test.ts +66 -0
  282. package/src/presentation/routes/email-verification/verify-email-confirm.ts +37 -0
  283. package/src/presentation/routes/email-verification/verify-email-resend.test.ts +100 -0
  284. package/src/presentation/routes/email-verification/verify-email-resend.ts +26 -0
  285. package/src/presentation/routes/index.ts +29 -0
  286. package/src/presentation/routes/password/change-password.test.ts +106 -0
  287. package/src/presentation/routes/password/change-password.ts +45 -0
  288. package/src/presentation/routes/password/password-reset-confirm.test.ts +63 -0
  289. package/src/presentation/routes/password/password-reset-confirm.ts +35 -0
  290. package/src/presentation/routes/password/password-reset-request.test.ts +56 -0
  291. package/src/presentation/routes/password/password-reset-request.ts +25 -0
  292. package/src/presentation/routes/rate-limit.test.ts +341 -0
  293. package/src/presentation/routes/rate-limit.ts +119 -0
  294. package/src/presentation/routes/registration/signup.test.ts +284 -0
  295. package/src/presentation/routes/registration/signup.ts +81 -0
  296. package/src/presentation/routes/session/login.test.ts +77 -0
  297. package/src/presentation/routes/session/login.ts +50 -0
  298. package/src/presentation/routes/session/logout.test.ts +55 -0
  299. package/src/presentation/routes/session/logout.ts +23 -0
  300. package/src/presentation/routes/session/me.test.ts +56 -0
  301. package/src/presentation/routes/session/me.ts +35 -0
  302. package/src/presentation/routes/session/refresh.test.ts +89 -0
  303. package/src/presentation/routes/session/refresh.ts +54 -0
  304. package/src/presentation/subscribers/email-send-requested.test.ts +77 -0
  305. package/src/presentation/subscribers/index.ts +2 -0
  306. package/src/presentation/subscribers/on-email-verification-send-requested.ts +10 -0
  307. package/src/presentation/subscribers/on-password-reset-send-requested.ts +13 -0
  308. package/test/env.ts +10 -0
  309. package/test/factories/index.ts +1 -0
  310. package/test/factories/user.ts +36 -0
  311. package/test/globalSetup.ts +18 -0
  312. package/test/index.ts +1 -0
  313. package/test/routes.ts +275 -0
  314. package/test/setup.ts +17 -0
  315. package/tsconfig.build.json +9 -0
  316. package/tsconfig.build.tsbuildinfo +1 -0
  317. package/tsconfig.json +4 -0
  318. package/tsconfig.test.json +8 -0
  319. package/vitest.config.ts +11 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/presentation/routes/session/login.ts"],"sourcesContent":["import {loginBodySchema, loginResponseSchema} from '@shipfox/api-auth-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {login} from '#core/auth.js';\nimport {\n AuthDependencyUnavailableError,\n EmailNotVerifiedError,\n InvalidCredentialsError,\n} from '#core/errors.js';\nimport {setRefreshTokenCookie} from '#presentation/auth/refresh-cookie.js';\nimport {toAuthSessionDto} from '#presentation/dto/user.js';\nimport {createAuthRateLimitPreHandler} from '#presentation/routes/rate-limit.js';\n\nexport const loginRoute = defineRoute({\n method: 'POST',\n path: '/login',\n description: 'Sign in with an email address and password.',\n schema: {\n body: loginBodySchema,\n response: {\n 200: loginResponseSchema,\n },\n },\n preHandler: createAuthRateLimitPreHandler('login'),\n errorHandler: (error) => {\n if (error instanceof InvalidCredentialsError) {\n throw new ClientError('Invalid credentials', 'invalid-credentials', {status: 401});\n }\n if (error instanceof EmailNotVerifiedError) {\n throw new ClientError('Email not verified', 'email-not-verified', {status: 403});\n }\n if (error instanceof AuthDependencyUnavailableError) {\n throw new ClientError(\n 'Authentication dependency unavailable',\n 'auth-dependency-unavailable',\n {\n status: 503,\n },\n );\n }\n throw error;\n },\n handler: async (request, reply) => {\n const {email, password} = request.body;\n\n const result = await login({email, password});\n setRefreshTokenCookie(reply, result.refreshToken);\n\n return toAuthSessionDto(result);\n },\n});\n"],"names":["loginBodySchema","loginResponseSchema","ClientError","defineRoute","login","AuthDependencyUnavailableError","EmailNotVerifiedError","InvalidCredentialsError","setRefreshTokenCookie","toAuthSessionDto","createAuthRateLimitPreHandler","loginRoute","method","path","description","schema","body","response","preHandler","errorHandler","error","status","handler","request","reply","email","password","result","refreshToken"],"mappings":"AAAA,SAAQA,eAAe,EAAEC,mBAAmB,QAAO,wBAAwB;AAC3E,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,KAAK,QAAO,gBAAgB;AACpC,SACEC,8BAA8B,EAC9BC,qBAAqB,EACrBC,uBAAuB,QAClB,kBAAkB;AACzB,SAAQC,qBAAqB,QAAO,uCAAuC;AAC3E,SAAQC,gBAAgB,QAAO,4BAA4B;AAC3D,SAAQC,6BAA6B,QAAO,qCAAqC;AAEjF,OAAO,MAAMC,aAAaR,YAAY;IACpCS,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMhB;QACNiB,UAAU;YACR,KAAKhB;QACP;IACF;IACAiB,YAAYR,8BAA8B;IAC1CS,cAAc,CAACC;QACb,IAAIA,iBAAiBb,yBAAyB;YAC5C,MAAM,IAAIL,YAAY,uBAAuB,uBAAuB;gBAACmB,QAAQ;YAAG;QAClF;QACA,IAAID,iBAAiBd,uBAAuB;YAC1C,MAAM,IAAIJ,YAAY,sBAAsB,sBAAsB;gBAACmB,QAAQ;YAAG;QAChF;QACA,IAAID,iBAAiBf,gCAAgC;YACnD,MAAM,IAAIH,YACR,yCACA,+BACA;gBACEmB,QAAQ;YACV;QAEJ;QACA,MAAMD;IACR;IACAE,SAAS,OAAOC,SAASC;QACvB,MAAM,EAACC,KAAK,EAAEC,QAAQ,EAAC,GAAGH,QAAQP,IAAI;QAEtC,MAAMW,SAAS,MAAMvB,MAAM;YAACqB;YAAOC;QAAQ;QAC3ClB,sBAAsBgB,OAAOG,OAAOC,YAAY;QAEhD,OAAOnB,iBAAiBkB;IAC1B;AACF,GAAG"}
@@ -0,0 +1,2 @@
1
+ export declare const logoutRoute: import("@shipfox/node-fastify").RouteDefinition;
2
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../../src/presentation/routes/session/logout.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,WAAW,iDAgBtB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { logoutBodySchema } from '@shipfox/api-auth-dto';
2
+ import { defineRoute } from '@shipfox/node-fastify';
3
+ import { z } from 'zod';
4
+ import { logout } from '#core/auth.js';
5
+ import { clearRefreshTokenCookie, getRefreshTokenCookie } from '#presentation/auth/refresh-cookie.js';
6
+ export const logoutRoute = defineRoute({
7
+ method: 'POST',
8
+ path: '/logout',
9
+ description: 'Sign out of the current session.',
10
+ schema: {
11
+ body: logoutBodySchema,
12
+ response: {
13
+ 204: z.void()
14
+ }
15
+ },
16
+ handler: async (request, reply)=>{
17
+ await logout({
18
+ refreshToken: getRefreshTokenCookie(request)
19
+ });
20
+ clearRefreshTokenCookie(reply);
21
+ reply.code(204);
22
+ }
23
+ });
24
+
25
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/presentation/routes/session/logout.ts"],"sourcesContent":["import {logoutBodySchema} from '@shipfox/api-auth-dto';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {z} from 'zod';\nimport {logout} from '#core/auth.js';\nimport {clearRefreshTokenCookie, getRefreshTokenCookie} from '#presentation/auth/refresh-cookie.js';\n\nexport const logoutRoute = defineRoute({\n method: 'POST',\n path: '/logout',\n description: 'Sign out of the current session.',\n schema: {\n body: logoutBodySchema,\n response: {\n 204: z.void(),\n },\n },\n handler: async (request, reply) => {\n await logout({refreshToken: getRefreshTokenCookie(request)});\n clearRefreshTokenCookie(reply);\n\n reply.code(204);\n },\n});\n"],"names":["logoutBodySchema","defineRoute","z","logout","clearRefreshTokenCookie","getRefreshTokenCookie","logoutRoute","method","path","description","schema","body","response","void","handler","request","reply","refreshToken","code"],"mappings":"AAAA,SAAQA,gBAAgB,QAAO,wBAAwB;AACvD,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAQC,CAAC,QAAO,MAAM;AACtB,SAAQC,MAAM,QAAO,gBAAgB;AACrC,SAAQC,uBAAuB,EAAEC,qBAAqB,QAAO,uCAAuC;AAEpG,OAAO,MAAMC,cAAcL,YAAY;IACrCM,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMX;QACNY,UAAU;YACR,KAAKV,EAAEW,IAAI;QACb;IACF;IACAC,SAAS,OAAOC,SAASC;QACvB,MAAMb,OAAO;YAACc,cAAcZ,sBAAsBU;QAAQ;QAC1DX,wBAAwBY;QAExBA,MAAME,IAAI,CAAC;IACb;AACF,GAAG"}
@@ -0,0 +1,2 @@
1
+ export declare const meRoute: import("@shipfox/node-fastify").RouteDefinition;
2
+ //# sourceMappingURL=me.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"me.d.ts","sourceRoot":"","sources":["../../../../src/presentation/routes/session/me.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,OAAO,iDA0BlB,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { AUTH_USER } from '@shipfox/api-auth-context';
2
+ import { meResponseSchema } from '@shipfox/api-auth-dto';
3
+ import { ClientError, defineRoute } from '@shipfox/node-fastify';
4
+ import { getCurrentUser } from '#core/auth.js';
5
+ import { UserNotFoundError } from '#core/errors.js';
6
+ import { getClientContext } from '#presentation/auth/jwt-auth.js';
7
+ import { toUserDto } from '#presentation/dto/user.js';
8
+ export const meRoute = defineRoute({
9
+ method: 'GET',
10
+ path: '/me',
11
+ description: 'Get the signed-in user.',
12
+ auth: AUTH_USER,
13
+ schema: {
14
+ response: {
15
+ 200: meResponseSchema
16
+ }
17
+ },
18
+ errorHandler: (error)=>{
19
+ if (error instanceof UserNotFoundError) {
20
+ throw new ClientError('User not found', 'not-found', {
21
+ status: 404
22
+ });
23
+ }
24
+ throw error;
25
+ },
26
+ handler: async (request)=>{
27
+ const client = getClientContext(request);
28
+ if (!client) {
29
+ throw new ClientError('Authentication required', 'unauthorized', {
30
+ status: 401
31
+ });
32
+ }
33
+ const result = await getCurrentUser({
34
+ userId: client.userId
35
+ });
36
+ return {
37
+ user: toUserDto(result.user)
38
+ };
39
+ }
40
+ });
41
+
42
+ //# sourceMappingURL=me.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/presentation/routes/session/me.ts"],"sourcesContent":["import {AUTH_USER} from '@shipfox/api-auth-context';\nimport {meResponseSchema} from '@shipfox/api-auth-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {getCurrentUser} from '#core/auth.js';\nimport {UserNotFoundError} from '#core/errors.js';\nimport {getClientContext} from '#presentation/auth/jwt-auth.js';\nimport {toUserDto} from '#presentation/dto/user.js';\n\nexport const meRoute = defineRoute({\n method: 'GET',\n path: '/me',\n description: 'Get the signed-in user.',\n auth: AUTH_USER,\n schema: {\n response: {\n 200: meResponseSchema,\n },\n },\n errorHandler: (error) => {\n if (error instanceof UserNotFoundError) {\n throw new ClientError('User not found', 'not-found', {status: 404});\n }\n throw error;\n },\n handler: async (request) => {\n const client = getClientContext(request);\n if (!client) {\n throw new ClientError('Authentication required', 'unauthorized', {status: 401});\n }\n\n const result = await getCurrentUser({userId: client.userId});\n\n return {user: toUserDto(result.user)};\n },\n});\n"],"names":["AUTH_USER","meResponseSchema","ClientError","defineRoute","getCurrentUser","UserNotFoundError","getClientContext","toUserDto","meRoute","method","path","description","auth","schema","response","errorHandler","error","status","handler","request","client","result","userId","user"],"mappings":"AAAA,SAAQA,SAAS,QAAO,4BAA4B;AACpD,SAAQC,gBAAgB,QAAO,wBAAwB;AACvD,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,cAAc,QAAO,gBAAgB;AAC7C,SAAQC,iBAAiB,QAAO,kBAAkB;AAClD,SAAQC,gBAAgB,QAAO,iCAAiC;AAChE,SAAQC,SAAS,QAAO,4BAA4B;AAEpD,OAAO,MAAMC,UAAUL,YAAY;IACjCM,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,MAAMZ;IACNa,QAAQ;QACNC,UAAU;YACR,KAAKb;QACP;IACF;IACAc,cAAc,CAACC;QACb,IAAIA,iBAAiBX,mBAAmB;YACtC,MAAM,IAAIH,YAAY,kBAAkB,aAAa;gBAACe,QAAQ;YAAG;QACnE;QACA,MAAMD;IACR;IACAE,SAAS,OAAOC;QACd,MAAMC,SAASd,iBAAiBa;QAChC,IAAI,CAACC,QAAQ;YACX,MAAM,IAAIlB,YAAY,2BAA2B,gBAAgB;gBAACe,QAAQ;YAAG;QAC/E;QAEA,MAAMI,SAAS,MAAMjB,eAAe;YAACkB,QAAQF,OAAOE,MAAM;QAAA;QAE1D,OAAO;YAACC,MAAMhB,UAAUc,OAAOE,IAAI;QAAC;IACtC;AACF,GAAG"}
@@ -0,0 +1,2 @@
1
+ export declare const refreshRoute: import("@shipfox/node-fastify").RouteDefinition;
2
+ //# sourceMappingURL=refresh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../../../src/presentation/routes/session/refresh.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,YAAY,iDA0CvB,CAAC"}
@@ -0,0 +1,49 @@
1
+ import { refreshResponseSchema } from '@shipfox/api-auth-dto';
2
+ import { ClientError, defineRoute } from '@shipfox/node-fastify';
3
+ import { refreshAccessToken } from '#core/auth.js';
4
+ import { AuthDependencyUnavailableError, TokenInvalidError } from '#core/errors.js';
5
+ import { clearRefreshTokenCookie, getRefreshTokenCookie, setRefreshTokenCookie } from '#presentation/auth/refresh-cookie.js';
6
+ import { toAuthSessionDto } from '#presentation/dto/user.js';
7
+ export const refreshRoute = defineRoute({
8
+ method: 'POST',
9
+ path: '/refresh',
10
+ description: 'Refresh the current browser session access token.',
11
+ schema: {
12
+ response: {
13
+ 200: refreshResponseSchema
14
+ }
15
+ },
16
+ errorHandler: (error, _request, reply)=>{
17
+ if (error instanceof TokenInvalidError) {
18
+ clearRefreshTokenCookie(reply);
19
+ throw new ClientError('Refresh token is invalid or expired', 'unauthorized', {
20
+ status: 401
21
+ });
22
+ }
23
+ if (error instanceof AuthDependencyUnavailableError) {
24
+ throw new ClientError('Authentication dependency unavailable', 'auth-dependency-unavailable', {
25
+ status: 503
26
+ });
27
+ }
28
+ throw error;
29
+ },
30
+ handler: async (request, reply)=>{
31
+ const refreshToken = getRefreshTokenCookie(request);
32
+ if (!refreshToken) {
33
+ clearRefreshTokenCookie(reply);
34
+ throw new ClientError('Refresh token is invalid or expired', 'unauthorized', {
35
+ status: 401
36
+ });
37
+ }
38
+ const result = await refreshAccessToken({
39
+ refreshToken
40
+ });
41
+ // Absent on a grace-window hit: keep the existing cookie rather than overwrite it.
42
+ if (result.refreshToken) {
43
+ setRefreshTokenCookie(reply, result.refreshToken);
44
+ }
45
+ return toAuthSessionDto(result);
46
+ }
47
+ });
48
+
49
+ //# sourceMappingURL=refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/presentation/routes/session/refresh.ts"],"sourcesContent":["import {refreshResponseSchema} from '@shipfox/api-auth-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {refreshAccessToken} from '#core/auth.js';\nimport {AuthDependencyUnavailableError, TokenInvalidError} from '#core/errors.js';\nimport {\n clearRefreshTokenCookie,\n getRefreshTokenCookie,\n setRefreshTokenCookie,\n} from '#presentation/auth/refresh-cookie.js';\nimport {toAuthSessionDto} from '#presentation/dto/user.js';\n\nexport const refreshRoute = defineRoute({\n method: 'POST',\n path: '/refresh',\n description: 'Refresh the current browser session access token.',\n schema: {\n response: {\n 200: refreshResponseSchema,\n },\n },\n errorHandler: (error, _request, reply) => {\n if (error instanceof TokenInvalidError) {\n clearRefreshTokenCookie(reply);\n throw new ClientError('Refresh token is invalid or expired', 'unauthorized', {\n status: 401,\n });\n }\n if (error instanceof AuthDependencyUnavailableError) {\n throw new ClientError(\n 'Authentication dependency unavailable',\n 'auth-dependency-unavailable',\n {\n status: 503,\n },\n );\n }\n throw error;\n },\n handler: async (request, reply) => {\n const refreshToken = getRefreshTokenCookie(request);\n if (!refreshToken) {\n clearRefreshTokenCookie(reply);\n throw new ClientError('Refresh token is invalid or expired', 'unauthorized', {status: 401});\n }\n\n const result = await refreshAccessToken({refreshToken});\n\n // Absent on a grace-window hit: keep the existing cookie rather than overwrite it.\n if (result.refreshToken) {\n setRefreshTokenCookie(reply, result.refreshToken);\n }\n return toAuthSessionDto(result);\n },\n});\n"],"names":["refreshResponseSchema","ClientError","defineRoute","refreshAccessToken","AuthDependencyUnavailableError","TokenInvalidError","clearRefreshTokenCookie","getRefreshTokenCookie","setRefreshTokenCookie","toAuthSessionDto","refreshRoute","method","path","description","schema","response","errorHandler","error","_request","reply","status","handler","request","refreshToken","result"],"mappings":"AAAA,SAAQA,qBAAqB,QAAO,wBAAwB;AAC5D,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,kBAAkB,QAAO,gBAAgB;AACjD,SAAQC,8BAA8B,EAAEC,iBAAiB,QAAO,kBAAkB;AAClF,SACEC,uBAAuB,EACvBC,qBAAqB,EACrBC,qBAAqB,QAChB,uCAAuC;AAC9C,SAAQC,gBAAgB,QAAO,4BAA4B;AAE3D,OAAO,MAAMC,eAAeR,YAAY;IACtCS,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,UAAU;YACR,KAAKf;QACP;IACF;IACAgB,cAAc,CAACC,OAAOC,UAAUC;QAC9B,IAAIF,iBAAiBZ,mBAAmB;YACtCC,wBAAwBa;YACxB,MAAM,IAAIlB,YAAY,uCAAuC,gBAAgB;gBAC3EmB,QAAQ;YACV;QACF;QACA,IAAIH,iBAAiBb,gCAAgC;YACnD,MAAM,IAAIH,YACR,yCACA,+BACA;gBACEmB,QAAQ;YACV;QAEJ;QACA,MAAMH;IACR;IACAI,SAAS,OAAOC,SAASH;QACvB,MAAMI,eAAehB,sBAAsBe;QAC3C,IAAI,CAACC,cAAc;YACjBjB,wBAAwBa;YACxB,MAAM,IAAIlB,YAAY,uCAAuC,gBAAgB;gBAACmB,QAAQ;YAAG;QAC3F;QAEA,MAAMI,SAAS,MAAMrB,mBAAmB;YAACoB;QAAY;QAErD,mFAAmF;QACnF,IAAIC,OAAOD,YAAY,EAAE;YACvBf,sBAAsBW,OAAOK,OAAOD,YAAY;QAClD;QACA,OAAOd,iBAAiBe;IAC1B;AACF,GAAG"}
@@ -0,0 +1,3 @@
1
+ export { onEmailVerificationSendRequested } from './on-email-verification-send-requested.js';
2
+ export { onPasswordResetSendRequested } from './on-password-reset-send-requested.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/presentation/subscribers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,gCAAgC,EAAC,MAAM,2CAA2C,CAAC;AAC3F,OAAO,EAAC,4BAA4B,EAAC,MAAM,uCAAuC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { onEmailVerificationSendRequested } from './on-email-verification-send-requested.js';
2
+ export { onPasswordResetSendRequested } from './on-password-reset-send-requested.js';
3
+
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/subscribers/index.ts"],"sourcesContent":["export {onEmailVerificationSendRequested} from './on-email-verification-send-requested.js';\nexport {onPasswordResetSendRequested} from './on-password-reset-send-requested.js';\n"],"names":["onEmailVerificationSendRequested","onPasswordResetSendRequested"],"mappings":"AAAA,SAAQA,gCAAgC,QAAO,4CAA4C;AAC3F,SAAQC,4BAA4B,QAAO,wCAAwC"}
@@ -0,0 +1,3 @@
1
+ import type { AuthEmailVerificationSendRequestedEvent } from '@shipfox/api-auth-dto';
2
+ export declare function onEmailVerificationSendRequested(payload: AuthEmailVerificationSendRequestedEvent): Promise<void>;
3
+ //# sourceMappingURL=on-email-verification-send-requested.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-email-verification-send-requested.d.ts","sourceRoot":"","sources":["../../../src/presentation/subscribers/on-email-verification-send-requested.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,uCAAuC,EAAC,MAAM,uBAAuB,CAAC;AAInF,wBAAsB,gCAAgC,CACpD,OAAO,EAAE,uCAAuC,GAC/C,OAAO,CAAC,IAAI,CAAC,CAGf"}
@@ -0,0 +1,13 @@
1
+ import { renderEmail } from '@shipfox/node-email';
2
+ import { mailer } from '#config.js';
3
+ export async function onEmailVerificationSendRequested(payload) {
4
+ const email = await renderEmail('verify-email', {
5
+ verifyLink: payload.verifyLink
6
+ });
7
+ await mailer.send({
8
+ to: payload.email,
9
+ ...email
10
+ });
11
+ }
12
+
13
+ //# sourceMappingURL=on-email-verification-send-requested.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/subscribers/on-email-verification-send-requested.ts"],"sourcesContent":["import type {AuthEmailVerificationSendRequestedEvent} from '@shipfox/api-auth-dto';\nimport {renderEmail} from '@shipfox/node-email';\nimport {mailer} from '#config.js';\n\nexport async function onEmailVerificationSendRequested(\n payload: AuthEmailVerificationSendRequestedEvent,\n): Promise<void> {\n const email = await renderEmail('verify-email', {verifyLink: payload.verifyLink});\n await mailer.send({to: payload.email, ...email});\n}\n"],"names":["renderEmail","mailer","onEmailVerificationSendRequested","payload","email","verifyLink","send","to"],"mappings":"AACA,SAAQA,WAAW,QAAO,sBAAsB;AAChD,SAAQC,MAAM,QAAO,aAAa;AAElC,OAAO,eAAeC,iCACpBC,OAAgD;IAEhD,MAAMC,QAAQ,MAAMJ,YAAY,gBAAgB;QAACK,YAAYF,QAAQE,UAAU;IAAA;IAC/E,MAAMJ,OAAOK,IAAI,CAAC;QAACC,IAAIJ,QAAQC,KAAK;QAAE,GAAGA,KAAK;IAAA;AAChD"}
@@ -0,0 +1,3 @@
1
+ import type { AuthPasswordResetSendRequestedEvent } from '@shipfox/api-auth-dto';
2
+ export declare function onPasswordResetSendRequested(payload: AuthPasswordResetSendRequestedEvent): Promise<void>;
3
+ //# sourceMappingURL=on-password-reset-send-requested.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-password-reset-send-requested.d.ts","sourceRoot":"","sources":["../../../src/presentation/subscribers/on-password-reset-send-requested.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,mCAAmC,EAAC,MAAM,uBAAuB,CAAC;AAI/E,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,mCAAmC,GAC3C,OAAO,CAAC,IAAI,CAAC,CAMf"}
@@ -0,0 +1,14 @@
1
+ import { renderEmail } from '@shipfox/node-email';
2
+ import { mailer } from '#config.js';
3
+ export async function onPasswordResetSendRequested(payload) {
4
+ const email = await renderEmail('reset-password', {
5
+ resetLink: payload.resetLink,
6
+ expiresInHours: payload.expiresInHours
7
+ });
8
+ await mailer.send({
9
+ to: payload.email,
10
+ ...email
11
+ });
12
+ }
13
+
14
+ //# sourceMappingURL=on-password-reset-send-requested.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/presentation/subscribers/on-password-reset-send-requested.ts"],"sourcesContent":["import type {AuthPasswordResetSendRequestedEvent} from '@shipfox/api-auth-dto';\nimport {renderEmail} from '@shipfox/node-email';\nimport {mailer} from '#config.js';\n\nexport async function onPasswordResetSendRequested(\n payload: AuthPasswordResetSendRequestedEvent,\n): Promise<void> {\n const email = await renderEmail('reset-password', {\n resetLink: payload.resetLink,\n expiresInHours: payload.expiresInHours,\n });\n await mailer.send({to: payload.email, ...email});\n}\n"],"names":["renderEmail","mailer","onPasswordResetSendRequested","payload","email","resetLink","expiresInHours","send","to"],"mappings":"AACA,SAAQA,WAAW,QAAO,sBAAsB;AAChD,SAAQC,MAAM,QAAO,aAAa;AAElC,OAAO,eAAeC,6BACpBC,OAA4C;IAE5C,MAAMC,QAAQ,MAAMJ,YAAY,kBAAkB;QAChDK,WAAWF,QAAQE,SAAS;QAC5BC,gBAAgBH,QAAQG,cAAc;IACxC;IACA,MAAML,OAAOM,IAAI,CAAC;QAACC,IAAIL,QAAQC,KAAK;QAAE,GAAGA,KAAK;IAAA;AAChD"}