示例#1
0
 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);
 }
示例#2
0
        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);
        }
示例#3
0
 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);
 }