From 82f37179ccda6c25bfc13d82f7f03128e7599bc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Irfan=20=C3=96m=C3=BCr?= Date: Wed, 22 Oct 2025 16:19:22 +0300 Subject: [PATCH 1/2] Add `replaceAllForSite` to `BookingsDao` Add a new `replaceAllForSite` transactional function to the `BookingsDao`. This function first deletes all bookings for a given site and then inserts the new list of bookings, ensuring atomicity. --- .../wordpress/android/fluxc/persistence/dao/BookingsDao.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libs/fluxc-plugin/src/main/kotlin/org/wordpress/android/fluxc/persistence/dao/BookingsDao.kt b/libs/fluxc-plugin/src/main/kotlin/org/wordpress/android/fluxc/persistence/dao/BookingsDao.kt index eec317aff1b4..b2ee9b99ee71 100644 --- a/libs/fluxc-plugin/src/main/kotlin/org/wordpress/android/fluxc/persistence/dao/BookingsDao.kt +++ b/libs/fluxc-plugin/src/main/kotlin/org/wordpress/android/fluxc/persistence/dao/BookingsDao.kt @@ -4,6 +4,7 @@ import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query +import androidx.room.Transaction import kotlinx.coroutines.flow.Flow import org.wordpress.android.fluxc.model.LocalOrRemoteId.LocalId import org.wordpress.android.fluxc.network.rest.wpcom.wc.bookings.BookingsFilterOption @@ -61,6 +62,12 @@ interface BookingsDao { @Query("DELETE FROM Bookings WHERE localSiteId = :localSiteId") suspend fun deleteAllForSite(localSiteId: LocalId) + @Transaction + suspend fun replaceAllForSite(siteId: LocalId, entities: List) { + deleteAllForSite(siteId) + insertOrReplace(entities) + } + fun observeBookings( localSiteId: LocalId, limit: Int? = null, From 8a2cf7621d1f87dbb3daee96671bef011ad17620 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Irfan=20=C3=96m=C3=BCr?= Date: Wed, 22 Oct 2025 16:20:24 +0300 Subject: [PATCH 2/2] Replace `deleteAll` and `insert` with `replaceAll` The `deleteAllForSite` and `insertOrReplace` calls are replaced with a single `replaceAllForSite` call. This is done within a database transaction, making the operation more efficient. --- .../network/rest/wpcom/wc/bookings/BookingsStore.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libs/fluxc-plugin/src/main/kotlin/org/wordpress/android/fluxc/network/rest/wpcom/wc/bookings/BookingsStore.kt b/libs/fluxc-plugin/src/main/kotlin/org/wordpress/android/fluxc/network/rest/wpcom/wc/bookings/BookingsStore.kt index a82db9a3b374..7936263e40da 100644 --- a/libs/fluxc-plugin/src/main/kotlin/org/wordpress/android/fluxc/network/rest/wpcom/wc/bookings/BookingsStore.kt +++ b/libs/fluxc-plugin/src/main/kotlin/org/wordpress/android/fluxc/network/rest/wpcom/wc/bookings/BookingsStore.kt @@ -46,11 +46,6 @@ class BookingsStore @Inject internal constructor( return@withDefaultContext WooResult(ordersResult.error) } - if (page == 1 && filters.isEmpty() && query.isNullOrEmpty()) { - // Clear existing bookings when fetching the first page - bookingsDao.deleteAllForSite(site.localId()) - } - val entities = response.result.map { with(bookingDtoMapper) { it.toEntity( @@ -59,7 +54,12 @@ class BookingsStore @Inject internal constructor( ) } } - bookingsDao.insertOrReplace(entities) + if (page == 1 && filters.isEmpty() && query.isNullOrEmpty()) { + // Clear existing bookings and insert new ones when fetching the first page + bookingsDao.replaceAllForSite(site.localId(), entities) + } else { + bookingsDao.insertOrReplace(entities) + } val totalPages = headersParser.getTotalPages(response.headers) // Determine if we can load more from the total pages header if available, otherwise // infer it from the number of items returned