@shipfox/api-auth 5.0.0 → 7.0.1

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 (154) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +69 -0
  3. package/README.md +71 -37
  4. package/dist/config.d.ts +0 -12
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js +0 -62
  7. package/dist/config.js.map +1 -1
  8. package/dist/core/auth.d.ts +21 -2
  9. package/dist/core/auth.d.ts.map +1 -1
  10. package/dist/core/auth.js +109 -77
  11. package/dist/core/auth.js.map +1 -1
  12. package/dist/core/email-owner.d.ts +12 -0
  13. package/dist/core/email-owner.d.ts.map +1 -0
  14. package/dist/core/email-owner.js +20 -0
  15. package/dist/core/email-owner.js.map +1 -0
  16. package/dist/core/job-lease-token.d.ts.map +1 -1
  17. package/dist/core/job-lease-token.js +3 -2
  18. package/dist/core/job-lease-token.js.map +1 -1
  19. package/dist/core/jwt.d.ts +2 -2
  20. package/dist/core/jwt.d.ts.map +1 -1
  21. package/dist/core/jwt.js.map +1 -1
  22. package/dist/core/rate-limit.d.ts.map +1 -1
  23. package/dist/core/rate-limit.js +2 -7
  24. package/dist/core/rate-limit.js.map +1 -1
  25. package/dist/core/runner-session-token.d.ts.map +1 -1
  26. package/dist/core/runner-session-token.js +3 -2
  27. package/dist/core/runner-session-token.js.map +1 -1
  28. package/dist/db/db.d.ts +0 -218
  29. package/dist/db/db.d.ts.map +1 -1
  30. package/dist/db/db.js +0 -2
  31. package/dist/db/db.js.map +1 -1
  32. package/dist/db/users.d.ts +3 -0
  33. package/dist/db/users.d.ts.map +1 -1
  34. package/dist/db/users.js +28 -10
  35. package/dist/db/users.js.map +1 -1
  36. package/dist/index.d.ts +5 -1
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +40 -34
  39. package/dist/index.js.map +1 -1
  40. package/dist/presentation/auth/jwt-auth.d.ts.map +1 -1
  41. package/dist/presentation/auth/jwt-auth.js +2 -2
  42. package/dist/presentation/auth/jwt-auth.js.map +1 -1
  43. package/dist/presentation/e2eRoutes/create-session.d.ts +2 -1
  44. package/dist/presentation/e2eRoutes/create-session.d.ts.map +1 -1
  45. package/dist/presentation/e2eRoutes/create-session.js +42 -39
  46. package/dist/presentation/e2eRoutes/create-session.js.map +1 -1
  47. package/dist/presentation/e2eRoutes/index.d.ts +2 -1
  48. package/dist/presentation/e2eRoutes/index.d.ts.map +1 -1
  49. package/dist/presentation/e2eRoutes/index.js +12 -10
  50. package/dist/presentation/e2eRoutes/index.js.map +1 -1
  51. package/dist/presentation/inter-module.d.ts +4 -0
  52. package/dist/presentation/inter-module.d.ts.map +1 -0
  53. package/dist/presentation/inter-module.js +16 -0
  54. package/dist/presentation/inter-module.js.map +1 -0
  55. package/dist/presentation/routes/email-verification/verify-email-confirm.d.ts +2 -1
  56. package/dist/presentation/routes/email-verification/verify-email-confirm.d.ts.map +1 -1
  57. package/dist/presentation/routes/email-verification/verify-email-confirm.js +36 -25
  58. package/dist/presentation/routes/email-verification/verify-email-confirm.js.map +1 -1
  59. package/dist/presentation/routes/email-verification/verify-email-resend.d.ts.map +1 -1
  60. package/dist/presentation/routes/email-verification/verify-email-resend.js +20 -4
  61. package/dist/presentation/routes/email-verification/verify-email-resend.js.map +1 -1
  62. package/dist/presentation/routes/index.d.ts +2 -2
  63. package/dist/presentation/routes/index.d.ts.map +1 -1
  64. package/dist/presentation/routes/index.js +11 -13
  65. package/dist/presentation/routes/index.js.map +1 -1
  66. package/dist/presentation/routes/password/password-reset-confirm.d.ts +2 -1
  67. package/dist/presentation/routes/password/password-reset-confirm.d.ts.map +1 -1
  68. package/dist/presentation/routes/password/password-reset-confirm.js +29 -26
  69. package/dist/presentation/routes/password/password-reset-confirm.js.map +1 -1
  70. package/dist/presentation/routes/registration/signup.d.ts +2 -1
  71. package/dist/presentation/routes/registration/signup.d.ts.map +1 -1
  72. package/dist/presentation/routes/registration/signup.js +86 -68
  73. package/dist/presentation/routes/registration/signup.js.map +1 -1
  74. package/dist/presentation/routes/session/login.d.ts +2 -1
  75. package/dist/presentation/routes/session/login.d.ts.map +1 -1
  76. package/dist/presentation/routes/session/login.js +40 -37
  77. package/dist/presentation/routes/session/login.js.map +1 -1
  78. package/dist/presentation/routes/session/refresh.d.ts +2 -1
  79. package/dist/presentation/routes/session/refresh.d.ts.map +1 -1
  80. package/dist/presentation/routes/session/refresh.js +42 -39
  81. package/dist/presentation/routes/session/refresh.js.map +1 -1
  82. package/dist/presentation/subscribers/index.d.ts +0 -1
  83. package/dist/presentation/subscribers/index.d.ts.map +1 -1
  84. package/dist/presentation/subscribers/index.js +0 -1
  85. package/dist/presentation/subscribers/index.js.map +1 -1
  86. package/dist/presentation/subscribers/on-password-reset-send-requested.js +1 -1
  87. package/dist/presentation/subscribers/on-password-reset-send-requested.js.map +1 -1
  88. package/dist/tsconfig.test.tsbuildinfo +1 -1
  89. package/drizzle/0000_initial.sql +1 -13
  90. package/drizzle/meta/0000_snapshot.json +0 -92
  91. package/package.json +18 -14
  92. package/src/config.ts +0 -56
  93. package/src/core/auth.test.ts +106 -187
  94. package/src/core/auth.ts +131 -87
  95. package/src/core/email-owner.test.ts +86 -0
  96. package/src/core/email-owner.ts +23 -0
  97. package/src/core/job-lease-token.test.ts +2 -1
  98. package/src/core/job-lease-token.ts +3 -2
  99. package/src/core/jwt.ts +2 -2
  100. package/src/core/rate-limit.test.ts +11 -28
  101. package/src/core/rate-limit.ts +3 -11
  102. package/src/core/runner-session-token.test.ts +2 -1
  103. package/src/core/runner-session-token.ts +3 -2
  104. package/src/db/db.ts +0 -2
  105. package/src/db/users.ts +32 -14
  106. package/src/index.test.ts +15 -11
  107. package/src/index.ts +23 -20
  108. package/src/presentation/auth/jwt-auth.test.ts +2 -1
  109. package/src/presentation/auth/jwt-auth.ts +2 -2
  110. package/src/presentation/e2eRoutes/create-session.ts +34 -30
  111. package/src/presentation/e2eRoutes/index.test.ts +9 -6
  112. package/src/presentation/e2eRoutes/index.ts +8 -5
  113. package/src/presentation/inter-module.ts +13 -0
  114. package/src/presentation/routes/email-verification/verify-email-confirm.ts +42 -24
  115. package/src/presentation/routes/email-verification/verify-email-resend.ts +18 -4
  116. package/src/presentation/routes/index.test.ts +10 -3
  117. package/src/presentation/routes/index.ts +22 -12
  118. package/src/presentation/routes/password/password-reset-confirm.ts +25 -22
  119. package/src/presentation/routes/password/password-reset-request.test.ts +1 -0
  120. package/src/presentation/routes/rate-limit.test.ts +2 -2
  121. package/src/presentation/routes/registration/signup.test.ts +39 -74
  122. package/src/presentation/routes/registration/signup.ts +89 -70
  123. package/src/presentation/routes/session/login.ts +38 -35
  124. package/src/presentation/routes/session/refresh.ts +43 -40
  125. package/src/presentation/subscribers/email-send-requested.test.ts +2 -30
  126. package/src/presentation/subscribers/index.ts +0 -1
  127. package/src/presentation/subscribers/on-password-reset-send-requested.ts +1 -1
  128. package/test/env.ts +1 -3
  129. package/test/globalSetup.ts +10 -1
  130. package/test/routes.ts +51 -84
  131. package/tsconfig.build.tsbuildinfo +1 -1
  132. package/dist/core/entities/email-verification.d.ts +0 -9
  133. package/dist/core/entities/email-verification.d.ts.map +0 -1
  134. package/dist/core/entities/email-verification.js +0 -3
  135. package/dist/core/entities/email-verification.js.map +0 -1
  136. package/dist/db/email-verifications.d.ts +0 -39
  137. package/dist/db/email-verifications.d.ts.map +0 -1
  138. package/dist/db/email-verifications.js +0 -95
  139. package/dist/db/email-verifications.js.map +0 -1
  140. package/dist/db/schema/email-verifications.d.ts +0 -114
  141. package/dist/db/schema/email-verifications.d.ts.map +0 -1
  142. package/dist/db/schema/email-verifications.js +0 -35
  143. package/dist/db/schema/email-verifications.js.map +0 -1
  144. package/dist/presentation/subscribers/on-email-verification-send-requested.d.ts +0 -3
  145. package/dist/presentation/subscribers/on-email-verification-send-requested.d.ts.map +0 -1
  146. package/dist/presentation/subscribers/on-email-verification-send-requested.js +0 -13
  147. package/dist/presentation/subscribers/on-email-verification-send-requested.js.map +0 -1
  148. package/src/core/entities/email-verification.ts +0 -8
  149. package/src/db/email-verifications.test.ts +0 -61
  150. package/src/db/email-verifications.ts +0 -160
  151. package/src/db/schema/email-verifications.ts +0 -37
  152. package/src/presentation/routes/email-verification/verify-email-confirm.test.ts +0 -66
  153. package/src/presentation/routes/email-verification/verify-email-resend.test.ts +0 -100
  154. package/src/presentation/subscribers/on-email-verification-send-requested.ts +0 -10
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { AUTH_EMAIL_VERIFICATION_SEND_REQUESTED, AUTH_PASSWORD_RESET_SEND_REQUESTED, authEventSchemas } from '@shipfox/api-auth-dto';
1
+ import { AUTH_PASSWORD_RESET_SEND_REQUESTED, authEventSchemas } from '@shipfox/api-auth-dto';
2
2
  import { subscriberFactory } from '@shipfox/node-module';
