private static void AddDefaultTags(IDataStoreContext ctx, Guid workspaceId, Guid timeEntryId) { // Check that there aren't any tags set yet: var tagCount = ctx.Connection.Table <TimeEntryTagData> () .Count(r => r.TimeEntryId == timeEntryId && r.DeletedAt == null); if (tagCount > 0) { return; } var defaultTag = ctx.Connection.Table <TagData> () .Where(r => r.Name == DefaultTag && r.WorkspaceId == workspaceId && r.DeletedAt == null) .FirstOrDefault(); if (defaultTag == null) { var newDefaultTag = new TagData { Name = DefaultTag, WorkspaceId = workspaceId, }; Model <TagData> .MarkDirty(newDefaultTag); defaultTag = ctx.Put(newDefaultTag); } ctx.Put(new TimeEntryTagData() { TimeEntryId = timeEntryId, TagId = defaultTag.Id, }); }
public ClientData Import (IDataStoreContext ctx, ClientJson json, Guid? localIdHint = null, ClientData mergeBase = null) { var data = GetByRemoteId<ClientData> (ctx, json.Id.Value, localIdHint); var merger = mergeBase != null ? new ClientMerger (mergeBase) : null; if (merger != null && data != null) merger.Add (new ClientData (data)); if (json.DeletedAt.HasValue) { if (data != null) { ctx.Delete (data); data = null; } } else if (merger != null || ShouldOverwrite (data, json)) { data = data ?? new ClientData (); ImportJson (ctx, data, json); if (merger != null) { merger.Add (data); data = merger.Result; } data = ctx.Put (data); } return data; }
private static void ImportJson (IDataStoreContext ctx, WorkspaceUserData data, WorkspaceUserJson json) { var workspaceId = GetLocalId<WorkspaceData> (ctx, json.WorkspaceId); var user = GetByRemoteId<UserData> (ctx, json.UserId, null); // Update linked user data: if (user == null) { user = new UserData () { RemoteId = json.UserId, Name = json.Name, Email = json.Email, DefaultWorkspaceId = workspaceId, ModifiedAt = DateTime.MinValue, }; } else { user.Name = json.Name; user.Email = json.Email; } user = ctx.Put (user); data.IsAdmin = json.IsAdmin; data.IsActive = json.IsActive; data.WorkspaceId = workspaceId; data.UserId = user.Id; ImportCommonJson (data, json); }
private static void ImportJson(IDataStoreContext ctx, WorkspaceUserData data, WorkspaceUserJson json) { var workspaceId = GetLocalId <WorkspaceData> (ctx, json.WorkspaceId); var user = GetByRemoteId <UserData> (ctx, json.UserId, null); // Update linked user data: if (user == null) { user = new UserData() { RemoteId = json.UserId, Name = json.Name, Email = json.Email, DefaultWorkspaceId = workspaceId, ModifiedAt = DateTime.MinValue, }; } else { user.Name = json.Name; user.Email = json.Email; } user = ctx.Put(user); data.IsAdmin = json.IsAdmin; data.IsActive = json.IsActive; data.WorkspaceId = workspaceId; data.UserId = user.Id; ImportCommonJson(data, json); }
public TimeEntryData Import(IDataStoreContext ctx, TimeEntryJson json, Guid?localIdHint = null, TimeEntryData mergeBase = null) { var log = ServiceContainer.Resolve <ILogger> (); var data = GetByRemoteId <TimeEntryData> (ctx, json.Id.Value, localIdHint); var merger = mergeBase != null ? new TimeEntryMerger(mergeBase) : null; if (merger != null && data != null) { merger.Add(new TimeEntryData(data)); } if (json.DeletedAt.HasValue) { if (data != null) { // TODO: Delete TimeEntryTag intermediate data 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 TimeEntryData(); ImportJson(ctx, 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); // Also update tags from the JSON we are merging: if (mergeBase == null || (mergeBase != null && mergeBase.ModifiedAt != data.ModifiedAt)) { log.Info(Tag, "Resetting tags for {0}.", data.ToIdString()); ResetTags(ctx, data, json); } } else { log.Info(Tag, "Skipping import of {0}.", json.ToIdString()); } return(data); }
private static Guid CreatePlaceholder <T> (IDataStoreContext ctx, long remoteId) where T : CommonData, new() { var data = ctx.Put(new T() { RemoteId = remoteId, ModifiedAt = DateTime.MinValue, }); return(data.Id); }
public TaskData Import(IDataStoreContext ctx, TaskJson json, Guid?localIdHint = null, TaskData mergeBase = null) { var log = ServiceContainer.Resolve <Logger> (); var data = GetByRemoteId <TaskData> (ctx, json.Id.Value, localIdHint); var merger = mergeBase != null ? new TaskMerger(mergeBase) : null; if (merger != null && data != null) { merger.Add(new TaskData(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 TaskData(); ImportJson(ctx, 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); }
public TagData Import (IDataStoreContext ctx, TagJson json, Guid? localIdHint = null, bool forceUpdate = false) { var data = GetByRemoteId<TagData> (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 = Merge (ctx, data, json); data = ctx.Put (data); } return data; }
public ClientData Import (IDataStoreContext ctx, ClientJson json, Guid? localIdHint = null, ClientData mergeBase = null) { var log = ServiceContainer.Resolve<ILogger> (); var data = GetByRemoteId<ClientData> (ctx, json.Id.Value, localIdHint); var merger = mergeBase != null ? new ClientMerger (mergeBase) : null; if (merger != null && data != null) { merger.Add (new ClientData (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 ClientData (); ImportJson (ctx, 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 ResetTags(IDataStoreContext ctx, TimeEntryData timeEntryData, TimeEntryJson json) { // Don't touch the tags when the field is null if (json.Tags == null) { return; } var con = ctx.Connection; // Resolve tags to IDs: var tagIds = new List <Guid> (); foreach (var tagName in json.Tags) { // Prevent importing empty (invalid) tags: if (String.IsNullOrWhiteSpace(tagName)) { continue; } var id = ctx.GetTagIdFromName(timeEntryData.WorkspaceId, tagName); if (id == Guid.Empty) { // Need to create a new tag: var tagData = new TagData() { Name = tagName, WorkspaceId = timeEntryData.WorkspaceId, }; con.Insert(tagData); id = timeEntryData.Id; } tagIds.Add(id); } // Iterate over TimeEntryTags and determine which to keep and which to discard: var inters = con.Table <TimeEntryTagData> ().Where(m => m.TimeEntryId == timeEntryData.Id); var toDelete = new List <TimeEntryTagData> (); foreach (var inter in inters) { if (tagIds.Contains(inter.TagId)) { tagIds.Remove(inter.TagId); } else { toDelete.Add(inter); } } // Delete unused tags intermediate rows: foreach (var inter in toDelete) { ctx.Delete(inter); } // Create new intermediate rows: foreach (var tagId in tagIds) { ctx.Put(new TimeEntryTagData() { TagId = tagId, TimeEntryId = timeEntryData.Id, }); } }
public TimeEntryData Import (IDataStoreContext ctx, TimeEntryJson json, Guid? localIdHint = null, TimeEntryData mergeBase = null) { var log = ServiceContainer.Resolve<ILogger> (); var data = GetByRemoteId<TimeEntryData> (ctx, json.Id.Value, localIdHint); var merger = mergeBase != null ? new TimeEntryMerger (mergeBase) : null; if (merger != null && data != null) { merger.Add (new TimeEntryData (data)); } if (json.DeletedAt.HasValue) { if (data != null) { // TODO: Delete TimeEntryTag intermediate data 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 TimeEntryData (); ImportJson (ctx, 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); // Also update tags from the JSON we are merging: if (mergeBase == null || (mergeBase != null && mergeBase.ModifiedAt != data.ModifiedAt)) { log.Info (Tag, "Resetting tags for {0}.", data.ToIdString ()); ResetTags (ctx, data, json); } } else { log.Info (Tag, "Skipping import of {0}.", json.ToIdString ()); } return data; }
private static void ResetTags (IDataStoreContext ctx, TimeEntryData timeEntryData, TimeEntryJson json) { // Don't touch the tags when the field is null if (json.Tags == null) { return; } var con = ctx.Connection; // Resolve tags to IDs: var tagIds = new List<Guid> (); foreach (var tagName in json.Tags) { // Prevent importing empty (invalid) tags: if (String.IsNullOrWhiteSpace (tagName)) { continue; } var id = ctx.GetTagIdFromName (timeEntryData.WorkspaceId, tagName); if (id == Guid.Empty) { // Need to create a new tag: var tagData = new TagData () { Name = tagName, WorkspaceId = timeEntryData.WorkspaceId, }; con.Insert (tagData); id = timeEntryData.Id; } tagIds.Add (id); } // Iterate over TimeEntryTags and determine which to keep and which to discard: var inters = con.Table<TimeEntryTagData> ().Where (m => m.TimeEntryId == timeEntryData.Id); var toDelete = new List<TimeEntryTagData> (); foreach (var inter in inters) { if (tagIds.Contains (inter.TagId)) { tagIds.Remove (inter.TagId); } else { toDelete.Add (inter); } } // Delete unused tags intermediate rows: foreach (var inter in toDelete) { ctx.Delete (inter); } // Create new intermediate rows: foreach (var tagId in tagIds) { ctx.Put (new TimeEntryTagData () { TagId = tagId, TimeEntryId = timeEntryData.Id, }); } }
public TimeEntryData Import (IDataStoreContext ctx, TimeEntryJson json, Guid? localIdHint = null, TimeEntryData mergeBase = null) { var data = GetByRemoteId<TimeEntryData> (ctx, json.Id.Value, localIdHint); var merger = mergeBase != null ? new TimeEntryMerger (mergeBase) : null; if (merger != null && data != null) merger.Add (new TimeEntryData (data)); if (json.DeletedAt.HasValue) { if (data != null) { // TODO: Delete TimeEntryTag intermediate data ctx.Delete (data); data = null; } } else if (merger != null || ShouldOverwrite (data, json)) { data = data ?? new TimeEntryData (); ImportJson (ctx, data, json); if (merger != null) { merger.Add (data); data = merger.Result; } data = ctx.Put (data); // Also update tags from the JSON we are merging: if (mergeBase == null || (mergeBase != null && mergeBase.ModifiedAt != data.ModifiedAt)) { ResetTags (ctx, data, json); } } return data; }