upsert method
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);
}