perform method

  1. @override
Future<CubeFile> perform()
override

Implementation

@override
Future<CubeFile> perform() async {
  Completer<CubeFile> completer = Completer();

  try {
    String uuid = const Uuid().v4();

    CubeFile toCreate = CubeFile();
    toCreate.isPublic = isPublic ?? false;
    toCreate.name = _name ?? basename(_file!.path);

    if (!isEmpty(mimeType)) {
      toCreate.contentType = mimeType;
    } else {
      toCreate.contentType = lookupMimeType(toCreate.name!);
    }

    _CreateBlobQuery(toCreate).perform().then((cubeBlob) {
      toCreate.id = cubeBlob.id;
      toCreate.uid = cubeBlob.uid;

      var length = _file != null ? _file!.lengthSync() : _bytes!.length;
      String amazonParams = cubeBlob.fileObjectAccess!.params!;
      Uri decodedUri = Uri.parse(amazonParams);

      Map<String, String> params = decodedUri.queryParameters.map(
          (key, value) => MapEntry(key, Uri.decodeQueryComponent(value)));

      MultipartRequestProgressed multipartRequest =
          MultipartRequestProgressed(
        "POST",
        Uri(
            scheme: decodedUri.scheme,
            host: decodedUri.host,
            path: decodedUri.path),
        onProgress: (int bytes, int total) {
          final int newProgress = ((bytes / total) * 100).toInt();
          if (newProgress != _progress) {
            if (onProgress != null) {
              onProgress!(newProgress);
            }
            _progress = newProgress;
          }
        },
      );

      ByteStream stream = _file != null
          ? ByteStream(StreamView(_file!.openRead()))
          : ByteStream.fromBytes(_bytes!);
      MultipartFile multipartFile = MultipartFile('file', stream, length,
          filename: toCreate.name,
          contentType: MediaType.parse(cubeBlob.contentType!));

      multipartRequest.files.add(multipartFile);
      multipartRequest.fields.addAll(params);

      _logAmazonRequest(multipartRequest, uuid);

      multipartRequest.send().then((response) {
        _logAmazonResponse(response, uuid).then((voidValue) {
          if (response.statusCode == 201) {
            toCreate.size = length;

            DeclareBlobCompletedQuery(cubeBlob.id!, length)
                .perform()
                .then((voidResult) {
              toCreate.completedAt = DateTime.now();
              completer.complete(toCreate);
            });
          }
        });
      });
    }).catchError((error) {
      handelError(error);
      completer.completeError(error);
    });
  } catch (e) {
    completer.completeError(e);
  }

  return completer.future;
}