using System; using System.Configuration; using System.Diagnostics; using System.Net; using System.Net.Http; using System.Threading.Tasks; using System.Web.Http; using Microsoft.TeamFoundation.Client; using Microsoft.TeamFoundation.WorkItemTracking.Client; namespace MediaManager.Web.Controllers { public class TfsStenoController : ApiController { public class WorkItemEmail { public int WorkItemId { get; set; } public string HistoryText { get { return String.Format("

{0} UTC - {1}

{2}
", DateTime.UtcNow, _subject, _body); } } private string _body; private string _subject; public WorkItemEmail() { WorkItemId = -1; } public void ParsePart(string partName, string partText) { switch (partName.Replace("\"", String.Empty).ToUpper()) { case "TO": int workItemId; string trimmedTo = partText.Replace("\"", String.Empty); Trace.TraceInformation("Parsing ID from " + trimmedTo); if (Int32.TryParse(trimmedTo.Substring(0, trimmedTo.IndexOf('@')), out workItemId)) WorkItemId = workItemId; break; case "SUBJECT": _subject = partText; break; case "TEXT": if (String.IsNullOrEmpty(_body)) _body = partText; break; case "HTML": _body = partText; break; } } public void Save() { string tfsUserName = ConfigurationManager.AppSettings["tfsUserName"]; string tfsPassword = ConfigurationManager.AppSettings["tfsPassword"]; string tfsUrl = ConfigurationManager.AppSettings["tfsUrl"]; string tfsProjectName = ConfigurationManager.AppSettings["tfsProject"]; var networkCred = new NetworkCredential(tfsUserName, tfsPassword); var basicCred = new BasicAuthCredential(networkCred); var tfsCred = new TfsClientCredentials(basicCred) {AllowInteractive = false}; var teamProjectColl = new TfsTeamProjectCollection(new Uri(tfsUrl), tfsCred); teamProjectColl.Authenticate(); var workItemService = teamProjectColl.GetService(); var workItem = workItemService.GetWorkItem(WorkItemId); workItem.History = HistoryText; workItem.Save(); } public override string ToString() { return String.Format("ID: {0}; Text: {1}", WorkItemId, HistoryText); } } public async Task Post(HttpRequestMessage request) { var workItemEmail = new WorkItemEmail(); var requestMulti = await request.Content.ReadAsMultipartAsync(); for (int contentIndex = 0; contentIndex < requestMulti.Contents.Count; contentIndex++) { var part = requestMulti.Contents[contentIndex]; string partName = part.Headers.ContentDisposition.Name; string partText = await part.ReadAsStringAsync(); workItemEmail.ParsePart(partName, partText); Trace.TraceInformation("Part {0} - {1}: {2}", contentIndex, partName, partText.Substring(0, Math.Min(partText.Length, 25))); } Trace.TraceInformation("WorkItemEmail: " + workItemEmail.ToString()); try { string responseContent; if (workItemEmail.WorkItemId == -1) { responseContent = "To address must be WorkItemId@tfssteno.aidanjryan.com"; Trace.TraceInformation("Bad or missing work item ID in to address."); } else { responseContent = "Appended to history of work item ID " + workItemEmail.WorkItemId; workItemEmail.Save(); Trace.TraceInformation("Saved history to workitem id " + workItemEmail.WorkItemId); } return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(responseContent) }; } catch (Exception ex) { string errorMessage = "Failed to save work item with exception: " + ex; Trace.TraceInformation(errorMessage); return new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(errorMessage) }; } } } }