3
3
  import { config } from '#config.js';
4
4
  import { db } from '#db/db.js';
@@ -7,11 +7,13 @@ import { authOutbox } from '#db/schema/outbox.js';
7
7
  import { createJwtAuthMethod } from '#presentation/auth/jwt-auth.js';
8
8
  import { createLeaseTokenAuthMethod } from '#presentation/auth/lease-token-auth.js';
9
9
  import { createRunnerSessionAuthMethod } from '#presentation/auth/runner-session-auth.js';
10
- import { authE2eRoutes } from '#presentation/e2eRoutes/index.js';
11
- import { authRoutes } from '#presentation/routes/index.js';
12
- import { onEmailVerificationSendRequested, onPasswordResetSendRequested } from '#presentation/subscribers/index.js';
10
+ import { createAuthE2eRoutes } from '#presentation/e2eRoutes/index.js';
11
+ import { createAuthInterModulePresentation } from '#presentation/inter-module.js';
12
+ import { buildAuthRoutes } from '#presentation/routes/index.js';
13
+ import { onPasswordResetSendRequested } from '#presentation/subscribers/index.js';
13
14
  import { passwordLoginMethods } from './login-methods.js';
14
15
  export { createSessionForUser, provisionUser } from '#core/auth.js';
16
+ export { findUserByEmail } from '#core/email-owner.js';
15
17
  export { AuthDependencyUnavailableError, EmailNotVerifiedError, InvalidCredentialsError, UserNotFoundError } from '#core/errors.js';
16
18
  export { issueJobLeaseToken, jobLeaseParamsFrom, verifyJobLeaseToken } from '#core/job-lease-token.js';
17
19
  export { issueRunnerSessionToken, verifyRunnerSessionToken } from '#core/runner-session-token.js';
@@ -20,36 +22,40 @@ export { createLeaseTokenAuthMethod } from '#presentation/auth/lease-token-auth.
20
22
  export { authCookiePlugin, clearRefreshTokenCookie, getRefreshTokenCookie, setRefreshTokenCookie } from '#presentation/auth/refresh-cookie.js';
21
23
  export { createRunnerSessionAuthMethod } from '#presentation/auth/runner-session-auth.js';
22
24
  const subscriber = subscriberFactory();
23
- export const authModule = {
24
- name: 'auth',
25
- database: {
26
- db,
27
- migrationsPath
28
- },
29
- auth: [
30
- createJwtAuthMethod(),
31
- createLeaseTokenAuthMethod(),
32
- createRunnerSessionAuthMethod()
33
- ],
34
- loginMethods: passwordLoginMethods(config.AUTH_PASSWORD_ENABLED),
35
- routes: [
36
- authRoutes
37
- ],
38
- e2eRoutes: [
39
- authE2eRoutes
40
- ],
41
- publishers: [
42
- {
43
- name: 'auth',
44
- table: authOutbox,
25
+ export function createAuthModule({ workspaces }) {
26
+ return {
27
+ name: 'auth',
28
+ database: {
45
29
  db,
46
- eventSchemas: authEventSchemas
47
- }
48
- ],
49
- subscribers: [
50
- subscriber(AUTH_EMAIL_VERIFICATION_SEND_REQUESTED, onEmailVerificationSendRequested),
51
- subscriber(AUTH_PASSWORD_RESET_SEND_REQUESTED, onPasswordResetSendRequested)
52
- ]
53
- };
30
+ migrationsPath
31
+ },
32
+ auth: [
33
+ createJwtAuthMethod(),
34
+ createLeaseTokenAuthMethod(),
35
+ createRunnerSessionAuthMethod()
36
+ ],
37
+ loginMethods: passwordLoginMethods(config.AUTH_PASSWORD_ENABLED),
38
+ routes: [
39
+ buildAuthRoutes(config.AUTH_PASSWORD_ENABLED, workspaces)
40
+ ],
41
+ e2eRoutes: [
42
+ createAuthE2eRoutes(workspaces)
43
+ ],
44
+ publishers: [
45
+ {
46
+ name: 'auth',
47
+ table: authOutbox,
48
+ db,
49
+ eventSchemas: authEventSchemas
50
+ }
51
+ ],
52
+ subscribers: [
53
+ subscriber(AUTH_PASSWORD_RESET_SEND_REQUESTED, onPasswordResetSendRequested)
54
+ ],
55
+ interModulePresentations: [
56
+ createAuthInterModulePresentation()
57
+ ]
58
+ };
59
+ }
54
60
 
