Files
sendico/frontend/pshared/lib/service/payment/documents.dart

59 lines
1.9 KiB
Dart

import 'package:logging/logging.dart';
import 'package:pshared/models/file/downloaded_file.dart';
import 'package:pshared/service/authorization/service.dart';
import 'package:pshared/service/services.dart';
class PaymentDocumentsService {
static final _logger = Logger('service.payment_documents');
static const String _objectType = Services.payments;
static Future<DownloadedFile> getOperationDocument(
String organizationRef,
String gatewayService,
String operationRef,
) async {
final query = <String, String>{
'gateway_service': gatewayService,
'operation_ref': operationRef,
};
final queryString = Uri(queryParameters: query).query;
final url = '/documents/operation/$organizationRef?$queryString';
_logger.fine(
'Downloading operation document for operation $operationRef in gateway $gatewayService',
);
final response = await AuthorizationService.getGETBinaryResponse(
_objectType,
url,
);
final filename =
_filenameFromDisposition(response.header('content-disposition')) ??
'operation_$operationRef.pdf';
final mimeType = response.header('content-type') ?? 'application/pdf';
return DownloadedFile(
bytes: response.bytes,
filename: filename,
mimeType: mimeType,
);
}
static String? _filenameFromDisposition(String? disposition) {
if (disposition == null || disposition.isEmpty) return null;
final parts = disposition.split(';');
for (final part in parts) {
final trimmed = part.trim();
if (trimmed.toLowerCase().startsWith('filename=')) {
var value = trimmed.substring('filename='.length).trim();
if (value.startsWith('"') && value.endsWith('"') && value.length > 1) {
value = value.substring(1, value.length - 1);
}
if (value.isNotEmpty) {
return value;
}
}
}
return null;
}
}