Пример #1
0
        public static WorkspaceData Import(this WorkspaceJson json, IDataStoreContext ctx,
                                           Guid?localIdHint = null, WorkspaceData mergeBase = null)
        {
            var converter = ServiceContainer.Resolve <WorkspaceJsonConverter> ();

            return(converter.Import(ctx, json, localIdHint, mergeBase));
        }
Пример #2
0
        public void ImportUpdated()
        {
            RunAsync(async delegate {
                var workspaceData = await DataStore.PutAsync(new WorkspaceData()
                {
                    RemoteId   = 1,
                    Name       = "",
                    ModifiedAt = new DateTime(2014, 1, 2, 10, 0, 0, DateTimeKind.Utc),
                });
                var workspaceJson = new WorkspaceJson()
                {
                    Id         = 1,
                    Name       = "Test",
                    ModifiedAt = new DateTime(2014, 1, 2, 10, 1, 0, DateTimeKind.Utc).ToLocalTime(),   // JSON deserialized to local
                };

                workspaceData = await DataStore.ExecuteInTransactionAsync(ctx => converter.Import(ctx, workspaceJson));
                Assert.AreNotEqual(Guid.Empty, workspaceData.Id);
                Assert.AreEqual(1, workspaceData.RemoteId);
                Assert.AreEqual("Test", workspaceData.Name);
                Assert.AreEqual(new DateTime(2014, 1, 2, 10, 1, 0, DateTimeKind.Utc), workspaceData.ModifiedAt);
                Assert.IsFalse(workspaceData.IsDirty);
                Assert.IsFalse(workspaceData.RemoteRejected);
                Assert.IsNull(workspaceData.DeletedAt);
            });

            // Warn the user that the test result might be invalid
            if (TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).TotalMinutes >= 0)
            {
                Assert.Inconclusive("The test machine timezone should be set to GTM-1 or less to test datetime comparison.");
            }
        }
Пример #3
0
        public async Task <AuthResult> NoUserSetupAsync()
        {
            IsAuthenticating = true;

            //Create dummy user and workspace.
            var userJson = new UserJson()
            {
                Id                 = 100,
                Name               = OfflineUserName,
                StartOfWeek        = DayOfWeek.Monday,
                Locale             = "",
                Email              = OfflineUserEmail,
                Password           = "******",
                Timezone           = Time.TimeZoneId,
                DefaultWorkspaceId = 1000
            };

            var workspaceJson = new WorkspaceJson()
            {
                Id        = 1000,
                Name      = OfflineWorkspaceName,
                IsPremium = false,
                IsAdmin   = false
            };

            try {
                // Import the user into our database:
                UserData userData;
                try {
                    var dataStore = ServiceContainer.Resolve <IDataStore> ();
                    userData = await dataStore.ExecuteInTransactionAsync(ctx => userJson.Import(ctx));

                    await dataStore.ExecuteInTransactionAsync(ctx => workspaceJson.Import(ctx));
                } catch (Exception ex) {
                    var log = ServiceContainer.Resolve <ILogger> ();
                    log.Error(Tag, ex, "Failed to import authenticated user.");

                    ServiceContainer.Resolve <MessageBus> ().Send(
                        new AuthFailedMessage(this, AuthResult.SystemError, ex));
                    return(AuthResult.SystemError);
                }

                var credStore = ServiceContainer.Resolve <ISettingsStore> ();
                credStore.UserId      = userData.Id;
                credStore.ApiToken    = userJson.ApiToken;
                credStore.OfflineMode = userData.Name == OfflineUserName;
                credStore.HasEntries  = false;

                User            = userData;
                Token           = userJson.ApiToken;
                OfflineMode     = userData.Name == OfflineUserName;
                IsAuthenticated = true;

                ServiceContainer.Resolve <MessageBus> ().Send(
                    new AuthChangedMessage(this, AuthChangeReason.NoUser));
            } finally {
                IsAuthenticating = false;
            }
            return(AuthResult.Success);
        }
