- Expédié
- 15 novembre 2026 à 10:00 UTC
- Auteur
- Kamo
- Commit
- 3b85588
CalDAV/CardDAV enregistrait les connexions externes et affichait "Dernière connexion enregistrée" synced" pour une synchronisation qui n'a rien récupéré (les tâches de DaemonService ont renversé les compteurs Les classes de fournisseurs étaient des tâches à accomplir). EmailService maintenant Les synchronise pour de vrai (groupware/sync): - CalDAV/CardDAV: découverte (adresse → principal → home set → collections, avec /.une solution de secours bien connue, une adresse de calendrier unique collée fonctionne), CTag/sync-token check, calendar-query ETag listing (366 derniers jours), multiget de ce qui a changé, PUT/DELETE avec If-Match/If-None-Match. iCloud définit ses adresses par défaut. - Google Calendar + Personnes, Microsoft Graphique calendriers + contacts sur l'octroi de la /oauth stocke le flux ; les jetons sont actualisés (et les jetons d'actualisation rotés sont conservés) avec un Une écriture qui ne remplace que le blob exact qu'elle a actualisé. - Les événements atterrissent via IcsImportService.upsert (série, exceptions, EXDATEs) et Contacts via ContactService + ContactDetailStore — pas d'invitations, pas de Rappels, aucune table brute n'écrit. - La comptabilité par collection/élément (nouvelles tables groupware_sync_*) donne des mises à jour, Suppressions et deux-voies: tirer d'abord (copie extérieure gagne une égalité), puis pousser Kamo Modifier/créer/supprimer lorsque l'intégration est bidirectionnelle et que la collection Gardes: rien supprimé sur une liste échouée ou suspectement vide, rien Kamo n'importait pas, rien qui ne vieillissait que hors de la fenêtre ; un passage Toute demande qui supprimerait la majeure partie d'une collection est refusée. - L'état est honnête: SYNCING en cours d'exécution, IDLE + lastSyncedAt seulement après un plein fetch, ERROR + plain-words errorMessage autrement; écrit colonne par colonne de sorte que La modification d'un membre à mi-parcours survit. Par-collection lastError et les comptes sont dans La charge utile des paramètres (syncSupported, calendarsSynced, eventsSynced, addressBooksSynced, contactsSynced, collections[]). - Planification: **************** (horloge de DaemonService) et /integrations/{id} (Synchroniser maintenant via daemon.sync.trigger, récupération locale sans NATS); bail SingletonTaskRunner par intégration afin que les pods ne se doublent jamais. - Test Connection se connecte maintenant et liste; les lignes de membres enregistrent leur organisation; La suppression d'une intégration détache (conserve) ce qui a été synchronisé; les adresses extérieures doit être https vers un hôte public (pas de portée cluster/SSRF); les informations d'identification ne sont jamais enregistrées. - Suppression des stubs de fournisseurs TODO morts et de leurs rafraîchissements inutilisés.
