delete method
Future<bool>
delete({
- required String id,
- required String userId,
- DataSource source = DataSource.local,
- 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;
}