Пример #4
0
        public WorkspaceData Import (IDataStoreContext ctx, WorkspaceJson json, Guid? localIdHint = null, WorkspaceData mergeBase = null)
        {
            var data = GetByRemoteId<WorkspaceData> (ctx, json.Id.Value, localIdHint);

            var merger = mergeBase != null ? new WorkspaceMerger (mergeBase) : null;
            if (merger != null && data != null)
                merger.Add (new WorkspaceData (data));

            if (json.DeletedAt.HasValue) {
                if (data != null) {
                    ctx.Delete (data);
                    data = null;
                }
            } else if (merger != null || ShouldOverwrite (data, json)) {
                data = data ?? new WorkspaceData ();
                ImportJson (data, json);

                if (merger != null) {
                    merger.Add (data);
                    data = merger.Result;
                }

                data = ctx.Put (data);
            }

            return data;
        }
Пример #5
0
        public WorkspaceData Import(IDataStoreContext ctx, WorkspaceJson json, Guid?localIdHint = null, WorkspaceData mergeBase = null)
        {
            var log = ServiceContainer.Resolve <Logger> ();

            var data = GetByRemoteId <WorkspaceData> (ctx, json.Id.Value, localIdHint);

            var merger = mergeBase != null ? new WorkspaceMerger(mergeBase) : null;

            if (merger != null && data != null)
            {
                merger.Add(new WorkspaceData(data));
            }

            if (json.DeletedAt.HasValue)
            {
                if (data != null)
                {
                    log.Info(Tag, "Deleting local data for {0}.", data.ToIdString());
                    ctx.Delete(data);
                    data = null;
                }
            }
            else if (merger != null || ShouldOverwrite(data, json))
            {
                data = data ?? new WorkspaceData();
                ImportJson(data, json);

                if (merger != null)
                {
                    merger.Add(data);
                    data = merger.Result;
                }

                if (merger != null)
                {
                    log.Info(Tag, "Importing {0}, merging with local data.", data.ToIdString());
                }
                else
                {
                    log.Info(Tag, "Importing {0}, replacing local data.", data.ToIdString());
                }

                data = ctx.Put(data);
            }
            else
            {
                log.Info(Tag, "Skipping import of {0}.", json.ToIdString());
            }

            return(data);
        }
        private static void ImportJson (WorkspaceData data, WorkspaceJson json)
        {
            data.Name = json.Name;
            data.IsPremium = json.IsPremium;
            data.DefaultRate = json.DefaultRate;
            data.DefaultCurrency = json.DefaultCurrency;
            data.ProjectCreationPrivileges = json.OnlyAdminsMayCreateProjects ? AccessLevel.Admin : AccessLevel.Regular;
            data.BillableRatesVisibility = json.OnlyAdminsSeeBillableRates ? AccessLevel.Admin : AccessLevel.Regular;
            data.RoundingMode = json.RoundingMode;
            data.RoundingPercision = json.RoundingPercision;
            data.LogoUrl = json.LogoUrl;

            ImportCommonJson (data, json);
        }
Пример #7
0
        private static void ImportJson(WorkspaceData data, WorkspaceJson json)
        {
            data.Name                      = json.Name;
            data.IsPremium                 = json.IsPremium;
            data.DefaultRate               = json.DefaultRate;
            data.DefaultCurrency           = json.DefaultCurrency;
            data.ProjectCreationPrivileges = json.OnlyAdminsMayCreateProjects ? AccessLevel.Admin : AccessLevel.Regular;
            data.BillableRatesVisibility   = json.OnlyAdminsSeeBillableRates ? AccessLevel.Admin : AccessLevel.Regular;
            data.RoundingMode              = json.RoundingMode;
            data.RoundingPercision         = json.RoundingPercision;
            data.LogoUrl                   = json.LogoUrl;

            ImportCommonJson(data, json);
        }
Пример #8
0
        public WorkspaceData Import (IDataStoreContext ctx, WorkspaceJson json, Guid? localIdHint = null, bool forceUpdate = false)
        {
            var data = GetByRemoteId<WorkspaceData> (ctx, json.Id.Value, localIdHint);

            if (json.DeletedAt.HasValue) {
                if (data != null) {
                    ctx.Delete (data);
                    data = null;
                }
            } else if (data == null || forceUpdate || data.ModifiedAt < json.ModifiedAt) {
                data = data ?? new WorkspaceData ();
                Merge (data, json);
                data = ctx.Put (data);
            }

            return data;
        }
