tychat-contracts 1.5.1 → 1.5.2
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/dist/auth/auth-kafka.payloads.d.ts +7 -0
- package/dist/auth/auth-kafka.payloads.d.ts.map +1 -1
- package/dist/auth/auth-kafka.payloads.js +36 -1
- package/dist/auth/index.d.ts +3 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +6 -1
- package/dist/auth/password-reset-finalize-2fa.dto.d.ts +8 -0
- package/dist/auth/password-reset-finalize-2fa.dto.d.ts.map +1 -0
- package/dist/auth/password-reset-finalize-2fa.dto.js +57 -0
- package/dist/auth/request-password-reset-response.dto.d.ts +12 -0
- package/dist/auth/request-password-reset-response.dto.d.ts.map +1 -0
- package/dist/auth/request-password-reset-response.dto.js +47 -0
- package/dist/notifications/notifications-kafka.payloads.d.ts +2 -1
- package/dist/notifications/notifications-kafka.payloads.d.ts.map +1 -1
- package/dist/notifications/notifications-kafka.payloads.js +14 -2
- package/package.json +1 -1
- package/src/auth/auth-kafka.payloads.ts +35 -1
- package/src/auth/index.ts +3 -0
- package/src/auth/password-reset-finalize-2fa.dto.ts +36 -0
- package/src/auth/request-password-reset-response.dto.ts +26 -0
- package/src/notifications/notifications-kafka.payloads.ts +15 -3
|
@@ -34,4 +34,11 @@ export declare class ConfirmPasswordResetPayload {
|
|
|
34
34
|
verify_token: string;
|
|
35
35
|
password: string;
|
|
36
36
|
}
|
|
37
|
+
/** Conclui reset de senha com 2FA (RMQ/Kafka → auth-service). */
|
|
38
|
+
export declare class PasswordResetFinalize2faPayload {
|
|
39
|
+
tenant: string;
|
|
40
|
+
pre_recovery_token: string;
|
|
41
|
+
totp: string;
|
|
42
|
+
password: string;
|
|
43
|
+
}
|
|
37
44
|
//# sourceMappingURL=auth-kafka.payloads.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-kafka.payloads.d.ts","sourceRoot":"","sources":["../../src/auth/auth-kafka.payloads.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth-kafka.payloads.d.ts","sourceRoot":"","sources":["../../src/auth/auth-kafka.payloads.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,qBAAa,YAAa,SAAQ,QAAQ;IAKxC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,+EAA+E;AAC/E,qBAAa,eAAe;IAK1B,MAAM,EAAE,MAAM,CAAC;IAKf,cAAc,EAAE,MAAM,CAAC;IAKvB,IAAI,EAAE,MAAM,CAAC;IAMb,WAAW,CAAC,EAAE,MAAM,CAAC;IAKrB,WAAW,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,CAAC;IAMvC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAM3B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,qBAAa,eAAe;IAK1B,MAAM,EAAE,MAAM,CAAC;IAMf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,cAAe,SAAQ,eAAe;IAKjD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,2FAA2F;AAC3F,qBAAa,iBAAiB;IAK5B,MAAM,EAAE,MAAM,CAAC;IAQf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,2BAA2B;IAKtC,MAAM,EAAE,MAAM,CAAC;IAMf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,2BAA2B;IAKtC,MAAM,EAAE,MAAM,CAAC;IAMf,YAAY,EAAE,MAAM,CAAC;IAMrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,iEAAiE;AACjE,qBAAa,+BAA+B;IAK1C,MAAM,EAAE,MAAM,CAAC;IAMf,kBAAkB,EAAE,MAAM,CAAC;IAK3B,IAAI,EAAE,MAAM,CAAC;IAMb,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -9,7 +9,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.ConfirmPasswordResetPayload = exports.RequestPasswordResetPayload = exports.GetProfilePayload = exports.RefreshPayload = exports.ValidatePayload = exports.Login2faPayload = exports.LoginPayload = void 0;
|
|
12
|
+
exports.PasswordResetFinalize2faPayload = exports.ConfirmPasswordResetPayload = exports.RequestPasswordResetPayload = exports.GetProfilePayload = exports.RefreshPayload = exports.ValidatePayload = exports.Login2faPayload = exports.LoginPayload = void 0;
|
|
13
13
|
const swagger_1 = require("@nestjs/swagger");
|
|
14
14
|
const class_validator_1 = require("class-validator");
|
|
15
15
|
const login_dto_1 = require("./login.dto");
|
|
@@ -180,3 +180,38 @@ __decorate([
|
|
|
180
180
|
(0, class_validator_1.MaxLength)(255),
|
|
181
181
|
__metadata("design:type", String)
|
|
182
182
|
], ConfirmPasswordResetPayload.prototype, "password", void 0);
|
|
183
|
+
/** Conclui reset de senha com 2FA (RMQ/Kafka → auth-service). */
|
|
184
|
+
class PasswordResetFinalize2faPayload {
|
|
185
|
+
tenant;
|
|
186
|
+
pre_recovery_token;
|
|
187
|
+
totp;
|
|
188
|
+
password;
|
|
189
|
+
}
|
|
190
|
+
exports.PasswordResetFinalize2faPayload = PasswordResetFinalize2faPayload;
|
|
191
|
+
__decorate([
|
|
192
|
+
(0, swagger_1.ApiProperty)({ description: 'ID do tenant', example: 'tenant1' }),
|
|
193
|
+
(0, class_validator_1.IsString)(),
|
|
194
|
+
(0, class_validator_1.MinLength)(1, { message: 'tenant não pode ser vazio' }),
|
|
195
|
+
(0, class_validator_1.MaxLength)(255),
|
|
196
|
+
__metadata("design:type", String)
|
|
197
|
+
], PasswordResetFinalize2faPayload.prototype, "tenant", void 0);
|
|
198
|
+
__decorate([
|
|
199
|
+
(0, swagger_1.ApiProperty)({ description: 'JWT pre_password_reset do pedido de reset' }),
|
|
200
|
+
(0, class_validator_1.IsString)(),
|
|
201
|
+
(0, class_validator_1.MinLength)(1, { message: 'pre_recovery_token não pode ser vazio' }),
|
|
202
|
+
(0, class_validator_1.MaxLength)(4096),
|
|
203
|
+
__metadata("design:type", String)
|
|
204
|
+
], PasswordResetFinalize2faPayload.prototype, "pre_recovery_token", void 0);
|
|
205
|
+
__decorate([
|
|
206
|
+
(0, swagger_1.ApiProperty)({ description: 'Código TOTP de 6 dígitos' }),
|
|
207
|
+
(0, class_validator_1.IsString)(),
|
|
208
|
+
(0, class_validator_1.Matches)(/^\d{6}$/, { message: 'totp deve ser exatamente 6 dígitos' }),
|
|
209
|
+
__metadata("design:type", String)
|
|
210
|
+
], PasswordResetFinalize2faPayload.prototype, "totp", void 0);
|
|
211
|
+
__decorate([
|
|
212
|
+
(0, swagger_1.ApiProperty)({ description: 'Nova senha', example: 'senha123' }),
|
|
213
|
+
(0, class_validator_1.IsString)(),
|
|
214
|
+
(0, class_validator_1.MinLength)(6, { message: 'password deve ter no mínimo 6 caracteres' }),
|
|
215
|
+
(0, class_validator_1.MaxLength)(255),
|
|
216
|
+
__metadata("design:type", String)
|
|
217
|
+
], PasswordResetFinalize2faPayload.prototype, "password", void 0);
|
package/dist/auth/index.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export { LoginDto } from './login.dto';
|
|
2
|
-
export { LoginPayload, Login2faPayload, ValidatePayload, RefreshPayload, GetProfilePayload, RequestPasswordResetPayload, ConfirmPasswordResetPayload, } from './auth-kafka.payloads';
|
|
2
|
+
export { LoginPayload, Login2faPayload, ValidatePayload, RefreshPayload, GetProfilePayload, RequestPasswordResetPayload, ConfirmPasswordResetPayload, PasswordResetFinalize2faPayload, } from './auth-kafka.payloads';
|
|
3
3
|
export { RefreshTokenDto } from './refresh-token.dto';
|
|
4
4
|
export { RequestPasswordResetDto } from './request-password-reset.dto';
|
|
5
5
|
export { ConfirmPasswordResetDto } from './confirm-password-reset.dto';
|
|
6
|
+
export { RequestPasswordResetResponseDto } from './request-password-reset-response.dto';
|
|
7
|
+
export { PasswordResetFinalize2faDto } from './password-reset-finalize-2fa.dto';
|
|
6
8
|
export { AuthLoginResponseDto } from './auth-login-response.dto';
|
|
7
9
|
export { Login2faDto } from './login-2fa.dto';
|
|
8
10
|
export { TotpSetupConfirmDto, TotpDisableDto, TotpSetupStartResponseDto, } from './totp-user.dto';
|
package/dist/auth/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EACL,YAAY,EACZ,eAAe,EACf,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,2BAA2B,EAC3B,2BAA2B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EACL,YAAY,EACZ,eAAe,EACf,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,2BAA2B,EAC3B,2BAA2B,EAC3B,+BAA+B,GAChC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,+BAA+B,EAAE,MAAM,uCAAuC,CAAC;AACxF,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,yBAAyB,GAC1B,MAAM,iBAAiB,CAAC"}
|
package/dist/auth/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TotpSetupStartResponseDto = exports.TotpDisableDto = exports.TotpSetupConfirmDto = exports.Login2faDto = exports.AuthLoginResponseDto = exports.ConfirmPasswordResetDto = exports.RequestPasswordResetDto = exports.RefreshTokenDto = exports.ConfirmPasswordResetPayload = exports.RequestPasswordResetPayload = exports.GetProfilePayload = exports.RefreshPayload = exports.ValidatePayload = exports.Login2faPayload = exports.LoginPayload = exports.LoginDto = void 0;
|
|
3
|
+
exports.TotpSetupStartResponseDto = exports.TotpDisableDto = exports.TotpSetupConfirmDto = exports.Login2faDto = exports.AuthLoginResponseDto = exports.PasswordResetFinalize2faDto = exports.RequestPasswordResetResponseDto = exports.ConfirmPasswordResetDto = exports.RequestPasswordResetDto = exports.RefreshTokenDto = exports.PasswordResetFinalize2faPayload = exports.ConfirmPasswordResetPayload = exports.RequestPasswordResetPayload = exports.GetProfilePayload = exports.RefreshPayload = exports.ValidatePayload = exports.Login2faPayload = exports.LoginPayload = exports.LoginDto = void 0;
|
|
4
4
|
var login_dto_1 = require("./login.dto");
|
|
5
5
|
Object.defineProperty(exports, "LoginDto", { enumerable: true, get: function () { return login_dto_1.LoginDto; } });
|
|
6
6
|
var auth_kafka_payloads_1 = require("./auth-kafka.payloads");
|
|
@@ -11,12 +11,17 @@ Object.defineProperty(exports, "RefreshPayload", { enumerable: true, get: functi
|
|
|
11
11
|
Object.defineProperty(exports, "GetProfilePayload", { enumerable: true, get: function () { return auth_kafka_payloads_1.GetProfilePayload; } });
|
|
12
12
|
Object.defineProperty(exports, "RequestPasswordResetPayload", { enumerable: true, get: function () { return auth_kafka_payloads_1.RequestPasswordResetPayload; } });
|
|
13
13
|
Object.defineProperty(exports, "ConfirmPasswordResetPayload", { enumerable: true, get: function () { return auth_kafka_payloads_1.ConfirmPasswordResetPayload; } });
|
|
14
|
+
Object.defineProperty(exports, "PasswordResetFinalize2faPayload", { enumerable: true, get: function () { return auth_kafka_payloads_1.PasswordResetFinalize2faPayload; } });
|
|
14
15
|
var refresh_token_dto_1 = require("./refresh-token.dto");
|
|
15
16
|
Object.defineProperty(exports, "RefreshTokenDto", { enumerable: true, get: function () { return refresh_token_dto_1.RefreshTokenDto; } });
|
|
16
17
|
var request_password_reset_dto_1 = require("./request-password-reset.dto");
|
|
17
18
|
Object.defineProperty(exports, "RequestPasswordResetDto", { enumerable: true, get: function () { return request_password_reset_dto_1.RequestPasswordResetDto; } });
|
|
18
19
|
var confirm_password_reset_dto_1 = require("./confirm-password-reset.dto");
|
|
19
20
|
Object.defineProperty(exports, "ConfirmPasswordResetDto", { enumerable: true, get: function () { return confirm_password_reset_dto_1.ConfirmPasswordResetDto; } });
|
|
21
|
+
var request_password_reset_response_dto_1 = require("./request-password-reset-response.dto");
|
|
22
|
+
Object.defineProperty(exports, "RequestPasswordResetResponseDto", { enumerable: true, get: function () { return request_password_reset_response_dto_1.RequestPasswordResetResponseDto; } });
|
|
23
|
+
var password_reset_finalize_2fa_dto_1 = require("./password-reset-finalize-2fa.dto");
|
|
24
|
+
Object.defineProperty(exports, "PasswordResetFinalize2faDto", { enumerable: true, get: function () { return password_reset_finalize_2fa_dto_1.PasswordResetFinalize2faDto; } });
|
|
20
25
|
var auth_login_response_dto_1 = require("./auth-login-response.dto");
|
|
21
26
|
Object.defineProperty(exports, "AuthLoginResponseDto", { enumerable: true, get: function () { return auth_login_response_dto_1.AuthLoginResponseDto; } });
|
|
22
27
|
var login_2fa_dto_1 = require("./login-2fa.dto");
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Finaliza recuperação de senha quando o utilizador tem 2FA (após `password-reset/request`). */
|
|
2
|
+
export declare class PasswordResetFinalize2faDto {
|
|
3
|
+
pre_recovery_token: string;
|
|
4
|
+
totp: string;
|
|
5
|
+
password: string;
|
|
6
|
+
password_confirmation: string;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=password-reset-finalize-2fa.dto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password-reset-finalize-2fa.dto.d.ts","sourceRoot":"","sources":["../../src/auth/password-reset-finalize-2fa.dto.ts"],"names":[],"mappings":"AAIA,iGAAiG;AACjG,qBAAa,2BAA2B;IAKtC,kBAAkB,EAAE,MAAM,CAAC;IAK3B,IAAI,EAAE,MAAM,CAAC;IAMb,QAAQ,EAAE,MAAM,CAAC;IAajB,qBAAqB,EAAE,MAAM,CAAC;CAC/B"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.PasswordResetFinalize2faDto = void 0;
|
|
13
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
14
|
+
const class_validator_1 = require("class-validator");
|
|
15
|
+
const match_field_decorator_1 = require("./match-field.decorator");
|
|
16
|
+
/** Finaliza recuperação de senha quando o utilizador tem 2FA (após `password-reset/request`). */
|
|
17
|
+
class PasswordResetFinalize2faDto {
|
|
18
|
+
pre_recovery_token;
|
|
19
|
+
totp;
|
|
20
|
+
password;
|
|
21
|
+
password_confirmation;
|
|
22
|
+
}
|
|
23
|
+
exports.PasswordResetFinalize2faDto = PasswordResetFinalize2faDto;
|
|
24
|
+
__decorate([
|
|
25
|
+
(0, swagger_1.ApiProperty)({ description: 'JWT pre_password_reset devolvido no pedido de reset' }),
|
|
26
|
+
(0, class_validator_1.IsString)(),
|
|
27
|
+
(0, class_validator_1.MinLength)(1, { message: 'pre_recovery_token não pode ser vazio' }),
|
|
28
|
+
(0, class_validator_1.MaxLength)(4096),
|
|
29
|
+
__metadata("design:type", String)
|
|
30
|
+
], PasswordResetFinalize2faDto.prototype, "pre_recovery_token", void 0);
|
|
31
|
+
__decorate([
|
|
32
|
+
(0, swagger_1.ApiProperty)({ description: 'Código TOTP de 6 dígitos' }),
|
|
33
|
+
(0, class_validator_1.IsString)(),
|
|
34
|
+
(0, class_validator_1.Matches)(/^\d{6}$/, { message: 'totp deve ser exatamente 6 dígitos' }),
|
|
35
|
+
__metadata("design:type", String)
|
|
36
|
+
], PasswordResetFinalize2faDto.prototype, "totp", void 0);
|
|
37
|
+
__decorate([
|
|
38
|
+
(0, swagger_1.ApiProperty)({ description: 'Nova senha', example: 'senha123', minLength: 6 }),
|
|
39
|
+
(0, class_validator_1.IsString)(),
|
|
40
|
+
(0, class_validator_1.MinLength)(6, { message: 'password deve ter no mínimo 6 caracteres' }),
|
|
41
|
+
(0, class_validator_1.MaxLength)(255),
|
|
42
|
+
__metadata("design:type", String)
|
|
43
|
+
], PasswordResetFinalize2faDto.prototype, "password", void 0);
|
|
44
|
+
__decorate([
|
|
45
|
+
(0, swagger_1.ApiProperty)({
|
|
46
|
+
description: 'Confirmação da nova senha',
|
|
47
|
+
example: 'senha123',
|
|
48
|
+
minLength: 6,
|
|
49
|
+
}),
|
|
50
|
+
(0, class_validator_1.IsString)(),
|
|
51
|
+
(0, class_validator_1.MinLength)(6, { message: 'password_confirmation deve ter no mínimo 6 caracteres' }),
|
|
52
|
+
(0, class_validator_1.MaxLength)(255),
|
|
53
|
+
(0, match_field_decorator_1.MatchField)('password', {
|
|
54
|
+
message: 'password_confirmation deve ser igual a password',
|
|
55
|
+
}),
|
|
56
|
+
__metadata("design:type", String)
|
|
57
|
+
], PasswordResetFinalize2faDto.prototype, "password_confirmation", void 0);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resposta de `POST /auth/password-reset/request`.
|
|
3
|
+
* - Sem utilizador ou utilizador sem 2FA: apenas mensagem genérica (e e-mail com senha provisória se existir conta sem 2FA).
|
|
4
|
+
* - Utilizador com 2FA: inclui token para o passo seguinte (`finalize-2fa`).
|
|
5
|
+
*/
|
|
6
|
+
export declare class RequestPasswordResetResponseDto {
|
|
7
|
+
success: boolean;
|
|
8
|
+
message: string;
|
|
9
|
+
two_factor_required?: boolean;
|
|
10
|
+
pre_recovery_token?: string;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=request-password-reset-response.dto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-password-reset-response.dto.d.ts","sourceRoot":"","sources":["../../src/auth/request-password-reset-response.dto.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,qBAAa,+BAA+B;IAE1C,OAAO,EAAE,OAAO,CAAC;IAKjB,OAAO,EAAE,MAAM,CAAC;IAKhB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAK9B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.RequestPasswordResetResponseDto = void 0;
|
|
13
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
14
|
+
/**
|
|
15
|
+
* Resposta de `POST /auth/password-reset/request`.
|
|
16
|
+
* - Sem utilizador ou utilizador sem 2FA: apenas mensagem genérica (e e-mail com senha provisória se existir conta sem 2FA).
|
|
17
|
+
* - Utilizador com 2FA: inclui token para o passo seguinte (`finalize-2fa`).
|
|
18
|
+
*/
|
|
19
|
+
class RequestPasswordResetResponseDto {
|
|
20
|
+
success;
|
|
21
|
+
message;
|
|
22
|
+
two_factor_required;
|
|
23
|
+
pre_recovery_token;
|
|
24
|
+
}
|
|
25
|
+
exports.RequestPasswordResetResponseDto = RequestPasswordResetResponseDto;
|
|
26
|
+
__decorate([
|
|
27
|
+
(0, swagger_1.ApiProperty)({ example: true }),
|
|
28
|
+
__metadata("design:type", Boolean)
|
|
29
|
+
], RequestPasswordResetResponseDto.prototype, "success", void 0);
|
|
30
|
+
__decorate([
|
|
31
|
+
(0, swagger_1.ApiProperty)({
|
|
32
|
+
description: 'Mensagem genérica (não revela se o e-mail existe, exceto quando two_factor_required é true)',
|
|
33
|
+
}),
|
|
34
|
+
__metadata("design:type", String)
|
|
35
|
+
], RequestPasswordResetResponseDto.prototype, "message", void 0);
|
|
36
|
+
__decorate([
|
|
37
|
+
(0, swagger_1.ApiPropertyOptional)({
|
|
38
|
+
description: 'Presente quando o e-mail existe e o utilizador tem 2FA ativo',
|
|
39
|
+
}),
|
|
40
|
+
__metadata("design:type", Boolean)
|
|
41
|
+
], RequestPasswordResetResponseDto.prototype, "two_factor_required", void 0);
|
|
42
|
+
__decorate([
|
|
43
|
+
(0, swagger_1.ApiPropertyOptional)({
|
|
44
|
+
description: 'JWT de curta duração para `POST /auth/password-reset/finalize-2fa`',
|
|
45
|
+
}),
|
|
46
|
+
__metadata("design:type", String)
|
|
47
|
+
], RequestPasswordResetResponseDto.prototype, "pre_recovery_token", void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifications-kafka.payloads.d.ts","sourceRoot":"","sources":["../../src/notifications/notifications-kafka.payloads.ts"],"names":[],"mappings":"AAiBA,qBAAa,mCAAmC;IAM9C,OAAO,EAAE,MAAM,CAAC;IAShB,MAAM,EAAE,MAAM,CAAC;IAQf,KAAK,EAAE,MAAM,CAAC;IASd,IAAI,EAAE,MAAM,CAAC;IASb,QAAQ,EAAE,MAAM,CAAC;IAOjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,8CAA8C;IAMzD,OAAO,EAAE,MAAM,CAAC;IAShB,MAAM,EAAE,MAAM,CAAC;IAQf,KAAK,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"notifications-kafka.payloads.d.ts","sourceRoot":"","sources":["../../src/notifications/notifications-kafka.payloads.ts"],"names":[],"mappings":"AAiBA,qBAAa,mCAAmC;IAM9C,OAAO,EAAE,MAAM,CAAC;IAShB,MAAM,EAAE,MAAM,CAAC;IAQf,KAAK,EAAE,MAAM,CAAC;IASd,IAAI,EAAE,MAAM,CAAC;IASb,QAAQ,EAAE,MAAM,CAAC;IAOjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,8CAA8C;IAMzD,OAAO,EAAE,MAAM,CAAC;IAShB,MAAM,EAAE,MAAM,CAAC;IAQf,KAAK,EAAE,MAAM,CAAC;IAWd,WAAW,CAAC,EAAE,MAAM,CAAC;IAUrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAO3B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,sCAAsC;IAMjD,OAAO,EAAE,MAAM,CAAC;IAMhB,MAAM,EAAE,MAAM,CAAC;IAIf,MAAM,EAAE,MAAM,CAAC;IAKf,KAAK,EAAE,MAAM,CAAC;IAMd,IAAI,EAAE,MAAM,CAAC;IAMb,UAAU,EAAE,MAAM,CAAC;IAMnB,UAAU,EAAE,MAAM,CAAC;IAMnB,SAAS,CAAC,EAAE,MAAM,CAAC;IAMnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAIlB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,+FAA+F;AAC/F,qBAAa,iDAAiD;IAG5D,OAAO,EAAE,MAAM,CAAC;IAMhB,MAAM,EAAE,MAAM,CAAC;IAIf,SAAS,EAAE,MAAM,CAAC;IAKlB,WAAW,EAAE,MAAM,CAAC;IAMpB,MAAM,EAAE,MAAM,CAAC;IAIf,UAAU,EAAE,MAAM,CAAC;IAMnB,WAAW,CAAC,EAAE,MAAM,CAAC;IAKrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAOhB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAKnB,aAAa,CAAC,EAAE,IAAI,GAAG,QAAQ,CAAC;CACjC;AAED,0FAA0F;AAC1F,qBAAa,+CAA+C;IAG1D,OAAO,EAAE,MAAM,CAAC;IAMhB,MAAM,EAAE,MAAM,CAAC;IASf,gBAAgB,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;IAMrC,eAAe,EAAE,MAAM,CAAC;IAMxB,gBAAgB,EAAE,MAAM,CAAC;IAKzB,cAAc,EAAE,MAAM,CAAC;IAKvB,gBAAgB,EAAE,MAAM,CAAC;IAIzB,cAAc,EAAE,MAAM,CAAC;IAIvB,aAAa,EAAE,MAAM,CAAC;IAItB,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -81,6 +81,7 @@ class NotificationPasswordResetRequestedEventPayload {
|
|
|
81
81
|
tenant;
|
|
82
82
|
email;
|
|
83
83
|
verifyToken;
|
|
84
|
+
temporaryPassword;
|
|
84
85
|
occurredAt;
|
|
85
86
|
}
|
|
86
87
|
exports.NotificationPasswordResetRequestedEventPayload = NotificationPasswordResetRequestedEventPayload;
|
|
@@ -112,15 +113,26 @@ __decorate([
|
|
|
112
113
|
__metadata("design:type", String)
|
|
113
114
|
], NotificationPasswordResetRequestedEventPayload.prototype, "email", void 0);
|
|
114
115
|
__decorate([
|
|
115
|
-
(0, swagger_1.
|
|
116
|
-
description: '
|
|
116
|
+
(0, swagger_1.ApiPropertyOptional)({
|
|
117
|
+
description: 'Legado: token para fluxo antigo de confirmação de reset (omitido quando se envia senha provisória)',
|
|
117
118
|
example: 'a3b5f3c1f3c6ef',
|
|
118
119
|
}),
|
|
120
|
+
(0, class_validator_1.IsOptional)(),
|
|
119
121
|
(0, class_validator_1.IsString)(),
|
|
120
122
|
(0, class_validator_1.MinLength)(1),
|
|
121
123
|
(0, class_validator_1.MaxLength)(255),
|
|
122
124
|
__metadata("design:type", String)
|
|
123
125
|
], NotificationPasswordResetRequestedEventPayload.prototype, "verifyToken", void 0);
|
|
126
|
+
__decorate([
|
|
127
|
+
(0, swagger_1.ApiPropertyOptional)({
|
|
128
|
+
description: 'Senha provisória gerada no servidor (fluxo sem 2FA); o utilizador deve alterá-la após o login',
|
|
129
|
+
}),
|
|
130
|
+
(0, class_validator_1.IsOptional)(),
|
|
131
|
+
(0, class_validator_1.IsString)(),
|
|
132
|
+
(0, class_validator_1.MinLength)(8),
|
|
133
|
+
(0, class_validator_1.MaxLength)(255),
|
|
134
|
+
__metadata("design:type", String)
|
|
135
|
+
], NotificationPasswordResetRequestedEventPayload.prototype, "temporaryPassword", void 0);
|
|
124
136
|
__decorate([
|
|
125
137
|
(0, swagger_1.ApiProperty)({
|
|
126
138
|
description: 'Timestamp when the event was created',
|
package/package.json
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
IsIn,
|
|
4
|
+
IsOptional,
|
|
5
|
+
IsString,
|
|
6
|
+
IsUUID,
|
|
7
|
+
Matches,
|
|
8
|
+
MaxLength,
|
|
9
|
+
MinLength,
|
|
10
|
+
} from 'class-validator';
|
|
3
11
|
import { LoginDto } from './login.dto';
|
|
4
12
|
import { RefreshTokenDto } from './refresh-token.dto';
|
|
5
13
|
|
|
@@ -124,4 +132,30 @@ export class ConfirmPasswordResetPayload {
|
|
|
124
132
|
@MinLength(6, { message: 'password deve ter no mínimo 6 caracteres' })
|
|
125
133
|
@MaxLength(255)
|
|
126
134
|
password: string;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** Conclui reset de senha com 2FA (RMQ/Kafka → auth-service). */
|
|
138
|
+
export class PasswordResetFinalize2faPayload {
|
|
139
|
+
@ApiProperty({ description: 'ID do tenant', example: 'tenant1' })
|
|
140
|
+
@IsString()
|
|
141
|
+
@MinLength(1, { message: 'tenant não pode ser vazio' })
|
|
142
|
+
@MaxLength(255)
|
|
143
|
+
tenant: string;
|
|
144
|
+
|
|
145
|
+
@ApiProperty({ description: 'JWT pre_password_reset do pedido de reset' })
|
|
146
|
+
@IsString()
|
|
147
|
+
@MinLength(1, { message: 'pre_recovery_token não pode ser vazio' })
|
|
148
|
+
@MaxLength(4096)
|
|
149
|
+
pre_recovery_token: string;
|
|
150
|
+
|
|
151
|
+
@ApiProperty({ description: 'Código TOTP de 6 dígitos' })
|
|
152
|
+
@IsString()
|
|
153
|
+
@Matches(/^\d{6}$/, { message: 'totp deve ser exatamente 6 dígitos' })
|
|
154
|
+
totp: string;
|
|
155
|
+
|
|
156
|
+
@ApiProperty({ description: 'Nova senha', example: 'senha123' })
|
|
157
|
+
@IsString()
|
|
158
|
+
@MinLength(6, { message: 'password deve ter no mínimo 6 caracteres' })
|
|
159
|
+
@MaxLength(255)
|
|
160
|
+
password: string;
|
|
127
161
|
}
|
package/src/auth/index.ts
CHANGED
|
@@ -7,10 +7,13 @@ export {
|
|
|
7
7
|
GetProfilePayload,
|
|
8
8
|
RequestPasswordResetPayload,
|
|
9
9
|
ConfirmPasswordResetPayload,
|
|
10
|
+
PasswordResetFinalize2faPayload,
|
|
10
11
|
} from './auth-kafka.payloads';
|
|
11
12
|
export { RefreshTokenDto } from './refresh-token.dto';
|
|
12
13
|
export { RequestPasswordResetDto } from './request-password-reset.dto';
|
|
13
14
|
export { ConfirmPasswordResetDto } from './confirm-password-reset.dto';
|
|
15
|
+
export { RequestPasswordResetResponseDto } from './request-password-reset-response.dto';
|
|
16
|
+
export { PasswordResetFinalize2faDto } from './password-reset-finalize-2fa.dto';
|
|
14
17
|
export { AuthLoginResponseDto } from './auth-login-response.dto';
|
|
15
18
|
export { Login2faDto } from './login-2fa.dto';
|
|
16
19
|
export {
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ApiProperty } from '@nestjs/swagger';
|
|
2
|
+
import { IsString, Matches, MaxLength, MinLength } from 'class-validator';
|
|
3
|
+
import { MatchField } from './match-field.decorator';
|
|
4
|
+
|
|
5
|
+
/** Finaliza recuperação de senha quando o utilizador tem 2FA (após `password-reset/request`). */
|
|
6
|
+
export class PasswordResetFinalize2faDto {
|
|
7
|
+
@ApiProperty({ description: 'JWT pre_password_reset devolvido no pedido de reset' })
|
|
8
|
+
@IsString()
|
|
9
|
+
@MinLength(1, { message: 'pre_recovery_token não pode ser vazio' })
|
|
10
|
+
@MaxLength(4096)
|
|
11
|
+
pre_recovery_token: string;
|
|
12
|
+
|
|
13
|
+
@ApiProperty({ description: 'Código TOTP de 6 dígitos' })
|
|
14
|
+
@IsString()
|
|
15
|
+
@Matches(/^\d{6}$/, { message: 'totp deve ser exatamente 6 dígitos' })
|
|
16
|
+
totp: string;
|
|
17
|
+
|
|
18
|
+
@ApiProperty({ description: 'Nova senha', example: 'senha123', minLength: 6 })
|
|
19
|
+
@IsString()
|
|
20
|
+
@MinLength(6, { message: 'password deve ter no mínimo 6 caracteres' })
|
|
21
|
+
@MaxLength(255)
|
|
22
|
+
password: string;
|
|
23
|
+
|
|
24
|
+
@ApiProperty({
|
|
25
|
+
description: 'Confirmação da nova senha',
|
|
26
|
+
example: 'senha123',
|
|
27
|
+
minLength: 6,
|
|
28
|
+
})
|
|
29
|
+
@IsString()
|
|
30
|
+
@MinLength(6, { message: 'password_confirmation deve ter no mínimo 6 caracteres' })
|
|
31
|
+
@MaxLength(255)
|
|
32
|
+
@MatchField('password', {
|
|
33
|
+
message: 'password_confirmation deve ser igual a password',
|
|
34
|
+
})
|
|
35
|
+
password_confirmation: string;
|
|
36
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Resposta de `POST /auth/password-reset/request`.
|
|
5
|
+
* - Sem utilizador ou utilizador sem 2FA: apenas mensagem genérica (e e-mail com senha provisória se existir conta sem 2FA).
|
|
6
|
+
* - Utilizador com 2FA: inclui token para o passo seguinte (`finalize-2fa`).
|
|
7
|
+
*/
|
|
8
|
+
export class RequestPasswordResetResponseDto {
|
|
9
|
+
@ApiProperty({ example: true })
|
|
10
|
+
success: boolean;
|
|
11
|
+
|
|
12
|
+
@ApiProperty({
|
|
13
|
+
description: 'Mensagem genérica (não revela se o e-mail existe, exceto quando two_factor_required é true)',
|
|
14
|
+
})
|
|
15
|
+
message: string;
|
|
16
|
+
|
|
17
|
+
@ApiPropertyOptional({
|
|
18
|
+
description: 'Presente quando o e-mail existe e o utilizador tem 2FA ativo',
|
|
19
|
+
})
|
|
20
|
+
two_factor_required?: boolean;
|
|
21
|
+
|
|
22
|
+
@ApiPropertyOptional({
|
|
23
|
+
description: 'JWT de curta duração para `POST /auth/password-reset/finalize-2fa`',
|
|
24
|
+
})
|
|
25
|
+
pre_recovery_token?: string;
|
|
26
|
+
}
|
|
@@ -91,14 +91,26 @@ export class NotificationPasswordResetRequestedEventPayload {
|
|
|
91
91
|
@MaxLength(255)
|
|
92
92
|
email: string;
|
|
93
93
|
|
|
94
|
-
@
|
|
95
|
-
description:
|
|
94
|
+
@ApiPropertyOptional({
|
|
95
|
+
description:
|
|
96
|
+
'Legado: token para fluxo antigo de confirmação de reset (omitido quando se envia senha provisória)',
|
|
96
97
|
example: 'a3b5f3c1f3c6ef',
|
|
97
98
|
})
|
|
99
|
+
@IsOptional()
|
|
98
100
|
@IsString()
|
|
99
101
|
@MinLength(1)
|
|
100
102
|
@MaxLength(255)
|
|
101
|
-
verifyToken
|
|
103
|
+
verifyToken?: string;
|
|
104
|
+
|
|
105
|
+
@ApiPropertyOptional({
|
|
106
|
+
description:
|
|
107
|
+
'Senha provisória gerada no servidor (fluxo sem 2FA); o utilizador deve alterá-la após o login',
|
|
108
|
+
})
|
|
109
|
+
@IsOptional()
|
|
110
|
+
@IsString()
|
|
111
|
+
@MinLength(8)
|
|
112
|
+
@MaxLength(255)
|
|
113
|
+
temporaryPassword?: string;
|
|
102
114
|
|
|
103
115
|
@ApiProperty({
|
|
104
116
|
description: 'Timestamp when the event was created',
|