writeWithSyncMultiple method

void writeWithSyncMultiple(
  1. List objects, {
  2. required String userId,
  3. required String collectionName,
  4. required void writeCallback(),
})

Performs a write operation on multiple objects and automatically updates their sync_updated_at fields, marks them for sync, and creates DBCache entries.

Usage:

realm.writeWithSyncMultiple(
  [goal1, goal2],
  userId: 'user-123',
  collectionName: 'goals',
  () {
    goal1.title = "Updated 1";
    goal2.title = "Updated 2";
    // sync_updated_at is automatically set for both
  },
);

Implementation

void writeWithSyncMultiple(
  List<RealmObject> objects, {
  required String userId,
  required String collectionName,
  required void Function() writeCallback,
}) {
  write(() {
    // Capture old states for all objects
    final oldStates = <RealmObject, Map<String, dynamic>>{};
    for (final obj in objects) {
      try {
        oldStates[obj] = RealmJson.toJsonWith(obj, null);
      } catch (e) {
        // Serialization failed, skip
      }
    }

    // Apply user's modifications
    writeCallback();

    // Update sync metadata and create DBCache entries
    final now = DateTime.now().millisecondsSinceEpoch;
    for (final obj in objects) {
      obj.updateSyncTimestamp(timestampOverride: now);
      obj.markForSync();

      // Create DBCache entry
      try {
        final newData = RealmJson.toJsonWith(obj, null);
        final entityId = _extractEntityId(obj);

        if (entityId != null) {
          final oldData = oldStates[obj] ?? {};
          final isInsert = oldData.isEmpty;
          // For inserts, store full data; for updates, store diff
          final diffData = isInsert ? newData : diff(oldData, newData);

          // Only create DBCache if there are actual changes
          if (diffData.isNotEmpty) {
            final key = '$userId|$collectionName|$entityId';
            final dbCache = SyncDBCache(
              key,
              userId,
              collectionName,
              entityId,
              jsonEncode(canonicalizeMap(diffData)),
              jsonEncode(canonicalizeMap(newData)),
              isInsert ? 'inserted' : 'modified',
              createdAt: DateTime.now(),
            );
            add<SyncDBCache>(dbCache, update: true);
          }
        }
      } catch (e) {
        // Log diff caching failures for debugging
        try {
          // ignore: avoid_print
          print(
            'DBCache creation failed for $collectionName|${_extractEntityId(obj)}: $e',
          );
        } catch (_) {}
      }
    }
  });
}