예제 #1
0
        /// <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());
        }