Compare commits

..

2 Commits

Author SHA1 Message Date
duffyduck 561ffff03e Release v0.0.0.25 2026-06-08 11:51:35 +02:00
duffyduck 53eed8eda3 Fix: recreate genuinely-deleted Starface contacts instead of keeping dead mapping
Der vorherige Fix war zu konservativ: bei einem in der geladenen Liste
fehlenden Starface-Kontakt wurde das Mapping immer behalten und nichts neu
angelegt - auch wenn der Kontakt in Starface wirklich geloescht war. In
Richtung Outlook->Starface wurden geloeschte Kontakte dadurch nie wieder
angelegt.

Jetzt wird der Kontakt per ID abgefragt:
- existiert noch (anderes Adressbuch) -> Mapping behalten, nichts anlegen
- 404 (wirklich geloescht) -> in Both/OutlookToStarface neu anlegen
  (Phase 2), in StarfaceToOutlook Loeschung nach Outlook spiegeln

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 10:24:30 +02:00
5 changed files with 50 additions and 17 deletions
+7 -3
View File
@@ -16,9 +16,13 @@ Versionsschema ist `x.x.x.x` (siehe `release.sh`).
"geloescht" ansehen, ihr Mapping verwerfen und sie beim naechsten Lauf neu "geloescht" ansehen, ihr Mapping verwerfen und sie beim naechsten Lauf neu
anlegen. Der Kontakt-Abruf bricht jetzt mit Fehlermeldung ab (inkl. anlegen. Der Kontakt-Abruf bricht jetzt mit Fehlermeldung ab (inkl.
Wiederholversuch), statt still mit einer Teil-Liste weiterzuarbeiten. Wiederholversuch), statt still mit einer Teil-Liste weiterzuarbeiten.
- Ist ein Starface-Kontakt nicht in der geladenen Liste (z.B. anderes - Ist ein Starface-Kontakt nicht in der geladenen Liste, wird er jetzt per
Adressbuch), wird das Mapping jetzt **behalten** statt verworfen und neu ID direkt abgefragt: existiert er noch (liegt also in einem **anderen
angelegt. Adressbuch**), bleibt das Mapping erhalten und es wird nichts neu angelegt
(keine Dublette). Ist er **wirklich geloescht** (404), wird er je nach
Sync-Richtung in Starface neu angelegt bzw. die Loeschung nach Outlook
gespiegelt. (Vorher wurde das Mapping faelschlich behalten und der Kontakt
in Outlook->Starface gar nicht neu angelegt.)
- Das Wiederzuordnen bestehender Kontakte war zu streng: eine von Starface - Das Wiederzuordnen bestehender Kontakte war zu streng: eine von Starface
umformatierte Telefonnummer konnte einen eindeutigen E-Mail- oder umformatierte Telefonnummer konnte einen eindeutigen E-Mail- oder
Namens-Treffer ueberstimmen und so eine Neuanlage statt Verknuepfung Namens-Treffer ueberstimmen und so eine Neuanlage statt Verknuepfung
+1 -1
View File
@@ -2,7 +2,7 @@
; Erfordert Inno Setup 6.x (https://jrsoftware.org/isinfo.php) ; Erfordert Inno Setup 6.x (https://jrsoftware.org/isinfo.php)
#define MyAppName "Starface Outlook Sync" #define MyAppName "Starface Outlook Sync"
#define MyAppVersion "0.0.0.24" #define MyAppVersion "0.0.0.25"
#define MyAppPublisher "HackerSoft - Hacker-Net Telekommunikation" #define MyAppPublisher "HackerSoft - Hacker-Net Telekommunikation"
#define MyAppURL "https://www.hacker-net.de" #define MyAppURL "https://www.hacker-net.de"
#define MyAppExeName "StarfaceOutlookSync.exe" #define MyAppExeName "StarfaceOutlookSync.exe"
+38 -9
View File
@@ -181,15 +181,44 @@ namespace StarfaceOutlookSync.Services
if (oc != null && sc == null) if (oc != null && sc == null)
{ {
// Starface-Kontakt nicht in der geladenen Liste. // Starface-Kontakt nicht in der geladenen Liste. Zwei Faelle
// Da unvollstaendige Ladevorgaenge inzwischen abgebrochen // unterscheiden, indem wir ihn per ID direkt abfragen:
// werden (siehe StarfaceApiClient), liegt das hoechstens an // (a) per ID noch vorhanden -> liegt in einem ANDEREN
// einem anderen Adressbuch. NICHT loeschen und NICHT neu // Adressbuch -> Mapping behalten, NICHT neu anlegen
// anlegen - sonst entstehen Dubletten. Mapping behalten, // (sonst Dublette).
// beim naechsten Sync wird es erneut abgeglichen. // (b) per ID 404 -> in Starface WIRKLICH geloescht.
Log($" Starface-Kontakt nicht in Liste (anderes Adressbuch?), behalte Mapping: {oc.DisplayName}"); bool stillExists = !string.IsNullOrEmpty(mapping.StarfaceId)
newMappings.Add(mapping); && await starface.GetContactAsync(mapping.StarfaceId) != null;
continue;
if (stillExists)
{
Log($" Starface-Kontakt in anderem Adressbuch, behalte Mapping: {oc.DisplayName}");
newMappings.Add(mapping);
continue;
}
// Wirklich geloescht.
if (profile.SyncDirection == SyncDirection.Both
|| profile.SyncDirection == SyncDirection.OutlookToStarface)
{
// Outlook ist (mit-)fuehrend -> Kontakt in Starface neu
// anlegen. Mapping verwerfen und oc wieder freigeben,
// damit Phase 2 ihn anlegt (inkl. Duplikat-Pruefung).
Log($" Starface-Kontakt geloescht, wird neu angelegt: {oc.DisplayName}");
processedOutlookIds.Remove(oc.OutlookEntryId);
continue;
}
else
{
// StarfaceToOutlook: Starface ist fuehrend, Loeschung
// nach Outlook spiegeln.
if (_outlookService.DeleteContact(oc.OutlookEntryId))
{
result.Updated++;
Log($" Geloescht (SF->OL): {oc.DisplayName}");
}
continue;
}
} }
if (oc != null && sc != null) if (oc != null && sc != null)
@@ -7,9 +7,9 @@
<AssemblyTitle>Starface Outlook Sync</AssemblyTitle> <AssemblyTitle>Starface Outlook Sync</AssemblyTitle>
<Company>HackerSoft - Hacker-Net Telekommunikation</Company> <Company>HackerSoft - Hacker-Net Telekommunikation</Company>
<Product>Starface Outlook Sync</Product> <Product>Starface Outlook Sync</Product>
<Version>0.0.0.24</Version> <Version>0.0.0.25</Version>
<AssemblyVersion>0.0.0.24</AssemblyVersion> <AssemblyVersion>0.0.0.25</AssemblyVersion>
<FileVersion>0.0.0.24</FileVersion> <FileVersion>0.0.0.25</FileVersion>
<Description>Synchronisiert Outlook-Kontakte mit Starface Telefonanlage</Description> <Description>Synchronisiert Outlook-Kontakte mit Starface Telefonanlage</Description>
<Copyright>Stefan Hacker - HackerSoft</Copyright> <Copyright>Stefan Hacker - HackerSoft</Copyright>
<RuntimeIdentifier>win-x64</RuntimeIdentifier> <RuntimeIdentifier>win-x64</RuntimeIdentifier>
+1 -1
View File
@@ -27,7 +27,7 @@ namespace StarfaceOutlookSync.UI
var lblVersion = new Label var lblVersion = new Label
{ {
Text = "Version 0.0.0.24", Text = "Version 0.0.0.25",
Left = 0, Top = 56, Width = 340, Height = 20, Left = 0, Top = 56, Width = 340, Height = 20,
TextAlign = ContentAlignment.MiddleCenter, TextAlign = ContentAlignment.MiddleCenter,
ForeColor = Color.Gray ForeColor = Color.Gray