async Task AddTaskTreeRecursive(IDictionary <string, Core.API.Task> tasks, string parentPath, IList <string> pathTokens) { if (pathTokens.Count == 0) { return; } var name = pathTokens.First(); var currentPath = parentPath != null ? parentPath + "|" + name : name; if (!tasks.ContainsKey(currentPath)) { var task = new Core.API.Task { name = name, externalId = currentPath, parentExternalId = parentPath, bookable = false, }; await TaskService.AddTask(task); tasks.Add(currentPath, task); } await AddTaskTreeRecursive(tasks, currentPath, pathTokens.Skip(1).ToList()); }
public override async Task Execute() { var tasks = await TaskService.GetTaskHierarchy(); var taskDictionary = await TaskService.CreateExternalIdDictionary(tasks); Logger.LogInformation($"Found {tasks.Count} existing timr root tasks."); var csvEntries = ParseFile(); Logger.LogInformation($"CSV contains {csvEntries.Count} entries."); var csvTasks = csvEntries.Select(entry => { var asyncTask = Task.Run(async() => { var taskTokens = entry.Task.Split("|"); var parentTaskTokens = taskTokens.SkipLast(1).ToList(); await AddTaskTreeRecursive(taskDictionary, null, parentTaskTokens); Core.API.Task task; if (taskDictionary.TryGetValue(entry.Task, out var existingTask)) { task = existingTask.Clone(); } else { task = new Core.API.Task { externalId = entry.Task, billable = true, bookable = true }; } task.name = taskTokens.Last(); task.parentExternalId = String.Join("|", parentTaskTokens); task.bookable = entry.Bookable; task.billable = entry.Billable; task.description = entry.Description; task.start = entry.Start; task.startSpecified = entry.Start.HasValue; task.end = entry.End; task.endSpecified = entry.End.HasValue; task.customField1 = entry.CustomField1; task.customField2 = entry.CustomField2; task.customField3 = entry.CustomField3; return(task); }); asyncTask.Wait(); return(asyncTask.Result); }).ToList(); await TaskService.SynchronizeTasksByExternalId(taskDictionary, csvTasks, updateTasks : updateTasks); }