private IEnumerable <ForeignRelation> GetTimeEntryTagRelations(TimeEntryTagData data) { yield return(new ForeignRelation() { Name = "TimeEntryId", Type = typeof(TimeEntryData), Required = true, Id = data.TimeEntryId, }); yield return(new ForeignRelation() { Name = "TagId", Type = typeof(TagData), Required = true, Id = data.TagId, }); }
private async Task <List <TagData> > UpdateTagsWithWorkspace(Guid timeEntryId, Guid workspaceId, List <TagData> oldTagList) { var dataStore = ServiceContainer.Resolve <IDataStore> (); // Get new workspace tag list. var tagList = await dataStore.Table <TagData> () .Where(r => r.WorkspaceId == workspaceId && r.DeletedAt == null) .ToListAsync(); // Get new tags to create and existing tags from previous workspace. var tagsToCreate = new List <TagData> (oldTagList.Where(t => tagList.IndexOf(n => n.Name.Equals(t.Name)) == -1)); var commonTags = new List <TagData> (tagList.Where(t => oldTagList.IndexOf(n => n.Name.Equals(t.Name)) != -1)); // Create new tags. for (int i = 0; i < tagsToCreate.Count; i++) { var newTag = await TagModel.AddTag(workspaceId, tagsToCreate[i].Name); tagsToCreate[i] = newTag; } // Contact both lists. var newTagList = commonTags.Concat(tagsToCreate); // Delete existing tag relationships from relationship table. var oldRelationships = await dataStore.Table <TimeEntryTagData> () .Where(t => t.TimeEntryId == timeEntryId && t.DeletedAt == null) .ToListAsync(); oldRelationships.ForEach(async(r) => await dataStore.DeleteAsync(r)); // Create and save new relationships foreach (var item in newTagList) { var r = new TimeEntryTagData { TagId = item.Id, TimeEntryId = timeEntryId }; await dataStore.PutAsync(r); } return(newTagList.ToList()); }
private void OnDataChange(TimeEntryTagData data, DataAction action) { var shouldUpdate = false; var isExcluded = action == DataAction.Delete || data.DeletedAt != null || data.TimeEntryId != timeEntryId; if (isExcluded) { shouldUpdate = tagIds.Remove(data.TagId); } else { shouldUpdate = tagIds.Add(data.TagId); var shouldAdd = shouldUpdate && !tagsList.Any(i => i.Id == data.TagId); if (shouldAdd) { // Try to add TagData from cache, or load it var tag = TagCache.Get(data.TagId); if (tag != null) { tagsList.Add(tag); } else { shouldUpdate = false; LoadTagData(data.TagId); } } } if (shouldUpdate) { OnUpdated(); } }