uploadDocument method Null safety

Future<Map<String, dynamic>> uploadDocument(
  1. File file
)

Allow to upload a GlpiItemType.Document. file must be a File object. Reference: https://github.com/glpi-project/glpi/blob/master/apirest.md#upload-a-document-file

Implementation

Future<Map<String, dynamic>> uploadDocument(
  File file,
) async {
  if (_sessionToken!.isEmpty) {
    throw Exception('No session token, initSession first');
  }

  final Map<String, String> headers = {
    'Session-Token': _sessionToken!,
    'Content-Type': 'multipart/form-data',
    ...?appToken != null ? {'App-Token': appToken!} : null,
  };

  final uri = Uri.parse('$baseUrl/Document');

  final payload = json.encode({
    'input': {
      'name': file.path.split('/').last,
      '_filename': [base64Encode(file.readAsBytesSync())],
    }
  });

  final uploadManifest = '$payload;type=application/json';

  final request = http.MultipartRequest('POST', uri)
    ..headers.addAll(headers)
    ..fields['uploadManifest'] = uploadManifest
    ..files.add(http.MultipartFile.fromBytes(
      'file',
      file.readAsBytesSync(),
      filename: file.path.split('/').last,
    ));

  final response = await request.send();

  final body = await response.stream.transform(utf8.decoder).join();

  if (response.statusCode != 200 && response.statusCode != 207) {
    throw Exception('${response.statusCode} $body');
  }

  Map<String, dynamic> decodedJson = json.decode(body);

  return Future.value(decodedJson);
}