import 'package:logging/logging.dart'; import 'package:uuid/uuid.dart'; import 'package:pshared/api/requests/payment/initiate.dart'; import 'package:pshared/api/responses/payment/payment.dart'; import 'package:pshared/api/responses/payment/payments.dart'; import 'package:pshared/data/mapper/payment/payment_response.dart'; import 'package:pshared/models/payment/payment.dart'; import 'package:pshared/service/authorization/service.dart'; import 'package:pshared/service/services.dart'; class PaymentService { static final _logger = Logger('service.payment'); static const String _objectType = Services.payments; static Future> list( String organizationRef, { int? limit, String? cursor, String? sourceRef, String? destinationRef, List? states, }) async { _logger.fine('Listing payments for organization $organizationRef'); final queryParams = {}; if (limit != null) { queryParams['limit'] = limit.toString(); } if (cursor != null && cursor.isNotEmpty) { queryParams['cursor'] = cursor; } if (sourceRef != null && sourceRef.isNotEmpty) { queryParams['source_ref'] = sourceRef; } if (destinationRef != null && destinationRef.isNotEmpty) { queryParams['destination_ref'] = destinationRef; } if (states != null && states.isNotEmpty) { queryParams['state'] = states.join(','); } final path = '/$organizationRef'; final url = queryParams.isEmpty ? path : Uri(path: path, queryParameters: queryParams).toString(); final response = await AuthorizationService.getGETResponse(_objectType, url); return PaymentsResponse.fromJson(response).payments.map((payment) => payment.toDomain()).toList(); } static Future pay( String organizationRef, String quotationRef, { String? idempotencyKey, Map? metadata, }) async { _logger.fine('Executing payment for quotation $quotationRef in $organizationRef'); final request = InitiatePaymentRequest( idempotencyKey: idempotencyKey ?? Uuid().v4(), quoteRef: quotationRef, metadata: metadata, ); final response = await AuthorizationService.getPOSTResponse( _objectType, '/by-quote/$organizationRef', request.toJson(), ); return PaymentResponse.fromJson(response).payment.toDomain(); } }