예제 #1
0
        public void Authorized()
        {
            var result1 = _processor.Upload(new UploadDataRequest()
            {
                ChangeNotifications = new[]
                {
                    new UploadRequestItem()
                    {
                        PrimaryKey       = "123",
                        Type             = "DbSyncObject",
                        SerializedObject = JsonConvert.SerializeObject(new DbSyncObject()
                        {
                            Id = "123", Text = "zxc", Tags = "u1"
                        }),
                    }
                }
            }, new LimitedUser());


            var result = _processor.Download(new DownloadDataRequest()
            {
                LastChangeTime = new DateTimeOffset(DateTime.Now).AddHours(-1).ToDictionary(),
                Types          = new[] { nameof(DbSyncObject) },
            }, new LimitedUser(new[] { "u2" }));

            result.ChangedObjects.Should().BeEmpty();

            var result2 = _processor.Download(new DownloadDataRequest()
            {
                LastChangeTime = new DateTimeOffset(DateTime.Now).AddHours(-1).ToDictionary(),
                Types          = new[] { nameof(DbSyncObject) },
            }, new LimitedUser(new[] { "u1" }));

            result2.ChangedObjects.Count.Should().Be(1);
        }
예제 #2
0
        public void IdAutoIncrementInteger()
        {
            var db = _contextFunc();

            db.IdIntObjects.Count().Should().Be(0);

            var controller   = new RealmiusServerProcessor(new SyncConfigForCustomId(_contextFunc, typeof(IdIntAutogeneratedObject)));
            var objectToSave = new IdIntAutogeneratedObject()
            {
                Text = "123123123",
            };

            db.IdIntAutogeneratedObjects.Add(objectToSave);
            db.SaveChanges();

            var download = controller.Download(
                new DownloadDataRequest()
            {
                Types = new List <string>()
                {
                    nameof(IdIntAutogeneratedObject)
                },
                LastChangeTime = DateTimeOffset.Now.Subtract(TimeSpan.FromMinutes(1)).ToDictionary(),
            }, new { });

            download.ChangedObjects.Count.Should().Be(1);
            var changedObject = download.ChangedObjects.First();

            changedObject.MobilePrimaryKey.Should().BeEquivalentTo(objectToSave.Id.ToString());
            changedObject.MobilePrimaryKey.Should().NotBeEmpty();
        }
예제 #3
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);
            }
        }
예제 #4
0
        public void Deleted()
        {
            _contextFunc().DbSyncObjects.Count().Should().Be(0);

            var controller   = new RealmiusServerProcessor(new ShareEverythingConfiguration(_contextFunc, typeof(DbSyncObject)));
            var objectToSave = new DbSyncObject()
            {
                Text = "123123123",
                Id   = Guid.NewGuid().ToString()
            };
            var db = _contextFunc();

            db.DbSyncObjects.Add(objectToSave);
            db.SaveChanges();

            Func <DownloadDataResponse> getDownloaded = () => controller.Download(new DownloadDataRequest()
            {
                Types = new[] { nameof(DbSyncObject) },
            }, new { });
            var downloaded1 = getDownloaded();

            downloaded1.ChangedObjects.Count.Should().Be(1);

            var result = controller.Upload(new UploadDataRequest()
            {
                ChangeNotifications =
                {
                    new UploadRequestItem()
                    {
                        Type             = nameof(DbSyncObject),
                        PrimaryKey       = objectToSave.MobilePrimaryKey,
                        SerializedObject = "",
                        IsDeleted        = true,
                    }
                }
            }, null);

            CheckNoError(result);
            _contextFunc().DbSyncObjects.Find(objectToSave.Id).Should().BeNull();

            var downloaded2 = getDownloaded();

            downloaded2.ChangedObjects.Count.Should().Be(0); //deleted items should not be downloaded during initial DB download
        }
예제 #5
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));
            }
        }
        public void Attach_NewObject()
        {
            var db = _contextFunc();

            db.EnableSyncTracking = false;
            db.DbSyncObjects.Add(new DbSyncObject
            {
                Id   = "2",
                Text = "x",
            });
            db.SaveChanges();

            db.CreateSyncStatusContext().SyncStatusServerObjects.Count().Should().Be(0);

            var res = _processor.Download(
                new DownloadDataRequest
            {
                Types = new[]
                {
                    nameof(DbSyncObject)
                },
                LastChangeTime = new Dictionary <string, DateTimeOffset> {
                    { "all", DateTimeOffset.MinValue }
                },
            }, _user);

            res.ChangedObjects.Count.Should().Be(0);

            db.EnableSyncTracking = true;
            db.AttachObject(nameof(DbSyncObject), "2");
            db.CreateSyncStatusContext().SyncStatusServerObjects.Count().Should().Be(1);

            var res2 = _processor.Download(
                new DownloadDataRequest
            {
                Types = new[]
                {
                    nameof(DbSyncObject)
                }
            }, _user);

            string.Join(", ", res2.ChangedObjects)
            .Should().BeEquivalentTo("Type: DbSyncObject, Key: 2, SerializedObject: { \"Text\": \"x\", \"Tags\": null, \"Id\": \"2\"}");
        }
예제 #7
0
        public void NoData()
        {
            var result = _controller.Download(new DownloadDataRequest
            {
                LastChangeTime = new Dictionary <string, DateTimeOffset> {
                    { "all", DateTimeOffset.Now }
                },
                Types = new[] { nameof(DbSyncObject) },
            }, _user);

            result.ChangedObjects.Should().BeEmpty();
        }
예제 #8
0
        public void Upload_Delete_UploadAgain()
        {
            var controller = new RealmiusServerProcessor(new ShareEverythingConfiguration(_contextFunc, typeof(DbSyncObject)));
            Func <DownloadDataResponse> getDownloaded = () => controller.Download(new DownloadDataRequest()
            {
                Types = new[] { nameof(DbSyncObject) },
            }, new { });
            Func <string> dataToCompare = () =>
            {
                var data = getDownloaded();
                return(string.Join(", ", data.ChangedObjects.Select(x => $"{x.IsDeleted}")));
            };


            var objectToSave = new DbSyncObject()
            {
                Text = "123123123",
                Id   = Guid.NewGuid().ToString()
            };
            var result1 = controller.Upload(new UploadDataRequest()
            {
                ChangeNotifications =
                {
                    new UploadRequestItem()
                    {
                        Type             = nameof(DbSyncObject),
                        PrimaryKey       = objectToSave.MobilePrimaryKey,
                        SerializedObject = JsonConvert.SerializeObject(objectToSave),
                        //IsDeleted = true,
                    }
                }
            }, null);

            dataToCompare().Should().BeEquivalentTo("False");

            var result2 = controller.Upload(new UploadDataRequest()
            {
                ChangeNotifications =
                {
                    new UploadRequestItem()
                    {
                        Type             = nameof(DbSyncObject),
                        PrimaryKey       = objectToSave.MobilePrimaryKey,
                        SerializedObject = "",
                        IsDeleted        = true,
                    }
                }
            }, null);

            //dataToCompare().Should().BeEquivalentTo("True");

            objectToSave.Text = "zxc";
            var result3 = controller.Upload(new UploadDataRequest()
            {
                ChangeNotifications =
                {
                    new UploadRequestItem()
                    {
                        Type             = nameof(DbSyncObject),
                        PrimaryKey       = objectToSave.MobilePrimaryKey,
                        SerializedObject = JsonConvert.SerializeObject(objectToSave),
                        IsDeleted        = false,
                    }
                }
            }, null);

            dataToCompare().Should().BeEquivalentTo("False");
        }