public async Task Preprocess(IMigrationContext migrationContext, IBatchMigrationContext batchContext, IList <WorkItem> sourceWorkItems, IList <WorkItem> targetWorkItems) { var linkedWorkItemArtifactUrls = new HashSet <string>(); foreach (WorkItem sourceWorkItem in sourceWorkItems) { var relations = GetWorkItemLinkRelations(migrationContext, sourceWorkItem.Relations); var linkedIds = relations.Select(r => ClientHelpers.GetWorkItemIdFromApiEndpoint(r.Url)); var uris = linkedIds.Where(id => !migrationContext.SourceToTargetIds.ContainsKey(id)).Select(id => ClientHelpers.GetWorkItemApiEndpoint(migrationContext.Config.SourceConnection.Account, id)); linkedWorkItemArtifactUrls.AddRange(uris); } await linkedWorkItemArtifactUrls.Batch(Constants.BatchSize).ForEachAsync(migrationContext.Config.Parallelism, async(workItemArtifactUris, batchId) => { Logger.LogTrace(LogDestination.File, $"Finding linked work items on target for batch {batchId}"); var results = await ClientHelpers.QueryArtifactUriToGetIdsFromUris(migrationContext.TargetClient.WorkItemTrackingHttpClient, workItemArtifactUris); foreach (var result in results.ArtifactUrisQueryResult) { if (result.Value != null) { if (result.Value.Count() == 1) { var sourceId = ClientHelpers.GetWorkItemIdFromApiEndpoint(result.Key); var targetId = result.Value.First().Id; migrationContext.SourceToTargetIds[sourceId] = targetId; } } } Logger.LogTrace(LogDestination.File, $"Finished finding linked work items on target for batch {batchId}"); }); }
private async Task <IList <WorkItemMigrationState> > FilterWorkItemIds(IValidationContext context, WorkItemTrackingHttpClient client, IDictionary <int, string> workItems) { // call GetWorkItemIdsForArtifactUrisAsync for target client to get the mapping of artifacturis and ids // do a check to see if any of them have already been migrated var artifactUris = workItems.Select(a => a.Value).ToList(); var result = await ClientHelpers.QueryArtifactUriToGetIdsFromUris(client, artifactUris); IList <WorkItemMigrationState> workItemStateList = new List <WorkItemMigrationState>(); //check if any of the workitems have been migrated before foreach (var workItem in workItems) { try { if (ClientHelpers.GetMigratedWorkItemId(result, workItem, out int id)) { workItemStateList.Add(new WorkItemMigrationState { SourceId = workItem.Key, TargetId = id, MigrationState = WorkItemMigrationState.State.Existing }); } else { workItemStateList.Add(new WorkItemMigrationState { SourceId = workItem.Key, MigrationState = WorkItemMigrationState.State.Create }); } } catch (Exception e) { //edge case where we find more than one workitems in the target for the workitem Logger.LogError(LogDestination.File, e, e.Message); //Add this workitem to notmigratedworkitem list workItemStateList.Add(new WorkItemMigrationState { SourceId = workItem.Key, MigrationState = WorkItemMigrationState.State.Error }); } } return(workItemStateList); }