upsert method

  1. @override
Future<void> upsert(
  1. ScheduleEntry entry
)
override

Inserts or updates a schedule entry, recomputing its next run.

Implementation

@override
/// Inserts or updates a schedule entry, recomputing its next run.
Future<void> upsert(ScheduleEntry entry) async {
  final now = stemNow().toUtc();
  var next = entry.nextRunAt;
  if (entry.enabled) {
    next ??= _calculator.nextRun(
      entry,
      entry.lastRunAt ?? now,
      includeJitter: false,
    );
  } else {
    next ??= entry.lastRunAt ?? now;
  }
  final existing = _entries[entry.id];
  final currentVersion = existing?.entry.version ?? 0;
  if (existing != null && entry.version != currentVersion) {
    throw ScheduleConflictException(
      entry.id,
      expectedVersion: entry.version,
      actualVersion: currentVersion,
    );
  }
  final nextVersion = existing == null ? 1 : currentVersion + 1;
  final updated = entry.copyWith(nextRunAt: next, version: nextVersion);
  _entries[entry.id] = _ScheduleState(updated, next, locked: false);
}