- Shipped
- 15 листопада 2026 р. о 10:00 UTC
- Author
- Kamo
- Commit
- 3b85588
Параметри › Електронна пошта › CalDAV/CardDAV зберігав зовнішні з' єднання і показував « Останнє « synced » для синхронізації, яка нічого не отримала (задачі DaemonService перекрили лічильники) і позначив все як ПОДІЙДЕНЕ; класи постачальника були ТОДО). EmailService now синхронізує їх насправді (groupware/ sync): - CalDAV/ CardDAV: виявлення (адреса → головна → домашній набір → збірки, з /. добре відомий резерв, працює вставлена адреса одного календаря), CTag/sync-token check, calendar- query перелік ETag (за останні 366 днів), multiget змін, PUT/DELETE з If-Match/If-None-Match. iCloud типові адреси. - Google Calendar + Люди, Microsoft Графік календарів + контактів на сторінці / oauth поток зберігає; токени оновлюються (і поворотні токени оновлення зберігаються) з запис, який замінює лише точний об’ єкт, який він оновив. - Події прибувають за допомогою IcsImportService. upsert (серії, винятки, EXDATEs) і контакти за допомогою ContactService + ContactDetailStore — без запрошень, без нагадування, немає записів сирої таблиці. - Бухгалтерський облік за збіркою/ елементом (нові таблиці groupware_ sync_ *) надає оновлення, вилучення і двостороннє: спочатку затягнути (зовнішня копія виграє у випадку нічиєї), потім натиснути Kamo редагує/ створює/ вилучає, якщо інтеграція двостороння, а збірка Можливість запису. Охоронці: нічого не вилучено з помилкового або підозріло порожнього списку, нічого Kamo не імпортувалося, нічого, що було лише вилучено з вікна; пропуск що вилучить більшу частину колекції, відмовляється. - Статус є справедливим: СИНХРОНІЗУВАННЯ під час виконання, НЕДІЯЛЬНІСТЬ + lastSyncedAt тільки після повного завершення отримати, ПОМИЛКА + прості слова errorMessage інакше; написано стовпчик за стовпчиком так зміна члена у середині проходження зберігається. За збіркою lastError і підрахунки знаходяться у корисну інформацію параметрів (syncSupported, calendarsSynced, eventsSynced, addressBooksSynced, contactsSynced, collections[]). - Планування: **************** (годинник DaemonService) і / integrations/ {id} (Синхронізувати зараз за допомогою daemon. sync. trigger, локальний резерв без NATS); на інтеграцію SingletonTaskRunner орендується так, що підпрограми ніколи не виконуються двічі. - Перевірка з’ єднання тепер реєструє і показує списки; рядки членів записують їх організацію; вилучення інтеграції відокремлює (зберігає) те, що було синхронізовано; зовнішні адреси має бути https до публічного вузла (без доступу кластерів/ SSRF); дані реєстрації ніколи не записуються у журнал. - Вилучено мертві заголовки постачальників TODO і їх не використовувані оновлення.
