- Shipped
- 15 listopada 2026 10:00 UTC
- Author
- Kamo
- Commit
- 3b85588
Ustawienia › E-mail › CalDAV/CardDAV zapisywał połączenia zewnętrzne i pokazywał "Ostatnie Synchronizacja, która nie pobrała niczego (zadania DaemonService nie zostały zsynchronizowane) I oznaczyłem wszystko jako IDLE; klasy dostawców były TODOs) Synchronizuje je na prawdę (groupware/sync): - CalDAV/CardDAV: odkrywanie (adres → główny → zestaw domowy → kolekcje, z / .dobrze znany fallback, działa wklejony adres pojedynczego kalendarza), CTag / sync-token check, calendar-query lista ETag (ostatnie 366 dni), multiget tego, co się zmieniło, PUT/DELETE z If-Match/If-None-Match. iCloud domyślnie ustawia swoje adresy. - Google Calendar + Ludzie, Microsoft Kalendarze wykresów + kontakty na przyznaniu /oauth przechowuje przepływ; tokeny odświeżane (i obrotowe tokeny odświeżania przechowywane) z Zapis, który zastępuje tylko dokładny blob, który odświeżył. - Zdarzenia lądują poprzez IcsImportService.upsert (serie, wyjątki, EXDATEs) i Kontakty przez ContactService + ContactDetailStore — bez zaproszeń, bez Przypomnienia, żadne surowe tabele nie piszą. - Księgowość na kolekcję / pozycję (nowe tabele groupware_sync_*) daje aktualizacje, Usuwanie i dwukierunkowe: najpierw pociągnij (kopia zewnętrzna wygrywa remis), a następnie wciśnij Kamo edytuje/tworzy/usuwa, gdy integracja jest dwukierunkowa, a kolekcja Strażnicy: nic nie jest usuwane na nieudanym lub podejrzanie pustym liście, nic Kamo nie importowało, nic, co tylko starzało się z okna; przejście Każdy wniosek, który usunąłby większość kolekcji, jest odrzucany. - Status jest uczciwy: SYNCING podczas pracy, IDLE + lastSyncedAt tylko po pełnym fetch, ERROR + zwykłe słowa errorMessage inaczej; napisane kolumna po kolumnie, więc Edycja członka w połowie przejścia przetrwa. Per-kolekcja lastError i liczby są w Ładunek ustawień (syncSupported, calendarsSynced, eventsSynced, addressBooksSynced, contactsSynced, collections[]). - Harmonogram: **************** (zegar DaemonService) oraz /integrations/{id} (Synchronizuj teraz za pomocą daemon.sync.trigger, lokalne zabezpieczenie bez NATS); dzierżawa SingletonTaskRunner na integrację, dzięki czemu pods nigdy się nie podwoi. - Połączenie testowe teraz loguje się i wyświetla; wiersze członkowskie rejestrują ich organizację; Usuwanie integracji odłącza (zachowuje) to, co zostało zsynchronizowane; zewnętrzne adresy Musi być https do publicznego hosta (bez zasięgu klastra/SSRF); poświadczenia nigdy nie są rejestrowane. - Usunięto martwe stuby dostawców TODO i ich nieużywane odświeżacze.
