delete method

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

Deletes an entity by its ID from all local and remote adapters.

Implementation

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

  final existing = await localAdapter.read(id, userId: userId);
  if (existing == null) {
    _logger.debug(
      'Entity $id does not exist for user $userId, skipping delete',
    );
    return false;
  }

  _logger.debug('Notifying observers of onDeleteStart for $id');
  for (final observer in _localObservers) {
    observer.onDeleteStart(id);
  }
  for (final observer in _globalObservers) {
    observer.onDeleteStart(id);
  }
  final deleted = await localAdapter.delete(id, userId: userId);
  if (!deleted) {
    _logger.warn('Local adapter failed to delete entity $id');
    // Notify observers of the failure before returning.
    for (final observer in _localObservers) {
      observer.onDeleteEnd(id, success: false);
    }
    for (final observer in _globalObservers) {
      observer.onDeleteEnd(id, success: false);
    }
    return false;
  }

  _logger.debug('Notifying observers of onDeleteEnd for $id');
  for (final observer in _localObservers) {
    observer.onDeleteEnd(id, success: true);
  }
  for (final observer in _globalObservers) {
    observer.onDeleteEnd(id, success: true);
  }
  if (source == DataSource.local || forceRemoteSync) {
    final operation = _createOperation(
      userId: userId,
      type: DatumOperationType.delete,
      entityId: id,
    );
    // Calculate size for delete operation (it's small, just the ID)
    final payload = {'id': id};
    final size = (await _isolateHelper.computeJsonEncode(payload)).length;

    await _queueManager.enqueue(operation.copyWith(sizeInBytes: size));
  }

  _eventController.add(
    DataChangeEvent<T>(
      userId: userId,
      data: existing,
      changeType: ChangeType.deleted,
      source: source,
    ),
  );

  return true;
}