private void UpdateContact(IAccountContactSummary updatedContact) { _logger.Trace("Updating contact - '{0}'", updatedContact.ProviderId); IAccountContactSummary existingContact; if (_contactSummaries.TryGetValue(updatedContact.ProviderId, out existingContact)) { if (AccountContactSummaryComparer.Instance.Equals(existingContact, updatedContact)) return; } // mark as modified _contactSummaries[updatedContact.ProviderId] = updatedContact; _changes.Add(updatedContact); }
public void Add(IAccountContactSummary contact) { if (!_isTrackingChanges) throw new InvalidOperationException("Add must be called while tracking changes"); //Look for matches var existing = _contacts.SingleOrDefault(c => c.OwnsContact(contact)); if (existing != null) { if (contact.IsDeleted) { existing.Remove(contact); } else { existing.Update(contact); } return; } //The provider could send us a Delete for a contact we don't know about. if(contact.IsDeleted) return; //This pattern produces different results with different order of input. If A & B can be linked on email, and B & C can be linked on phone, then Adding A, then B, thne C will result in one Aggregate contact (ABC). However adding A then C then B will result in two aggregates (AB & C) //var match = _contacts.Select(c => c.Match(contact)) // .OrderBy(match => match.Weight) // .FirstOrDefault(); //TODO: Update to allow for the A,C,B scenario above. var match = _contacts.FirstOrDefault(c => c.IsMatch(contact)); if (match != null) { match.Add(contact); return; } var newContact = new ContactAggregate(contact); _contacts.Add(newContact); }
private static AccountContactRecord ToAccountContactRecord(IAccountContactSummary contact) { var result = new AccountContactRecord { AccountId = contact.AccountId, Provider = contact.Provider, ProviderId = contact.ProviderId, }; if (contact.IsDeleted) { result.IsDeleted = true; } else { result.Title = contact.Title; result.AvatarUris = contact.AvatarUris.ToArray(); result.Tags = contact.Tags.ToArray(); result.Handles = contact.Handles.Select(h=>new ContactHandleRecord(h)).ToArray(); result.Organizations = contact.Organizations.Select(o => new ContactAssociationRecord { Association = o.Association, Name = o.Name }).ToArray(); result.Relationships = contact.Relationships.Select(r => new ContactAssociationRecord { Association = r.Association, Name = r.Name }).ToArray(); } return result; }
private static void IsSummaryEqualToUpdate(IAccountContactSummary summary, ContactAggregateUpdate update) { CollectionAssert.AreEqual(summary.AvatarUris, update.AddedAvatars); Assert.AreEqual(summary.Provider, update.AddedProviders.Single().ProviderName); Assert.AreEqual(summary.AccountId, update.AddedProviders.Single().AccountId); Assert.AreEqual(summary.ProviderId, update.AddedProviders.Single().ContactId); CollectionAssert.AreEqual(summary.Tags, update.AddedTags); Assert.AreEqual(summary.Title, update.NewTitle); }
public void When_a_ContactSummary_is_removed(IAccountContactSummary contactSummary) { if (!contactSummary.IsDeleted) throw new ArgumentException("contactSummary must be flagged as deleted", "contactSummary"); _userContacts.TrackChanges(); _userContacts.Add(contactSummary); }
public void When_a_ContactSummary_is_added(IAccountContactSummary contactSummary) { _userContacts.Add(contactSummary); }