/// <summary> /// This takes an UpdatePackage, which represents an email, and records it to the database /// </summary> /// <param name="package">An UpdatePackage is a normalized email</param> /// <returns>Guid of updated project as a string. /// Useful if this project is new or caller wants to retreive other data on that project</returns> public string RecordUpdatePackage(UpdatePackage package) { //__get the information from input string projectName = package.ProjectName; string subject = package.Subject; string body = package.Body; if (string.IsNullOrEmpty(projectName)) { return(null); } Dictionary <string, string> updatePairs = package.Updates; Project project = context.Projects.FirstOrDefault(p => p.ProjectName == projectName); //__if no existing project, create new one bool madeNewProject = false; if (project == null) { project = new Project(); project.ProjectID = Guid.NewGuid(); madeNewProject = true; } //__get the Project ID to use locally Guid projectID = project.ProjectID; //__Look for VerticalID int verticalID = -1;//__default is not assigned. try { KeyValuePair <string, string> verticalPair = updatePairs.FirstOrDefault(u => u.Key.ToLower() == "verticalid"); if (verticalPair.Value != null) { verticalID = Convert.ToInt16(verticalPair.Value); } if (verticalID < -1 || verticalID > 8) { verticalID = -1; } } catch (Exception) { //__just use default value verticalID = -1; } //__these might be new or changed project.VerticalID = verticalID; project.ProjectName = projectName; //__Look for a PhaseID int phaseID = -1; try { KeyValuePair <string, string> phasePair = updatePairs.FirstOrDefault(u => u.Key.ToLower() == "phaseid"); if (phasePair.Value != null) { phaseID = Convert.ToInt16(phasePair.Value); } if (phaseID < -1 || phaseID > 7) { phaseID = -1; } } catch (Exception) { //_simply use default phaseID = -1; } //__do fuzzy word matches if no phase found yet if (phaseID < 0) { string searchString = subject + body; phaseID = Convert.ToInt16(PhaseKeywords.GuessPhase(searchString)); } //__if this is new Project write it to DB if (madeNewProject) { context.Projects.Add(project); context.SaveChanges(); } //__create and record new ProjectUpdate ProjectUpdate projectUpdate = new ProjectUpdate(); projectUpdate.ProjectUpdateID = Guid.NewGuid(); projectUpdate.ProjectID = projectID; projectUpdate.Subject = subject; projectUpdate.Body = body; context.ProjectUpdates.Add(projectUpdate); context.SaveChanges(); //__build and record StatusUpdates from list of Key:Value pairs //__also make sure to update ProjectPhase table for efficient queries later StatusUpdate statusUpdateTemplate = new StatusUpdate(); statusUpdateTemplate.ProjectID = projectID; statusUpdateTemplate.ProjectUpdateID = projectUpdate.ProjectUpdateID; statusUpdateTemplate.PhaseID = phaseID; statusUpdateTemplate.VerticalID = verticalID; //__safety, incase of duplicate keys, combine the values so there is only one entry //___trying to record duplicate keys in the same PackageUpdate will cause primary key error in DB Dictionary <string, string> cleanedPairs = combineEqualKeys(updatePairs); foreach (var pair in cleanedPairs) { string key = pair.Key; string value = pair.Value; StatusUpdate statusUpdate = statusUpdateTemplate.Clone(); statusUpdate.UpdateKey = key; statusUpdate.UpdateValue = value; statusUpdate.RecordDate = DateTime.Now; context.StatusUpdates.Add(statusUpdate); context.SaveChanges(); updateProjectPhase(projectID, phaseID, key); } return(projectID.ToString()); }