/// <summary> /// Extracts and saves all textual content for a page. /// </summary> /// <param name="page">The page the content belongs to.</param> private void AddContent(string pageName, Page page) { using (SqlConnection connection = new SqlConnection(_connectionString)) { using (SqlCommand command = connection.CreateCommand()) { connection.Open(); command.CommandText = "SELECT * FROM PageContent WHERE [Page]=@Page"; SqlParameter parameter = new SqlParameter(); parameter.ParameterName = "@Page"; parameter.SqlDbType = System.Data.SqlDbType.VarChar; parameter.Value = pageName; command.Parameters.Add(parameter); List <PageContent> categories = new List <PageContent>(); bool hasContent = false; using (SqlDataReader reader = command.ExecuteReader()) { while (reader.Read()) { PageContent content = new PageContent(); string editedBy = reader["User"].ToString(); DateTime EditedOn = (DateTime)reader["LastModified"]; string text = reader["Content"].ToString(); text = CleanContent(text); int versionNumber = (int.Parse(reader["Revision"].ToString())) + 1; DateTime projectStart = (DateTime)reader["ProjectStart"]; DateTime projectEnd = (DateTime)reader["ProjectEnd"]; bool projectEstimatedTime = (bool)reader["ProjectEnd"]; string projectLanguage = (string)reader["ProjectLanguage"]; string projectStatus = (string)reader["ProjectStatus"]; int orgID = (int.Parse(reader["orgID"].ToString())); string projectAgileLifeCyclePhase = (string)reader["ProjectAgileLifeCyclePhase"]; string department = (string)reader["Department"]; string owner = (string)reader["Owner"]; string fundingBoundary = (string)reader["FundingBoundary"]; string ownerEmail = (string)reader["OwnerEmail"]; string collaborationLevel = (string)reader["CollaborationLevel"]; var phase2Params = Phase2Params.Create(projectAgileLifeCyclePhase, department, owner, ownerEmail, collaborationLevel, fundingBoundary); Repository.AddNewPageContentVersion(page, text, editedBy, EditedOn, versionNumber, projectStart, projectEnd, projectEstimatedTime, projectStatus, phase2Params, projectLanguage, orgID); hasContent = true; } } // For broken content, make sure the page has something if (!hasContent) { Repository.AddNewPage(page, "", "unknown", DateTime.UtcNow, DateTime.UtcNow, DateTime.UtcNow, false, "unknown", Phase2Params.Empty(), "unknown", 1); } } } }
/// <summary> /// Reverts to a particular version, creating a new version in the process. /// </summary> /// <param name="versionId">The version ID to revert to.</param> /// <param name="context">The current logged in user's context.</param> /// <exception cref="HistoryException">An databaseerror occurred while reverting to the version.</exception> public void RevertTo(Guid versionId, IUserContext context) { try { string currentUser = context.CurrentUsername; PageContent versionContent = Repository.GetPageContentById(versionId); Page page = Repository.GetPageById(versionContent.Page.Id); int versionNumber = MaxVersion(page.Id) + 1; string text = versionContent.Text; string editedBy = currentUser; DateTime editedOn = DateTime.UtcNow; DateTime projectStart = versionContent.ProjectStart; DateTime projectEnd = versionContent.ProjectEnd; bool projectEstimatedTime = versionContent.ProjectEstimatedTime; string projectLanguage = versionContent.ProjectLanguage; string projectStatus = versionContent.ProjectStatus; string projectAgileLifeCyclePhase = versionContent.ProjectAgileLifeCyclePhase; string fundingBoundary = versionContent.FundingBoundary; int orgID = versionContent.orgID; Repository.AddNewPageContentVersion(page, text, editedBy, editedOn, versionNumber, projectStart, projectEnd, projectEstimatedTime, projectStatus, Phase2Params.FromPageContent(versionContent), projectLanguage, orgID); // Clear the cache _pageViewModelCache.Remove(page.Id); } catch (ArgumentNullException ex) { throw new HistoryException(ex, "An ArgumentNullException occurred when reverting to version ID {0}", versionId); } catch (DatabaseException ex) { throw new HistoryException(ex, "A DatabaseException occurred when reverting to version ID {0}", versionId); } }
/// <summary> /// Adds the page to the database. /// </summary> /// <param name="model">The summary details for the page.</param> /// <returns>A <see cref="PageViewModel"/> for the newly added page.</returns> /// <exception cref="DatabaseException">An databaseerror occurred while saving.</exception> /// <exception cref="SearchException">An error occurred adding the page to the search index.</exception> public PageViewModel AddPage(PageViewModel model) { try { string currentUser = _context.CurrentUsername; var currentUserId = _context.CurrentUserId; Page page = new Page(); page.Title = model.Title; page.Tags = model.CommaDelimitedTags(); page.CreatedBy = AppendIpForDemoSite(currentUser); page.CreatedOn = DateTime.UtcNow; page.ModifiedOn = DateTime.UtcNow; page.ModifiedBy = AppendIpForDemoSite(currentUser); page.ProjectStart = model.ProjectStart; page.ProjectEnd = model.ProjectEnd; page.ProjectEstimatedTime = model.ProjectEstimatedTime; page.ProjectLanguage = model.ProjectLanguage; page.ProjectStatus = model.ProjectStatus; page.ProjectAgileLifeCyclePhase = model.ProjectAgileLifeCyclePhase; page.Department = model.Department; page.FundingBoundary = model.FundingBoundary; page.orgID = model.orgID; // Double check, incase the HTML form was faked. if (_context.IsAdmin) { page.IsLocked = model.IsLocked; } PageContent pageContent = Repository.AddNewPage(page, model.Content, AppendIpForDemoSite(currentUser), DateTime.UtcNow, model.ProjectStart, model.ProjectEnd, model.ProjectEstimatedTime, model.ProjectStatus, Phase2Params.FromModel(model), model.ProjectLanguage, model.orgID); _listCache.RemoveAll(); _pageViewModelCache.RemoveAll(); // completely clear the cache to update any reciprocal links. // Update the lucene index PageViewModel savedModel = new PageViewModel(pageContent, _markupConverter); try { _searchService.Add(savedModel); } catch (SearchException) { // TODO: log } Repository.SetContributeAutoApprovedInProject(savedModel.Id, currentUserId, savedModel.orgID); return(savedModel); } catch (DatabaseException e) { throw new DatabaseException(e, "An error occurred while adding page '{0}' to the database", model.Title); } }
/// <summary> /// Updates the provided page. /// </summary> /// <param name="model">The summary.</param> /// <exception cref="DatabaseException">An databaseerror occurred while updating.</exception> /// <exception cref="SearchException">An error occurred adding the page to the search index.</exception> public void UpdatePage(PageViewModel model) { try { string currentUser = _context.CurrentUsername; Page page = Repository.GetPageById(model.Id); page.Title = model.Title; page.Tags = model.CommaDelimitedTags(); page.ModifiedOn = DateTime.UtcNow; page.ModifiedBy = AppendIpForDemoSite(currentUser); page.ProjectStart = model.ProjectStart; page.ProjectEnd = model.ProjectEnd; page.ProjectEstimatedTime = model.ProjectEstimatedTime; page.ProjectLanguage = model.ProjectLanguage; page.Owner = model.Owner; page.OwnerEmail = model.OwnerEmail; page.ProjectAgileLifeCyclePhase = model.ProjectAgileLifeCyclePhase; page.CollaborationLevel = model.CollaborationLevel; page.Department = model.Department; page.FundingBoundary = model.FundingBoundary; page.ProjectStatus = model.ProjectStatus; page.orgID = model.orgID; // A second check to ensure a fake IsLocked POST doesn't work. if (_context.IsAdmin) { page.IsLocked = model.IsLocked; } Repository.SaveOrUpdatePage(page); // // Update the cache - updating a page is expensive for the cache right now // this could be improved by updating the item in the listcache instead of invalidating it // _pageViewModelCache.Remove(model.Id, 0); if (model.Tags.Contains("homepage")) { _pageViewModelCache.RemoveHomePage(); } _listCache.RemoveAll(); int newVersion = _historyService.MaxVersion(model.Id) + 1; PageContent pageContent = Repository.AddNewPageContentVersion(page, model.Content, AppendIpForDemoSite(currentUser), DateTime.UtcNow, newVersion, model.ProjectStart, model.ProjectEnd, model.ProjectEstimatedTime, model.ProjectStatus, Phase2Params.FromModel(model), model.ProjectLanguage, model.orgID); // Update all links to this page (if it has had its title renamed). Case changes don't need any updates. if (model.PreviousTitle != null && model.PreviousTitle.ToLower() != model.Title.ToLower()) { UpdateLinksToPage(model.PreviousTitle, model.Title); } // Update the lucene index PageViewModel updatedModel = new PageViewModel(Repository.GetLatestPageContent(page.Id), _markupConverter); _searchService.Update(updatedModel); } catch (DatabaseException ex) { throw new DatabaseException(ex, "An error occurred updating the page with title '{0}' in the database", model.Title); } }
public PageContent AddNewPageContentVersion(Page page, string text, string editedBy, DateTime editedOn, int version, DateTime projectStart, DateTime projectEnd, bool projectEstimatedTime, string projectStatus, Phase2Params phase2Params, string projectLanguage, int orgID) { if (version < 1) { version = 1; } PageEntity pageEntity = UnitOfWork.FindById <PageEntity>(page.Id); if (pageEntity != null) { // Update the content PageContentEntity pageContentEntity = new PageContentEntity() { Id = Guid.NewGuid(), Page = pageEntity, Text = text, EditedBy = editedBy, EditedOn = editedOn, VersionNumber = version, ProjectStart = projectStart, ProjectEnd = projectEnd, ProjectEstimatedTime = projectEstimatedTime, ProjectStatus = projectStatus, ProjectLanguage = projectLanguage, orgID = orgID, Owner = phase2Params.Owner, OwnerEmail = phase2Params.OwnerEmail, Department = phase2Params.Department, CollaborationLevel = phase2Params.CollaborationLevel, FundingBoundary = phase2Params.FundingBoundary, ProjectAgileLifeCyclePhase = phase2Params.ProjectAgileLifeCyclePhase, }; UnitOfWork.Add(pageContentEntity); UnitOfWork.SaveChanges(); // The page modified fields pageEntity.ModifiedOn = editedOn; pageEntity.ModifiedBy = editedBy; UnitOfWork.SaveChanges(); // Turn the content database entity back into a domain object PageContent pageContent = PageContent.FromPageContentEntity(pageContentEntity); pageContent.Page = Page.FromPageEntity(pageEntity); return(pageContent); } Log.Error("Unable to update page content for page id {0} (not found)", page.Id); return(null); }
public PageContent AddNewPage(Page page, string text, string editedBy, DateTime editedOn, DateTime projectStart, DateTime projectEnd, bool projectEstimatedTime, string projectStatus, Phase2Params phase2Params, string projectLanguage, int orgID) { PageEntity pageEntity = new PageEntity(); ToEntity.FromPage(page, pageEntity); pageEntity.Id = 0; UnitOfWork.Add(pageEntity); UnitOfWork.SaveChanges(); PageContentEntity pageContentEntity = new PageContentEntity() { Id = Guid.NewGuid(), Page = pageEntity, Text = text, EditedBy = editedBy, EditedOn = editedOn, VersionNumber = 1, ProjectStart = projectStart, ProjectEnd = projectEnd, ProjectEstimatedTime = projectEstimatedTime, ProjectStatus = projectStatus, ProjectLanguage = projectLanguage, orgID = orgID, Owner = phase2Params.Owner, OwnerEmail = phase2Params.OwnerEmail, Department = phase2Params.Department, CollaborationLevel = phase2Params.CollaborationLevel, ProjectAgileLifeCyclePhase = phase2Params.ProjectAgileLifeCyclePhase, FundingBoundary = phase2Params.FundingBoundary }; UnitOfWork.Add(pageContentEntity); UnitOfWork.SaveChanges(); PageContent pageContent = PageContent.FromPageContentEntity(pageContentEntity); pageContent.Page = Page.FromPageEntity(pageEntity); return(pageContent); }