diff --git a/crossfire/lib/src/crossfire_base.dart b/crossfire/lib/src/crossfire_base.dart index 06fb224..2dda350 100644 --- a/crossfire/lib/src/crossfire_base.dart +++ b/crossfire/lib/src/crossfire_base.dart @@ -13,6 +13,7 @@ abstract class Firebase { Future getStorage(String path); bool get isConnected; Stream get onConnectivityUpdated; + Future batch(); } abstract class FirebaseDocument { @@ -103,3 +104,18 @@ enum FireDocumentChangeType { /// longer matches the query. removed, } + +abstract class FirebaseBatch { + Future commit(); + FirebaseBatch delete(FirebaseDocumentReference documentRef); + FirebaseBatch setData( + FirebaseDocumentReference documentRef, + Map data, { + bool merge: false, + }); + FirebaseBatch updateData( + FirebaseDocumentReference documentRef, { + Map data, + List fieldsAndValues, + }); +} diff --git a/crossfire_flutter/lib/crossfire_flutter.dart b/crossfire_flutter/lib/crossfire_flutter.dart index b75d16f..77f6829 100644 --- a/crossfire_flutter/lib/crossfire_flutter.dart +++ b/crossfire_flutter/lib/crossfire_flutter.dart @@ -110,6 +110,12 @@ class FlutterFirebase implements Firebase { @override Stream get onConnectivityUpdated => _connectionChangedSink.stream; + + @override + Future batch() async { + final b = _firestore.batch(); + return FlutterFirebaseBatch(b); + } } class FlutterFirebaseDocReference implements FirebaseDocumentReference { @@ -307,3 +313,41 @@ class FlutterStorageMetadata implements FirebaseStorageMetadata { String get contentType => _metadata.contentType; int get size => _metadata.sizeBytes; } + +class FlutterFirebaseBatch implements FirebaseBatch { + final WriteBatch _batch; + + FlutterFirebaseBatch(this._batch); + + @override + Future commit() => _batch.commit(); + + @override + FirebaseBatch delete(FirebaseDocumentReference documentRef) { + final doc = documentRef as FlutterFirebaseDocReference; + _batch.delete(doc.ref); + return this; + } + + @override + FirebaseBatch setData( + FirebaseDocumentReference documentRef, + Map data, { + bool merge = false, + }) { + final doc = documentRef as FlutterFirebaseDocReference; + _batch.setData(doc.ref, data, merge: merge); + return this; + } + + @override + FirebaseBatch updateData( + FirebaseDocumentReference documentRef, { + Map data, + List fieldsAndValues, + }) { + final doc = documentRef as FlutterFirebaseDocReference; + _batch.updateData(doc.ref, data); + return this; + } +} \ No newline at end of file diff --git a/crossfire_web/lib/crossfire_web.dart b/crossfire_web/lib/crossfire_web.dart index f48c098..e5466db 100644 --- a/crossfire_web/lib/crossfire_web.dart +++ b/crossfire_web/lib/crossfire_web.dart @@ -37,13 +37,12 @@ class FirebaseWeb implements Firebase { if (usePersistence != null && usePersistence) { try { _store.enablePersistence(); - } catch(e) { + } catch (e) { // Support re-initializing with a different app. Enabling persistence // can throw an error if it has already been enabled once on the page. } } _storage = fb.storage(app); - } @override @@ -82,6 +81,12 @@ class FirebaseWeb implements Firebase { @override Stream get onConnectivityUpdated => _connectionChangeSink.stream; + + @override + Future batch() async { + var b = _store.batch(); + return BrowserFirebaseBatch(b); + } } class BrowserFirebaseQuerySnapshot implements FirebaseQuerySnapshot { @@ -322,3 +327,42 @@ class BrowserFirebaseQuery extends FirebaseQuery { return new BrowserFirebaseQuery(q); } } + +class BrowserFirebaseBatch implements FirebaseBatch { + final WriteBatch _batch; + + BrowserFirebaseBatch(this._batch); + + @override + Future commit() => _batch.commit(); + + @override + FirebaseBatch delete(FirebaseDocumentReference documentRef) { + final doc = documentRef as BrowserFirebaseDocReference; + final b = _batch.delete(doc._ref); + return BrowserFirebaseBatch(b); + } + + @override + FirebaseBatch setData( + FirebaseDocumentReference documentRef, + Map data, { + bool merge = false, + }) { + final doc = documentRef as BrowserFirebaseDocReference; + final b = _batch.set(doc._ref, data, SetOptions(merge: merge)); + return BrowserFirebaseBatch(b); + } + + @override + FirebaseBatch updateData( + FirebaseDocumentReference documentRef, { + Map data, + List fieldsAndValues, + }) { + final doc = documentRef as BrowserFirebaseDocReference; + final b = + _batch.update(doc._ref, data: data, fieldsAndValues: fieldsAndValues); + return BrowserFirebaseBatch(b); + } +}