- Enviado
- 15 de noviembre de 2026 a las 10:00 UTC
- Autor
- Kamo
- Commit
- 3b85588
Configuración › Correo electrónico › CalDAV/CardDAV guardaba conexiones externas y mostraba "Últimas synced" para una sincronización que no obtuvo nada (los trabajos de DaemonService bloquearon los contadores y marcó todo como INACTIVO; las clases de proveedores eran tareas pendientes) Los sincroniza de verdad (groupware/sync): - CalDAV/CardDAV: descubrimiento (dirección → principal → home set → colecciones, con /.recurso de emergencia bien conocido, una dirección pegada de un solo calendario funciona), CTag/sync-token check, calendario-consulta ETag listado (últimos 366 días en), multiget de lo que cambió, PUT/DELETE con If-Match/If-None-Match. iCloud predetermina sus direcciones. - Google Calendar + Personas, Microsoft Gráfico de calendarios + contactos en la concesión /oauth almacena el flujo; los tokens se actualizan (y los tokens de actualización rotados se mantienen) con un Escribir que solo reemplaza el blob exacto que actualizó. - Eventos de aterrizaje a través de IcsImportService.upsert (series, excepciones, EXDATEs) y Contactos a través de ContactService + ContactDetailStore — sin invitaciones, sin Recordatorios, ninguna tabla en bruto escribe. - La contabilidad por colección / elemento (nuevas tablas groupware_sync_*) da actualizaciones, Eliminaciones y dos vías: tira primero (la copia exterior gana un empate), luego empuja Kamo Editar/crear/eliminar cuando la integración es bidireccional y la colección Guardias: nada eliminado en un listado fallido o sospechosamente vacío, nada Kamo no importaba, nada que solo envejeciera fuera de la ventana; un pase Que borraría la mayor parte de una colección por ahí es rechazado. - El estado es honesto: SINCRONIZACIÓN mientras se ejecuta, IDLE + lastSyncedAt solo después de un fetch, ERROR + plain-words errorMessage de lo contrario; escrito columna por columna así La edición de un miembro a mitad de paso sobrevive. Por colección lastError y recuentos están en la carga de configuración (syncSupported, calendarsSynced, eventsSynced, addressBooksSynced, contactsSynced, collections[]). - Programación: **************** (reloj de DaemonService) y /integrations/{id} (Sincronizar ahora a través de daemon.sync.trigger, fallback local sin NATS); concesión de SingletonTaskRunner por integración para que los pods nunca se ejecuten dos veces. - Conexión de prueba ahora inicia sesión y listas; filas de miembros registran su organización; Eliminar una integración separa (mantene) lo que se sincronizó; direcciones externas Debe ser https a un host público (sin alcance de clúster/SSRF); las credenciales nunca se registran. - Se eliminaron los esbozos de proveedores de TODO muertos y sus actualizaciones no utilizadas.
