protected override void ExecuteWorkImplementation() { var now = DateTime.UtcNow; var chapters = m_resourceRepository.GetProjectLatestChapters(m_projectId); var project = m_resourceRepository.Load<Project>(m_projectId); var user = m_resourceRepository.Load<User>(m_userId); // Fix levels var currentLevel = 0; // min level is 1 foreach (var heading in m_pageWithHeadingsList.SelectMany(x => x.Item2)) { if (heading.Level > currentLevel + 1) { heading.Level = currentLevel + 1; } else { currentLevel = heading.Level; } } // Update chapters var updatedResourceChapters = new List<Resource>(); var currentChapterByLevel = new ChapterResource[7]; var position = 0; foreach (var pageWithHeadings in m_pageWithHeadingsList) { var headings = pageWithHeadings.Item2; var resourcePage = m_resourceRepository.Load<Resource>(pageWithHeadings.Item1.Resource.Id); foreach (var markdownHeadingData in headings) { position++; // Find original Resource ChapterResource originalChapterResource = null; var originalChapters = chapters.Where(x => x.Name == markdownHeadingData.Heading).ToList(); if (originalChapters.Count == 1) { originalChapterResource = originalChapters[0]; } else if (originalChapters.Count > 1) { originalChapterResource = originalChapters.FirstOrDefault(x => x.Position == position); } if (updatedResourceChapters.Contains(originalChapterResource?.Resource)) { originalChapterResource = null; } // Create ChapterResource var chapterResource = new ChapterResource { Comment = null, CreateTime = now, CreatedByUser = user, Name = markdownHeadingData.Heading, ParentResource = currentChapterByLevel[markdownHeadingData.Level - 1]?.Resource, Position = position, Resource = null, // is updated below ResourceBeginningPage = resourcePage, VersionNumber = 1, // is updated below }; if (originalChapterResource != null) { chapterResource.Resource = originalChapterResource.Resource; chapterResource.VersionNumber = originalChapterResource.VersionNumber + 1; updatedResourceChapters.Add(chapterResource.Resource); } else { chapterResource.Resource = new Resource { ContentType = ContentTypeEnum.Chapter, IsRemoved = false, Name = chapterResource.Name, Project = project, ResourceType = ResourceTypeEnum.Chapter, }; } chapterResource.Resource.LatestVersion = chapterResource; currentChapterByLevel[markdownHeadingData.Level] = chapterResource; m_resourceRepository.Create(chapterResource); } } // Remove unused chapters var removeResourceSubwork = new RemoveResourceSubwork(m_resourceRepository); foreach (var chapterResource in chapters) { var resource = chapterResource.Resource; if (!updatedResourceChapters.Contains(resource)) { removeResourceSubwork.RemoveResource(resource.Id); } } }
protected override void ExecuteWorkImplementation() { var now = DateTime.UtcNow; var user = m_resourceRepository.Load <User>(m_userId); var dbChapters = m_resourceRepository.GetProjectLatestChapters(m_projectId); var updatedResourceChapterIds = new List <long>(); foreach (var chapter in m_chapterData) { var resourceBeginningPage = m_resourceRepository.Load <Resource>(chapter.BeginningPageId); var resourceParentChapter = chapter.ParentChapterId != null ? m_resourceRepository.Load <Resource>(chapter.ParentChapterId.Value) : null; var chapterResource = new ChapterResource { Name = chapter.Name, Comment = chapter.Comment, Position = chapter.Position, Resource = null, ParentResource = resourceParentChapter, ResourceBeginningPage = resourceBeginningPage, VersionNumber = 0, CreateTime = now, CreatedByUser = user, }; if (chapter.Id == null) { var resource = new Resource { ContentType = ContentTypeEnum.Chapter, ResourceType = ResourceTypeEnum.Chapter, Project = m_resourceRepository.Load <Project>(m_projectId), }; chapterResource.Resource = resource; chapterResource.VersionNumber = 1; } else { var latestChapterResource = m_resourceRepository.GetLatestResourceVersion <ChapterResource>(chapter.Id.Value); if (latestChapterResource == null) { throw new MainServiceException(MainServiceErrorCode.EntityNotFound, "The entity was not found."); } chapterResource.Resource = latestChapterResource.Resource; chapterResource.VersionNumber = latestChapterResource.VersionNumber + 1; updatedResourceChapterIds.Add(chapter.Id.Value); } chapterResource.Resource.Name = chapter.Name; chapterResource.Resource.LatestVersion = chapterResource; m_resourceRepository.Create(chapterResource); } var removeResourceSubwork = new RemoveResourceSubwork(m_resourceRepository); foreach (var dbChapter in dbChapters) { if (!updatedResourceChapterIds.Contains(dbChapter.Resource.Id)) { removeResourceSubwork.RemoveResource(dbChapter.Resource.Id); } } }
protected override void ExecuteWorkImplementation() { var now = DateTime.UtcNow; var user = m_resourceRepository.Load <User>(m_userId); var dbPages = m_resourceRepository.GetProjectLatestPages(m_projectId); var updatedResourcePageIds = new List <long>(); foreach (var newPage in m_newPages) { var pageResource = new PageResource { Name = newPage.Name, Comment = null, Position = newPage.Position, Resource = null, VersionNumber = 0, CreateTime = now, CreatedByUser = user, Terms = null, // Terms must be also updated }; if (newPage.Id == null) { var resource = new Resource { ContentType = ContentTypeEnum.Page, ResourceType = ResourceTypeEnum.Page, Project = m_resourceRepository.Load <Project>(m_projectId), }; pageResource.Resource = resource; pageResource.VersionNumber = 1; } else { var latestPageResource = m_resourceRepository.GetLatestResourceVersion <PageResource>(newPage.Id.Value); if (latestPageResource == null) { throw new MainServiceException(MainServiceErrorCode.EntityNotFound, "The entity was not found."); } pageResource.Resource = latestPageResource.Resource; pageResource.VersionNumber = latestPageResource.VersionNumber + 1; pageResource.Terms = new List <Term>(latestPageResource.Terms); // Lazy fetch updatedResourcePageIds.Add(newPage.Id.Value); } pageResource.Resource.Name = newPage.Name; pageResource.Resource.LatestVersion = pageResource; m_resourceRepository.Create(pageResource); } var removeResourceSubwork = new RemoveResourceSubwork(m_resourceRepository); foreach (var dbPage in dbPages) { if (!updatedResourcePageIds.Contains(dbPage.Resource.Id)) { removeResourceSubwork.RemoveResource(dbPage.Resource.Id); } } }