push method

Future<T> push({
  1. required T item,
  2. required String userId,
  3. DataSource source = DataSource.local,
  4. bool forceRemoteSync = false,
})

Implementation

Future<T> push({
  required T item,
  required String userId,
  DataSource source = DataSource.local,
  bool forceRemoteSync = false,
}) async {
  _ensureInitialized();
  // Check for user switch before proceeding.
  await _syncEngineInstance.checkForUserSwitch(userId);

  final transformed = await _applyPreSaveTransforms(item);
  final existing = await localAdapter.read(item.id, userId: userId);

  if (existing != null) {
    // This is an update. Calculate the diff.
    final delta = transformed.diff(existing);
    if (delta == null) {
      _logger.debug(
        'No changes detected for entity ${item.id}, skipping save.',
      );
      return transformed;
    }
    // If we are here, it's a valid update with changes.
    final result = await _performUpdate(transformed, delta, source, forceRemoteSync);

    // Invalidate caches that might be affected by this update
    _invalidateCachesForEntity(result);

    return result;
  } else {
    // This is a new creation.
    final result = await _performCreate(transformed, source, forceRemoteSync);

    // Invalidate caches that might be affected by this creation
    _invalidateCachesForEntity(result);

    return result;
  }
}