dto / mapper / model separation of verification purpose

This commit is contained in:
Stephan D
2026-02-26 22:38:31 +01:00
parent 20ce4485e8
commit 947cd7f4c9
5 changed files with 74 additions and 22 deletions

View File

@@ -1,24 +1,24 @@
import 'package:json_annotation/json_annotation.dart'; 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/api/requests/tokens/session_identifier.dart';
import 'package:pshared/data/dto/verification/purpose.dart';
part 'login.g.dart'; part 'login.g.dart';
@JsonSerializable(explicitToJson: true) @JsonSerializable(explicitToJson: true)
class LoginVerificationRequest { class LoginVerificationRequest {
final VerificationPurpose purpose; final VerificationPurposeDTO purpose;
final String? target; final String? target;
final String idempotencyKey; final String idempotencyKey;
const LoginVerificationRequest({ const LoginVerificationRequest({
this.purpose = VerificationPurpose.login, this.purpose = VerificationPurposeDTO.login,
this.target, this.target,
required this.idempotencyKey, required this.idempotencyKey,
}); });
factory LoginVerificationRequest.fromJson(Map<String, dynamic> json) => _$LoginVerificationRequestFromJson(json); factory LoginVerificationRequest.fromJson(Map<String, dynamic> json) =>
_$LoginVerificationRequestFromJson(json);
Map<String, dynamic> toJson() => _$LoginVerificationRequestToJson(this); Map<String, dynamic> toJson() => _$LoginVerificationRequestToJson(this);
} }
@@ -28,14 +28,15 @@ class LoginCodeVerifyicationRequest extends LoginVerificationRequest {
final SessionIdentifierDTO sessionIdentifier; final SessionIdentifierDTO sessionIdentifier;
const LoginCodeVerifyicationRequest({ const LoginCodeVerifyicationRequest({
super.purpose = VerificationPurpose.login, super.purpose = VerificationPurposeDTO.login,
super.target, super.target,
required super.idempotencyKey, required super.idempotencyKey,
required this.code, required this.code,
required this.sessionIdentifier, required this.sessionIdentifier,
}); });
factory LoginCodeVerifyicationRequest.fromJson(Map<String, dynamic> json) => _$LoginCodeVerifyicationRequestFromJson(json); factory LoginCodeVerifyicationRequest.fromJson(Map<String, dynamic> json) =>
_$LoginCodeVerifyicationRequestFromJson(json);
@override @override
Map<String, dynamic> toJson() => _$LoginCodeVerifyicationRequestToJson(this); Map<String, dynamic> toJson() => _$LoginCodeVerifyicationRequestToJson(this);
} }

View File

@@ -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,
}

View File

@@ -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;
}
}
}

View File

@@ -1,17 +1,8 @@
import 'package:json_annotation/json_annotation.dart';
/// Targets for confirmation codes. /// Targets for confirmation codes.
@JsonEnum(alwaysCreate: true)
enum VerificationPurpose { enum VerificationPurpose {
@JsonValue('login')
login, login,
@JsonValue('payout')
payout, payout,
@JsonValue('account_activation')
accountActivation, accountActivation,
@JsonValue('email_change')
emailChange, emailChange,
@JsonValue('password_reset')
passwordReset, passwordReset,
} }

View File

@@ -8,6 +8,7 @@ import 'package:pshared/api/responses/login.dart';
import 'package:pshared/api/responses/verification/response.dart'; import 'package:pshared/api/responses/verification/response.dart';
import 'package:pshared/data/mapper/account/account.dart'; import 'package:pshared/data/mapper/account/account.dart';
import 'package:pshared/data/mapper/session_identifier.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/account/account.dart';
import 'package:pshared/models/auth/pending_login.dart'; import 'package:pshared/models/auth/pending_login.dart';
import 'package:pshared/models/verification/purpose.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/service/services.dart';
import 'package:pshared/utils/http/requests.dart'; import 'package:pshared/utils/http/requests.dart';
class VerificationService { class VerificationService {
static final _logger = Logger('service.verification'); static final _logger = Logger('service.verification');
static const String _objectType = Services.verification; static const String _objectType = Services.verification;
static Future<VerificationResponse> requestLoginCode(PendingLogin pending, {String? target}) async { static Future<VerificationResponse> requestLoginCode(
PendingLogin pending, {
String? target,
}) async {
_logger.fine('Requesting login confirmation code'); _logger.fine('Requesting login confirmation code');
final response = await getPOSTResponse( final response = await getPOSTResponse(
_objectType, _objectType,
@@ -35,7 +38,10 @@ class VerificationService {
return VerificationResponse.fromJson(response); return VerificationResponse.fromJson(response);
} }
static Future<VerificationResponse> resendLoginCode(PendingLogin pending, {String? target}) async { static Future<VerificationResponse> resendLoginCode(
PendingLogin pending, {
String? target,
}) async {
_logger.fine('Resending login confirmation code'); _logger.fine('Resending login confirmation code');
final response = await getPOSTResponse( final response = await getPOSTResponse(
_objectType, _objectType,
@@ -82,7 +88,7 @@ class VerificationService {
_objectType, _objectType,
'', '',
LoginVerificationRequest( LoginVerificationRequest(
purpose: VerificationPurpose.payout, purpose: VerificationPurpose.payout.toDTO(),
target: target, target: target,
idempotencyKey: idempotencyKey ?? Uuid().v4(), idempotencyKey: idempotencyKey ?? Uuid().v4(),
).toJson(), ).toJson(),
@@ -99,7 +105,7 @@ class VerificationService {
_objectType, _objectType,
'/resend', '/resend',
LoginVerificationRequest( LoginVerificationRequest(
purpose: VerificationPurpose.payout, purpose: VerificationPurpose.payout.toDTO(),
target: target, target: target,
idempotencyKey: idempotencyKey, idempotencyKey: idempotencyKey,
).toJson(), ).toJson(),
@@ -117,7 +123,7 @@ class VerificationService {
_objectType, _objectType,
'/verify', '/verify',
LoginCodeVerifyicationRequest( LoginCodeVerifyicationRequest(
purpose: VerificationPurpose.payout, purpose: VerificationPurpose.payout.toDTO(),
target: target, target: target,
idempotencyKey: idempotencyKey, idempotencyKey: idempotencyKey,
code: code, code: code,