/// <summary> /// Update the work items in Target with all required field values /// </summary> /// <param name="workItemType"></param> /// <param name="workImport"></param> /// <param name="projectName"></param> /// <returns></returns> public bool PrepareAndUpdateTarget(string workItemType, string workImport, string projectName, string selectedTemplate, string userAssignment) { try { workImport = workImport.Replace("$ProjectName$", projectName); ImportWorkItemModel.WorkItems fetchedWIs = JsonConvert.DeserializeObject <ImportWorkItemModel.WorkItems>(workImport); if (fetchedWIs.count > 0) { if (workItemType.ToLower() == "epic" || workItemType.ToLower() == "feature") { fetchedWIs.value = fetchedWIs.value.OrderBy(x => x.id).ToArray(); } foreach (ImportWorkItemModel.Value newWI in fetchedWIs.value) { newWI.fields.SystemCreatedDate = DateTime.Now.AddDays(-3); Dictionary <string, object> dicWIFields = new Dictionary <string, object>(); string assignToUser = string.Empty; if (listAssignToUsers.Count > 0) { assignToUser = listAssignToUsers[new Random().Next(0, listAssignToUsers.Count)] ?? string.Empty; } //Test cases have different fields compared to other items like bug, Epics, etc. if ((workItemType == "Test Case")) { //replacing null values with Empty strngs; creation fails if the fields are null if (newWI.fields.MicrosoftVSTSTCMParameters == null) { newWI.fields.MicrosoftVSTSTCMParameters = string.Empty; } if (newWI.fields.MicrosoftVSTSTCMSteps == null) { newWI.fields.MicrosoftVSTSTCMSteps = string.Empty; } if (newWI.fields.MicrosoftVSTSTCMLocalDataSource == null) { newWI.fields.MicrosoftVSTSTCMLocalDataSource = string.Empty; } dicWIFields.Add("/fields/System.Title", newWI.fields.SystemTitle); dicWIFields.Add("/fields/System.State", newWI.fields.SystemState); dicWIFields.Add("/fields/System.Reason", newWI.fields.SystemReason); dicWIFields.Add("/fields/Microsoft.VSTS.Common.Priority", newWI.fields.MicrosoftVSTSCommonPriority); dicWIFields.Add("/fields/Microsoft.VSTS.TCM.Steps", newWI.fields.MicrosoftVSTSTCMSteps); dicWIFields.Add("/fields/Microsoft.VSTS.TCM.Parameters", newWI.fields.MicrosoftVSTSTCMParameters); dicWIFields.Add("/fields/Microsoft.VSTS.TCM.LocalDataSource", newWI.fields.MicrosoftVSTSTCMLocalDataSource); dicWIFields.Add("/fields/Microsoft.VSTS.TCM.AutomationStatus", newWI.fields.MicrosoftVSTSTCMAutomationStatus); if (newWI.fields.MicrosoftVSTSCommonAcceptanceCriteria != null) { dicWIFields.Add("/fields/Microsoft.VSTS.Common.AcceptanceCriteria", newWI.fields.MicrosoftVSTSCommonAcceptanceCriteria); } if (newWI.fields.SystemTags != null) { dicWIFields.Add("/fields/System.Tags", newWI.fields.SystemTags); } dicWIFields.Add("/fields/Microsoft.VSTS.Scheduling.RemainingWork", newWI.fields.MicrosoftVSTSSchedulingRemainingWork); } else { string iterationPath = projectName; string boardRowField = string.Empty; if (newWI.fields.SystemIterationPath.Contains("\\")) { iterationPath = string.Format(@"{0}\{1}", projectName, newWI.fields.SystemIterationPath.Split('\\')[1]); } if (!string.IsNullOrWhiteSpace(boardRowFieldName)) { boardRowField = string.Format("/fields/{0}", boardRowFieldName); } if (newWI.fields.SystemDescription == null) { newWI.fields.SystemDescription = newWI.fields.SystemTitle; } if (string.IsNullOrEmpty(newWI.fields.SystemBoardLane)) { newWI.fields.SystemBoardLane = string.Empty; } dicWIFields.Add("/fields/System.Title", newWI.fields.SystemTitle); if (userAssignment.ToLower() != "any") { if (newWI.fields.SystemState == "Done") { dicWIFields.Add("/fields/System.AssignedTo", assignToUser); } } else { dicWIFields.Add("/fields/System.AssignedTo", assignToUser); } //string areaPath = newWI.fields.SystemAreaPath ?? projectName; //dicWIFields.Add("/fields/System.AreaPath", areaPath); dicWIFields.Add("/fields/System.Description", newWI.fields.SystemDescription); dicWIFields.Add("/fields/System.State", newWI.fields.SystemState); dicWIFields.Add("/fields/System.Reason", newWI.fields.SystemReason); dicWIFields.Add("/fields/Microsoft.VSTS.Common.Priority", newWI.fields.MicrosoftVSTSCommonPriority); dicWIFields.Add("/fields/System.IterationPath", iterationPath); dicWIFields.Add("/fields/Microsoft.VSTS.Scheduling.RemainingWork", newWI.fields.MicrosoftVSTSSchedulingRemainingWork); dicWIFields.Add("/fields/Microsoft.VSTS.Scheduling.Effort", newWI.fields.MicrosoftVSTSSchedulingEffort); if (newWI.fields.MicrosoftVSTSCommonAcceptanceCriteria != null) { dicWIFields.Add("/fields/Microsoft.VSTS.Common.AcceptanceCriteria", newWI.fields.MicrosoftVSTSCommonAcceptanceCriteria); } if (newWI.fields.SystemTags != null) { dicWIFields.Add("/fields/System.Tags", newWI.fields.SystemTags); } if (newWI.fields.MicrosoftVSTSTCMParameters != null) { dicWIFields.Add("/fields/Microsoft.VSTS.TCM.Parameters", newWI.fields.MicrosoftVSTSTCMParameters); } if (newWI.fields.MicrosoftVSTSTCMSteps != null) { dicWIFields.Add("/fields/Microsoft.VSTS.TCM.Steps", newWI.fields.MicrosoftVSTSTCMSteps); } if (!string.IsNullOrWhiteSpace(boardRowField)) { dicWIFields.Add(boardRowField, newWI.fields.SystemBoardLane); } } UpdateWorkIteminTarget(workItemType, newWI.id.ToString(), projectName, dicWIFields); } return(true); } } catch (Exception ex) { logger.Debug(DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss") + "\t" + ex.Message + "\t" + "\n" + ex.StackTrace + "\n"); } return(false); }
/// <summary> /// Update work items links - parent child- Hyperlinks-artifact links-attachments /// </summary> /// <param name="workItemTemplateJson"></param> /// <returns></returns> public bool UpdateWorkItemLinks(string workItemTemplateJson) { try { ImportWorkItemModel.WorkItems fetchedPBIs = JsonConvert.DeserializeObject <ImportWorkItemModel.WorkItems>(workItemTemplateJson); string wiToUpdate = ""; WIMapData findIDforUpdate; if (fetchedPBIs.count > 0) { foreach (ImportWorkItemModel.Value newWI in fetchedPBIs.value) { //continue next iteration if there is no relation if (newWI.relations == null) { continue; } int relCount = newWI.relations.Length; string oldWIID = newWI.id.ToString(); findIDforUpdate = wiData.Find(t => t.OldID == oldWIID); if (findIDforUpdate != null) { wiToUpdate = findIDforUpdate.NewID; foreach (ImportWorkItemModel.Relations rel in newWI.relations) { if (relTypes.Contains(rel.rel.Trim())) { oldWIID = rel.url.Substring(rel.url.LastIndexOf("/") + 1); WIMapData findIDforlink = wiData.Find(t => t.OldID == oldWIID); if (findIDforlink != null) { string newWIID = findIDforlink.NewID; Object[] patchWorkItem = new Object[1]; // change some values on a few fields patchWorkItem[0] = new { op = "add", path = "/relations/-", value = new { rel = rel.rel, url = _configuration.UriString + "/_apis/wit/workitems/" + newWIID, attributes = new { comment = "Making a new link for the dependency" } } }; if (UpdateLink("Product Backlog Item", wiToUpdate, patchWorkItem)) { } } } if (rel.rel == "Hyperlink") { Object[] patchWorkItem = new Object[1]; patchWorkItem[0] = new { op = "add", path = "/relations/-", value = new { rel = "Hyperlink", url = rel.url } }; bool isHyperLinkCreated = UpdateLink(string.Empty, wiToUpdate, patchWorkItem); } if (rel.rel == "AttachedFile") { Object[] patchWorkItem = new Object[1]; string filPath = string.Format(attachmentFolder + @"\{0}{1}", rel.attributes["id"], rel.attributes["name"]); string fileName = rel.attributes["name"]; string attchmentURl = UploadAttchment(filPath, fileName); if (!string.IsNullOrEmpty(attchmentURl)) { patchWorkItem[0] = new { op = "add", path = "/relations/-", value = new { rel = "AttachedFile", url = attchmentURl } }; bool isAttachmemntCreated = UpdateLink(string.Empty, wiToUpdate, patchWorkItem); } } if (rel.rel == "ArtifactLink") { rel.url = rel.url.Replace("$projectId$", projectId).Replace("$RepositoryId$", repositoryId); foreach (var pullReqest in pullRequests) { string key = string.Format("${0}$", pullReqest.Key); rel.url = rel.url.Replace(key, pullReqest.Value); } Object[] patchWorkItem = new Object[1]; patchWorkItem[0] = new { op = "add", path = "/relations/-", value = new { rel = "ArtifactLink", url = rel.url, attributes = new { name = rel.attributes["name"] } } }; bool isArtifactLinkCreated = UpdateLink(string.Empty, wiToUpdate, patchWorkItem); } } } } return(true); } } catch (Exception ex) { logger.Debug(DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss") + "\t" + ex.Message + "\t" + "\n" + ex.StackTrace + "\n"); } return(false); }
/// <summary> /// Update the work items in Target with all required field values /// </summary> /// <param name="workItemType"></param> /// <param name="workImport"></param> /// <param name="ProjectName"></param> /// <returns></returns> public bool PrepareAndUpdateTarget(string workItemType, string workImport, string ProjectName) { //List<ColumnPost> Columns = JsonConvert.DeserializeObject<List<ColumnPost>>(workImport); ImportWorkItemModel.WorkItems fetchedWIs = JsonConvert.DeserializeObject <ImportWorkItemModel.WorkItems>(workImport); if (fetchedWIs.count > 0) { foreach (ImportWorkItemModel.Value newWI in fetchedWIs.value) { newWI.fields.SystemCreatedDate = DateTime.Now.AddDays(-3); //newWI.fields.SystemChangedDate = DateTime.Now.AddDays(-2); //newWI.fields.SystemRevisedDate = DateTime.Now.AddDays(-2); // UpdateWorkIteminTarget(workItemType,newWI, new String[] {"/fields/System.Title", "/fields/Microsoft.VSTS.CommonPriority","/fields/Microsoft.VSTS.CommonStackRank", "/fields/System.Description"}, new Object[] {newWI.fields.SystemTitle,newWI.fields.MicrosoftVSTSCommonPriority,newWI.fields.MicrosoftVSTSCommonStackRank,newWI.fields.SystemDescription }); //String[] FieldstoAdd = { }; Object[] ValuestoAdd = { }; Dictionary <string, object> dicWIFields = new Dictionary <string, object>(); string assignToUser = string.Empty; if (listAssignToUsers.Count > 0) { assignToUser = listAssignToUsers[new Random().Next(0, listAssignToUsers.Count)]; } //Test cases have different fields compared to other items like bug, Epics, etc. if ((workItemType == "Test Case")) { //replacing null values with Empty strngs; creation fails if the fields are null if (newWI.fields.MicrosoftVSTSTCMParameters == null) { newWI.fields.MicrosoftVSTSTCMParameters = string.Empty; } if (newWI.fields.MicrosoftVSTSTCMSteps == null) { newWI.fields.MicrosoftVSTSTCMSteps = string.Empty; } if (newWI.fields.MicrosoftVSTSTCMLocalDataSource == null) { newWI.fields.MicrosoftVSTSTCMLocalDataSource = string.Empty; } dicWIFields.Add("/fields/System.Title", newWI.fields.SystemTitle); dicWIFields.Add("/fields/System.State", newWI.fields.SystemState); dicWIFields.Add("/fields/System.Reason", newWI.fields.SystemReason); dicWIFields.Add("/fields/Microsoft.VSTS.Common.Priority", newWI.fields.MicrosoftVSTSCommonPriority); dicWIFields.Add("/fields/Microsoft.VSTS.TCM.Steps", newWI.fields.MicrosoftVSTSTCMSteps); dicWIFields.Add("/fields/Microsoft.VSTS.TCM.Parameters", newWI.fields.MicrosoftVSTSTCMParameters); dicWIFields.Add("/fields/Microsoft.VSTS.TCM.LocalDataSource", newWI.fields.MicrosoftVSTSTCMLocalDataSource); dicWIFields.Add("/fields/Microsoft.VSTS.TCM.AutomationStatus", newWI.fields.MicrosoftVSTSTCMAutomationStatus); if (newWI.fields.MicrosoftVSTSCommonAcceptanceCriteria != null) { dicWIFields.Add("/fields/Microsoft.VSTS.Common.AcceptanceCriteria", newWI.fields.MicrosoftVSTSCommonAcceptanceCriteria); } if (newWI.fields.SystemTags != null) { dicWIFields.Add("/fields/System.Tags", newWI.fields.SystemTags); } dicWIFields.Add("/fields/Microsoft.VSTS.Scheduling.RemainingWork", newWI.fields.MicrosoftVSTSSchedulingRemainingWork); } else { string iterationPath = ProjectName; string boardRowField = string.Empty; if (newWI.fields.SystemIterationPath.Contains("\\")) { iterationPath = string.Format(@"{0}\{1}", ProjectName, newWI.fields.SystemIterationPath.Split('\\')[1]); } if (!string.IsNullOrWhiteSpace(boardRowFieldName)) { boardRowField = string.Format("/fields/{0}", boardRowFieldName); } if (newWI.fields.SystemDescription == null) { newWI.fields.SystemDescription = newWI.fields.SystemTitle; } if (string.IsNullOrEmpty(newWI.fields.SystemBoardLane)) { newWI.fields.SystemBoardLane = string.Empty; } dicWIFields.Add("/fields/System.Title", newWI.fields.SystemTitle); dicWIFields.Add("/fields/System.Description", newWI.fields.SystemDescription); dicWIFields.Add("/fields/System.State", newWI.fields.SystemState); dicWIFields.Add("/fields/System.Reason", newWI.fields.SystemReason); dicWIFields.Add("/fields/Microsoft.VSTS.Common.Priority", newWI.fields.MicrosoftVSTSCommonPriority); dicWIFields.Add("/fields/System.AssignedTo", assignToUser); dicWIFields.Add("/fields/System.IterationPath", iterationPath); dicWIFields.Add("/fields/Microsoft.VSTS.Scheduling.RemainingWork", newWI.fields.MicrosoftVSTSSchedulingRemainingWork); dicWIFields.Add("/fields/Microsoft.VSTS.Scheduling.Effort", newWI.fields.MicrosoftVSTSSchedulingEffort); if (newWI.fields.MicrosoftVSTSCommonAcceptanceCriteria != null) { dicWIFields.Add("/fields/Microsoft.VSTS.Common.AcceptanceCriteria", newWI.fields.MicrosoftVSTSCommonAcceptanceCriteria); } if (newWI.fields.SystemTags != null) { dicWIFields.Add("/fields/System.Tags", newWI.fields.SystemTags); } if (newWI.fields.MicrosoftVSTSTCMParameters != null) { dicWIFields.Add("/fields/Microsoft.VSTS.TCM.Parameters", newWI.fields.MicrosoftVSTSTCMParameters); } if (newWI.fields.MicrosoftVSTSTCMSteps != null) { dicWIFields.Add("/fields/Microsoft.VSTS.TCM.Steps", newWI.fields.MicrosoftVSTSTCMSteps); } if (!string.IsNullOrWhiteSpace(boardRowField)) { dicWIFields.Add(boardRowField, newWI.fields.SystemBoardLane); } } UpdateWorkIteminTarget(workItemType, newWI.id.ToString(), ProjectName, dicWIFields); } return(true); } return(false); }