public IObservable<Event<ContactAggregateUpdate>> GetContactUpdates(User user, int versionId)
 {
     var streamName = ContactStreamNames.UserContacts(user.Id);
     return _eventStoreClient.GetEvents(streamName, versionId)
         .Where(resolvedEvent => resolvedEvent.OriginalEvent != null)
         .Select(resolvedEvent => new Event<ContactAggregateUpdate>(resolvedEvent.OriginalEventNumber, resolvedEvent.OriginalEvent.Deserialize<ContactAggregateUpdate>()));
 }
        public IObservable<int> ObserveContactUpdatesHeadVersion(User user)
        {
            var streamName = ContactStreamNames.UserContacts(user.Id);

            return Observable.Concat(
                _eventStoreClient.GetHeadVersion(streamName).ToObservable(),
                _eventStoreClient.GetNewEvents(streamName).Select(resolvedEvent => resolvedEvent.OriginalEventNumber));
        }
 public IObservable<IContactProfile> LookupContactByHandles(User user, ContactHandle[] contactHandles)
 {
     var keys = contactHandles.SelectMany(ch => ch.NormalizedHandle())
         .ToArray();
     var matchedContacts = _userContactMap[user.Id].GetByContactKeys(keys);
     //HACK: This should be able to return multiple values. -LC
     return matchedContacts.ToObservable();
 }
 public IObservable<IContactProfile> LookupContactByHandles(User user, ContactHandle[] contactHandles)
 {
     var keys = contactHandles.SelectMany(ch => ch.NormalizedHandle())
         .ToArray();
     return GetContactLookupFor(user)
         .Log(_logger, "GetContactDetails")
         .SelectMany(cl => cl.GetByContactKeys(keys));
 }
 private static IEnumerable<IAccount> GetAuthorizedGMailAccounts(User user)
 {
     //TODO: Enable the getting of a new token, and persisting it to the ES -LC
     return user.Accounts
         .Where(acc => !acc.CurrentSession.HasExpired())
         .Where(acc => acc.Provider == Constants.ProviderName)
         .Where(acc => acc.CurrentSession.AuthorizedResources.Contains(ResourceScope.Gmail.Resource));
 }
        public IObservable<IMessage> GetMessages(User user, string[] contactKeys)
        {
            if(user==null)throw new ArgumentNullException("user");
            if (contactKeys == null) throw new ArgumentNullException("contactKeys");
            if (contactKeys.Length == 0) 
                return Observable.Empty<IMessage>();

            return GetAuthorizedGMailAccounts(user)
                .Select(acc => SearchImap(contactKeys, acc))
                .Merge()
                .Log(_logger, "LoadMessages");
        }
 private IObservable<ContactLookup> GetContactLookupFor(User user)
 {
     var streamName = ContactStreamNames.UserContacts(user.Id);
     var query =
         from headVer in _eventStoreClient.GetHeadVersion(streamName).ToObservable()
                 .Log(_logger, "UserContact-Head")
         from contactUpdate in _eventStoreClient.GetEvents(streamName)
             .Where(resolvedEvent => resolvedEvent.OriginalEvent != null)
             .TakeUntil(re => re.OriginalEventNumber == headVer)
             .Select(resolvedEvent => resolvedEvent.OriginalEvent.Deserialize<ContactAggregateUpdate>())
             .Where(x => x != null)
             .Log(_logger, "UserContact-Profile")
         select contactUpdate;
     return query.Aggregate(new ContactLookup(), (acc, cur) => acc.Add(cur))
                 .Log(_logger, "UserContact-Aggregate");
 }
 private void SetPrincipal(User user, int version = 1)
 {
     var authTicket = new FormsAuthenticationTicket(version, user.DisplayName, 
         DateTime.UtcNow, DateTime.MaxValue, true, user.Id.ToString(), "CallWallAuth");
     
     var encTicket = FormsAuthentication.Encrypt(authTicket);
     var faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
     Response.Cookies.Add(faCookie);
 }
 public IObservable<IContactProfile> GetContactDetails(User user, string[] contactKeys)
 {
     //return Observable.Empty<IContactProfile>();
     return Observable.Interval(TimeSpan.FromSeconds(1))
                      .Zip(Profiles(), (_, msg) => msg);
 }
 public async Task When_user_adds_account()
 {
     _updatedUser = await UserRepository.RegisterAccount(_initialUser.Id, _newAccount);
 }
 public async Task Given_a_signed_in_user()
 {
     await UserRepository.Run();
     await UserRepository.Login(_initialAccount);
     _initialUser = await _userRepository.Login(_initialAccount);
 }
 public async Task When_a_user_registers_an_account()
 {
     _updatedUser = await _userRepository.RegisterAccount(_initialUser.Id, _newAccount);
     Trace.WriteLine("User registered additional account of " + _newAccount.AccountId);
 }
 public IObservable<IContactProfile> GetContactDetails(User user, string contactId)
 {
     return GetContactLookupFor(user).Select(cl => cl.GetById(int.Parse(contactId)));
 }
 public async Task When_a_user_registers_and_triggers_an_AccountRefresh()
 {
     User = await _userRepository.Login(_account);
 }
 private async Task RequestAccountRefresh(User user, ContactRefreshTriggers triggeredBy)
 {
     Logger.Trace("Requesting account refresh for userId {0}", user.Id);
     await Task.WhenAll(
         user.Accounts.Select(account =>
             _accountContactRefresher.RequestRefresh(user.Id, account, triggeredBy)
         ));
 }
 public async Task When_the_user_registers_with_an_unrecongised_account()
 {
     _user = await _userRepository.Login(_account);
 }
 private async Task RequestAccountRefreshForAllUserAccounts(User user, ContactRefreshTriggers triggeredBy)
 {
     Logger.Trace("Requesting account refresh for userId {0}", user.Id);
     await Task.Factory.StartNew(() =>
         {
             foreach (var acc in user.Accounts)
             {
                 RequestAccountRefresh(user.Id, triggeredBy, acc);
             }
         });
 }
 public void Given_an_anon_user()
 {
     _user = User.AnonUser;
 }
 public async Task When_user_logs_in_by_account()
 {
     _storedUser = await _userRepository.Login(_account);
 }
 public IObservable<IContactCollaboration> GetCollaborations(User user, string[] contactKeys)
 {
     return Observable.Interval(TimeSpan.FromSeconds(1))
         .Zip(GetContactCollaborations(), (_, msg) => msg);
 }
 public async Task Given_a_signed_in_user()
 {
     _initialUser = await _userRepository.Login(_initialAccount);
     Trace.WriteLine("User logged in with Account " + _initialAccount.AccountId);
 }
 public IObservable<ICalendarEntry> GetCalendarEntries(User user, string[] contactKeys)
 {
     return Observable.Interval(TimeSpan.FromSeconds(1))
         .Zip(GetCalendarEvents(), (_, msg) => msg);
 }
 public async Task When_a_user_registers_and_triggers_an_AccountRefresh()
 {
     _user = await _userRepository.Login(_account);
     Trace.WriteLine("Account logged in");
 }
 public IObservable<int> ObserveContactUpdatesHeadVersion(User user)
 {
     _logger.Trace("ObserveContactUpdatesHeadVersion({0})", user.Id);
     return _userContactsMap[user.Id].HeadEventId;
 }
 public IObservable<IContactProfile> GetContactDetails(User user, string[] contactKeys)
 {
     //TODO: Implement LinkedIn GetContactDetails
     return Observable.Empty<IContactProfile>();
 }
 public IObservable<Event<ContactAggregateUpdate>> GetContactUpdates(User user, int fromEventId)
 {
     _logger.Trace("GetContactUpdates({0}, {1})", user.Id, fromEventId);
     return _userContactsMap[user.Id].ContactUpdates.Where(evt => evt.EventId >= fromEventId);
 }
 public IObservable<IGalleryAlbum> GetGalleryAlbums(User user, string[] contactKeys)
 {
     return Observable.Interval(TimeSpan.FromSeconds(1))
         .Zip(GetAlbums(), (_, msg) => msg);
 }
 public IObservable<IContactProfile> GetContactDetails(User user, string contactId)
 {
     var contact = _userContactMap[user.Id].GetById(int.Parse(contactId));
     return Observable.Return(contact);
 }
        private void AddUserToCache(RecordedEvent recordedEvent)
        {
            var userCreatedEvent = recordedEvent.Deserialize<UserCreatedEvent>();
            var account = CreateAccount(userCreatedEvent.Account);
            var accounts = new[] { account };

            var user = new User(userCreatedEvent.Id, userCreatedEvent.DisplayName, accounts);
            _userCache.Add(user);
        }
 public IObservable<IMessage> GetMessages(User user, string[] contactKeys)
 {
     return Observable.Interval(TimeSpan.FromSeconds(1))
         .Zip(GetMessages(), (_, msg) => msg);
 }