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); } }
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)); } }