@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.
- package/.turbo/turbo-build.log +2 -0
- package/.turbo/turbo-type$colon$emit.log +1 -0
- package/.turbo/turbo-type.log +1 -0
- package/CHANGELOG.md +116 -0
- package/LICENSE +21 -0
- package/README.md +336 -0
- package/dist/config.d.ts +22 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +95 -0
- package/dist/config.js.map +1 -0
- package/dist/core/auth.d.ts +108 -0
- package/dist/core/auth.d.ts.map +1 -0
- package/dist/core/auth.js +476 -0
- package/dist/core/auth.js.map +1 -0
- package/dist/core/entities/email-verification.d.ts +9 -0
- package/dist/core/entities/email-verification.d.ts.map +1 -0
- package/dist/core/entities/email-verification.js +3 -0
- package/dist/core/entities/email-verification.js.map +1 -0
- package/dist/core/entities/password-reset.d.ts +9 -0
- package/dist/core/entities/password-reset.d.ts.map +1 -0
- package/dist/core/entities/password-reset.js +3 -0
- package/dist/core/entities/password-reset.js.map +1 -0
- package/dist/core/entities/refresh-token.d.ts +12 -0
- package/dist/core/entities/refresh-token.d.ts.map +1 -0
- package/dist/core/entities/refresh-token.js +3 -0
- package/dist/core/entities/refresh-token.js.map +1 -0
- package/dist/core/entities/user.d.ts +12 -0
- package/dist/core/entities/user.d.ts.map +1 -0
- package/dist/core/entities/user.js +3 -0
- package/dist/core/entities/user.js.map +1 -0
- package/dist/core/errors.d.ts +54 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +106 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/job-lease-token.d.ts +12 -0
- package/dist/core/job-lease-token.d.ts.map +1 -0
- package/dist/core/job-lease-token.js +58 -0
- package/dist/core/job-lease-token.js.map +1 -0
- package/dist/core/jwt.d.ts +37 -0
- package/dist/core/jwt.d.ts.map +1 -0
- package/dist/core/jwt.js +46 -0
- package/dist/core/jwt.js.map +1 -0
- package/dist/core/password.d.ts +10 -0
- package/dist/core/password.d.ts.map +1 -0
- package/dist/core/password.js +13 -0
- package/dist/core/password.js.map +1 -0
- package/dist/core/rate-limit.d.ts +34 -0
- package/dist/core/rate-limit.d.ts.map +1 -0
- package/dist/core/rate-limit.js +76 -0
- package/dist/core/rate-limit.js.map +1 -0
- package/dist/core/runner-session-token.d.ts +6 -0
- package/dist/core/runner-session-token.d.ts.map +1 -0
- package/dist/core/runner-session-token.js +37 -0
- package/dist/core/runner-session-token.js.map +1 -0
- package/dist/db/db.d.ts +1723 -0
- package/dist/db/db.d.ts.map +1 -0
- package/dist/db/db.js +28 -0
- package/dist/db/db.js.map +1 -0
- package/dist/db/email-verifications.d.ts +39 -0
- package/dist/db/email-verifications.d.ts.map +1 -0
- package/dist/db/email-verifications.js +95 -0
- package/dist/db/email-verifications.js.map +1 -0
- package/dist/db/migrations.d.ts +2 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +5 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/password-resets.d.ts +23 -0
- package/dist/db/password-resets.d.ts.map +1 -0
- package/dist/db/password-resets.js +37 -0
- package/dist/db/password-resets.js.map +1 -0
- package/dist/db/rate-limits.d.ts +18 -0
- package/dist/db/rate-limits.d.ts.map +1 -0
- package/dist/db/rate-limits.js +44 -0
- package/dist/db/rate-limits.js.map +1 -0
- package/dist/db/refresh-tokens.d.ts +44 -0
- package/dist/db/refresh-tokens.d.ts.map +1 -0
- package/dist/db/refresh-tokens.js +71 -0
- package/dist/db/refresh-tokens.js.map +1 -0
- package/dist/db/schema/common.d.ts +2 -0
- package/dist/db/schema/common.d.ts.map +1 -0
- package/dist/db/schema/common.js +4 -0
- package/dist/db/schema/common.js.map +1 -0
- package/dist/db/schema/email-verifications.d.ts +114 -0
- package/dist/db/schema/email-verifications.d.ts.map +1 -0
- package/dist/db/schema/email-verifications.js +35 -0
- package/dist/db/schema/email-verifications.js.map +1 -0
- package/dist/db/schema/outbox.d.ts +195 -0
- package/dist/db/schema/outbox.d.ts.map +1 -0
- package/dist/db/schema/outbox.js +5 -0
- package/dist/db/schema/outbox.js.map +1 -0
- package/dist/db/schema/password-resets.d.ts +114 -0
- package/dist/db/schema/password-resets.d.ts.map +1 -0
- package/dist/db/schema/password-resets.js +35 -0
- package/dist/db/schema/password-resets.js.map +1 -0
- package/dist/db/schema/rate-limits.d.ts +145 -0
- package/dist/db/schema/rate-limits.d.ts.map +1 -0
- package/dist/db/schema/rate-limits.js +25 -0
- package/dist/db/schema/rate-limits.js.map +1 -0
- package/dist/db/schema/refresh-tokens.d.ts +165 -0
- package/dist/db/schema/refresh-tokens.d.ts.map +1 -0
- package/dist/db/schema/refresh-tokens.js +47 -0
- package/dist/db/schema/refresh-tokens.js.map +1 -0
- package/dist/db/schema/users.d.ts +149 -0
- package/dist/db/schema/users.d.ts.map +1 -0
- package/dist/db/schema/users.js +40 -0
- package/dist/db/schema/users.js.map +1 -0
- package/dist/db/users.d.ts +28 -0
- package/dist/db/users.d.ts.map +1 -0
- package/dist/db/users.js +83 -0
- package/dist/db/users.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +3 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/instance.d.ts +16 -0
- package/dist/metrics/instance.d.ts.map +1 -0
- package/dist/metrics/instance.js +52 -0
- package/dist/metrics/instance.js.map +1 -0
- package/dist/presentation/auth/bearer-token-auth.d.ts +15 -0
- package/dist/presentation/auth/bearer-token-auth.d.ts.map +1 -0
- package/dist/presentation/auth/bearer-token-auth.js +31 -0
- package/dist/presentation/auth/bearer-token-auth.js.map +1 -0
- package/dist/presentation/auth/jwt-auth.d.ts +10 -0
- package/dist/presentation/auth/jwt-auth.d.ts.map +1 -0
- package/dist/presentation/auth/jwt-auth.js +31 -0
- package/dist/presentation/auth/jwt-auth.js.map +1 -0
- package/dist/presentation/auth/lease-token-auth.d.ts +15 -0
- package/dist/presentation/auth/lease-token-auth.d.ts.map +1 -0
- package/dist/presentation/auth/lease-token-auth.js +27 -0
- package/dist/presentation/auth/lease-token-auth.js.map +1 -0
- package/dist/presentation/auth/refresh-cookie.d.ts +7 -0
- package/dist/presentation/auth/refresh-cookie.d.ts.map +1 -0
- package/dist/presentation/auth/refresh-cookie.js +29 -0
- package/dist/presentation/auth/refresh-cookie.js.map +1 -0
- package/dist/presentation/auth/runner-session-auth.d.ts +3 -0
- package/dist/presentation/auth/runner-session-auth.d.ts.map +1 -0
- package/dist/presentation/auth/runner-session-auth.js +16 -0
- package/dist/presentation/auth/runner-session-auth.js.map +1 -0
- package/dist/presentation/dto/user.d.ts +8 -0
- package/dist/presentation/dto/user.d.ts.map +1 -0
- package/dist/presentation/dto/user.js +19 -0
- package/dist/presentation/dto/user.js.map +1 -0
- package/dist/presentation/e2eRoutes/create-session.d.ts +2 -0
- package/dist/presentation/e2eRoutes/create-session.d.ts.map +1 -0
- package/dist/presentation/e2eRoutes/create-session.js +49 -0
- package/dist/presentation/e2eRoutes/create-session.js.map +1 -0
- package/dist/presentation/e2eRoutes/create-user.d.ts +2 -0
- package/dist/presentation/e2eRoutes/create-user.d.ts.map +1 -0
- package/dist/presentation/e2eRoutes/create-user.js +42 -0
- package/dist/presentation/e2eRoutes/create-user.js.map +1 -0
- package/dist/presentation/e2eRoutes/index.d.ts +3 -0
- package/dist/presentation/e2eRoutes/index.d.ts.map +1 -0
- package/dist/presentation/e2eRoutes/index.js +15 -0
- package/dist/presentation/e2eRoutes/index.js.map +1 -0
- package/dist/presentation/routes/email-verification/verify-email-confirm.d.ts +2 -0
- package/dist/presentation/routes/email-verification/verify-email-confirm.d.ts.map +1 -0
- package/dist/presentation/routes/email-verification/verify-email-confirm.js +35 -0
- package/dist/presentation/routes/email-verification/verify-email-confirm.js.map +1 -0
- package/dist/presentation/routes/email-verification/verify-email-resend.d.ts +2 -0
- package/dist/presentation/routes/email-verification/verify-email-resend.d.ts.map +1 -0
- package/dist/presentation/routes/email-verification/verify-email-resend.js +27 -0
- package/dist/presentation/routes/email-verification/verify-email-resend.js.map +1 -0
- package/dist/presentation/routes/index.d.ts +3 -0
- package/dist/presentation/routes/index.d.ts.map +1 -0
- package/dist/presentation/routes/index.js +31 -0
- package/dist/presentation/routes/index.js.map +1 -0
- package/dist/presentation/routes/password/change-password.d.ts +2 -0
- package/dist/presentation/routes/password/change-password.d.ts.map +1 -0
- package/dist/presentation/routes/password/change-password.js +50 -0
- package/dist/presentation/routes/password/change-password.js.map +1 -0
- package/dist/presentation/routes/password/password-reset-confirm.d.ts +2 -0
- package/dist/presentation/routes/password/password-reset-confirm.d.ts.map +1 -0
- package/dist/presentation/routes/password/password-reset-confirm.js +36 -0
- package/dist/presentation/routes/password/password-reset-confirm.js.map +1 -0
- package/dist/presentation/routes/password/password-reset-request.d.ts +2 -0
- package/dist/presentation/routes/password/password-reset-request.d.ts.map +1 -0
- package/dist/presentation/routes/password/password-reset-request.js +26 -0
- package/dist/presentation/routes/password/password-reset-request.js.map +1 -0
- package/dist/presentation/routes/rate-limit.d.ts +10 -0
- package/dist/presentation/routes/rate-limit.d.ts.map +1 -0
- package/dist/presentation/routes/rate-limit.js +101 -0
- package/dist/presentation/routes/rate-limit.js.map +1 -0
- package/dist/presentation/routes/registration/signup.d.ts +2 -0
- package/dist/presentation/routes/registration/signup.d.ts.map +1 -0
- package/dist/presentation/routes/registration/signup.js +82 -0
- package/dist/presentation/routes/registration/signup.js.map +1 -0
- package/dist/presentation/routes/session/login.d.ts +2 -0
- package/dist/presentation/routes/session/login.d.ts.map +1 -0
- package/dist/presentation/routes/session/login.js +48 -0
- package/dist/presentation/routes/session/login.js.map +1 -0
- package/dist/presentation/routes/session/logout.d.ts +2 -0
- package/dist/presentation/routes/session/logout.d.ts.map +1 -0
- package/dist/presentation/routes/session/logout.js +25 -0
- package/dist/presentation/routes/session/logout.js.map +1 -0
- package/dist/presentation/routes/session/me.d.ts +2 -0
- package/dist/presentation/routes/session/me.d.ts.map +1 -0
- package/dist/presentation/routes/session/me.js +42 -0
- package/dist/presentation/routes/session/me.js.map +1 -0
- package/dist/presentation/routes/session/refresh.d.ts +2 -0
- package/dist/presentation/routes/session/refresh.d.ts.map +1 -0
- package/dist/presentation/routes/session/refresh.js +49 -0
- package/dist/presentation/routes/session/refresh.js.map +1 -0
- package/dist/presentation/subscribers/index.d.ts +3 -0
- package/dist/presentation/subscribers/index.d.ts.map +1 -0
- package/dist/presentation/subscribers/index.js +4 -0
- package/dist/presentation/subscribers/index.js.map +1 -0
- package/dist/presentation/subscribers/on-email-verification-send-requested.d.ts +3 -0
- package/dist/presentation/subscribers/on-email-verification-send-requested.d.ts.map +1 -0
- package/dist/presentation/subscribers/on-email-verification-send-requested.js +13 -0
- package/dist/presentation/subscribers/on-email-verification-send-requested.js.map +1 -0
- package/dist/presentation/subscribers/on-password-reset-send-requested.d.ts +3 -0
- package/dist/presentation/subscribers/on-password-reset-send-requested.d.ts.map +1 -0
- package/dist/presentation/subscribers/on-password-reset-send-requested.js +14 -0
- package/dist/presentation/subscribers/on-password-reset-send-requested.js.map +1 -0
- package/dist/tsconfig.test.tsbuildinfo +1 -0
- package/drizzle/0000_initial.sql +81 -0
- package/drizzle/meta/0000_snapshot.json +643 -0
- package/drizzle/meta/_journal.json +13 -0
- package/drizzle.config.ts +7 -0
- package/package.json +88 -0
- package/src/config.ts +88 -0
- package/src/core/auth.test.ts +675 -0
- package/src/core/auth.ts +560 -0
- package/src/core/entities/email-verification.ts +8 -0
- package/src/core/entities/password-reset.ts +8 -0
- package/src/core/entities/refresh-token.ts +11 -0
- package/src/core/entities/user.ts +12 -0
- package/src/core/errors.ts +123 -0
- package/src/core/job-lease-token.test.ts +201 -0
- package/src/core/job-lease-token.ts +83 -0
- package/src/core/jwt.test.ts +180 -0
- package/src/core/jwt.ts +66 -0
- package/src/core/password.test.ts +28 -0
- package/src/core/password.ts +21 -0
- package/src/core/rate-limit.test.ts +462 -0
- package/src/core/rate-limit.ts +130 -0
- package/src/core/runner-session-token.test.ts +126 -0
- package/src/core/runner-session-token.ts +49 -0
- package/src/db/db.ts +28 -0
- package/src/db/email-verifications.test.ts +61 -0
- package/src/db/email-verifications.ts +160 -0
- package/src/db/migrations.ts +4 -0
- package/src/db/password-resets.test.ts +61 -0
- package/src/db/password-resets.ts +69 -0
- package/src/db/rate-limits.ts +69 -0
- package/src/db/refresh-tokens.test.ts +164 -0
- package/src/db/refresh-tokens.ts +149 -0
- package/src/db/schema/common.ts +3 -0
- package/src/db/schema/email-verifications.ts +37 -0
- package/src/db/schema/outbox.ts +4 -0
- package/src/db/schema/password-resets.ts +37 -0
- package/src/db/schema/rate-limits.ts +27 -0
- package/src/db/schema/refresh-tokens.ts +43 -0
- package/src/db/schema/users.ts +37 -0
- package/src/db/users.test.ts +75 -0
- package/src/db/users.ts +121 -0
- package/src/index.test.ts +39 -0
- package/src/index.ts +69 -0
- package/src/metrics/index.ts +13 -0
- package/src/metrics/instance.test.ts +69 -0
- package/src/metrics/instance.ts +77 -0
- package/src/presentation/auth/bearer-token-auth.test.ts +99 -0
- package/src/presentation/auth/bearer-token-auth.ts +51 -0
- package/src/presentation/auth/jwt-auth.test.ts +136 -0
- package/src/presentation/auth/jwt-auth.ts +39 -0
- package/src/presentation/auth/lease-token-auth.test.ts +56 -0
- package/src/presentation/auth/lease-token-auth.ts +25 -0
- package/src/presentation/auth/refresh-cookie.test.ts +39 -0
- package/src/presentation/auth/refresh-cookie.ts +34 -0
- package/src/presentation/auth/runner-session-auth.test.ts +54 -0
- package/src/presentation/auth/runner-session-auth.ts +13 -0
- package/src/presentation/dto/user.ts +21 -0
- package/src/presentation/e2eRoutes/create-session.ts +39 -0
- package/src/presentation/e2eRoutes/create-user.ts +38 -0
- package/src/presentation/e2eRoutes/index.test.ts +102 -0
- package/src/presentation/e2eRoutes/index.ts +10 -0
- package/src/presentation/routes/email-verification/verify-email-confirm.test.ts +66 -0
- package/src/presentation/routes/email-verification/verify-email-confirm.ts +37 -0
- package/src/presentation/routes/email-verification/verify-email-resend.test.ts +100 -0
- package/src/presentation/routes/email-verification/verify-email-resend.ts +26 -0
- package/src/presentation/routes/index.ts +29 -0
- package/src/presentation/routes/password/change-password.test.ts +106 -0
- package/src/presentation/routes/password/change-password.ts +45 -0
- package/src/presentation/routes/password/password-reset-confirm.test.ts +63 -0
- package/src/presentation/routes/password/password-reset-confirm.ts +35 -0
- package/src/presentation/routes/password/password-reset-request.test.ts +56 -0
- package/src/presentation/routes/password/password-reset-request.ts +25 -0
- package/src/presentation/routes/rate-limit.test.ts +341 -0
- package/src/presentation/routes/rate-limit.ts +119 -0
- package/src/presentation/routes/registration/signup.test.ts +284 -0
- package/src/presentation/routes/registration/signup.ts +81 -0
- package/src/presentation/routes/session/login.test.ts +77 -0
- package/src/presentation/routes/session/login.ts +50 -0
- package/src/presentation/routes/session/logout.test.ts +55 -0
- package/src/presentation/routes/session/logout.ts +23 -0
- package/src/presentation/routes/session/me.test.ts +56 -0
- package/src/presentation/routes/session/me.ts +35 -0
- package/src/presentation/routes/session/refresh.test.ts +89 -0
- package/src/presentation/routes/session/refresh.ts +54 -0
- package/src/presentation/subscribers/email-send-requested.test.ts +77 -0
- package/src/presentation/subscribers/index.ts +2 -0
- package/src/presentation/subscribers/on-email-verification-send-requested.ts +10 -0
- package/src/presentation/subscribers/on-password-reset-send-requested.ts +13 -0
- package/test/env.ts +10 -0
- package/test/factories/index.ts +1 -0
- package/test/factories/user.ts +36 -0
- package/test/globalSetup.ts +18 -0
- package/test/index.ts +1 -0
- package/test/routes.ts +275 -0
- package/test/setup.ts +17 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.json +4 -0
- package/tsconfig.test.json +8 -0
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|