restore method

Future<RestoreResult> restore({
  1. required String collectionId,
  2. String? content,
})

Implementation

Future<RestoreResult> restore(
    {required String collectionId, String? content}) async {
  /*
  if content is not provided plugin try to find specific backup file.
  if there is no matching backup file, this return an error.
  */

  RestoreResult restoreResult = RestoreResult();
  restoreResult.collection = collectionId;
  if (content == null) {
    var file = await _localFile(collectionId);
    if (await file.exists()) {
      print("file found");
      restoreResult.source = "FILE";
      content = file.readAsStringSync();
    } else {
      print("file not found");
      restoreResult.hasError = true;
      restoreResult.message =
          "Backup file can't find. Set the content attribute.";
      return restoreResult;
    }
  } else {
    print("content has");
    restoreResult.source = "ATTRIBUTE";
  }

  var jsonList = jsonDecode(content) as List;

  if (jsonList.isEmpty) {
    restoreResult.hasError = true;
    restoreResult.message = "empty content found!";
    return restoreResult;
  }
  CollectionReference collectionReference =
      FirebaseFirestore.instance.collection(collectionId);

  int done = 0;

  for (var obj in jsonList) {
    if (obj['id'] != null) {
      collectionReference.doc(obj['id']).set(obj);
    } else {
      collectionReference.add(obj);
    }
    done++;
  }

  if (done != jsonList.length) {
    restoreResult.hasError = true;
    restoreResult.message = "all objects not restored correctly!";
    return restoreResult;
  }
  restoreResult.hasError = false;
  restoreResult.message = "$done objects successfully restored!";
  return restoreResult;
}