+source currency pick fix +fx side propagation

This commit is contained in:
Stephan D
2026-02-26 02:39:48 +01:00
parent 008427483c
commit 70b1c2a9cc
73 changed files with 2123 additions and 656 deletions

View File

@@ -37,7 +37,6 @@ class PaymentIntentDTO {
this.feeTreatment,
});
factory PaymentIntentDTO.fromJson(Map<String, dynamic> json) =>
_$PaymentIntentDTOFromJson(json);
factory PaymentIntentDTO.fromJson(Map<String, dynamic> json) => _$PaymentIntentDTOFromJson(json);
Map<String, dynamic> toJson() => _$PaymentIntentDTOToJson(this);
}

View File

@@ -6,22 +6,22 @@ import 'package:pshared/models/payment/fx/intent.dart';
extension FxIntentMapper on FxIntent {
FxIntentDTO toDTO() => FxIntentDTO(
pair: pair?.toDTO(),
side: fxSideToValue(side),
firm: firm,
ttlMs: ttlMs,
preferredProvider: preferredProvider,
maxAgeMs: maxAgeMs,
);
pair: pair?.toDTO(),
side: fxSideToValue(side),
firm: firm,
ttlMs: ttlMs,
preferredProvider: preferredProvider,
maxAgeMs: maxAgeMs,
);
}
extension FxIntentDTOMapper on FxIntentDTO {
FxIntent toDomain() => FxIntent(
pair: pair?.toDomain(),
side: fxSideFromValue(side),
firm: firm,
ttlMs: ttlMs,
preferredProvider: preferredProvider,
maxAgeMs: maxAgeMs,
);
pair: pair?.toDomain(),
side: fxSideFromValue(side),
firm: firm,
ttlMs: ttlMs,
preferredProvider: preferredProvider,
maxAgeMs: maxAgeMs,
);
}

View File

@@ -8,7 +8,7 @@ environment:
# Add regular dependencies here.
dependencies:
analyzer: ^10.0.0
json_annotation: ^4.10.0
json_annotation: ^4.11.0
http: ^1.1.0
provider: ^6.0.5
flutter:

View File

@@ -7,7 +7,9 @@ import 'package:pshared/api/requests/payment/initiate_payments.dart';
import 'package:pshared/api/requests/payment/quote.dart';
import 'package:pshared/api/responses/payment/quotation.dart';
import 'package:pshared/data/dto/money.dart';
import 'package:pshared/data/dto/payment/currency_pair.dart';
import 'package:pshared/data/dto/payment/endpoint.dart';
import 'package:pshared/data/dto/payment/intent/fx.dart';
import 'package:pshared/data/dto/payment/intent/payment.dart';
import 'package:pshared/data/mapper/payment/payment.dart';
import 'package:pshared/models/payment/asset.dart';
@@ -76,6 +78,36 @@ void main() {
expect(destination['type'], equals('cardToken'));
});
test('quote payment request serializes fx side to backend value', () {
final request = QuotePaymentRequest(
idempotencyKey: '',
previewOnly: true,
intent: const PaymentIntentDTO(
kind: 'payout',
source: PaymentEndpointDTO(
type: 'managedWallet',
data: {'managed_wallet_ref': 'mw-1'},
),
destination: PaymentEndpointDTO(
type: 'cardToken',
data: {'token': 'tok_1', 'masked_pan': '4111'},
),
amount: MoneyDTO(amount: '10', currency: 'USDT'),
settlementMode: 'fix_source',
fx: FxIntentDTO(
pair: CurrencyPairDTO(base: 'RUB', quote: 'USDT'),
side: 'buy_base_sell_quote',
),
),
);
final json =
jsonDecode(jsonEncode(request.toJson())) as Map<String, dynamic>;
final intent = json['intent'] as Map<String, dynamic>;
final fx = intent['fx'] as Map<String, dynamic>;
expect(fx['side'], equals('buy_base_sell_quote'));
});
test('quote response parses backend fx quote pricedAtUnixMs', () {
final response = PaymentQuoteResponse.fromJson({
'accessToken': {'token': 'token', 'expiration': '2026-02-25T00:00:00Z'},