feat(PROJ-8): Automatischer IMAP-Sync (Cron-Scheduler)
Backend:
- internal/imap/store.go: 7 neue Felder (sync_interval_min, last_sync_at,
last_sync_count, last_uid, sync_running, sync_status, sync_error_msg)
DB-Migration via ALTER TABLE ADD COLUMN IF NOT EXISTS
Neue Methoden: ListAll, UpdateSyncInterval, SetSyncRunning, UpdateSyncResult
- internal/imap/scheduler.go: Scheduler mit time.Ticker (1 min),
inkrementeller Sync via UID SEARCH UID <lastUID+1>:*,
exponential backoff (3 Versuche: 1s / 60s / 300s),
sync_running-Flag verhindert parallele Syncs
- internal/api/server.go: POST /api/imap/{id}/sync (manueller Trigger),
PATCH /api/imap/{id} (sync_interval_min setzen, 0 oder 5-1440 min)
- cmd/archivmail/main.go: Scheduler gestartet + via SetImap verdrahtet
Frontend:
- src/lib/api.ts: 6 neue ImapAccount-Felder, triggerImapSync, updateImapInterval
- src/app/imap/page.tsx: Intervall-Dropdown, "Sync jetzt"-Button,
Letzter-Sync-Anzeige mit Status-Badge, Polling auch bei sync_running
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -314,6 +314,13 @@ export interface ImapAccount {
|
||||
progress_current: number;
|
||||
progress_total: number;
|
||||
created_at: string;
|
||||
// PROJ-8: Auto-sync fields
|
||||
sync_interval_min: number;
|
||||
last_sync_at?: string;
|
||||
last_sync_count: number;
|
||||
sync_running: boolean;
|
||||
sync_status: string;
|
||||
sync_error_msg: string;
|
||||
}
|
||||
|
||||
export interface ImapTestResult {
|
||||
@@ -366,6 +373,17 @@ export async function getImapProgress(id: number): Promise<ImapAccount> {
|
||||
return request<ImapAccount>(`/api/imap/${id}/progress`);
|
||||
}
|
||||
|
||||
export async function triggerImapSync(id: number): Promise<ImapAccount> {
|
||||
return request<ImapAccount>(`/api/imap/${id}/sync`, { method: "POST" });
|
||||
}
|
||||
|
||||
export async function updateImapInterval(id: number, intervalMin: number): Promise<ImapAccount> {
|
||||
return request<ImapAccount>(`/api/imap/${id}`, {
|
||||
method: "PATCH",
|
||||
body: JSON.stringify({ sync_interval_min: intervalMin }),
|
||||
});
|
||||
}
|
||||
|
||||
// ── System Stats ──────────────────────────────────────────────────────────
|
||||
|
||||
export interface SystemStatsCPU {
|
||||
|
||||
Reference in New Issue
Block a user