private void Execute(IDomainEvent domainEvent, Group group, User newMember, DateTime joined)
        {
            foreach (var session in newMember.Sessions)
            {
                _backChannelService.AddUserToGroupChannel(group.Id, session.ConnectionId);
            }

            var groupViewModel = _groupViewFactory.Make(group, newMember);

            _backChannelService.SendJoinedGroupToUserChannel(newMember.Id, groupViewModel);

            dynamic activity = MakeActivity(
                domainEvent,
                "userjoinedgroup",
                joined,
                string.Format("{0} joined {1}", newMember.Name, group.Name),
                new[] { group });

            activity.UserJoinedGroup = new
            {
                User  = _userViewFactory.Make(newMember, null),
                Group = groupViewModel
            };

            _documentSession.Store(activity);
            _documentSession.SaveChanges();
        }
Exemplo n.º 2
0
        public dynamic RegisterUserClient(string userId)
        {
            var user = _documentSession.Load <User>(userId);

            // Add user to their own group
            Groups.Add(Context.ConnectionId, "user-" + userId);

            // Get all user's memberships and add them to the corresponding group channel
            foreach (var membership in user.Memberships)
            {
                _backChannelService.AddUserToGroupChannel(membership.Group.Id, Context.ConnectionId);
            }

            _backChannelService.AddUserToOnlineUsersChannel(Context.ConnectionId);

            // ADD TO CACHE
            _onlineUserCache.AddUserSession(userId, Context.ConnectionId);

            return(BuildOnlineUserList());
        }
        public void Execute(IDomainEvent domainEvent, UserSession userSession, User user)
        {
            // Add user to the online users channel
            _backChannelService.AddUserToOnlineUsersChannel(userSession.ConnectionId);

            // If new user session, send all online users down the wire
            if (domainEvent is DomainModelCreatedEvent <UserSession> )
            {
                // Get all user's memberships and add them to the corresponding group channel
                //var memberships = _documentSession
                //    .Query<All_Users.Result, All_Users>()
                //    .AsProjection<All_Users.Result>()
                //    .Where(x => x.UserId == user.Id)
                //    .ToList()
                //    .SelectMany(x => x.User.Memberships);

                foreach (var membership in user.Memberships)
                {
                    _backChannelService.AddUserToGroupChannel(membership.Group.Id, userSession.ConnectionId);
                }

                // Return connected users (those users active less than 5 minutes ago)
                var onlineUsers = _userViewModelQuery.BuildOnlineUserList(user.Id);

                _backChannelService.SendOnlineUsersToUserChannel(user.Id, onlineUsers);
            }

            //var userStatus = new
            //    {
            //        User = _userViewFactory.Make(user)
            //    };

            // This is being removed to prevent asynchronous calling to clients to update user's statuses.
            // Rather than this approach, a call to update user status will respond with the current statuses
            // of all other online users.
            //_backChannelService.SendUserStatusUpdateToOnlineUsersChannel(userStatus);

            //var updateOnlineUsers = _userViewModelBuilder.BuildOnlineUserList();

            //_backChannelService.SendOnlineUsersUpdateToUserChannel(user.Id, updateOnlineUsers);
        }