From abe66b6619418d457e9d753e2ed994d978f06ff3 Mon Sep 17 00:00:00 2001
From: xuty <xty50337@hotmail.com>
Date: Sun, 12 Dec 2021 23:11:20 +0800
Subject: [PATCH] Add listAllObjects() & listAllObjectsV2()

---
 lib/src/minio.dart | 64 +++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 55 insertions(+), 9 deletions(-)

diff --git a/lib/src/minio.dart b/lib/src/minio.dart
index d4732f4..5884ace 100644
--- a/lib/src/minio.dart
+++ b/lib/src/minio.dart
@@ -488,8 +488,8 @@ class Minio {
   }
 
   /// Returns all [Object]s in a bucket.
-  /// If recursive is true, the returned stream may also contains [CommonPrefix]
-  Stream<ListObjectsChunk> listObjects(
+  /// To list objects in a bucket with prefix, set [prefix] to the desired prefix.
+  Stream<ListObjectsResult> listObjects(
     String bucket, {
     String prefix = '',
     bool recursive = false,
@@ -511,13 +511,33 @@ class Minio {
       );
       isTruncated = resp.isTruncated!;
       marker = resp.nextMarker;
-      yield ListObjectsChunk(
+      yield ListObjectsResult(
         objects: resp.contents!,
-        prefixes: resp.commonPrefixes.map((e) => e.prefix).toList(),
+        prefixes: resp.commonPrefixes.map((e) => e.prefix!).toList(),
       );
     } while (isTruncated);
   }
 
+  /// Returns all [Object]s in a bucket. This is a shortcut for [listObjects].
+  /// Use [listObjects] to list buckets with a large number of objects.
+  Future<ListObjectsResult> listAllObjects(
+    String bucket, {
+    String prefix = '',
+    bool recursive = false,
+  }) async {
+    final chunks = listObjects(bucket, prefix: prefix, recursive: recursive);
+    final objects = <Object>[];
+    final prefixes = <String>[];
+    await for (final chunk in chunks) {
+      objects.addAll(chunk.objects);
+      prefixes.addAll(chunk.prefixes);
+    }
+    return ListObjectsResult(
+      objects: objects,
+      prefixes: prefixes,
+    );
+  }
+
   /// list a batch of objects
   Future<ListObjectsOutput> listObjectsQuery(
     String bucket,
@@ -566,8 +586,10 @@ class Minio {
   }
 
   /// Returns all [Object]s in a bucket.
-  /// If recursive is true, the returned stream may also contains [CommonPrefix]
-  Stream<ListObjectsChunk> listObjectsV2(
+  /// To list objects in a bucket with prefix, set [prefix] to the desired prefix.
+  /// This uses ListObjectsV2 in the S3 API. For backward compatibility, use
+  /// [listObjects] instead.
+  Stream<ListObjectsResult> listObjectsV2(
     String bucket, {
     String prefix = '',
     bool recursive = false,
@@ -591,13 +613,35 @@ class Minio {
       );
       isTruncated = resp.isTruncated;
       continuationToken = resp.nextContinuationToken;
-      yield ListObjectsChunk(
+      yield ListObjectsResult(
         objects: resp.contents!,
-        prefixes: resp.commonPrefixes.map((e) => e.prefix).toList(),
+        prefixes: resp.commonPrefixes.map((e) => e.prefix!).toList(),
       );
     } while (isTruncated!);
   }
 
+  /// Returns all [Object]s in a bucket. This is a shortcut for [listObjectsV2].
+  /// Use [listObjects] to list buckets with a large number of objects.
+  /// This uses ListObjectsV2 in the S3 API. For backward compatibility, use
+  /// [listAllObjects] instead.
+  Future<ListObjectsResult> listAllObjectsV2(
+    String bucket, {
+    String prefix = '',
+    bool recursive = false,
+  }) async {
+    final chunks = listObjects(bucket, prefix: prefix, recursive: recursive);
+    final objects = <Object>[];
+    final prefixes = <String>[];
+    await for (final chunk in chunks) {
+      objects.addAll(chunk.objects);
+      prefixes.addAll(chunk.prefixes);
+    }
+    return ListObjectsResult(
+      objects: objects,
+      prefixes: prefixes,
+    );
+  }
+
   /// listObjectsV2Query - (List Objects V2) - List some or all (up to 1000) of the objects in a bucket.
   Future<ListObjectsV2Output> listObjectsV2Query(
     String bucket,
@@ -1033,7 +1077,9 @@ class Minio {
     );
 
     return AccessControlPolicy.fromXml(
-      xml.XmlDocument.parse(resp.body).firstChild as XmlElement?,
+      xml.XmlDocument.parse(resp.body)
+          .findElements('AccessControlPolicy')
+          .first,
     );
   }
 
-- 
GitLab