@jmlq/auth 0.0.1-alpha.3 → 0.0.1-alpha.30

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 (155) hide show
  1. package/dist/application/dtos/index.d.ts +1 -1
  2. package/dist/application/dtos/index.js +1 -1
  3. package/dist/application/dtos/request/change-password.request.d.ts +15 -0
  4. package/dist/application/dtos/request/index.d.ts +5 -0
  5. package/dist/application/dtos/request/index.js +5 -0
  6. package/dist/application/dtos/request/logout.request.d.ts +2 -1
  7. package/dist/application/dtos/request/me.request.d.ts +3 -0
  8. package/dist/application/dtos/request/me.request.js +2 -0
  9. package/dist/application/dtos/request/register-user.request.d.ts +1 -1
  10. package/dist/application/dtos/request/request-password-reset.request.d.ts +6 -0
  11. package/dist/application/dtos/request/request-password-reset.request.js +2 -0
  12. package/dist/application/dtos/request/reset-password.request.d.ts +14 -0
  13. package/dist/application/dtos/request/reset-password.request.js +2 -0
  14. package/dist/application/dtos/request/verify-email.request.d.ts +3 -0
  15. package/dist/application/dtos/request/verify-email.request.js +2 -0
  16. package/dist/application/dtos/response/change-password.response.d.ts +7 -0
  17. package/dist/application/dtos/response/change-password.response.js +2 -0
  18. package/dist/application/dtos/response/index.d.ts +5 -0
  19. package/dist/application/dtos/response/index.js +5 -0
  20. package/dist/application/dtos/response/login.response.d.ts +2 -1
  21. package/dist/application/dtos/response/me.response.d.ts +11 -0
  22. package/dist/application/dtos/response/me.response.js +2 -0
  23. package/dist/application/dtos/response/refresh-token.response.d.ts +1 -0
  24. package/dist/application/dtos/response/register-user.response.d.ts +9 -0
  25. package/dist/application/dtos/response/request-password-reset.response.d.ts +15 -0
  26. package/dist/application/dtos/response/request-password-reset.response.js +2 -0
  27. package/dist/application/dtos/response/reset-password.response.d.ts +7 -0
  28. package/dist/application/dtos/response/reset-password.response.js +2 -0
  29. package/dist/application/dtos/response/verify-email.response.d.ts +4 -0
  30. package/dist/application/dtos/response/verify-email.response.js +2 -0
  31. package/dist/application/dtos/types/user-role.type.js +2 -0
  32. package/dist/application/facades/auth.facade.d.ts +33 -0
  33. package/dist/application/facades/auth.facade.js +60 -0
  34. package/dist/application/facades/create-auth-facade.d.ts +22 -0
  35. package/dist/application/facades/create-auth-facade.js +9 -0
  36. package/dist/application/facades/index.d.ts +2 -0
  37. package/dist/application/facades/index.js +18 -0
  38. package/dist/application/factories/auth-service.factory.d.ts +4 -4
  39. package/dist/application/factories/auth-service.factory.js +16 -4
  40. package/dist/application/factories/index.js +1 -0
  41. package/dist/application/types/auth-service-factory-options.type.d.ts +44 -0
  42. package/dist/application/use-cases/change-password.use-case.d.ts +21 -0
  43. package/dist/application/use-cases/change-password.use-case.js +49 -0
  44. package/dist/application/use-cases/index.d.ts +5 -0
  45. package/dist/application/use-cases/index.js +5 -0
  46. package/dist/application/use-cases/internal/index.d.ts +1 -0
  47. package/dist/application/use-cases/internal/index.js +17 -0
  48. package/dist/application/use-cases/internal/password-assertions.d.ts +13 -0
  49. package/dist/application/use-cases/internal/password-assertions.js +26 -0
  50. package/dist/application/use-cases/login-with-password.use-case.js +5 -1
  51. package/dist/application/use-cases/logout.use-case.js +14 -2
  52. package/dist/application/use-cases/me.use-case.d.ts +7 -0
  53. package/dist/application/use-cases/me.use-case.js +28 -0
  54. package/dist/application/use-cases/refresh-token.use-case.d.ts +16 -2
  55. package/dist/application/use-cases/refresh-token.use-case.js +33 -5
  56. package/dist/application/use-cases/register-user.use-case.d.ts +6 -1
  57. package/dist/application/use-cases/register-user.use-case.js +16 -7
  58. package/dist/application/use-cases/request-password-reset.use-case.d.ts +19 -0
  59. package/dist/application/use-cases/request-password-reset.use-case.js +43 -0
  60. package/dist/application/use-cases/reset-password.use-case.d.ts +20 -0
  61. package/dist/application/use-cases/reset-password.use-case.js +59 -0
  62. package/dist/application/use-cases/verify-email.use-case.d.ts +8 -0
  63. package/dist/application/use-cases/verify-email.use-case.js +26 -0
  64. package/dist/domain/entities/credential.entity.d.ts +36 -11
  65. package/dist/domain/entities/credential.entity.js +41 -11
  66. package/dist/domain/entities/user.entity.d.ts +32 -1
  67. package/dist/domain/entities/user.entity.js +54 -1
  68. package/dist/domain/errors/Invalid-jwt-payload.error.d.ts +4 -0
  69. package/dist/domain/errors/Invalid-jwt-payload.error.js +10 -0
  70. package/dist/domain/errors/auth-error-code.d.ts +12 -0
  71. package/dist/domain/errors/auth-error-code.js +2 -0
  72. package/dist/domain/errors/auth.errors.d.ts +6 -7
  73. package/dist/domain/errors/auth.errors.js +11 -6
  74. package/dist/domain/errors/identity.errors.d.ts +17 -12
  75. package/dist/domain/errors/identity.errors.js +29 -25
  76. package/dist/domain/errors/index.d.ts +3 -0
  77. package/dist/domain/errors/index.js +3 -0
  78. package/dist/domain/errors/password-reset.errors.d.ts +14 -0
  79. package/dist/domain/errors/password-reset.errors.js +29 -0
  80. package/dist/domain/index.d.ts +1 -0
  81. package/dist/domain/index.js +1 -0
  82. package/dist/domain/object-values/id.js +3 -4
  83. package/dist/domain/ports/auth/email-verification-token.port.d.ts +19 -0
  84. package/dist/domain/ports/auth/email-verification-token.port.js +2 -0
  85. package/dist/domain/ports/auth/index.d.ts +2 -0
  86. package/dist/domain/ports/auth/index.js +2 -0
  87. package/dist/domain/ports/auth/password-reset-token.port.d.ts +36 -0
  88. package/dist/domain/ports/auth/password-reset-token.port.js +2 -0
  89. package/dist/domain/ports/jwt/payload/jwt-payload.port.d.ts +25 -3
  90. package/dist/domain/ports/repository/credential.repository.d.ts +55 -2
  91. package/dist/domain/ports/token/token-session.port.d.ts +2 -0
  92. package/dist/domain/props/entities/credential.props.d.ts +9 -1
  93. package/dist/domain/props/entities/user.props.d.ts +1 -0
  94. package/dist/domain/props/jwt/generate-access-token.props.d.ts +3 -2
  95. package/dist/domain/props/jwt/generate-refresh-token.props.d.ts +3 -2
  96. package/dist/domain/props/jwt/jwt-user.d.ts +11 -2
  97. package/dist/domain/services/helpers/index.d.ts +6 -0
  98. package/dist/domain/services/helpers/index.js +22 -0
  99. package/dist/domain/services/helpers/optional-audience.helper.d.ts +14 -0
  100. package/dist/domain/services/helpers/optional-audience.helper.js +49 -0
  101. package/dist/domain/services/helpers/optional-non-empty-string.helper.d.ts +1 -0
  102. package/dist/domain/services/helpers/optional-non-empty-string.helper.js +9 -0
  103. package/dist/domain/services/helpers/optional-record.helper.d.ts +1 -0
  104. package/dist/domain/services/helpers/optional-record.helper.js +15 -0
  105. package/dist/domain/services/helpers/optional-roles.helper.d.ts +3 -0
  106. package/dist/domain/services/helpers/optional-roles.helper.js +32 -0
  107. package/dist/domain/services/helpers/require-finite-number.helper.d.ts +1 -0
  108. package/dist/domain/services/helpers/require-finite-number.helper.js +12 -0
  109. package/dist/domain/services/helpers/require-non-empty-string.helper.d.ts +1 -0
  110. package/dist/domain/services/helpers/require-non-empty-string.helper.js +12 -0
  111. package/dist/domain/services/index.d.ts +1 -0
  112. package/dist/domain/services/index.js +1 -0
  113. package/dist/domain/services/normalize-jwt-payload.service.d.ts +19 -0
  114. package/dist/domain/services/normalize-jwt-payload.service.js +58 -0
  115. package/dist/domain/types/access-snapshot.type.d.ts +15 -0
  116. package/dist/domain/types/access-snapshot.type.js +2 -0
  117. package/dist/domain/types/index.d.ts +1 -0
  118. package/dist/domain/types/index.js +2 -0
  119. package/dist/in-memory/in-memory-credential.repository.d.ts +66 -3
  120. package/dist/in-memory/in-memory-credential.repository.js +174 -46
  121. package/dist/index.d.ts +20 -1
  122. package/dist/index.js +28 -6
  123. package/dist/infrastructure/index.d.ts +3 -0
  124. package/dist/infrastructure/index.js +18 -0
  125. package/dist/infrastructure/security/bcrypt-password-hasher.js +0 -1
  126. package/dist/infrastructure/services/token-session.service.d.ts +163 -8
  127. package/dist/infrastructure/services/token-session.service.js +290 -37
  128. package/dist/infrastructure/types/auth-service-container.d.ts +21 -2
  129. package/dist/shared/index.d.ts +1 -0
  130. package/dist/shared/index.js +1 -0
  131. package/dist/shared/jwt-plugin/create-jwt-id.d.ts +6 -0
  132. package/dist/shared/jwt-plugin/create-jwt-id.js +30 -0
  133. package/dist/shared/jwt-plugin/index.d.ts +9 -0
  134. package/dist/shared/jwt-plugin/index.js +25 -0
  135. package/dist/shared/jwt-plugin/is-retryable-auth-code.d.ts +8 -0
  136. package/dist/shared/jwt-plugin/is-retryable-auth-code.js +15 -0
  137. package/dist/shared/jwt-plugin/normalize-clock-skew-seconds.d.ts +14 -0
  138. package/dist/shared/jwt-plugin/normalize-clock-skew-seconds.js +23 -0
  139. package/dist/shared/jwt-plugin/normalize-default-expires-in.d.ts +16 -0
  140. package/dist/shared/jwt-plugin/normalize-default-expires-in.js +36 -0
  141. package/dist/shared/jwt-plugin/read-custom-claims.d.ts +12 -0
  142. package/dist/shared/jwt-plugin/read-custom-claims.js +21 -0
  143. package/dist/shared/jwt-plugin/read-expires-in.d.ts +12 -0
  144. package/dist/shared/jwt-plugin/read-expires-in.js +20 -0
  145. package/dist/shared/jwt-plugin/read-session-id.d.ts +11 -0
  146. package/dist/shared/jwt-plugin/read-session-id.js +17 -0
  147. package/dist/shared/jwt-plugin/resolve-expires-in.d.ts +14 -0
  148. package/dist/shared/jwt-plugin/resolve-expires-in.js +31 -0
  149. package/dist/shared/jwt-plugin/to-date-from-unix-seconds.d.ts +7 -0
  150. package/dist/shared/jwt-plugin/to-date-from-unix-seconds.js +12 -0
  151. package/package.json +5 -4
  152. /package/dist/application/dtos/{type/user-role.type.js → request/change-password.request.js} +0 -0
  153. /package/dist/application/dtos/{type → types}/index.d.ts +0 -0
  154. /package/dist/application/dtos/{type → types}/index.js +0 -0
  155. /package/dist/application/dtos/{type → types}/user-role.type.d.ts +0 -0