Пример #9
0
        public void ImportNew()
        {
            RunAsync(async delegate {
                var workspaceJson = new WorkspaceJson()
                {
                    Id         = 1,
                    Name       = "Test",
                    ModifiedAt = new DateTime(2014, 1, 2),
                };

                var workspaceData = await DataStore.ExecuteInTransactionAsync(ctx => converter.Import(ctx, workspaceJson));
                Assert.AreNotEqual(Guid.Empty, workspaceData.Id);
                Assert.AreEqual(1, workspaceData.RemoteId);
                Assert.AreEqual("Test", workspaceData.Name);
                Assert.AreEqual(new DateTime(2014, 1, 2), workspaceData.ModifiedAt);
                Assert.IsFalse(workspaceData.IsDirty);
                Assert.IsFalse(workspaceData.RemoteRejected);
                Assert.IsNull(workspaceData.DeletedAt);
            });
        }
Пример #10
0
        public void ImportUpdatedOverwriteNonDirtyLocal()
        {
            RunAsync(async delegate {
                var workspaceData = await DataStore.PutAsync(new WorkspaceData()
                {
                    RemoteId   = 1,
                    Name       = "",
                    ModifiedAt = new DateTime(2014, 1, 2, 10, 0, 0, DateTimeKind.Utc),
                });
                var workspaceJson = new WorkspaceJson()
                {
                    Id         = 1,
                    Name       = "Test",
                    ModifiedAt = new DateTime(2014, 1, 2, 9, 59, 0, DateTimeKind.Utc).ToLocalTime(),   // Remote modified is less than local
                };

                workspaceData = await DataStore.ExecuteInTransactionAsync(ctx => converter.Import(ctx, workspaceJson));
                Assert.AreEqual("Test", workspaceData.Name);
                Assert.AreEqual(new DateTime(2014, 1, 2, 9, 59, 0, DateTimeKind.Utc), workspaceData.ModifiedAt);
            });
        }
        public WorkspaceData Import (IDataStoreContext ctx, WorkspaceJson json, Guid? localIdHint = null, WorkspaceData mergeBase = null)
        {
            var log = ServiceContainer.Resolve<ILogger> ();

            var data = GetByRemoteId<WorkspaceData> (ctx, json.Id.Value, localIdHint);

            var merger = mergeBase != null ? new WorkspaceMerger (mergeBase) : null;
            if (merger != null && data != null) {
                merger.Add (new WorkspaceData (data));
            }

            if (json.DeletedAt.HasValue) {
                if (data != null) {
                    log.Info (Tag, "Deleting local data for {0}.", data.ToIdString ());
                    ctx.Delete (data);
                    data = null;
                }
            } else if (merger != null || ShouldOverwrite (data, json)) {
                data = data ?? new WorkspaceData ();
                ImportJson (data, json);

                if (merger != null) {
                    merger.Add (data);
                    data = merger.Result;
                }

                if (merger != null) {
                    log.Info (Tag, "Importing {0}, merging with local data.", data.ToIdString ());
                } else {
                    log.Info (Tag, "Importing {0}, replacing local data.", data.ToIdString ());
                }

                data = ctx.Put (data);
            } else {
                log.Info (Tag, "Skipping import of {0}.", json.ToIdString ());
            }

            return data;
        }
Пример #12
0
        public void ImportPastDeleted()
        {
            RunAsync(async delegate {
                var workspaceData = await DataStore.PutAsync(new WorkspaceData()
                {
                    RemoteId   = 1,
                    Name       = "Test",
                    ModifiedAt = new DateTime(2014, 1, 2),
                });

                var workspaceJson = new WorkspaceJson()
                {
                    Id        = 1,
                    DeletedAt = new DateTime(2014, 1, 1),
                };

                var ret = await DataStore.ExecuteInTransactionAsync(ctx => converter.Import(ctx, workspaceJson));
                Assert.IsNull(ret);

                var rows = await DataStore.Table <WorkspaceData> ().QueryAsync(m => m.Id == workspaceData.Id);
                Assert.That(rows, Has.Exactly(0).Count);
            });
        }
Пример #13
0
        public Task <WorkspaceJson> UpdateWorkspace(WorkspaceJson jsonObject)
        {
            var url = new Uri(v8Url, String.Format("workspaces/{0}", jsonObject.Id.Value.ToString()));

            return(UpdateObject(url, jsonObject));
        }
Пример #14
0
        public Task <WorkspaceJson> CreateWorkspace(WorkspaceJson jsonObject)
        {
            var url = new Uri(v8Url, "workspaces");

            return(CreateObject(url, jsonObject));
        }