postMultipartMultiple method

Future<Response> postMultipartMultiple(
  1. String endpoint, {
  2. required Map<String, dynamic> files,
  3. Map<String, String>? fields,
  4. Map<String, String>? headers,
})

Make POST request with multiple files (multipart) Accepts Map<String, dynamic> where keys are field names and values are files Example: {'front': file1, 'back': file2}

Implementation

Future<http.Response> postMultipartMultiple(
  String endpoint, {
  required Map<String, dynamic>
  files, // Map of fieldName -> file (File on mobile, XFile on web)
  Map<String, String>? fields,
  Map<String, String>? headers,
}) async {
  try {
    final uri = Uri.parse('${_config.baseUrl}$endpoint');

    if (_config.enableLogging) {
      debugPrint('[ApexKYC] POST Multipart Multiple $uri');
      debugPrint('[ApexKYC] Files: ${files.keys.join(", ")}');
    }

    final request = http.MultipartRequest('POST', uri);

    // Add headers
    final requestHeaders = _getHeaders(additionalHeaders: headers);
    requestHeaders.remove('Content-Type'); // Let multipart set it
    request.headers.addAll(requestHeaders);

    // Add files - handle web vs mobile differently
    for (var entry in files.entries) {
      final fieldName = entry.key;
      final file = entry.value;

      if (kIsWeb) {
        // Web platform - use XFile
        final xFile = file as XFile;
        final bytes = await xFile.readAsBytes();
        final filename = xFile.name.isNotEmpty
            ? xFile.name
            : '${fieldName}_${DateTime.now().millisecondsSinceEpoch}.jpg';
        final contentType = xFile.mimeType ?? 'image/jpeg';

        final multipartFile = http.MultipartFile.fromBytes(
          fieldName,
          bytes,
          filename: filename,
          contentType: MediaType.parse(contentType),
        );
        request.files.add(multipartFile);
      } else {
        // Mobile platform - use File
        final fileStream = _getFileStream(file);
        final fileLength = await _getFileLength(file);
        final filename = _getFileName(file);
        final multipartFile = http.MultipartFile(
          fieldName,
          fileStream,
          fileLength,
          filename: filename,
          contentType: MediaType('image', 'jpeg'),
        );
        request.files.add(multipartFile);
      }
    }

    // Add additional fields
    if (fields != null) {
      request.fields.addAll(fields);
    }

    final streamedResponse = await _client
        .send(request)
        .timeout(Duration(seconds: _config.timeoutSeconds));

    final response = await http.Response.fromStream(streamedResponse);

    if (_config.enableLogging) {
      debugPrint(
        '[ApexKYC] Response: ${response.statusCode} ${response.body}',
      );
    }

    return _handleResponse(response);
  } catch (e) {
    if (e is ApexKycException) {
      rethrow;
    }
    throw ApexKycException(
      'Unexpected error: ${e.toString()}',
      originalError: e,
    );
  }
}