Fonaria als zweite Anlage neben Starface
Die SyncEngine kennt jetzt nur noch IContactBackend. Was dahinter steckt, entscheidet das Profil — der Ablauf mit getrennten Baselines, Wiederzuordnung und Konfliktaufloesung bleibt unangetastet. In ihm steckt die Erfahrung, die man nicht zweimal machen will. FonariaApiClient spricht deren REST-API. Der Kern ist das Feld `verwaltet`, das jeder Schreibvorgang mitschickt: Fonaria haelt den Kontakt als vollstaendige vCard, dieses Sync-Modell bildet davon nur einen Ausschnitt ab. Ohne diese Liste haette ein aus Outlook gespiegelter Kontakt nach dem ersten Abgleich kein Bild, keine Kategorien und keinen Jahrestag mehr — nicht weil jemand sie geloescht haette, sondern weil wir sie nicht kannten. Zwei Verluste lagen darunter und sind gefunden worden, weil der Client gegen eine echte Anlage lief: - Die Abteilung steckt im zweiten Teil von ORG. Wer nur die Firma schickt, loescht sie mit. - Neben der geschaeftlichen Anschrift kann eine private stehen. Das Sync-Modell traegt nur eine. Beides wird jetzt aus dem gelesenen Stand unveraendert zurueckgeschrieben. Umbenannt: StarfaceConnection -> SystemConnection, StarfaceAddressBook -> RemoteAddressBook. Die JSON-Namen bleiben ueber JsonProperty erhalten, sonst verloeren bestehende Profile ihre Verbindungsdaten. SyncMapping.StarfaceId behaelt seinen Namen aus demselben Grund. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -110,7 +110,7 @@ namespace StarfaceOutlookSync.Services
|
||||
try
|
||||
{
|
||||
Log("Verbinde mit Starface...");
|
||||
using (var starface = new StarfaceApiClient(profile.StarfaceConnection))
|
||||
using (var starface = ContactBackendFactory.Create(profile.Connection))
|
||||
{
|
||||
starface.OnDebug += (msg) => Log(msg);
|
||||
var loginOk = await starface.LoginAsync();
|
||||
@@ -127,7 +127,7 @@ namespace StarfaceOutlookSync.Services
|
||||
Log($"{outlookContacts.Count} Outlook-Kontakte geladen");
|
||||
|
||||
Log("Lade Starface-Kontakte...");
|
||||
var starfaceContacts = await starface.GetContactsAsync(profile.StarfaceAddressBook);
|
||||
var starfaceContacts = await starface.GetContactsAsync(profile.AddressBook);
|
||||
Log($"{starfaceContacts.Count} Starface-Kontakte geladen");
|
||||
|
||||
// Bestehende Mappings laden
|
||||
@@ -236,7 +236,7 @@ namespace StarfaceOutlookSync.Services
|
||||
// (sonst Dublette).
|
||||
// (b) per ID 404 -> in Starface WIRKLICH geloescht.
|
||||
bool stillExists = !string.IsNullOrEmpty(mapping.StarfaceId)
|
||||
&& await starface.GetContactAsync(mapping.StarfaceId) != null;
|
||||
&& await starface.GetContactAsync(mapping.StarfaceId, profile.AddressBook) != null;
|
||||
|
||||
if (stillExists)
|
||||
{
|
||||
@@ -324,7 +324,7 @@ namespace StarfaceOutlookSync.Services
|
||||
if (olChanged && !sfChanged && (profile.SyncDirection == SyncDirection.Both || profile.SyncDirection == SyncDirection.OutlookToStarface))
|
||||
{
|
||||
// Outlook hat sich geaendert -> Starface updaten
|
||||
var updated = await starface.UpdateContactAsync(mapping.StarfaceId, oc, profile.StarfaceAddressBook);
|
||||
var updated = await starface.UpdateContactAsync(mapping.StarfaceId, oc, profile.AddressBook);
|
||||
if (updated != null)
|
||||
{
|
||||
SetBaseline(mapping, oc, updated);
|
||||
@@ -355,7 +355,7 @@ namespace StarfaceOutlookSync.Services
|
||||
var (merged, conflicts) = ContactMerger.Merge(
|
||||
mapping.LastOutlook, mapping.LastStarface, oc, sc, outlookWins: true);
|
||||
|
||||
var updatedSf = await starface.UpdateContactAsync(mapping.StarfaceId, merged, profile.StarfaceAddressBook);
|
||||
var updatedSf = await starface.UpdateContactAsync(mapping.StarfaceId, merged, profile.AddressBook);
|
||||
var updatedOl = _outlookService.UpdateContact(mapping.OutlookEntryId, merged);
|
||||
|
||||
if (updatedSf != null || updatedOl != null)
|
||||
@@ -382,7 +382,7 @@ namespace StarfaceOutlookSync.Services
|
||||
{
|
||||
// Fallback ohne Snapshot bzw. OutlookToStarface:
|
||||
// Outlook gewinnt komplett.
|
||||
var updated = await starface.UpdateContactAsync(mapping.StarfaceId, oc, profile.StarfaceAddressBook);
|
||||
var updated = await starface.UpdateContactAsync(mapping.StarfaceId, oc, profile.AddressBook);
|
||||
if (updated != null)
|
||||
{
|
||||
SetBaseline(mapping, oc, updated);
|
||||
@@ -432,7 +432,7 @@ namespace StarfaceOutlookSync.Services
|
||||
if (match != null)
|
||||
{
|
||||
// Existiert schon -> verknuepfen und updaten
|
||||
var updated = await starface.UpdateContactAsync(match.StarfaceId, oc, profile.StarfaceAddressBook);
|
||||
var updated = await starface.UpdateContactAsync(match.StarfaceId, oc, profile.AddressBook);
|
||||
if (updated != null)
|
||||
{
|
||||
newMappings.Add(new SyncMapping
|
||||
@@ -455,7 +455,7 @@ namespace StarfaceOutlookSync.Services
|
||||
{
|
||||
// Neu -> in Starface erstellen
|
||||
Log($" Erstelle in Starface: {oc.DisplayName}");
|
||||
var created = await starface.CreateContactAsync(oc, profile.StarfaceAddressBook);
|
||||
var created = await starface.CreateContactAsync(oc, profile.AddressBook);
|
||||
if (created != null && !string.IsNullOrEmpty(created.StarfaceId))
|
||||
{
|
||||
newMappings.Add(new SyncMapping
|
||||
|
||||
Reference in New Issue
Block a user