예제 #1
0
        protected virtual void UserConnected(IRequest contextRequest, string connectionId)
        {
            var user = Processor.Configuration.AuthenticateUser(contextRequest);

            if (user == null)
            {
                CallUnauthorize(connectionId, new UnauthorizedResponse()
                {
                    Error = "User not authorized"
                });
                return;
            }
            Connections[connectionId] = user;

            var lastDownloadString = contextRequest.QueryString[Constants.LastDownloadParameterName];
            Dictionary <string, DateTimeOffset> lastDownload;
            var userTags = Processor.GetTagsForUser(user);

            if (string.IsNullOrEmpty(lastDownloadString))
            {
                var lastDownloadOld = contextRequest.QueryString[Constants.LastDownloadParameterNameOld];
                if (string.IsNullOrEmpty(lastDownloadOld))
                {
                    lastDownload = new Dictionary <string, DateTimeOffset>();
                }
                else
                {
                    var date = DateTimeOffset.Parse(lastDownloadOld);
                    lastDownload = userTags.ToDictionary(x => x, x => date);
                }
            }
            else
            {
                lastDownload = JsonConvert.DeserializeObject <Dictionary <string, DateTimeOffset> >(lastDownloadString);
            }
            var types = contextRequest.QueryString[Constants.SyncTypesParameterName];
            var data  = Processor.Download(new DownloadDataRequest()
            {
                LastChangeTime = lastDownload,
                Types          = types.Split(','),
            }, user);

            data.LastChangeContainsNewTags = true;
            CallDataDownloaded(connectionId, data);

            foreach (var userTag in userTags)
            {
                Groups.Add(connectionId, userTag);
            }
        }
예제 #2
0
        public static void AddUserGroup(Func <TUser, bool> userPredicate, string group)
        {
            var connectionIds = Connections.Where(x => userPredicate(x.Value));
            var connection    = GlobalHost.ConnectionManager.GetConnectionContext <RealmiusPersistentConnection <TUser> >();

            foreach (KeyValuePair <string, TUser> connectionId in connectionIds)
            {
                connection.Groups.Add(connectionId.Key, group);

                var tags = ProcessorStatic.GetTagsForUser(connectionId.Value);
                if (tags.Contains(group))
                {
                    continue;
                }

                tags.Add(group);
                //include data for the tag
                var changes = ProcessorStatic.Download(new DownloadDataRequest()
                {
                    LastChangeTime = new Dictionary <string, DateTimeOffset>()
                    {
                        { group, DateTimeOffset.MinValue }
                    },
                    Types = ProcessorStatic.Configuration.TypesToSync.Select(x => x.Name),
                    OnlyDownloadSpecifiedTags = true,
                }, connectionId.Value);

                var downloadData = new DownloadDataResponse()
                {
                    ChangedObjects = changes.ChangedObjects,
                    LastChange     = new Dictionary <string, DateTimeOffset>()
                    {
                        { group, DateTimeOffset.UtcNow }
                    },
                    LastChangeContainsNewTags = true,
                };
                connection.Connection.Send(connectionId.Key, MethodConstants.ClientDataDownloaded + Serialize(downloadData));
            }
        }