Only notify clients actually affected by a conflict
Bisher bekam jeder Arbeitsplatz, der den Konflikt-Kontakt im Adressbuch hat, den Hinweis - auch wenn er den Wert gar nicht selbst gepflegt hat. Jetzt zeigt ein Client eine fremde Konflikt-Notiz nur, wenn er den Kontakt hat UND sein eigener Feldwert vom uebernommenen (Gewinner-)Wert abweicht. Die Pruefung laeuft VOR dem Sync (gegen den eigenen Mapping-Snapshot), bevor der Sync den Stand auf den Gewinner-Wert angleicht. - FieldConflict/ConflictNotice: stabiler FieldKey zusaetzlich zum Anzeige-Label. - ContactMerger: GetValue/ValuesEqual per FieldKey (telefon-normalisiert). - ConflictNotifier.GetPending: Filter "eigener Wert != Gewinner-Wert", bekommt StarfaceId -> eigener Kontaktstand. - MainForm zeigt die Hinweise jetzt vor dem Sync und liefert den eigenen Stand aus den Mapping-Snapshots. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -57,6 +57,7 @@ namespace StarfaceOutlookSync.Services
|
||||
StarfaceId = c.StarfaceId,
|
||||
ContactName = c.ContactName,
|
||||
Field = c.Field,
|
||||
FieldKey = c.FieldKey,
|
||||
OutlookValue = c.OutlookValue,
|
||||
StarfaceValue = c.StarfaceValue,
|
||||
Winner = c.Winner
|
||||
@@ -74,10 +75,13 @@ namespace StarfaceOutlookSync.Services
|
||||
|
||||
/// <summary>
|
||||
/// Liefert ungesehene Konflikt-Notizen, die Kontakte dieses Clients
|
||||
/// betreffen (StarfaceId in myStarfaceIds) und nicht von ihm selbst
|
||||
/// stammen. Markiert sie als gesehen und raeumt veraltete Notizen auf.
|
||||
/// betreffen und nicht von ihm selbst stammen. Es werden nur die Notizen
|
||||
/// zurueckgegeben, bei denen der EIGENE aktuelle Feldwert vom uebernommenen
|
||||
/// (Gewinner-)Wert abweicht - wer den Wert ohnehin schon hat, wird nicht
|
||||
/// benachrichtigt. myContacts bildet StarfaceId -> eigener Kontaktstand ab.
|
||||
/// Markiert verarbeitete Notizen als gesehen und raeumt veraltete auf.
|
||||
/// </summary>
|
||||
public List<ConflictNotice> GetPending(string sharedDir, ICollection<string> myStarfaceIds)
|
||||
public List<ConflictNotice> GetPending(string sharedDir, IDictionary<string, UnifiedContact> myContacts)
|
||||
{
|
||||
var result = new List<ConflictNotice>();
|
||||
if (string.IsNullOrWhiteSpace(sharedDir)) return result;
|
||||
@@ -117,9 +121,29 @@ namespace StarfaceOutlookSync.Services
|
||||
seen.Add(n.Id); // selbst erzeugt -> nicht erneut anzeigen
|
||||
continue;
|
||||
}
|
||||
if (myStarfaceIds != null && !string.IsNullOrEmpty(n.StarfaceId)
|
||||
&& !myStarfaceIds.Contains(n.StarfaceId))
|
||||
continue; // betrifft mich nicht
|
||||
|
||||
// Habe ich diesen Kontakt ueberhaupt?
|
||||
UnifiedContact mine = null;
|
||||
bool haveContact = !string.IsNullOrEmpty(n.StarfaceId)
|
||||
&& myContacts != null
|
||||
&& myContacts.TryGetValue(n.StarfaceId, out mine);
|
||||
if (!haveContact)
|
||||
continue; // betrifft mich nicht (kein seen -> evtl. spaeter relevant)
|
||||
|
||||
// Bin ich wirklich betroffen? Nur wenn mein aktueller Feldwert vom
|
||||
// uebernommenen Wert abweicht. Wer den Gewinner-Wert schon hat, wird
|
||||
// nicht benachrichtigt.
|
||||
if (mine != null && !string.IsNullOrEmpty(n.FieldKey))
|
||||
{
|
||||
var winnerValue = string.Equals(n.Winner, "Outlook", StringComparison.OrdinalIgnoreCase)
|
||||
? n.OutlookValue : n.StarfaceValue;
|
||||
var myValue = ContactMerger.GetValue(mine, n.FieldKey);
|
||||
if (ContactMerger.ValuesEqual(n.FieldKey, myValue, winnerValue))
|
||||
{
|
||||
seen.Add(n.Id); // nicht betroffen -> als erledigt merken
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
result.Add(n);
|
||||
seen.Add(n.Id);
|
||||
|
||||
Reference in New Issue
Block a user