@@ -1,3 +1,3 @@
1
1
  export * from "./request";
2
2
  export * from "./response";
3
- export * from "./type";
3
+ export * from "./types";
@@ -16,4 +16,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./request"), exports);
18
18
  __exportStar(require("./response"), exports);
19
- __exportStar(require("./type"), exports);
19
+ __exportStar(require("./types"), exports);
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Cambiar password desde formulario
3
+ */
4
+ export interface ChangePasswordRequest {
5
+ userId: string;
6
+ sessionId: string;
7
+ currentPassword: string;
8
+ newPassword: string;
9
+ confirmNewPassword: string;
10
+ /**
11
+ * Si es true, revoca todas las sesiones del usuario.
12
+ * Si es false, revoca solo la sesión actual (sessionId).
13
+ */
14
+ logoutAllDevices: boolean;
15
+ }
@@ -2,3 +2,8 @@ export * from "./login.request";
2
2
  export * from "./logout.request";
3
3
  export * from "./refresh-token.request";
4
4
  export * from "./register-user.request";
5
+ export * from "./request-password-reset.request";
6
+ export * from "./reset-password.request";
7
+ export * from "./change-password.request";
8
+ export * from "./verify-email.request";
9
+ export * from "./me.request";
@@ -18,3 +18,8 @@ __exportStar(require("./login.request"), exports);
18
18
  __exportStar(require("./logout.request"), exports);
