From 947cd7f4c97f78777f0ec33e8a217aad661ad607 Mon Sep 17 00:00:00 2001 From: Stephan D Date: Thu, 26 Feb 2026 22:38:31 +0100 Subject: [PATCH] dto / mapper / model separation of verification purpose --- .../lib/api/requests/verification/login.dart | 15 ++++---- .../lib/data/dto/verification/purpose.dart | 18 ++++++++++ .../lib/data/mapper/verification/purpose.dart | 36 +++++++++++++++++++ .../lib/models/verification/purpose.dart | 9 ----- .../pshared/lib/service/verification.dart | 18 ++++++---- 5 files changed, 74 insertions(+), 22 deletions(-) create mode 100644 frontend/pshared/lib/data/dto/verification/purpose.dart create mode 100644 frontend/pshared/lib/data/mapper/verification/purpose.dart diff --git a/frontend/pshared/lib/api/requests/verification/login.dart b/frontend/pshared/lib/api/requests/verification/login.dart index 7212ef19..0c76e8b5 100644 --- a/frontend/pshared/lib/api/requests/verification/login.dart +++ b/frontend/pshared/lib/api/requests/verification/login.dart @@ -1,24 +1,24 @@ import 'package:json_annotation/json_annotation.dart'; -import 'package:pshared/models/verification/purpose.dart'; import 'package:pshared/api/requests/tokens/session_identifier.dart'; +import 'package:pshared/data/dto/verification/purpose.dart'; part 'login.g.dart'; - @JsonSerializable(explicitToJson: true) class LoginVerificationRequest { - final VerificationPurpose purpose; + final VerificationPurposeDTO purpose; final String? target; final String idempotencyKey; const LoginVerificationRequest({ - this.purpose = VerificationPurpose.login, + this.purpose = VerificationPurposeDTO.login, this.target, required this.idempotencyKey, }); - factory LoginVerificationRequest.fromJson(Map json) => _$LoginVerificationRequestFromJson(json); + factory LoginVerificationRequest.fromJson(Map json) => + _$LoginVerificationRequestFromJson(json); Map toJson() => _$LoginVerificationRequestToJson(this); } @@ -28,14 +28,15 @@ class LoginCodeVerifyicationRequest extends LoginVerificationRequest { final SessionIdentifierDTO sessionIdentifier; const LoginCodeVerifyicationRequest({ - super.purpose = VerificationPurpose.login, + super.purpose = VerificationPurposeDTO.login, super.target, required super.idempotencyKey, required this.code, required this.sessionIdentifier, }); - factory LoginCodeVerifyicationRequest.fromJson(Map json) => _$LoginCodeVerifyicationRequestFromJson(json); + factory LoginCodeVerifyicationRequest.fromJson(Map json) => + _$LoginCodeVerifyicationRequestFromJson(json); @override Map toJson() => _$LoginCodeVerifyicationRequestToJson(this); } diff --git a/frontend/pshared/lib/data/dto/verification/purpose.dart b/frontend/pshared/lib/data/dto/verification/purpose.dart new file mode 100644 index 00000000..4fe6487d --- /dev/null +++ b/frontend/pshared/lib/data/dto/verification/purpose.dart @@ -0,0 +1,18 @@ +import 'package:json_annotation/json_annotation.dart'; + +enum VerificationPurposeDTO { + @JsonValue('login') + login, + + @JsonValue('payout') + payout, + + @JsonValue('account_activation') + accountActivation, + + @JsonValue('email_change') + emailChange, + + @JsonValue('password_reset') + passwordReset, +} diff --git a/frontend/pshared/lib/data/mapper/verification/purpose.dart b/frontend/pshared/lib/data/mapper/verification/purpose.dart new file mode 100644 index 00000000..849cd5e1 --- /dev/null +++ b/frontend/pshared/lib/data/mapper/verification/purpose.dart @@ -0,0 +1,36 @@ +import 'package:pshared/data/dto/verification/purpose.dart'; +import 'package:pshared/models/verification/purpose.dart'; + +extension VerificationPurposeDTOMapper on VerificationPurposeDTO { + VerificationPurpose toDomain() { + switch (this) { + case VerificationPurposeDTO.login: + return VerificationPurpose.login; + case VerificationPurposeDTO.payout: + return VerificationPurpose.payout; + case VerificationPurposeDTO.accountActivation: + return VerificationPurpose.accountActivation; + case VerificationPurposeDTO.emailChange: + return VerificationPurpose.emailChange; + case VerificationPurposeDTO.passwordReset: + return VerificationPurpose.passwordReset; + } + } +} + +extension VerificationPurposeMapper on VerificationPurpose { + VerificationPurposeDTO toDTO() { + switch (this) { + case VerificationPurpose.login: + return VerificationPurposeDTO.login; + case VerificationPurpose.payout: + return VerificationPurposeDTO.payout; + case VerificationPurpose.accountActivation: + return VerificationPurposeDTO.accountActivation; + case VerificationPurpose.emailChange: + return VerificationPurposeDTO.emailChange; + case VerificationPurpose.passwordReset: + return VerificationPurposeDTO.passwordReset; + } + } +} diff --git a/frontend/pshared/lib/models/verification/purpose.dart b/frontend/pshared/lib/models/verification/purpose.dart index 4d08602f..6f6ac424 100644 --- a/frontend/pshared/lib/models/verification/purpose.dart +++ b/frontend/pshared/lib/models/verification/purpose.dart @@ -1,17 +1,8 @@ -import 'package:json_annotation/json_annotation.dart'; - - /// Targets for confirmation codes. -@JsonEnum(alwaysCreate: true) enum VerificationPurpose { - @JsonValue('login') login, - @JsonValue('payout') payout, - @JsonValue('account_activation') accountActivation, - @JsonValue('email_change') emailChange, - @JsonValue('password_reset') passwordReset, } diff --git a/frontend/pshared/lib/service/verification.dart b/frontend/pshared/lib/service/verification.dart index 99febb82..10fab535 100644 --- a/frontend/pshared/lib/service/verification.dart +++ b/frontend/pshared/lib/service/verification.dart @@ -8,6 +8,7 @@ import 'package:pshared/api/responses/login.dart'; import 'package:pshared/api/responses/verification/response.dart'; import 'package:pshared/data/mapper/account/account.dart'; import 'package:pshared/data/mapper/session_identifier.dart'; +import 'package:pshared/data/mapper/verification/purpose.dart'; import 'package:pshared/models/account/account.dart'; import 'package:pshared/models/auth/pending_login.dart'; import 'package:pshared/models/verification/purpose.dart'; @@ -16,12 +17,14 @@ import 'package:pshared/service/authorization/storage.dart'; import 'package:pshared/service/services.dart'; import 'package:pshared/utils/http/requests.dart'; - class VerificationService { static final _logger = Logger('service.verification'); static const String _objectType = Services.verification; - static Future requestLoginCode(PendingLogin pending, {String? target}) async { + static Future requestLoginCode( + PendingLogin pending, { + String? target, + }) async { _logger.fine('Requesting login confirmation code'); final response = await getPOSTResponse( _objectType, @@ -35,7 +38,10 @@ class VerificationService { return VerificationResponse.fromJson(response); } - static Future resendLoginCode(PendingLogin pending, {String? target}) async { + static Future resendLoginCode( + PendingLogin pending, { + String? target, + }) async { _logger.fine('Resending login confirmation code'); final response = await getPOSTResponse( _objectType, @@ -82,7 +88,7 @@ class VerificationService { _objectType, '', LoginVerificationRequest( - purpose: VerificationPurpose.payout, + purpose: VerificationPurpose.payout.toDTO(), target: target, idempotencyKey: idempotencyKey ?? Uuid().v4(), ).toJson(), @@ -99,7 +105,7 @@ class VerificationService { _objectType, '/resend', LoginVerificationRequest( - purpose: VerificationPurpose.payout, + purpose: VerificationPurpose.payout.toDTO(), target: target, idempotencyKey: idempotencyKey, ).toJson(), @@ -117,7 +123,7 @@ class VerificationService { _objectType, '/verify', LoginCodeVerifyicationRequest( - purpose: VerificationPurpose.payout, + purpose: VerificationPurpose.payout.toDTO(), target: target, idempotencyKey: idempotencyKey, code: code,