feat(bot): add self-hosted scheduled dispatch support

Co-authored-by: claw <stanislavkalishin+claw@gmail.com>
This commit is contained in:
2026-03-30 15:27:15 +02:00
parent 94c1f48794
commit 575a68b3bb
13 changed files with 331 additions and 40 deletions

View File

@@ -68,6 +68,19 @@ class ScheduledDispatchRepositoryStub implements ScheduledDispatchRepository {
return [...this.dispatches.values()].filter((dispatch) => dispatch.householdId === householdId)
}
async listDueScheduledDispatches(input: {
dueBefore: Temporal.Instant
provider?: ScheduledDispatchRecord['provider']
limit: number
}): Promise<readonly ScheduledDispatchRecord[]> {
return [...this.dispatches.values()]
.filter((dispatch) => dispatch.status === 'scheduled')
.filter((dispatch) => dispatch.dueAt.epochMilliseconds <= input.dueBefore.epochMilliseconds)
.filter((dispatch) => (input.provider ? dispatch.provider === input.provider : true))
.sort((left, right) => left.dueAt.epochMilliseconds - right.dueAt.epochMilliseconds)
.slice(0, input.limit)
}
async updateScheduledDispatch(input: {
dispatchId: string
dueAt?: Temporal.Instant

View File

@@ -86,6 +86,7 @@ export interface ScheduledDispatchService {
cancelAdHocNotification(notificationId: string, cancelledAt?: Instant): Promise<void>
reconcileHouseholdBuiltInDispatches(householdId: string, asOf?: Instant): Promise<void>
reconcileAllBuiltInDispatches(asOf?: Instant): Promise<void>
listDueDispatches(input?: { asOf?: Instant; limit?: number }): Promise<readonly ScheduledDispatchRecord[]>
getDispatchById(dispatchId: string): Promise<ScheduledDispatchRecord | null>
claimDispatch(dispatchId: string): Promise<boolean>
releaseDispatch(dispatchId: string): Promise<void>
@@ -307,6 +308,14 @@ export function createScheduledDispatchService(input: {
}
},
listDueDispatches(inputValue) {
return input.repository.listDueScheduledDispatches({
dueBefore: inputValue?.asOf ?? nowInstant(),
provider: input.scheduler.provider,
limit: inputValue?.limit ?? 25
})
},
getDispatchById(dispatchId) {
return input.repository.getScheduledDispatchById(dispatchId)
},