19
19
  __exportStar(require("./refresh-token.request"), exports);
20
20
  __exportStar(require("./register-user.request"), exports);
21
+ __exportStar(require("./request-password-reset.request"), exports);
22
+ __exportStar(require("./reset-password.request"), exports);
23
+ __exportStar(require("./change-password.request"), exports);
24
+ __exportStar(require("./verify-email.request"), exports);
25
+ __exportStar(require("./me.request"), exports);
@@ -1,3 +1,4 @@
1
1
  export interface LogoutRequest {
2
- refreshToken: string;
2
+ refreshToken?: string;
3
+ sessionId?: string;
3
4
  }
@@ -0,0 +1,3 @@
1
+ export interface MeRequest {
2
+ userId: string;
3
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,4 +1,4 @@
1
- import { UserRole } from "../type";
1
+ import { UserRole } from "../types";
2
2
  export interface RegisterUserRequest {
3
3
  email: string;
4
4
  password: string;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Solicitar un cambio de password por medio del email (inicio)
3
+ */
4
+ export interface RequestPasswordResetRequest {
5
+ email: string;
6
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Actualizar password usando un token una vez que se envía link a email
3
+ */
4
+ export interface ResetPasswordRequest {
5
+ resetToken: string;
6
+ newPassword: string;
7
+ confirmNewPassword: string;
8
+ /**
9
+ * Política de sesiones post-reset:
10
+ * - true: logout global (recomendado)
11
+ * - false: mantener sesiones (si lo permites)
12
+ */
13
+ logoutAllDevices?: boolean;
14
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,3 @@
1
+ export interface VerifyEmailRequest {
2
+ token: string;
3
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Respuesta cambio de password desde formulario
3
+ */
4
+ export interface ChangePasswordResponse {
5
+ success: true;
6
+ message: string;
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -2,3 +2,8 @@ export * from "./login.response";
2
2
  export * from "./logout.response";
3
3
  export * from "./refresh-token.response";
4
4
  export * from "./register-user.response";
5
+ export * from "./reset-password.response";
6
+ export * from "./request-password-reset.response";
7
+ export * from "./change-password.response";
8
+ export * from "./verify-email.response";
9
+ export * from "./me.response";
@@ -18,3 +18,8 @@ __exportStar(require("./login.response"), exports);
18
18
  __exportStar(require("./logout.response"), exports);
19
19
  __exportStar(require("./refresh-token.response"), exports);
20
20
  __exportStar(require("./register-user.response"), exports);
21
+ __exportStar(require("./reset-password.response"), exports);
22
+ __exportStar(require("./request-password-reset.response"), exports);
23
+ __exportStar(require("./change-password.response"), exports);
24
+ __exportStar(require("./verify-email.response"), exports);
25
+ __exportStar(require("./me.response"), exports);
@@ -1,4 +1,5 @@
1
1
  export interface LoginResponse {
2
+ sessionId: string;
2
3
  accessToken: string;
3
- refreshToken: string;
4
+ refreshToken?: string;
4
5
  }
@@ -0,0 +1,11 @@
1
+ export interface MeResponse {
2
+ id: string;
3
+ email: string;
4
+ isActive: boolean;
5
+ isEmailVerified: boolean;
6
+ roles: {
7
+ role: string;
8
+ }[];
9
+ createdAt: string;
10
+ updatedAt: string;
11
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,4 +1,5 @@
1
1
  export interface RefreshTokenResponse {
2
+ sessionId: string;
2
3
  accessToken: string;
3
4
  refreshToken: string;
4
5
  }
@@ -4,4 +4,13 @@ export interface RegisterUserResponse {
4
4
  role: string;
5
5
  }[];
6
6
  isActive: boolean;
7
+ /**
8
+ * Delivery interno para el host (API) para enviar email.
9
+ * NO recomendado devolver al cliente.
10
+ */
11
+ delivery?: {
12
+ email: string;
13
+ token: string;
14
+ expiresAt: string;
15
+ };
7
16
  }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Respuesta del caso de uso.
3
+ * - `message` debe ser genérico para evitar enumeración de usuarios.
4
+ * - `delivery` es opcional y SOLO debe usarse internamente por el API para enviar email.
5
+ * No se recomienda devolver `delivery` al cliente final.
6
+ */
7
+ export interface RequestPasswordResetResponse {
8
+ success: true;
9
+ message: string;
10
+ delivery?: {
11
+ email: string;
12
+ resetToken: string;
13
+ expiresAt: string;
14
+ };
15
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Respuesta actualizar password por link cuando se solicita por email
3
+ */
4
+ export interface ResetPasswordResponse {
5
+ success: true;
6
+ message: string;
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,4 @@
1
+ export interface VerifyEmailResponse {
2
+ success: true;
3
+ message: string;
4
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,33 @@
1
+ import type { IAuthServiceContainer } from "../../infrastructure";
2
+ import type { ChangePasswordRequest, LoginRequest, LogoutRequest, MeRequest, RefreshTokenRequest, RegisterUserRequest, RequestPasswordResetRequest, ResetPasswordRequest, VerifyEmailRequest } from "../dtos/request";
3
+ import type { ChangePasswordResponse, LoginResponse, LogoutResponse, MeResponse, RefreshTokenResponse, RegisterUserResponse, RequestPasswordResetResponse, ResetPasswordResponse, VerifyEmailResponse } from "../dtos/response";
4
+ /**
5
+ * Facade delgada para integrar @jmlq/auth en hosts (APIs externas).
6
+ *
7
+ * Propósito:
8
+ * - Ofrecer una API ergonómica y estable.
9
+ * - Delegar 100% la lógica de negocio a los use-cases del container.
10
+ *
11
+ * No hace:
12
+ * - Validaciones de negocio.
13
+ * - Conocimiento de Express, TypeORM, jose, etc.
14
+ *
15
+ * Nota de tipado:
16
+ * - Cada use-case.execute(...) retorna Promise<T>.
17
+ * - Por eso aquí exponemos Promise<T> (NO Promise<Promise<T>>).
18
+ * - Para evitar fragilidad y ruido, tipamos con DTOs públicos (request/response),
19
+ * no con "index access types" sobre el container.
20
+ */
21
+ export declare class AuthFacade {
22
+ private readonly container;
23
+ constructor(container: IAuthServiceContainer);
24
+ registerUser(request: RegisterUserRequest): Promise<RegisterUserResponse>;
25
+ loginWithPassword(request: LoginRequest): Promise<LoginResponse>;
26
+ refreshToken(request: RefreshTokenRequest): Promise<RefreshTokenResponse>;
27
+ logout(request: LogoutRequest): Promise<LogoutResponse>;
28
+ changePassword(request: ChangePasswordRequest): Promise<ChangePasswordResponse>;
29
+ requestPasswordReset(request: RequestPasswordResetRequest): Promise<RequestPasswordResetResponse>;
30
+ resetPassword(request: ResetPasswordRequest): Promise<ResetPasswordResponse>;
31
+ verifyEmail(request: VerifyEmailRequest): Promise<VerifyEmailResponse>;
32
+ me(request: MeRequest): Promise<MeResponse>;
33
+ }
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ //src/application/facades/auth.facade.ts
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.AuthFacade = void 0;
5
+ /**
6
+ * Facade delgada para integrar @jmlq/auth en hosts (APIs externas).
7
+ *
8
+ * Propósito:
9
+ * - Ofrecer una API ergonómica y estable.
10
+ * - Delegar 100% la lógica de negocio a los use-cases del container.
11
+ *
12
+ * No hace:
13
+ * - Validaciones de negocio.
14
+ * - Conocimiento de Express, TypeORM, jose, etc.
15
+ *
16
+ * Nota de tipado:
17
+ * - Cada use-case.execute(...) retorna Promise<T>.
18
+ * - Por eso aquí exponemos Promise<T> (NO Promise<Promise<T>>).
19
+ * - Para evitar fragilidad y ruido, tipamos con DTOs públicos (request/response),
20
+ * no con "index access types" sobre el container.
21
+ */
22
+ class AuthFacade {
23
+ constructor(container) {
24
+ this.container = container;
25
+ }
26
+ // -------------------------
27
+ // Identity / Auth flows
28
+ // -------------------------
29
+ registerUser(request) {
30
+ return this.container.registerUserUseCase.execute(request);
31
+ }
32
+ loginWithPassword(request) {
33
+ return this.container.loginWithPasswordUseCase.execute(request);
34
+ }
35
+ refreshToken(request) {
36
+ return this.container.refreshTokenUseCase.execute(request);
37
+ }
38
+ logout(request) {
39
+ return this.container.logoutUseCase.execute(request);
40
+ }
41
+ changePassword(request) {
42
+ return this.container.changePasswordUseCase.execute(request);
43
+ }
44
+ // -------------------------
45
+ // Password reset flows
46
+ // -------------------------
47
+ requestPasswordReset(request) {
48
+ return this.container.requestPasswordResetUseCase.execute(request);
49
+ }
50
+ resetPassword(request) {
51
+ return this.container.resetPasswordUseCase.execute(request);
52
+ }
53
+ verifyEmail(request) {
54
+ return this.container.verifyEmailUseCase.execute(request);
55
+ }
56
+ me(request) {
57
+ return this.container.meUseCase.execute(request);
58
+ }
59
+ }
60
+ exports.AuthFacade = AuthFacade;
@@ -0,0 +1,22 @@
1
+ import { AuthFacade } from "./auth.facade";
2
+ import type { IUserRepositoryPort, ICredentialRepositoryPort, ITokenServicePort, IPasswordResetTokenPort, IEmailVerificationTokenPort } from "../../domain";
3
+ import type { AuthServiceFactoryOptions } from "../types";
4
+ /**
5
+ * Helper de integración para hosts (APIs externas).
6
+ *
7
+ * Crea el container oficial del core (@jmlq/auth) y lo envuelve con una facade
8
+ * ergonómica (`AuthFacade`) para evitar boilerplate repetido.
9
+ *
10
+ * SRP:
11
+ * - Este helper SOLO hace composición (wiring).
12
+ * - No contiene reglas de negocio.
13
+ */
14
+ export type CreateAuthFacadeDeps = Readonly<{
15
+ userRepository: IUserRepositoryPort;
16
+ credentialRepository: ICredentialRepositoryPort;
17
+ tokenService: ITokenServicePort;
18
+ passwordResetToken: IPasswordResetTokenPort;
19
+ emailVerificationToken: IEmailVerificationTokenPort;
20
+ options?: AuthServiceFactoryOptions;
21
+ }>;
22
+ export declare function createAuthFacade(deps: CreateAuthFacadeDeps): AuthFacade;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAuthFacade = createAuthFacade;
4
+ const auth_facade_1 = require("./auth.facade");
5
+ const factories_1 = require("../factories");
6
+ function createAuthFacade(deps) {
7
+ const container = factories_1.AuthServiceFactory.create(deps.userRepository, deps.credentialRepository, deps.tokenService, deps.passwordResetToken, deps.emailVerificationToken, deps.options);
8
+ return new auth_facade_1.AuthFacade(container);
9
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./auth.facade";
2
+ export * from "./create-auth-facade";
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./auth.facade"), exports);
18
+ __exportStar(require("./create-auth-facade"), exports);
@@ -1,11 +1,11 @@
1
- import { ICredentialRepositoryPort, ITokenServicePort, IUserRepositoryPort } from "../../domain";
2
- import { IAuthServiceContainer } from "../../infrastructure/types";
3
- import { AuthServiceFactoryOptions } from "../types";
1
+ import { ICredentialRepositoryPort, ITokenServicePort, IUserRepositoryPort, IPasswordResetTokenPort, IEmailVerificationTokenPort } from "../../domain";
2
+ import type { IAuthServiceContainer } from "../../infrastructure/types";
3
+ import type { AuthServiceFactoryOptions } from "../types";
4
4
  /**
5
5
  * Factory principal:
6
6
  * - construye servicios e inyecta dependencias
7
7
  * - encapsula configuración para que NO se repita en cada API externa
8
8
  */
9
9
  export declare class AuthServiceFactory {
10
- static create(userRepository: IUserRepositoryPort, credentialRepository: ICredentialRepositoryPort, tokenService: ITokenServicePort, options?: AuthServiceFactoryOptions): IAuthServiceContainer;
10
+ static create(userRepository: IUserRepositoryPort, credentialRepository: ICredentialRepositoryPort, tokenService: ITokenServicePort, passwordResetToken: IPasswordResetTokenPort, emailVerificationToken: IEmailVerificationTokenPort, options?: AuthServiceFactoryOptions): IAuthServiceContainer;
11
11
  }
@@ -1,7 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AuthServiceFactory = void 0;
4
- // src/application/factories/auth-service.factory.ts
5
4
  const services_1 = require("../../domain/services");
6
5
  const use_cases_1 = require("../use-cases");
7
6
  const security_1 = require("../../infrastructure/security");
@@ -12,17 +11,23 @@ const services_2 = require("../../infrastructure/services");
12
11
  * - encapsula configuración para que NO se repita en cada API externa
13
12
  */
14
13
  class AuthServiceFactory {
15
- static create(userRepository, credentialRepository, tokenService, options) {
14
+ static create(userRepository, credentialRepository, tokenService, passwordResetToken, emailVerificationToken, options) {
16
15
  // 1) Policy + hasher
17
- const passwordPolicy = new services_1.DefaultPasswordPolicy();
16
+ const passwordPolicy = options?.passwordPolicy ?? new services_1.DefaultPasswordPolicy();
18
17
  const passwordHasher = new security_1.BcryptPasswordHasher(options?.bcryptSaltRounds);
19
18
  // 2) Session service (rotación/revocación)
20
19
  const tokenSession = new services_2.TokenSessionService(tokenService, userRepository, credentialRepository, options?.accessTokenTtl ?? "15m", options?.refreshTokenTtl ?? "7d");
21
20
  // 3) Use cases
22
- const registerUserUseCase = new use_cases_1.RegisterUserUseCase(userRepository, passwordHasher, passwordPolicy);
21
+ const registerUserUseCase = new use_cases_1.RegisterUserUseCase(userRepository, passwordHasher, passwordPolicy, emailVerificationToken, { verifyTokenTtl: options?.emailVerificationTokenTtl });
22
+ const verifyEmailUseCase = new use_cases_1.VerifyEmailUseCase(userRepository, emailVerificationToken);
23
23
  const loginWithPasswordUseCase = new use_cases_1.LoginWithPasswordUseCase(userRepository, passwordHasher, tokenSession);
24
+ const meUseCase = new use_cases_1.MeUseCase(userRepository);
24
25
  const refreshTokenUseCase = new use_cases_1.RefreshTokenUseCase(tokenSession);
25
26
  const logoutUseCase = new use_cases_1.LogoutUseCase(tokenSession);
27
+ // 4) Use cases nuevos (password flows)
28
+ const requestPasswordResetUseCase = new use_cases_1.RequestPasswordResetUseCase(userRepository, passwordResetToken, { resetTokenTtl: options?.passwordResetTokenTtl });
29
+ const resetPasswordUseCase = new use_cases_1.ResetPasswordUseCase(userRepository, credentialRepository, passwordHasher, passwordPolicy, passwordResetToken);
30
+ const changePasswordUseCase = new use_cases_1.ChangePasswordUseCase(userRepository, credentialRepository, passwordHasher, passwordPolicy);
26
31
  return {
27
32
  userRepository,
28
33
  credentialRepository,
@@ -30,10 +35,17 @@ class AuthServiceFactory {
30
35
  tokenService,
31
36
  passwordPolicy,
32
37
  tokenSession,
38
+ passwordResetToken,
33
39
  registerUserUseCase,
34
40
  loginWithPasswordUseCase,
35
41
  refreshTokenUseCase,
36
42
  logoutUseCase,
43
+ requestPasswordResetUseCase,
44
+ resetPasswordUseCase,
45
+ changePasswordUseCase,
46
+ verifyEmailUseCase,
47
+ emailVerificationToken,
48
+ meUseCase,
37
49
  };
38
50
  }
39
51
  }
@@ -14,4 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ //src/application/factories/index.ts
17
18
  __exportStar(require("./auth-service.factory"), exports);
@@ -1,5 +1,49 @@
1
+ import type { IPasswordPolicyPort } from "../../domain/ports";
2
+ /**
3
+ * Permite ajustar parámetros operativos de Auth sin conocer ni tocar la construcción interna del core.
4
+ * Es decir: configura “políticas” y “valores por defecto” que la factory usará al armar el container.
5
+ */
1
6
  export interface AuthServiceFactoryOptions {
7
+ /**
8
+ * Controla el costo computacional del hashing con bcrypt
9
+ * - Qué hace: define cuántas rondas (work factor) usa bcrypt al generar hashes.
10
+ * - Impacto:
11
+ * - Mayor valor ⇒ más seguro contra ataques de fuerza bruta, pero más CPU/latencia en register/login/change/reset password.
12
+ * - Menor valor ⇒ más rápido, pero menos robusto.
13
+ */
2
14
  bcryptSaltRounds?: number;
15
+ /**
16
+ * Permite reemplazar la política de password por defecto del core.
17
+ * - Si no se envía, el core usa DefaultPasswordPolicy.
18
+ * - Si se envía, se utiliza esta policy (host-defined).
19
+ */
20
+ passwordPolicy?: IPasswordPolicyPort;
21
+ /**
22
+ * Define el tiempo de vida por defecto de los access tokens.
23
+ * - Qué hace: determina el exp (expiración) con el que se generan access tokens (si tu tokenSession/token service usa este default).
24
+ * - Formato: string “humana” (ej. "15m", "1h"), que el core normaliza.
25
+ * - Impacto:
26
+ * - Más corto ⇒ más seguridad, más refresh frecuente.
27
+ * - Más largo ⇒ mejor UX, más riesgo si el token se filtra.
28
+ */
3
29
  accessTokenTtl?: string;
30
+ /**
31
+ * Define el tiempo de vida por defecto de los refresh tokens.
32
+ * - Qué hace: determina la expiración del refresh token (el que permite rotar/renovar access tokens).
33
+ * - Formato: "7d", "30d", etc.
34
+ * - Impacto:
35
+ * - Más corto ⇒ limita ventana de secuestro de sesión, pero obliga re-login más seguido.
36
+ * - Más largo ⇒ sesiones persistentes, más riesgo si el refresh token se compromete.
37
+ */
4
38
  refreshTokenTtl?: string;
39
+ /**
40
+ * Define el tiempo de vida del token de recuperación de contraseña (RememberPassword).
41
+ * - Qué hace: controla cuánto dura el token que se entrega en el email de “reset password”.
42
+ * - Formato: "15m", "30m", "1h", etc
43
+ * - Impacto:
44
+ * - Más corto ⇒ más seguro (menos ventana), pero el usuario puede no alcanzar a usarlo.
45
+ * - Más largo ⇒ mejor conveniencia, pero incrementa exposición.
46
+ */
47
+ passwordResetTokenTtl?: string;
48
+ emailVerificationTokenTtl?: string;
5
49
  }
@@ -0,0 +1,21 @@
1
+ import type { ICredentialRepositoryPort, IPasswordHasherPort, IPasswordPolicyPort, IUserRepositoryPort } from "../../domain/ports";
2
+ import { ChangePasswordRequest, ChangePasswordResponse } from "../dtos";
3
+ /**
4
+ * Cambia contraseña con validación de password actual.
5
+ *
6
+ * - Valida confirmación
7
+ * - Valida policy
8
+ * - Verifica password actual
9
+ * - Cambia hash
10
+ * - Revoca sesiones:
11
+ * - logoutAllDevices=true => revoca todas
12
+ * - false => revoca solo la sesión actual (sessionId)
13
+ */
14
+ export declare class ChangePasswordUseCase {
15
+ private readonly userRepository;
16
+ private readonly credentialRepository;
17
+ private readonly passwordHasher;
18
+ private readonly passwordPolicy;
19
+ constructor(userRepository: IUserRepositoryPort, credentialRepository: ICredentialRepositoryPort, passwordHasher: IPasswordHasherPort, passwordPolicy: IPasswordPolicyPort);
20
+ execute(request: ChangePasswordRequest): Promise<ChangePasswordResponse>;
21
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChangePasswordUseCase = void 0;
4
+ const object_values_1 = require("../../domain/object-values");
5
+ const errors_1 = require("../../domain/errors");
6
+ const internal_1 = require("./internal");
7
+ /**
8
+ * Cambia contraseña con validación de password actual.
9
+ *
10
+ * - Valida confirmación
11
+ * - Valida policy
12
+ * - Verifica password actual
13
+ * - Cambia hash
14
+ * - Revoca sesiones:
15
+ * - logoutAllDevices=true => revoca todas
16
+ * - false => revoca solo la sesión actual (sessionId)
17
+ */
18
+ class ChangePasswordUseCase {
19
+ constructor(userRepository, credentialRepository, passwordHasher, passwordPolicy) {
20
+ this.userRepository = userRepository;
21
+ this.credentialRepository = credentialRepository;
22
+ this.passwordHasher = passwordHasher;
23
+ this.passwordPolicy = passwordPolicy;
24
+ }
25
+ async execute(request) {
26
+ (0, internal_1.assertPasswordsMatch)(request.newPassword, request.confirmNewPassword);
27
+ (0, internal_1.assertPasswordPolicy)(this.passwordPolicy, request.newPassword);
28
+ const user = await this.userRepository.findById(new object_values_1.Id(request.userId));
29
+ if (!user)
30
+ throw new errors_1.UserNotFoundError("User not found");
31
+ const currentHash = user.password.serialize();
32
+ const ok = await this.passwordHasher.compare(request.currentPassword, currentHash);
33
+ if (!ok) {
34
+ throw new errors_1.PasswordMismatchError("Current password is invalid");
35
+ }
36
+ const newHash = await this.passwordHasher.hash(request.newPassword);
37
+ user.changePassword(new object_values_1.HashedPassword(newHash));
38
+ await this.userRepository.update(user);
39
+ const userId = user.id;
40
+ if (request.logoutAllDevices) {
41
+ await this.credentialRepository.deleteByUserId(userId);
42
+ }
43
+ else {
44
+ await this.credentialRepository.deleteBySessionId(new object_values_1.Id(request.sessionId));
45
+ }
46
+ return { success: true, message: "Password changed successfully" };
47
+ }
48
+ }
49
+ exports.ChangePasswordUseCase = ChangePasswordUseCase;
@@ -2,3 +2,8 @@ export * from "./login-with-password.use-case";
2
2
  export * from "./logout.use-case";
3
3
  export * from "./refresh-token.use-case";
4
4
  export * from "./register-user.use-case";
5
+ export * from "./change-password.use-case";
6
+ export * from "./request-password-reset.use-case";
7
+ export * from "./reset-password.use-case";
8
+ export * from "./verify-email.use-case";
9
+ export * from "./me.use-case";
@@ -18,3 +18,8 @@ __exportStar(require("./login-with-password.use-case"), exports);
18
18
  __exportStar(require("./logout.use-case"), exports);
19
19
  __exportStar(require("./refresh-token.use-case"), exports);
20
20
  __exportStar(require("./register-user.use-case"), exports);
21
+ __exportStar(require("./change-password.use-case"), exports);
22
+ __exportStar(require("./request-password-reset.use-case"), exports);
23
+ __exportStar(require("./reset-password.use-case"), exports);
24
+ __exportStar(require("./verify-email.use-case"), exports);
25
+ __exportStar(require("./me.use-case"), exports);
@@ -0,0 +1 @@
1
+ export * from "./password-assertions";
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./password-assertions"), exports);