fix: retry unchanged reschedule intent after stale revision (Closes #1311)
CI / lint (pull_request) Successful in 3m47s
CI / build-release (pull_request) Successful in 8s
CI / browser-journey (pull_request) Successful in 6m58s
CI / release-candidate (pull_request) Has been skipped

This commit is contained in:
timmy committed 2026-08-23 15:43:30 +00:00
1 parent 544ffb4ae7
commit 75846cf045
2 files changed
+106 -5

No files matched your search

+39 -5
View File
@@ -70,11 +70,12 @@ function createTodayWeekReschedule({
throw conflict;
}
function flush() {
function flush(retryConflict = false) {
if (flushing) return flushing;
if (!pending()) return Promise.resolve(false);
flushing = (async () => {
let result = null;
let conflictRetried = false;
while (true) {
const records = readQueue();
const record = records[0];
@@ -83,7 +84,25 @@ function createTodayWeekReschedule({
result = await api('api/v1/week/reschedule', {
method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify(record.body),
});
} catch (error) { await restoreConflict(error); }
} catch (error) {
if (error?.status === 409 && retryConflict && !conflictRetried) {
const [today, weekState] = await Promise.all([api('api/v1/today'), api('api/v1/week')]);
adoptToday(today); week.adopt(weekState);
const latest = readQueue();
if (today?.ids?.includes(record.body.identity) &&
latest[0]?.body?.operation_id === record.body.operation_id) {
latest[0] = {...latest[0], body:{
...latest[0].body,
today_revision:today.revision,
week_revision:weekState.revision,
}};
if (!saveQueue(latest)) throw new Error('Could not update this saved move after plans changed.');
conflictRetried = true;
continue;
}
}
await restoreConflict(error);
}
adoptToday(result.today);
week.adopt(result.week);
const latest = readQueue();
@@ -207,9 +226,24 @@ function createTodayWeekReschedule({
}
let result;
try {
result = admitted ? await flush() : await api('api/v1/week/reschedule', {
method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify(body),
});
if (admitted) {
result = await flush(true);
} else {
try {
result = await api('api/v1/week/reschedule', {
method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify(body),
});
} catch (error) {
if (error?.status !== 409) throw error;
const [today, weekState] = await Promise.all([api('api/v1/today'), api('api/v1/week')]);
adoptToday(today); week.adopt(weekState);
if (!today?.ids?.includes(body.identity)) throw error;
body.today_revision = today.revision; body.week_revision = weekState.revision;
result = await api('api/v1/week/reschedule', {
method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify(body),
});
}
}
} catch(error) {
if (admitted && error?.status === 409) await restoreConflict(error);
if (admitted && error?.status !== 401 && error?.status !== 403) {