Files
AFFiNE-Mirror/packages/backend/server/src/plugins/calendar/cron.ts
T
DarkSky d975bf46fb feat(server): improve calendar sync queue (#14783)
#### PR Dependency Tree


* **PR #14783** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
  * Configurable request timeout for calendar integrations.
* Calendar polling now enqueues per-subscription sync jobs (larger
batch) for improved throughput.

* **Bug Fixes / Improvements**
* Persisted next-sync timestamps and retry counts for more reliable
scheduling and retry behavior.
* Exponential backoff and webhook renewal now update scheduling
consistently.

* **Refactor**
* Calendar sync flow moved to a job-queue-driven design for better
concurrency and observability.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-04-05 10:52:18 +08:00

34 lines
801 B
TypeScript

import { Injectable } from '@nestjs/common';
import { Cron, CronExpression } from '@nestjs/schedule';
import { JobQueue } from '../../base';
import { Models } from '../../models';
const CALENDAR_POLL_BATCH_SIZE = 200;
@Injectable()
export class CalendarCronJobs {
constructor(
private readonly models: Models,
private readonly queue: JobQueue
) {}
@Cron(CronExpression.EVERY_MINUTE)
async pollAccounts() {
const subscriptions = await this.models.calendarSubscription.listDueForSync(
new Date(),
CALENDAR_POLL_BATCH_SIZE
);
await Promise.allSettled(
subscriptions.map(({ id }) =>
this.queue.add(
'calendar.syncSubscription',
{ subscriptionId: id, reason: 'polling' },
{ jobId: id }
)
)
);
}
}