deleteMany method

  1. @override
Future<void> deleteMany(
  1. SyncScope scope,
  2. List<Id> ids
)
override

Delete semantics within the given scope:

  • If supportsSoftDelete is true, mark items as deleted (e.g., set deletedAt) and keep rows.
  • Otherwise, remove rows permanently (hard delete).

Implementation

@override
Future<void> deleteMany(SyncScope scope, List<Id> ids) async {
  if (ids.isEmpty) return;
  final sk = _scopeKey(scope);
  if (supportsSoftDelete) {
    final nowIso = DateTime.now().toUtc().toIso8601String();
    await db.batch((b) {
      for (final id in ids) {
        final idStr = idToString(id);
        b.insert(
          db.items,
          ItemsCompanion.insert(
            scopeName: scope.name,
            scopeKeys: sk,
            id: idStr,
            payload: jsonEncode({}), // payload may be empty on tombstone
            updatedAt: nowIso,
            deletedAt: d.Value(nowIso),
          ),
          onConflict: d.DoUpdate(
            (old) => ItemsCompanion(
              deletedAt: d.Value(nowIso),
              updatedAt: d.Value(nowIso),
            ),
          ),
        );
      }
    });
  } else {
    await (db.delete(db.items)..where(
          (t) =>
              (t.scopeName.equals(scope.name) &
              t.scopeKeys.equals(sk) &
              t.id.isIn(ids.map(idToString))),
        ))
        .go();
  }
  await _maybeEnforceLimit();
}