55
61
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n AUTH_EMAIL_VERIFICATION_SEND_REQUESTED,\n AUTH_PASSWORD_RESET_SEND_REQUESTED,\n type AuthEventMap,\n authEventSchemas,\n} from '@shipfox/api-auth-dto';\nimport type {ShipfoxModule} from '@shipfox/node-module';\nimport {subscriberFactory} from '@shipfox/node-module';\nimport {config} from '#config.js';\nimport {db} from '#db/db.js';\nimport {migrationsPath} from '#db/migrations.js';\nimport {authOutbox} from '#db/schema/outbox.js';\nimport {createJwtAuthMethod} from '#presentation/auth/jwt-auth.js';\nimport {createLeaseTokenAuthMethod} from '#presentation/auth/lease-token-auth.js';\nimport {createRunnerSessionAuthMethod} from '#presentation/auth/runner-session-auth.js';\nimport {authE2eRoutes} from '#presentation/e2eRoutes/index.js';\nimport {authRoutes} from '#presentation/routes/index.js';\nimport {\n onEmailVerificationSendRequested,\n onPasswordResetSendRequested,\n} from '#presentation/subscribers/index.js';\nimport {passwordLoginMethods} from './login-methods.js';\n\nexport type {JobLeaseTokenClaims, RunnerSessionTokenClaims} from '@shipfox/api-auth-dto';\nexport type {\n CreateSessionForUserError,\n CreateSessionForUserParams,\n CreateSessionForUserResult,\n ProvisionUserParams,\n} from '#core/auth.js';\nexport {createSessionForUser, provisionUser} from '#core/auth.js';\nexport type {User, UserStatus} from '#core/entities/user.js';\nexport {\n AuthDependencyUnavailableError,\n EmailNotVerifiedError,\n InvalidCredentialsError,\n UserNotFoundError,\n} from '#core/errors.js';\nexport {\n issueJobLeaseToken,\n jobLeaseParamsFrom,\n verifyJobLeaseToken,\n} from '#core/job-lease-token.js';\nexport {\n issueRunnerSessionToken,\n verifyRunnerSessionToken,\n} from '#core/runner-session-token.js';\nexport {createJwtAuthMethod} from '#presentation/auth/jwt-auth.js';\nexport {createLeaseTokenAuthMethod} from '#presentation/auth/lease-token-auth.js';\nexport {\n authCookiePlugin,\n clearRefreshTokenCookie,\n getRefreshTokenCookie,\n setRefreshTokenCookie,\n} from '#presentation/auth/refresh-cookie.js';\nexport {createRunnerSessionAuthMethod} from '#presentation/auth/runner-session-auth.js';\n\nconst subscriber = subscriberFactory<AuthEventMap>();\n\nexport const authModule: ShipfoxModule = {\n name: 'auth',\n database: {db, migrationsPath},\n auth: [createJwtAuthMethod(), createLeaseTokenAuthMethod(), createRunnerSessionAuthMethod()],\n loginMethods: passwordLoginMethods(config.AUTH_PASSWORD_ENABLED),\n routes: [authRoutes],\n e2eRoutes: [authE2eRoutes],\n publishers: [{name: 'auth', table: authOutbox, db, eventSchemas: authEventSchemas}],\n subscribers: [\n subscriber(AUTH_EMAIL_VERIFICATION_SEND_REQUESTED, onEmailVerificationSendRequested),\n subscriber(AUTH_PASSWORD_RESET_SEND_REQUESTED, onPasswordResetSendRequested),\n ],\n};\n"],"names":["AUTH_EMAIL_VERIFICATION_SEND_REQUESTED","AUTH_PASSWORD_RESET_SEND_REQUESTED","authEventSchemas","subscriberFactory","config","db","migrationsPath","authOutbox","createJwtAuthMethod","createLeaseTokenAuthMethod","createRunnerSessionAuthMethod","authE2eRoutes","authRoutes","onEmailVerificationSendRequested","onPasswordResetSendRequested","passwordLoginMethods","createSessionForUser","provisionUser","AuthDependencyUnavailableError","EmailNotVerifiedError","InvalidCredentialsError","UserNotFoundError","issueJobLeaseToken","jobLeaseParamsFrom","verifyJobLeaseToken","issueRunnerSessionToken","verifyRunnerSessionToken","authCookiePlugin","clearRefreshTokenCookie","getRefreshTokenCookie","setRefreshTokenCookie","subscriber","authModule","name","database","auth","loginMethods","AUTH_PASSWORD_ENABLED","routes","e2eRoutes","publishers","table","eventSchemas","subscribers"],"mappings":"AAAA,SACEA,sCAAsC,EACtCC,kCAAkC,EAElCC,gBAAgB,QACX,wBAAwB;AAE/B,SAAQC,iBAAiB,QAAO,uBAAuB;AACvD,SAAQC,MAAM,QAAO,aAAa;AAClC,SAAQC,EAAE,QAAO,YAAY;AAC7B,SAAQC,cAAc,QAAO,oBAAoB;AACjD,SAAQC,UAAU,QAAO,uBAAuB;AAChD,SAAQC,mBAAmB,QAAO,iCAAiC;AACnE,SAAQC,0BAA0B,QAAO,yCAAyC;AAClF,SAAQC,6BAA6B,QAAO,4CAA4C;AACxF,SAAQC,aAAa,QAAO,mCAAmC;AAC/D,SAAQC,UAAU,QAAO,gCAAgC;AACzD,SACEC,gCAAgC,EAChCC,4BAA4B,QACvB,qCAAqC;AAC5C,SAAQC,oBAAoB,QAAO,qBAAqB;AASxD,SAAQC,oBAAoB,EAAEC,aAAa,QAAO,gBAAgB;AAElE,SACEC,8BAA8B,EAC9BC,qBAAqB,EACrBC,uBAAuB,EACvBC,iBAAiB,QACZ,kBAAkB;AACzB,SACEC,kBAAkB,EAClBC,kBAAkB,EAClBC,mBAAmB,QACd,2BAA2B;AAClC,SACEC,uBAAuB,EACvBC,wBAAwB,QACnB,gCAAgC;AACvC,SAAQlB,mBAAmB,QAAO,iCAAiC;AACnE,SAAQC,0BAA0B,QAAO,yCAAyC;AAClF,SACEkB,gBAAgB,EAChBC,uBAAuB,EACvBC,qBAAqB,EACrBC,qBAAqB,QAChB,uCAAuC;AAC9C,SAAQpB,6BAA6B,QAAO,4CAA4C;AAExF,MAAMqB,aAAa5B;AAEnB,OAAO,MAAM6B,aAA4B;IACvCC,MAAM;IACNC,UAAU;QAAC7B;QAAIC;IAAc;IAC7B6B,MAAM;QAAC3B;QAAuBC;QAA8BC;KAAgC;IAC5F0B,cAAcrB,qBAAqBX,OAAOiC,qBAAqB;IAC/DC,QAAQ;QAAC1B;KAAW;IACpB2B,WAAW;QAAC5B;KAAc;IAC1B6B,YAAY;QAAC;YAACP,MAAM;YAAQQ,OAAOlC;YAAYF;YAAIqC,cAAcxC;QAAgB;KAAE;IACnFyC,aAAa;QACXZ,WAAW/B,wCAAwCa;QACnDkB,WAAW9B,oCAAoCa;KAChD;AACH,EAAE"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n AUTH_PASSWORD_RESET_SEND_REQUESTED,\n type AuthEventMap,\n authEventSchemas,\n} from '@shipfox/api-auth-dto';\nimport type {ShipfoxModule} from '@shipfox/node-module';\nimport {subscriberFactory} from '@shipfox/node-module';\nimport {config} from '#config.js';\nimport {db} from '#db/db.js';\nimport {migrationsPath} from '#db/migrations.js';\nimport {authOutbox} from '#db/schema/outbox.js';\nimport {createJwtAuthMethod} from '#presentation/auth/jwt-auth.js';\nimport {createLeaseTokenAuthMethod} from '#presentation/auth/lease-token-auth.js';\nimport {createRunnerSessionAuthMethod} from '#presentation/auth/runner-session-auth.js';\nimport {createAuthE2eRoutes} from '#presentation/e2eRoutes/index.js';\nimport {createAuthInterModulePresentation} from '#presentation/inter-module.js';\nimport {buildAuthRoutes} from '#presentation/routes/index.js';\nimport {onPasswordResetSendRequested} from '#presentation/subscribers/index.js';\nimport {passwordLoginMethods} from './login-methods.js';\n\nexport type {JobLeaseTokenClaims, RunnerSessionTokenClaims} from '@shipfox/api-auth-dto';\nexport type {\n CreateSessionForUserError,\n CreateSessionForUserParams,\n CreateSessionForUserResult,\n ProvisionUserParams,\n} from '#core/auth.js';\nexport {createSessionForUser, provisionUser} from '#core/auth.js';\nexport type {EmailOwner, FindUserByEmailParams} from '#core/email-owner.js';\nexport {findUserByEmail} from '#core/email-owner.js';\nexport type {User, UserStatus} from '#core/entities/user.js';\nexport {\n AuthDependencyUnavailableError,\n EmailNotVerifiedError,\n InvalidCredentialsError,\n UserNotFoundError,\n} from '#core/errors.js';\nexport {\n issueJobLeaseToken,\n jobLeaseParamsFrom,\n verifyJobLeaseToken,\n} from '#core/job-lease-token.js';\nexport {\n issueRunnerSessionToken,\n verifyRunnerSessionToken,\n} from '#core/runner-session-token.js';\nexport {createJwtAuthMethod} from '#presentation/auth/jwt-auth.js';\nexport {createLeaseTokenAuthMethod} from '#presentation/auth/lease-token-auth.js';\nexport {\n authCookiePlugin,\n clearRefreshTokenCookie,\n getRefreshTokenCookie,\n setRefreshTokenCookie,\n} from '#presentation/auth/refresh-cookie.js';\nexport {createRunnerSessionAuthMethod} from '#presentation/auth/runner-session-auth.js';\n\nconst subscriber = subscriberFactory<AuthEventMap>();\n\nexport function createAuthModule({\n workspaces,\n}: {\n workspaces: import('@shipfox/api-workspaces-dto/inter-module').WorkspacesInterModuleClient;\n}): ShipfoxModule {\n return {\n name: 'auth',\n database: {db, migrationsPath},\n auth: [createJwtAuthMethod(), createLeaseTokenAuthMethod(), createRunnerSessionAuthMethod()],\n loginMethods: passwordLoginMethods(config.AUTH_PASSWORD_ENABLED),\n routes: [buildAuthRoutes(config.AUTH_PASSWORD_ENABLED, workspaces)],\n e2eRoutes: [createAuthE2eRoutes(workspaces)],\n publishers: [{name: 'auth', table: authOutbox, db, eventSchemas: authEventSchemas}],\n subscribers: [subscriber(AUTH_PASSWORD_RESET_SEND_REQUESTED, onPasswordResetSendRequested)],\n interModulePresentations: [createAuthInterModulePresentation()],\n };\n}\n"],"names":["AUTH_PASSWORD_RESET_SEND_REQUESTED","authEventSchemas","subscriberFactory","config","db","migrationsPath","authOutbox","createJwtAuthMethod","createLeaseTokenAuthMethod","createRunnerSessionAuthMethod","createAuthE2eRoutes","createAuthInterModulePresentation","buildAuthRoutes","onPasswordResetSendRequested","passwordLoginMethods","createSessionForUser","provisionUser","findUserByEmail","AuthDependencyUnavailableError","EmailNotVerifiedError","InvalidCredentialsError","UserNotFoundError","issueJobLeaseToken","jobLeaseParamsFrom","verifyJobLeaseToken","issueRunnerSessionToken","verifyRunnerSessionToken","authCookiePlugin","clearRefreshTokenCookie","getRefreshTokenCookie","setRefreshTokenCookie","subscriber","createAuthModule","workspaces","name","database","auth","loginMethods","AUTH_PASSWORD_ENABLED","routes","e2eRoutes","publishers","table","eventSchemas","subscribers","interModulePresentations"],"mappings":"AAAA,SACEA,kCAAkC,EAElCC,gBAAgB,QACX,wBAAwB;AAE/B,SAAQC,iBAAiB,QAAO,uBAAuB;AACvD,SAAQC,MAAM,QAAO,aAAa;AAClC,SAAQC,EAAE,QAAO,YAAY;AAC7B,SAAQC,cAAc,QAAO,oBAAoB;AACjD,SAAQC,UAAU,QAAO,uBAAuB;AAChD,SAAQC,mBAAmB,QAAO,iCAAiC;AACnE,SAAQC,0BAA0B,QAAO,yCAAyC;AAClF,SAAQC,6BAA6B,QAAO,4CAA4C;AACxF,SAAQC,mBAAmB,QAAO,mCAAmC;AACrE,SAAQC,iCAAiC,QAAO,gCAAgC;AAChF,SAAQC,eAAe,QAAO,gCAAgC;AAC9D,SAAQC,4BAA4B,QAAO,qCAAqC;AAChF,SAAQC,oBAAoB,QAAO,qBAAqB;AASxD,SAAQC,oBAAoB,EAAEC,aAAa,QAAO,gBAAgB;AAElE,SAAQC,eAAe,QAAO,uBAAuB;AAErD,SACEC,8BAA8B,EAC9BC,qBAAqB,EACrBC,uBAAuB,EACvBC,iBAAiB,QACZ,kBAAkB;AACzB,SACEC,kBAAkB,EAClBC,kBAAkB,EAClBC,mBAAmB,QACd,2BAA2B;AAClC,SACEC,uBAAuB,EACvBC,wBAAwB,QACnB,gCAAgC;AACvC,SAAQnB,mBAAmB,QAAO,iCAAiC;AACnE,SAAQC,0BAA0B,QAAO,yCAAyC;AAClF,SACEmB,gBAAgB,EAChBC,uBAAuB,EACvBC,qBAAqB,EACrBC,qBAAqB,QAChB,uCAAuC;AAC9C,SAAQrB,6BAA6B,QAAO,4CAA4C;AAExF,MAAMsB,aAAa7B;AAEnB,OAAO,SAAS8B,iBAAiB,EAC/BC,UAAU,EAGX;IACC,OAAO;QACLC,MAAM;QACNC,UAAU;YAAC/B;YAAIC;QAAc;QAC7B+B,MAAM;YAAC7B;YAAuBC;YAA8BC;SAAgC;QAC5F4B,cAAcvB,qBAAqBX,OAAOmC,qBAAqB;QAC/DC,QAAQ;YAAC3B,gBAAgBT,OAAOmC,qBAAqB,EAAEL;SAAY;QACnEO,WAAW;YAAC9B,oBAAoBuB;SAAY;QAC5CQ,YAAY;YAAC;gBAACP,MAAM;gBAAQQ,OAAOpC;gBAAYF;gBAAIuC,cAAc1C;YAAgB;SAAE;QACnF2C,aAAa;YAACb,WAAW/B,oCAAoCa;SAA8B;QAC3FgC,0BAA0B;YAAClC;SAAoC;IACjE;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"jwt-auth.d.ts","sourceRoot":"","sources":["../../../src/presentation/auth/jwt-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,SAAS,CAAC;AAK5C,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC;AAExC,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,GAAG,IAAI,CAE9E;AAED,wBAAgB,mBAAmB,IAAI,UAAU,CAehD"}
1
+ {"version":3,"file":"jwt-auth.d.ts","sourceRoot":"","sources":["../../../src/presentation/auth/jwt-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,SAAS,CAAC;AAI5C,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC;AAExC,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,GAAG,IAAI,CAE9E;AAED,wBAAgB,mBAAmB,IAAI,UAAU,CAehD"}
@@ -1,5 +1,5 @@
1
1
  import { AUTH_USER, buildUserContext, getUserContext, setUserContext } from '@shipfox/api-auth-context';
2
- import { config } from '#config.js';
2
+ import { userAccessTokenKey } from '@shipfox/node-auth-root-key';
3
3
  import { verifyUserToken } from '#core/jwt.js';
4
4
  import { createBearerTokenAuthMethod } from './bearer-token-auth.js';
5
5
  export function getClientContext(request) {
@@ -10,7 +10,7 @@ export function createJwtAuthMethod() {
10
10
  name: AUTH_USER,
11
11
  verifyToken: (token)=>verifyUserToken({
12
12
  token,
13
- secret: config.AUTH_JWT_SECRET
13
+ secret: userAccessTokenKey()
14
14
  }),
15
15
  invalidTokenError: {
16
16
  message: 'Invalid or expired token',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/auth/jwt-auth.ts"],"sourcesContent":["import {\n AUTH_USER,\n buildUserContext,\n getUserContext,\n setUserContext,\n type UserContext,\n} from '@shipfox/api-auth-context';\nimport type {AuthMethod} from '@shipfox/node-fastify';\nimport type {FastifyRequest} from 'fastify';\nimport {config} from '#config.js';\nimport {verifyUserToken} from '#core/jwt.js';\nimport {createBearerTokenAuthMethod} from './bearer-token-auth.js';\n\nexport type ClientContext = UserContext;\n\nexport interface CreateJwtAuthMethodOptions {\n secret: string;\n}\n\nexport function getClientContext(request: FastifyRequest): ClientContext | null {\n return getUserContext(request);\n}\n\nexport function createJwtAuthMethod(): AuthMethod {\n return createBearerTokenAuthMethod({\n name: AUTH_USER,\n verifyToken: (token) => verifyUserToken({token, secret: config.AUTH_JWT_SECRET}),\n invalidTokenError: {message: 'Invalid or expired token', code: 'unauthorized'},\n setContext: (request, claims) => {\n const clientContext: ClientContext = buildUserContext({\n userId: claims.sub,\n email: claims.email,\n name: claims.name ?? null,\n memberships: claims.memberships,\n });\n setUserContext(request, clientContext);\n },\n });\n}\n"],"names":["AUTH_USER","buildUserContext","getUserContext","setUserContext","config","verifyUserToken","createBearerTokenAuthMethod","getClientContext","request","createJwtAuthMethod","name","verifyToken","token","secret","AUTH_JWT_SECRET","invalidTokenError","message","code","setContext","claims","clientContext","userId","sub","email","memberships"],"mappings":"AAAA,SACEA,SAAS,EACTC,gBAAgB,EAChBC,cAAc,EACdC,cAAc,QAET,4BAA4B;AAGnC,SAAQC,MAAM,QAAO,aAAa;AAClC,SAAQC,eAAe,QAAO,eAAe;AAC7C,SAAQC,2BAA2B,QAAO,yBAAyB;AAQnE,OAAO,SAASC,iBAAiBC,OAAuB;IACtD,OAAON,eAAeM;AACxB;AAEA,OAAO,SAASC;IACd,OAAOH,4BAA4B;QACjCI,MAAMV;QACNW,aAAa,CAACC,QAAUP,gBAAgB;gBAACO;gBAAOC,QAAQT,OAAOU,eAAe;YAAA;QAC9EC,mBAAmB;YAACC,SAAS;YAA4BC,MAAM;QAAc;QAC7EC,YAAY,CAACV,SAASW;YACpB,MAAMC,gBAA+BnB,iBAAiB;gBACpDoB,QAAQF,OAAOG,GAAG;gBAClBC,OAAOJ,OAAOI,KAAK;gBACnBb,MAAMS,OAAOT,IAAI,IAAI;gBACrBc,aAAaL,OAAOK,WAAW;YACjC;YACArB,eAAeK,SAASY;QAC1B;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/presentation/auth/jwt-auth.ts"],"sourcesContent":["import {\n AUTH_USER,\n buildUserContext,\n getUserContext,\n setUserContext,\n type UserContext,\n} from '@shipfox/api-auth-context';\nimport {userAccessTokenKey} from '@shipfox/node-auth-root-key';\nimport type {AuthMethod} from '@shipfox/node-fastify';\nimport type {FastifyRequest} from 'fastify';\nimport {verifyUserToken} from '#core/jwt.js';\nimport {createBearerTokenAuthMethod} from './bearer-token-auth.js';\n\nexport type ClientContext = UserContext;\n\nexport interface CreateJwtAuthMethodOptions {\n secret: string;\n}\n\nexport function getClientContext(request: FastifyRequest): ClientContext | null {\n return getUserContext(request);\n}\n\nexport function createJwtAuthMethod(): AuthMethod {\n return createBearerTokenAuthMethod({\n name: AUTH_USER,\n verifyToken: (token) => verifyUserToken({token, secret: userAccessTokenKey()}),\n invalidTokenError: {message: 'Invalid or expired token', code: 'unauthorized'},\n setContext: (request, claims) => {\n const clientContext: ClientContext = buildUserContext({\n userId: claims.sub,\n email: claims.email,\n name: claims.name ?? null,\n memberships: claims.memberships,\n });\n setUserContext(request, clientContext);\n },\n });\n}\n"],"names":["AUTH_USER","buildUserContext","getUserContext","setUserContext","userAccessTokenKey","verifyUserToken","createBearerTokenAuthMethod","getClientContext","request","createJwtAuthMethod","name","verifyToken","token","secret","invalidTokenError","message","code","setContext","claims","clientContext","userId","sub","email","memberships"],"mappings":"AAAA,SACEA,SAAS,EACTC,gBAAgB,EAChBC,cAAc,EACdC,cAAc,QAET,4BAA4B;AACnC,SAAQC,kBAAkB,QAAO,8BAA8B;AAG/D,SAAQC,eAAe,QAAO,eAAe;AAC7C,SAAQC,2BAA2B,QAAO,yBAAyB;AAQnE,OAAO,SAASC,iBAAiBC,OAAuB;IACtD,OAAON,eAAeM;AACxB;AAEA,OAAO,SAASC;IACd,OAAOH,4BAA4B;QACjCI,MAAMV;QACNW,aAAa,CAACC,QAAUP,gBAAgB;gBAACO;gBAAOC,QAAQT;YAAoB;QAC5EU,mBAAmB;YAACC,SAAS;YAA4BC,MAAM;QAAc;QAC7EC,YAAY,CAACT,SAASU;YACpB,MAAMC,gBAA+BlB,iBAAiB;gBACpDmB,QAAQF,OAAOG,GAAG;gBAClBC,OAAOJ,OAAOI,KAAK;gBACnBZ,MAAMQ,OAAOR,IAAI,IAAI;gBACrBa,aAAaL,OAAOK,WAAW;YACjC;YACApB,eAAeK,SAASW;QAC1B;IACF;AACF"}
@@ -1,2 +1,3 @@
1
- export declare const createE2eSessionRoute: import("@shipfox/node-fastify").RouteDefinition;
1
+ import type { WorkspacesInterModuleClient } from '@shipfox/api-workspaces-dto/inter-module';
2
+ export declare function createE2eSessionRoute(workspaces: WorkspacesInterModuleClient): import("@shipfox/node-fastify").RouteDefinition;
2
3
  //# sourceMappingURL=create-session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-session.d.ts","sourceRoot":"","sources":["../../../src/presentation/e2eRoutes/create-session.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,qBAAqB,iDA+BhC,CAAC"}
1
+ {"version":3,"file":"create-session.d.ts","sourceRoot":"","sources":["../../../src/presentation/e2eRoutes/create-session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,2BAA2B,EAAC,MAAM,0CAA0C,CAAC;AAO1F,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,2BAA2B,mDAkC5E"}
@@ -4,46 +4,49 @@ import { createSessionForUser } from '#core/auth.js';
4
4
  import { EmailNotVerifiedError, InvalidCredentialsError, UserNotFoundError } from '#core/errors.js';
5
5
  import { setRefreshTokenCookie } from '#presentation/auth/refresh-cookie.js';
6
6
  import { toAuthSessionDto } from '#presentation/dto/user.js';
7
- export const createE2eSessionRoute = defineRoute({
8
- method: 'POST',
9
- path: '/sessions',
10
- description: 'Create an authenticated browser session for E2E tests.',
11
- schema: {
12
- body: e2eCreateSessionBodySchema,
13
- response: {
14
- 200: e2eCreateSessionResponseSchema
15
- }
16
- },
17
- errorHandler: (error)=>{
18
- if (error instanceof UserNotFoundError) {
19
- throw new ClientError('User not found', 'user-not-found', {
20
- status: 404
21
- });
22
- }
23
- if (error instanceof EmailNotVerifiedError) {
24
- throw new ClientError('Email not verified', 'email-not-verified', {
25
- status: 403
26
- });
27
- }
28
- if (error instanceof InvalidCredentialsError) {
29
- throw new ClientError('User is not active', 'user-inactive', {
30
- status: 409
7
+ export function createE2eSessionRoute(workspaces) {
8
+ return defineRoute({
9
+ method: 'POST',
10
+ path: '/sessions',
11
+ description: 'Create an authenticated browser session for E2E tests.',
12
+ schema: {
13
+ body: e2eCreateSessionBodySchema,
14
+ response: {
15
+ 200: e2eCreateSessionResponseSchema
16
+ }
17
+ },
18
+ errorHandler: (error)=>{
19
+ if (error instanceof UserNotFoundError) {
20
+ throw new ClientError('User not found', 'user-not-found', {
21
+ status: 404
22
+ });
23
+ }
24
+ if (error instanceof EmailNotVerifiedError) {
25
+ throw new ClientError('Email not verified', 'email-not-verified', {
26
+ status: 403
27
+ });
28
+ }
29
+ if (error instanceof InvalidCredentialsError) {
30
+ throw new ClientError('User is not active', 'user-inactive', {
31
+ status: 409
32
+ });
33
+ }
34
+ throw error;
35
+ },
36
+ handler: async (request, reply)=>{
37
+ const result = await createSessionForUser({
38
+ ...request.body.user_id ? {
39
+ userId: request.body.user_id
40
+ } : {},
41
+ ...request.body.email ? {
42
+ email: request.body.email
43
+ } : {},
44
+ workspaces
31
45
  });
46
+ setRefreshTokenCookie(reply, result.refreshToken);
47
+ return toAuthSessionDto(result);
32
48
  }
33
- throw error;
34
- },
35
- handler: async (request, reply)=>{
36
- const result = await createSessionForUser({
37
- ...request.body.user_id ? {
38
- userId: request.body.user_id
39
- } : {},
40
- ...request.body.email ? {
41
- email: request.body.email
42
- } : {}
43
- });
44
- setRefreshTokenCookie(reply, result.refreshToken);
45
- return toAuthSessionDto(result);
46
- }
47
- });
49
+ });
50
+ }
48
51
 
49
52
  //# sourceMappingURL=create-session.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/e2eRoutes/create-session.ts"],"sourcesContent":["import {e2eCreateSessionBodySchema, e2eCreateSessionResponseSchema} from '@shipfox/api-auth-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {createSessionForUser} from '#core/auth.js';\nimport {EmailNotVerifiedError, InvalidCredentialsError, UserNotFoundError} from '#core/errors.js';\nimport {setRefreshTokenCookie} from '#presentation/auth/refresh-cookie.js';\nimport {toAuthSessionDto} from '#presentation/dto/user.js';\n\nexport const createE2eSessionRoute = defineRoute({\n method: 'POST',\n path: '/sessions',\n description: 'Create an authenticated browser session for E2E tests.',\n schema: {\n body: e2eCreateSessionBodySchema,\n response: {\n 200: e2eCreateSessionResponseSchema,\n },\n },\n errorHandler: (error) => {\n if (error instanceof UserNotFoundError) {\n throw new ClientError('User not found', 'user-not-found', {status: 404});\n }\n if (error instanceof EmailNotVerifiedError) {\n throw new ClientError('Email not verified', 'email-not-verified', {status: 403});\n }\n if (error instanceof InvalidCredentialsError) {\n throw new ClientError('User is not active', 'user-inactive', {status: 409});\n }\n throw error;\n },\n handler: async (request, reply) => {\n const result = await createSessionForUser({\n ...(request.body.user_id ? {userId: request.body.user_id} : {}),\n ...(request.body.email ? {email: request.body.email} : {}),\n });\n\n setRefreshTokenCookie(reply, result.refreshToken);\n return toAuthSessionDto(result);\n },\n});\n"],"names":["e2eCreateSessionBodySchema","e2eCreateSessionResponseSchema","ClientError","defineRoute","createSessionForUser","EmailNotVerifiedError","InvalidCredentialsError","UserNotFoundError","setRefreshTokenCookie","toAuthSessionDto","createE2eSessionRoute","method","path","description","schema","body","response","errorHandler","error","status","handler","request","reply","result","user_id","userId","email","refreshToken"],"mappings":"AAAA,SAAQA,0BAA0B,EAAEC,8BAA8B,QAAO,wBAAwB;AACjG,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,oBAAoB,QAAO,gBAAgB;AACnD,SAAQC,qBAAqB,EAAEC,uBAAuB,EAAEC,iBAAiB,QAAO,kBAAkB;AAClG,SAAQC,qBAAqB,QAAO,uCAAuC;AAC3E,SAAQC,gBAAgB,QAAO,4BAA4B;AAE3D,OAAO,MAAMC,wBAAwBP,YAAY;IAC/CQ,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMf;QACNgB,UAAU;YACR,KAAKf;QACP;IACF;IACAgB,cAAc,CAACC;QACb,IAAIA,iBAAiBX,mBAAmB;YACtC,MAAM,IAAIL,YAAY,kBAAkB,kBAAkB;gBAACiB,QAAQ;YAAG;QACxE;QACA,IAAID,iBAAiBb,uBAAuB;YAC1C,MAAM,IAAIH,YAAY,sBAAsB,sBAAsB;gBAACiB,QAAQ;YAAG;QAChF;QACA,IAAID,iBAAiBZ,yBAAyB;YAC5C,MAAM,IAAIJ,YAAY,sBAAsB,iBAAiB;gBAACiB,QAAQ;YAAG;QAC3E;QACA,MAAMD;IACR;IACAE,SAAS,OAAOC,SAASC;QACvB,MAAMC,SAAS,MAAMnB,qBAAqB;YACxC,GAAIiB,QAAQN,IAAI,CAACS,OAAO,GAAG;gBAACC,QAAQJ,QAAQN,IAAI,CAACS,OAAO;YAAA,IAAI,CAAC,CAAC;YAC9D,GAAIH,QAAQN,IAAI,CAACW,KAAK,GAAG;gBAACA,OAAOL,QAAQN,IAAI,CAACW,KAAK;YAAA,IAAI,CAAC,CAAC;QAC3D;QAEAlB,sBAAsBc,OAAOC,OAAOI,YAAY;QAChD,OAAOlB,iBAAiBc;IAC1B;AACF,GAAG"}
1
+ {"version":3,"sources":["../../../src/presentation/e2eRoutes/create-session.ts"],"sourcesContent":["import {e2eCreateSessionBodySchema, e2eCreateSessionResponseSchema} from '@shipfox/api-auth-dto';\nimport type {WorkspacesInterModuleClient} from '@shipfox/api-workspaces-dto/inter-module';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {createSessionForUser} from '#core/auth.js';\nimport {EmailNotVerifiedError, InvalidCredentialsError, UserNotFoundError} from '#core/errors.js';\nimport {setRefreshTokenCookie} from '#presentation/auth/refresh-cookie.js';\nimport {toAuthSessionDto} from '#presentation/dto/user.js';\n\nexport function createE2eSessionRoute(workspaces: WorkspacesInterModuleClient) {\n return defineRoute({\n method: 'POST',\n path: '/sessions',\n description: 'Create an authenticated browser session for E2E tests.',\n schema: {\n body: e2eCreateSessionBodySchema,\n response: {\n 200: e2eCreateSessionResponseSchema,\n },\n },\n errorHandler: (error) => {\n if (error instanceof UserNotFoundError) {\n throw new ClientError('User not found', 'user-not-found', {status: 404});\n }\n if (error instanceof EmailNotVerifiedError) {\n throw new ClientError('Email not verified', 'email-not-verified', {status: 403});\n }\n if (error instanceof InvalidCredentialsError) {\n throw new ClientError('User is not active', 'user-inactive', {status: 409});\n }\n throw error;\n },\n handler: async (request, reply) => {\n const result = await createSessionForUser({\n ...(request.body.user_id ? {userId: request.body.user_id} : {}),\n ...(request.body.email ? {email: request.body.email} : {}),\n workspaces,\n });\n\n setRefreshTokenCookie(reply, result.refreshToken);\n return toAuthSessionDto(result);\n },\n });\n}\n"],"names":["e2eCreateSessionBodySchema","e2eCreateSessionResponseSchema","ClientError","defineRoute","createSessionForUser","EmailNotVerifiedError","InvalidCredentialsError","UserNotFoundError","setRefreshTokenCookie","toAuthSessionDto","createE2eSessionRoute","workspaces","method","path","description","schema","body","response","errorHandler","error","status","handler","request","reply","result","user_id","userId","email","refreshToken"],"mappings":"AAAA,SAAQA,0BAA0B,EAAEC,8BAA8B,QAAO,wBAAwB;AAEjG,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,oBAAoB,QAAO,gBAAgB;AACnD,SAAQC,qBAAqB,EAAEC,uBAAuB,EAAEC,iBAAiB,QAAO,kBAAkB;AAClG,SAAQC,qBAAqB,QAAO,uCAAuC;AAC3E,SAAQC,gBAAgB,QAAO,4BAA4B;AAE3D,OAAO,SAASC,sBAAsBC,UAAuC;IAC3E,OAAOR,YAAY;QACjBS,QAAQ;QACRC,MAAM;QACNC,aAAa;QACbC,QAAQ;YACNC,MAAMhB;YACNiB,UAAU;gBACR,KAAKhB;YACP;QACF;QACAiB,cAAc,CAACC;YACb,IAAIA,iBAAiBZ,mBAAmB;gBACtC,MAAM,IAAIL,YAAY,kBAAkB,kBAAkB;oBAACkB,QAAQ;gBAAG;YACxE;YACA,IAAID,iBAAiBd,uBAAuB;gBAC1C,MAAM,IAAIH,YAAY,sBAAsB,sBAAsB;oBAACkB,QAAQ;gBAAG;YAChF;YACA,IAAID,iBAAiBb,yBAAyB;gBAC5C,MAAM,IAAIJ,YAAY,sBAAsB,iBAAiB;oBAACkB,QAAQ;gBAAG;YAC3E;YACA,MAAMD;QACR;QACAE,SAAS,OAAOC,SAASC;YACvB,MAAMC,SAAS,MAAMpB,qBAAqB;gBACxC,GAAIkB,QAAQN,IAAI,CAACS,OAAO,GAAG;oBAACC,QAAQJ,QAAQN,IAAI,CAACS,OAAO;gBAAA,IAAI,CAAC,CAAC;gBAC9D,GAAIH,QAAQN,IAAI,CAACW,KAAK,GAAG;oBAACA,OAAOL,QAAQN,IAAI,CAACW,KAAK;gBAAA,IAAI,CAAC,CAAC;gBACzDhB;YACF;YAEAH,sBAAsBe,OAAOC,OAAOI,YAAY;YAChD,OAAOnB,iBAAiBe;QAC1B;IACF;AACF"}
@@ -1,3 +1,4 @@
1
+ import type { WorkspacesInterModuleClient } from '@shipfox/api-workspaces-dto/inter-module';
1
2
  import type { RouteGroup } from '@shipfox/node-fastify';
2
- export declare const authE2eRoutes: RouteGroup;
3
+ export declare function createAuthE2eRoutes(workspaces: WorkspacesInterModuleClient): RouteGroup;
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/presentation/e2eRoutes/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAItD,eAAO,MAAM,aAAa,EAAE,UAI3B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/presentation/e2eRoutes/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,2BAA2B,EAAC,MAAM,0CAA0C,CAAC;AAC1F,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAItD,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,2BAA2B,GAAG,UAAU,CAMvF"}
@@ -1,15 +1,17 @@
1
1
  import cookie from '@fastify/cookie';
2
2
  import { createE2eSessionRoute } from './create-session.js';
3
3
  import { createE2eUserRoute } from './create-user.js';
4
- export const authE2eRoutes = {
5
- prefix: '/auth',
6
- plugins: [
7
- cookie
8
- ],
9
- routes: [
10
- createE2eUserRoute,
11
- createE2eSessionRoute
12
- ]
13
- };
4
+ export function createAuthE2eRoutes(workspaces) {
5
+ return {
6
+ prefix: '/auth',
7
+ plugins: [
8
+ cookie
9
+ ],
10
+ routes: [
11
+ createE2eUserRoute,
12
+ createE2eSessionRoute(workspaces)
13
+ ]
14
+ };
15
+ }
14
16
 
15
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/e2eRoutes/index.ts"],"sourcesContent":["import cookie from '@fastify/cookie';\nimport type {RouteGroup} from '@shipfox/node-fastify';\nimport {createE2eSessionRoute} from './create-session.js';\nimport {createE2eUserRoute} from './create-user.js';\n\nexport const authE2eRoutes: RouteGroup = {\n prefix: '/auth',\n plugins: [cookie],\n routes: [createE2eUserRoute, createE2eSessionRoute],\n};\n"],"names":["cookie","createE2eSessionRoute","createE2eUserRoute","authE2eRoutes","prefix","plugins","routes"],"mappings":"AAAA,OAAOA,YAAY,kBAAkB;AAErC,SAAQC,qBAAqB,QAAO,sBAAsB;AAC1D,SAAQC,kBAAkB,QAAO,mBAAmB;AAEpD,OAAO,MAAMC,gBAA4B;IACvCC,QAAQ;IACRC,SAAS;QAACL;KAAO;IACjBM,QAAQ;QAACJ;QAAoBD;KAAsB;AACrD,EAAE"}
1
+ {"version":3,"sources":["../../../src/presentation/e2eRoutes/index.ts"],"sourcesContent":["import cookie from '@fastify/cookie';\nimport type {WorkspacesInterModuleClient} from '@shipfox/api-workspaces-dto/inter-module';\nimport type {RouteGroup} from '@shipfox/node-fastify';\nimport {createE2eSessionRoute} from './create-session.js';\nimport {createE2eUserRoute} from './create-user.js';\n\nexport function createAuthE2eRoutes(workspaces: WorkspacesInterModuleClient): RouteGroup {\n return {\n prefix: '/auth',\n plugins: [cookie],\n routes: [createE2eUserRoute, createE2eSessionRoute(workspaces)],\n };\n}\n"],"names":["cookie","createE2eSessionRoute","createE2eUserRoute","createAuthE2eRoutes","workspaces","prefix","plugins","routes"],"mappings":"AAAA,OAAOA,YAAY,kBAAkB;AAGrC,SAAQC,qBAAqB,QAAO,sBAAsB;AAC1D,SAAQC,kBAAkB,QAAO,mBAAmB;AAEpD,OAAO,SAASC,oBAAoBC,UAAuC;IACzE,OAAO;QACLC,QAAQ;QACRC,SAAS;YAACN;SAAO;QACjBO,QAAQ;YAACL;YAAoBD,sBAAsBG;SAAY;IACjE;AACF"}
@@ -0,0 +1,4 @@
1
+ import { authInterModuleContract } from '@shipfox/api-auth-dto/inter-module';
2
+ import { type InterModulePresentation } from '@shipfox/inter-module';
3
+ export declare function createAuthInterModulePresentation(): InterModulePresentation<typeof authInterModuleContract>;
4
+ //# sourceMappingURL=inter-module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inter-module.d.ts","sourceRoot":"","sources":["../../src/presentation/inter-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,uBAAuB,EAAC,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAgC,KAAK,uBAAuB,EAAC,MAAM,uBAAuB,CAAC;AAIlG,wBAAgB,iCAAiC,IAAI,uBAAuB,CAC1E,OAAO,uBAAuB,CAC/B,CAKA"}
@@ -0,0 +1,16 @@
1
+ import { authInterModuleContract } from '@shipfox/api-auth-dto/inter-module';
2
+ import { defineInterModulePresentation } from '@shipfox/inter-module';
3
+ import { issueJobLeaseToken } from '#core/job-lease-token.js';
4
+ import { issueRunnerSessionToken } from '#core/runner-session-token.js';
5
+ export function createAuthInterModulePresentation() {
6
+ return defineInterModulePresentation(authInterModuleContract, {
7
+ mintRunnerSessionToken: async (claims)=>({
8
+ token: await issueRunnerSessionToken(claims)
9
+ }),
10
+ mintJobLeaseToken: async (claims)=>({
11
+ token: await issueJobLeaseToken(claims)
12
+ })
13
+ });
14
+ }
15
+
16
+ //# sourceMappingURL=inter-module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/presentation/inter-module.ts"],"sourcesContent":["import {authInterModuleContract} from '@shipfox/api-auth-dto/inter-module';\nimport {defineInterModulePresentation, type InterModulePresentation} from '@shipfox/inter-module';\nimport {issueJobLeaseToken} from '#core/job-lease-token.js';\nimport {issueRunnerSessionToken} from '#core/runner-session-token.js';\n\nexport function createAuthInterModulePresentation(): InterModulePresentation<\n typeof authInterModuleContract\n> {\n return defineInterModulePresentation(authInterModuleContract, {\n mintRunnerSessionToken: async (claims) => ({token: await issueRunnerSessionToken(claims)}),\n mintJobLeaseToken: async (claims) => ({token: await issueJobLeaseToken(claims)}),\n });\n}\n"],"names":["authInterModuleContract","defineInterModulePresentation","issueJobLeaseToken","issueRunnerSessionToken","createAuthInterModulePresentation","mintRunnerSessionToken","claims","token","mintJobLeaseToken"],"mappings":"AAAA,SAAQA,uBAAuB,QAAO,qCAAqC;AAC3E,SAAQC,6BAA6B,QAAqC,wBAAwB;AAClG,SAAQC,kBAAkB,QAAO,2BAA2B;AAC5D,SAAQC,uBAAuB,QAAO,gCAAgC;AAEtE,OAAO,SAASC;IAGd,OAAOH,8BAA8BD,yBAAyB;QAC5DK,wBAAwB,OAAOC,SAAY,CAAA;gBAACC,OAAO,MAAMJ,wBAAwBG;YAAO,CAAA;QACxFE,mBAAmB,OAAOF,SAAY,CAAA;gBAACC,OAAO,MAAML,mBAAmBI;YAAO,CAAA;IAChF;AACF"}
@@ -1,2 +1,3 @@
1
- export declare const verifyEmailConfirmRoute: import("@shipfox/node-fastify").RouteDefinition;
1
+ import type { WorkspacesInterModuleClient } from '@shipfox/api-workspaces-dto/inter-module';
2
+ export declare function createVerifyEmailConfirmRoute(workspaces: WorkspacesInterModuleClient): import("@shipfox/node-fastify").RouteDefinition;
2
3
  //# sourceMappingURL=verify-email-confirm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"verify-email-confirm.d.ts","sourceRoot":"","sources":["../../../../src/presentation/routes/email-verification/verify-email-confirm.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,uBAAuB,iDA0BlC,CAAC"}
1
+ {"version":3,"file":"verify-email-confirm.d.ts","sourceRoot":"","sources":["../../../../src/presentation/routes/email-verification/verify-email-confirm.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,2BAA2B,EAAC,MAAM,0CAA0C,CAAC;AAO1F,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,2BAA2B,mDA0CpF"}
@@ -1,35 +1,46 @@
1
1
  import { verifyEmailConfirmBodySchema, verifyEmailConfirmResponseSchema } from '@shipfox/api-auth-dto';
2
+ import { EmailChallengeError } from '@shipfox/api-email-challenges';
2
3
  import { ClientError, defineRoute } from '@shipfox/node-fastify';
3
4
  import { confirmEmailVerification } from '#core/auth.js';
4
5
  import { TokenInvalidError } from '#core/errors.js';
5
6
  import { setRefreshTokenCookie } from '#presentation/auth/refresh-cookie.js';
6
7
  import { toAuthSessionDto } from '#presentation/dto/user.js';
7
- export const verifyEmailConfirmRoute = defineRoute({
8
- method: 'POST',
9
- path: '/verify-email/confirm',
10
- description: 'Verify a user email address with the link sent by email.',
11
- schema: {
12
- body: verifyEmailConfirmBodySchema,
13
- response: {
14
- 200: verifyEmailConfirmResponseSchema
15
- }
16
- },
17
- errorHandler: (error)=>{
18
- if (error instanceof TokenInvalidError) {
19
- throw new ClientError('Verification token is invalid or expired', 'token-invalid', {
20
- status: 410
8
+ export function createVerifyEmailConfirmRoute(workspaces) {
9
+ return defineRoute({
10
+ method: 'POST',
11
+ path: '/verify-email/confirm',
12
+ description: 'Verify a user email address with the code sent by email.',
13
+ schema: {
14
+ body: verifyEmailConfirmBodySchema,
15
+ response: {
16
+ 200: verifyEmailConfirmResponseSchema
17
+ }
18
+ },
19
+ errorHandler: (error)=>{
20
+ if (error instanceof TokenInvalidError) {
21
+ throw new ClientError('Verification code is invalid or expired', 'email-challenge-invalid', {
22
+ status: 410
23
+ });
24
+ }
25
+ if (error instanceof EmailChallengeError) {
26
+ throw new ClientError(error.message, `email-challenge-${error.code}`, {
27
+ status: error.code === 'expired' || error.code === 'exhausted' ? 410 : 400
28
+ });
29
+ }
30
+ throw error;
31
+ },
32
+ handler: async (request, reply)=>{
33
+ const { email, challenge_id, code } = request.body;
34
+ const result = await confirmEmailVerification({
35
+ email,
36
+ challengeId: challenge_id,
37
+ code,
38
+ workspaces
21
39
  });
40
+ setRefreshTokenCookie(reply, result.refreshToken);
41
+ return toAuthSessionDto(result);
22
42
  }
23
- throw error;
24
- },
25
- handler: async (request, reply)=>{
26
- const { token } = request.body;
27
- const result = await confirmEmailVerification({
28
- token
29
- });
30
- setRefreshTokenCookie(reply, result.refreshToken);
31
- return toAuthSessionDto(result);
32
- }
33
- });
43
+ });
44
+ }
34
45
 
35
46
  //# sourceMappingURL=verify-email-confirm.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/presentation/routes/email-verification/verify-email-confirm.ts"],"sourcesContent":["import {\n verifyEmailConfirmBodySchema,\n verifyEmailConfirmResponseSchema,\n} from '@shipfox/api-auth-dto';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {confirmEmailVerification} from '#core/auth.js';\nimport {TokenInvalidError} from '#core/errors.js';\nimport {setRefreshTokenCookie} from '#presentation/auth/refresh-cookie.js';\nimport {toAuthSessionDto} from '#presentation/dto/user.js';\n\nexport const verifyEmailConfirmRoute = defineRoute({\n method: 'POST',\n path: '/verify-email/confirm',\n description: 'Verify a user email address with the link sent by email.',\n schema: {\n body: verifyEmailConfirmBodySchema,\n response: {\n 200: verifyEmailConfirmResponseSchema,\n },\n },\n errorHandler: (error) => {\n if (error instanceof TokenInvalidError) {\n throw new ClientError('Verification token is invalid or expired', 'token-invalid', {\n status: 410,\n });\n }\n throw error;\n },\n handler: async (request, reply) => {\n const {token} = request.body;\n\n const result = await confirmEmailVerification({token});\n setRefreshTokenCookie(reply, result.refreshToken);\n\n return toAuthSessionDto(result);\n },\n});\n"],"names":["verifyEmailConfirmBodySchema","verifyEmailConfirmResponseSchema","ClientError","defineRoute","confirmEmailVerification","TokenInvalidError","setRefreshTokenCookie","toAuthSessionDto","verifyEmailConfirmRoute","method","path","description","schema","body","response","errorHandler","error","status","handler","request","reply","token","result","refreshToken"],"mappings":"AAAA,SACEA,4BAA4B,EAC5BC,gCAAgC,QAC3B,wBAAwB;AAC/B,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,wBAAwB,QAAO,gBAAgB;AACvD,SAAQC,iBAAiB,QAAO,kBAAkB;AAClD,SAAQC,qBAAqB,QAAO,uCAAuC;AAC3E,SAAQC,gBAAgB,QAAO,4BAA4B;AAE3D,OAAO,MAAMC,0BAA0BL,YAAY;IACjDM,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMb;QACNc,UAAU;YACR,KAAKb;QACP;IACF;IACAc,cAAc,CAACC;QACb,IAAIA,iBAAiBX,mBAAmB;YACtC,MAAM,IAAIH,YAAY,4CAA4C,iBAAiB;gBACjFe,QAAQ;YACV;QACF;QACA,MAAMD;IACR;IACAE,SAAS,OAAOC,SAASC;QACvB,MAAM,EAACC,KAAK,EAAC,GAAGF,QAAQN,IAAI;QAE5B,MAAMS,SAAS,MAAMlB,yBAAyB;YAACiB;QAAK;QACpDf,sBAAsBc,OAAOE,OAAOC,YAAY;QAEhD,OAAOhB,iBAAiBe;IAC1B;AACF,GAAG"}
1
+ {"version":3,"sources":["../../../../src/presentation/routes/email-verification/verify-email-confirm.ts"],"sourcesContent":["import {\n verifyEmailConfirmBodySchema,\n verifyEmailConfirmResponseSchema,\n} from '@shipfox/api-auth-dto';\nimport {EmailChallengeError} from '@shipfox/api-email-challenges';\nimport type {WorkspacesInterModuleClient} from '@shipfox/api-workspaces-dto/inter-module';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {confirmEmailVerification} from '#core/auth.js';\nimport {TokenInvalidError} from '#core/errors.js';\nimport {setRefreshTokenCookie} from '#presentation/auth/refresh-cookie.js';\nimport {toAuthSessionDto} from '#presentation/dto/user.js';\n\nexport function createVerifyEmailConfirmRoute(workspaces: WorkspacesInterModuleClient) {\n return defineRoute({\n method: 'POST',\n path: '/verify-email/confirm',\n description: 'Verify a user email address with the code sent by email.',\n schema: {\n body: verifyEmailConfirmBodySchema,\n response: {\n 200: verifyEmailConfirmResponseSchema,\n },\n },\n errorHandler: (error) => {\n if (error instanceof TokenInvalidError) {\n throw new ClientError(\n 'Verification code is invalid or expired',\n 'email-challenge-invalid',\n {\n status: 410,\n },\n );\n }\n if (error instanceof EmailChallengeError) {\n throw new ClientError(error.message, `email-challenge-${error.code}`, {\n status: error.code === 'expired' || error.code === 'exhausted' ? 410 : 400,\n });\n }\n throw error;\n },\n handler: async (request, reply) => {\n const {email, challenge_id, code} = request.body;\n\n const result = await confirmEmailVerification({\n email,\n challengeId: challenge_id,\n code,\n workspaces,\n });\n setRefreshTokenCookie(reply, result.refreshToken);\n\n return toAuthSessionDto(result);\n },\n });\n}\n"],"names":["verifyEmailConfirmBodySchema","verifyEmailConfirmResponseSchema","EmailChallengeError","ClientError","defineRoute","confirmEmailVerification","TokenInvalidError","setRefreshTokenCookie","toAuthSessionDto","createVerifyEmailConfirmRoute","workspaces","method","path","description","schema","body","response","errorHandler","error","status","message","code","handler","request","reply","email","challenge_id","result","challengeId","refreshToken"],"mappings":"AAAA,SACEA,4BAA4B,EAC5BC,gCAAgC,QAC3B,wBAAwB;AAC/B,SAAQC,mBAAmB,QAAO,gCAAgC;AAElE,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,wBAAwB,QAAO,gBAAgB;AACvD,SAAQC,iBAAiB,QAAO,kBAAkB;AAClD,SAAQC,qBAAqB,QAAO,uCAAuC;AAC3E,SAAQC,gBAAgB,QAAO,4BAA4B;AAE3D,OAAO,SAASC,8BAA8BC,UAAuC;IACnF,OAAON,YAAY;QACjBO,QAAQ;QACRC,MAAM;QACNC,aAAa;QACbC,QAAQ;YACNC,MAAMf;YACNgB,UAAU;gBACR,KAAKf;YACP;QACF;QACAgB,cAAc,CAACC;YACb,IAAIA,iBAAiBZ,mBAAmB;gBACtC,MAAM,IAAIH,YACR,2CACA,2BACA;oBACEgB,QAAQ;gBACV;YAEJ;YACA,IAAID,iBAAiBhB,qBAAqB;gBACxC,MAAM,IAAIC,YAAYe,MAAME,OAAO,EAAE,CAAC,gBAAgB,EAAEF,MAAMG,IAAI,EAAE,EAAE;oBACpEF,QAAQD,MAAMG,IAAI,KAAK,aAAaH,MAAMG,IAAI,KAAK,cAAc,MAAM;gBACzE;YACF;YACA,MAAMH;QACR;QACAI,SAAS,OAAOC,SAASC;YACvB,MAAM,EAACC,KAAK,EAAEC,YAAY,EAAEL,IAAI,EAAC,GAAGE,QAAQR,IAAI;YAEhD,MAAMY,SAAS,MAAMtB,yBAAyB;gBAC5CoB;gBACAG,aAAaF;gBACbL;gBACAX;YACF;YACAH,sBAAsBiB,OAAOG,OAAOE,YAAY;YAEhD,OAAOrB,iBAAiBmB;QAC1B;IACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"verify-email-resend.d.ts","sourceRoot":"","sources":["../../../../src/presentation/routes/email-verification/verify-email-resend.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,sBAAsB,iDAoBjC,CAAC"}
1
+ {"version":3,"file":"verify-email-resend.d.ts","sourceRoot":"","sources":["../../../../src/presentation/routes/email-verification/verify-email-resend.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,sBAAsB,iDAiCjC,CAAC"}
@@ -1,11 +1,12 @@
1
1
  import { verifyEmailResendBodySchema, verifyEmailResendResponseSchema } from '@shipfox/api-auth-dto';
2
- import { defineRoute } from '@shipfox/node-fastify';
2
+ import { EmailChallengeError } from '@shipfox/api-email-challenges';
3
+ import { ClientError, defineRoute } from '@shipfox/node-fastify';
3
4
  import { resendEmailVerification } from '#core/auth.js';
4
5
  import { createAuthRateLimitPreHandler } from '#presentation/routes/rate-limit.js';
5
6
  export const verifyEmailResendRoute = defineRoute({
6
7
  method: 'POST',
7
8
  path: '/verify-email/resend',
8
- description: 'Send a new email verification link if the account can be verified.',
9
+ description: 'Send a new email verification code if the account can be verified.',
9
10
  schema: {
10
11
  body: verifyEmailResendBodySchema,
11
12
  response: {
@@ -13,10 +14,25 @@ export const verifyEmailResendRoute = defineRoute({
13
14
  }
14
15
  },
15
16
  preHandler: createAuthRateLimitPreHandler('email-send'),
17
+ errorHandler: (error)=>{
18
+ if (error instanceof EmailChallengeError) {
19
+ throw new ClientError(error.message, `email-challenge-${error.code}`, {
20
+ status: error.code === 'limited' ? 429 : error.code === 'expired' ? 410 : 400,
21
+ ...error.retryAt ? {
22
+ details: {
23
+ retry_at: error.retryAt.toISOString()
24
+ }
25
+ } : {}
26
+ });
27
+ }
28
+ throw error;
29
+ },
16
30
  handler: async (request, reply)=>{
17
- const { email } = request.body;
31
+ const { email, challenge_id } = request.body;
18
32
  const result = await resendEmailVerification({
19
- email
33
+ email,
34
+ challengeId: challenge_id,
35
+ sourceIp: request.ip
20
36
  });
21
37
  reply.code(200).send({
22
38
  next_resend_available_at: result.nextResendAvailableAt.toISOString()
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/presentation/routes/email-verification/verify-email-resend.ts"],"sourcesContent":["import {verifyEmailResendBodySchema, verifyEmailResendResponseSchema} from '@shipfox/api-auth-dto';\nimport {defineRoute} from '@shipfox/node-fastify';\nimport {resendEmailVerification} from '#core/auth.js';\nimport {createAuthRateLimitPreHandler} from '#presentation/routes/rate-limit.js';\n\nexport const verifyEmailResendRoute = defineRoute({\n method: 'POST',\n path: '/verify-email/resend',\n description: 'Send a new email verification link if the account can be verified.',\n schema: {\n body: verifyEmailResendBodySchema,\n response: {\n 200: verifyEmailResendResponseSchema,\n },\n },\n preHandler: createAuthRateLimitPreHandler('email-send'),\n handler: async (request, reply) => {\n const {email} = request.body;\n\n const result = await resendEmailVerification({email});\n\n reply.code(200).send({\n next_resend_available_at: result.nextResendAvailableAt.toISOString(),\n });\n },\n});\n"],"names":["verifyEmailResendBodySchema","verifyEmailResendResponseSchema","defineRoute","resendEmailVerification","createAuthRateLimitPreHandler","verifyEmailResendRoute","method","path","description","schema","body","response","preHandler","handler","request","reply","email","result","code","send","next_resend_available_at","nextResendAvailableAt","toISOString"],"mappings":"AAAA,SAAQA,2BAA2B,EAAEC,+BAA+B,QAAO,wBAAwB;AACnG,SAAQC,WAAW,QAAO,wBAAwB;AAClD,SAAQC,uBAAuB,QAAO,gBAAgB;AACtD,SAAQC,6BAA6B,QAAO,qCAAqC;AAEjF,OAAO,MAAMC,yBAAyBH,YAAY;IAChDI,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMV;QACNW,UAAU;YACR,KAAKV;QACP;IACF;IACAW,YAAYR,8BAA8B;IAC1CS,SAAS,OAAOC,SAASC;QACvB,MAAM,EAACC,KAAK,EAAC,GAAGF,QAAQJ,IAAI;QAE5B,MAAMO,SAAS,MAAMd,wBAAwB;YAACa;QAAK;QAEnDD,MAAMG,IAAI,CAAC,KAAKC,IAAI,CAAC;YACnBC,0BAA0BH,OAAOI,qBAAqB,CAACC,WAAW;QACpE;IACF;AACF,GAAG"}
1
+ {"version":3,"sources":["../../../../src/presentation/routes/email-verification/verify-email-resend.ts"],"sourcesContent":["import {verifyEmailResendBodySchema, verifyEmailResendResponseSchema} from '@shipfox/api-auth-dto';\nimport {EmailChallengeError} from '@shipfox/api-email-challenges';\nimport {ClientError, defineRoute} from '@shipfox/node-fastify';\nimport {resendEmailVerification} from '#core/auth.js';\nimport {createAuthRateLimitPreHandler} from '#presentation/routes/rate-limit.js';\n\nexport const verifyEmailResendRoute = defineRoute({\n method: 'POST',\n path: '/verify-email/resend',\n description: 'Send a new email verification code if the account can be verified.',\n schema: {\n body: verifyEmailResendBodySchema,\n response: {\n 200: verifyEmailResendResponseSchema,\n },\n },\n preHandler: createAuthRateLimitPreHandler('email-send'),\n errorHandler: (error) => {\n if (error instanceof EmailChallengeError) {\n throw new ClientError(error.message, `email-challenge-${error.code}`, {\n status: error.code === 'limited' ? 429 : error.code === 'expired' ? 410 : 400,\n ...(error.retryAt ? {details: {retry_at: error.retryAt.toISOString()}} : {}),\n });\n }\n throw error;\n },\n handler: async (request, reply) => {\n const {email, challenge_id} = request.body;\n\n const result = await resendEmailVerification({\n email,\n challengeId: challenge_id,\n sourceIp: request.ip,\n });\n\n reply.code(200).send({\n next_resend_available_at: result.nextResendAvailableAt.toISOString(),\n });\n },\n});\n"],"names":["verifyEmailResendBodySchema","verifyEmailResendResponseSchema","EmailChallengeError","ClientError","defineRoute","resendEmailVerification","createAuthRateLimitPreHandler","verifyEmailResendRoute","method","path","description","schema","body","response","preHandler","errorHandler","error","message","code","status","retryAt","details","retry_at","toISOString","handler","request","reply","email","challenge_id","result","challengeId","sourceIp","ip","send","next_resend_available_at","nextResendAvailableAt"],"mappings":"AAAA,SAAQA,2BAA2B,EAAEC,+BAA+B,QAAO,wBAAwB;AACnG,SAAQC,mBAAmB,QAAO,gCAAgC;AAClE,SAAQC,WAAW,EAAEC,WAAW,QAAO,wBAAwB;AAC/D,SAAQC,uBAAuB,QAAO,gBAAgB;AACtD,SAAQC,6BAA6B,QAAO,qCAAqC;AAEjF,OAAO,MAAMC,yBAAyBH,YAAY;IAChDI,QAAQ;IACRC,MAAM;IACNC,aAAa;IACbC,QAAQ;QACNC,MAAMZ;QACNa,UAAU;YACR,KAAKZ;QACP;IACF;IACAa,YAAYR,8BAA8B;IAC1CS,cAAc,CAACC;QACb,IAAIA,iBAAiBd,qBAAqB;YACxC,MAAM,IAAIC,YAAYa,MAAMC,OAAO,EAAE,CAAC,gBAAgB,EAAED,MAAME,IAAI,EAAE,EAAE;gBACpEC,QAAQH,MAAME,IAAI,KAAK,YAAY,MAAMF,MAAME,IAAI,KAAK,YAAY,MAAM;gBAC1E,GAAIF,MAAMI,OAAO,GAAG;oBAACC,SAAS;wBAACC,UAAUN,MAAMI,OAAO,CAACG,WAAW;oBAAE;gBAAC,IAAI,CAAC,CAAC;YAC7E;QACF;QACA,MAAMP;IACR;IACAQ,SAAS,OAAOC,SAASC;QACvB,MAAM,EAACC,KAAK,EAAEC,YAAY,EAAC,GAAGH,QAAQb,IAAI;QAE1C,MAAMiB,SAAS,MAAMxB,wBAAwB;YAC3CsB;YACAG,aAAaF;YACbG,UAAUN,QAAQO,EAAE;QACtB;QAEAN,MAAMR,IAAI,CAAC,KAAKe,IAAI,CAAC;YACnBC,0BAA0BL,OAAOM,qBAAqB,CAACZ,WAAW;QACpE;IACF;AACF,GAAG"}
@@ -1,4 +1,4 @@
1
+ import type { WorkspacesInterModuleClient } from '@shipfox/api-workspaces-dto/inter-module';
1
2
  import type { RouteGroup } from '@shipfox/node-fastify';
2
- export declare function buildAuthRoutes(passwordEnabled: boolean): RouteGroup;
3
- export declare const authRoutes: RouteGroup;
3
+ export declare function buildAuthRoutes(passwordEnabled: boolean, workspaces: WorkspacesInterModuleClient): RouteGroup;
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AActD,wBAAgB,eAAe,CAAC,eAAe,EAAE,OAAO,GAAG,UAAU,CAkBpE;AAED,eAAO,MAAM,UAAU,YAAgD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/presentation/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,2BAA2B,EAAC,MAAM,0CAA0C,CAAC;AAC1F,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAatD,wBAAgB,eAAe,CAC7B,eAAe,EAAE,OAAO,EACxB,UAAU,EAAE,2BAA2B,GACtC,UAAU,CA2BZ"}
@@ -1,21 +1,20 @@
1
- import { config } from '#config.js';
2
1
  import { authCookiePlugin } from '#presentation/auth/refresh-cookie.js';
3
- import { verifyEmailConfirmRoute } from './email-verification/verify-email-confirm.js';
2
+ import { createVerifyEmailConfirmRoute } from './email-verification/verify-email-confirm.js';
4
3
  import { verifyEmailResendRoute } from './email-verification/verify-email-resend.js';
5
4
  import { changePasswordRoute } from './password/change-password.js';
6
- import { passwordResetConfirmRoute } from './password/password-reset-confirm.js';
5
+ import { createPasswordResetConfirmRoute } from './password/password-reset-confirm.js';
7
6
  import { passwordResetRequestRoute } from './password/password-reset-request.js';
8
- import { signupRoute } from './registration/signup.js';
9
- import { loginRoute } from './session/login.js';
7
+ import { createSignupRoute } from './registration/signup.js';
8
+ import { createLoginRoute } from './session/login.js';
10
9
  import { logoutRoute } from './session/logout.js';
11
10
  import { meRoute } from './session/me.js';
12
- import { refreshRoute } from './session/refresh.js';
13
- export function buildAuthRoutes(passwordEnabled) {
11
+ import { createRefreshRoute } from './session/refresh.js';
12
+ export function buildAuthRoutes(passwordEnabled, workspaces) {
14
13
  const passwordRoutes = passwordEnabled ? [
15
- signupRoute,
16
- verifyEmailConfirmRoute,
14
+ createSignupRoute(workspaces),
15
+ createVerifyEmailConfirmRoute(workspaces),
17
16
  verifyEmailResendRoute,
18
- loginRoute
17
+ createLoginRoute(workspaces)
19
18
  ] : [];
20
19
  return {
21
20
  prefix: '/auth',
@@ -24,17 +23,16 @@ export function buildAuthRoutes(passwordEnabled) {
24
23
  ],
25
24
  routes: [
26
25
  ...passwordRoutes,
27
- refreshRoute,
26
+ createRefreshRoute(workspaces),
28
27
  logoutRoute,
29
28
  meRoute,
30
29
  ...passwordEnabled ? [
31
30
  changePasswordRoute,
32
31
  passwordResetRequestRoute,
33
- passwordResetConfirmRoute
32
+ createPasswordResetConfirmRoute(workspaces)
34
33
  ] : []
35
34
  ]
36
35
  };
37
36
  }
38
- export const authRoutes = buildAuthRoutes(config.AUTH_PASSWORD_ENABLED);
39
37
 
40
38
  //# sourceMappingURL=index.js.map