From f5085707e0740b4159ab08ccf29b21eeb65dfc5a Mon Sep 17 00:00:00 2001 From: TheNoumanDev <76642732+TheNoumanDev@users.noreply.github.com> Date: Sat, 21 Feb 2026 06:17:41 +0500 Subject: [PATCH] Add mergeOptions support for Firestore set operation --- .../firestore/firestore_api_provider.dart | 1 - .../apiproviders/firestore/firestore_app.dart | 22 +++++++++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/modules/ensemble/lib/framework/apiproviders/firestore/firestore_api_provider.dart b/modules/ensemble/lib/framework/apiproviders/firestore/firestore_api_provider.dart index 99ccab705..2c6dbf988 100644 --- a/modules/ensemble/lib/framework/apiproviders/firestore/firestore_api_provider.dart +++ b/modules/ensemble/lib/framework/apiproviders/firestore/firestore_api_provider.dart @@ -274,7 +274,6 @@ class FirestoreAPIProvider extends APIProvider with LiveAPIProvider { 'message': 'Subscribed to API', 'documents': [] }; - ; return FirestoreResponse( apiState: APIState.success, body: body, diff --git a/modules/ensemble/lib/framework/apiproviders/firestore/firestore_app.dart b/modules/ensemble/lib/framework/apiproviders/firestore/firestore_app.dart index 00217a054..5d086879d 100644 --- a/modules/ensemble/lib/framework/apiproviders/firestore/firestore_app.dart +++ b/modules/ensemble/lib/framework/apiproviders/firestore/firestore_app.dart @@ -149,9 +149,27 @@ class FirestoreApp { Future performSetOperation(Map evaluatedApi) async { String path = evaluatedApi['path']; - Map data = EnsembleFieldValue.prepareToSendToFirestore(evaluatedApi['data']); + Map data = + EnsembleFieldValue.prepareToSendToFirestore(evaluatedApi['data']); DocumentReference docRef = firestore.doc(path); - return await docRef.set(data); + + SetOptions? setOptions; + Map? mergeOptions = evaluatedApi['mergeOptions']; + + if (mergeOptions != null) { + bool hasMerge = mergeOptions['merge'] == true; + bool hasMergeFields = mergeOptions['mergeFields'] is List; + + // mergeFields takes priority over merge if both are provided + if (hasMergeFields) { + List fields = List.from(mergeOptions['mergeFields']); + setOptions = SetOptions(mergeFields: fields); + } else if (hasMerge) { + setOptions = SetOptions(merge: true); + } + } + + return await docRef.set(data, setOptions); } Future performUpdateOperation(Map evaluatedApi) async {