public bool TryImport(IssueMigration migration) { if (migration.ImportComplete) { if (_force) { _migrationRepository.Reset(migration); } else { Logger.Debug("Skipping already imported issue {issue}", migration.IssueId); return(false); } } if (!_issueTypeCsvMapper.TryGetMappedValue(migration, out var workItemTypeKey)) { Logger.Debug("Skipping issue {issue} for unknown type {issueType}", migration.IssueId, migration.IssueType); return(false); } if (!TryGetWorkItemType(workItemTypeKey, out var workItemType)) { throw new Exception($"Unable to find work item type {workItemTypeKey} in {_adoApi.TfsProject.Name}"); } var existingWorkItem = _adoApi.GetWorkItem(migration); if (existingWorkItem != null) { if (_force) { Logger.Info("deleteing pre-existing workitem with originalId {originalId}", migration.IssueId); _adoApi.Delete(migration); } else { throw new Exception($"Issue {migration.IssueId} already imported for existing {migration.IssueType}. TODO: resume migration from last stopping point"); } } WorkItem workItem = workItemType.NewWorkItem(); migration.TempWorkItemId = workItem.TemporaryId; _migrationRepository.Save(migration); var wiLog = new { Type = workItem.Type.Name, migration.IssueId, TempId = migration.TempWorkItemId }; Logger.Debug("created Work Item for {wi}", wiLog); var issue = _jiraApi.GetIssue(migration.IssueId).Result.ToObject <Issue>(); MapWorkItem(migration, issue, workItem); Logger.Debug("mapped Work Item for {wi}", wiLog); workItem.Save(); migration.WorkItemId = workItem.Id; migration.IssueImported = true; _migrationRepository.Save(migration); Logger.Info("Imported issue {issue} as work item {workItem}", new { migration.IssueId, migration.IssueType, migration.Status }, new { workItem.Id, workItem.Type.Name, workItem.State, TempId = migration.TempWorkItemId }); return(true); }