protected override long ExecuteWorkImplementation() { var now = DateTime.UtcNow; var user = m_projectRepository.Load <User>(m_userId); var project = m_projectRepository.Load <Project>(m_projectId); var latestSnapshot = m_projectRepository.GetLatestSnapshot(m_projectId); var bookTypes = m_bookTypes.Select(bookTypeEnum => m_projectRepository.GetBookTypeByEnum(bookTypeEnum)).ToList(); var defaultBookType = m_projectRepository.GetBookTypeByEnum(m_defaultBookType); var versionNumber = latestSnapshot?.VersionNumber ?? 0; // Get all resources (specified in request) var resourceVersions = new List <ResourceVersion>(); var textResourceVersions = BatchGetResourceVersions <TextResource>(m_resourceVersionIds); resourceVersions.AddRange(textResourceVersions); var imageResourceVersions = BatchGetResourceVersions <ImageResource>(m_resourceVersionIds); resourceVersions.AddRange(imageResourceVersions); var audioResourceVersions = BatchGetResourceVersions <AudioResource>(m_resourceVersionIds); resourceVersions.AddRange(audioResourceVersions); // Get required related resources var trackResourceVersions = GetTrackResourceVersions(audioResourceVersions); resourceVersions.AddRange(trackResourceVersions); var pageResourceVersions = GetPageResourceVersions(textResourceVersions, imageResourceVersions, trackResourceVersions); resourceVersions.AddRange(pageResourceVersions); var chapterResourceVersions = GetChapterResourceVersions(pageResourceVersions); resourceVersions.AddRange(chapterResourceVersions); // Get all required resources var metadataResourceVersion = m_resourceRepository.GetLatestMetadata(m_projectId); resourceVersions.Add(metadataResourceVersion); if (metadataResourceVersion == null) { throw new MainServiceException(MainServiceErrorCode.SnapshotMustContainMetadata, $"Project ID={m_projectId} does not contain required Metadata resource"); } var editionNote = m_resourceRepository.GetLatestEditionNote(m_projectId); if (editionNote != null) { resourceVersions.Add(editionNote); } // Headwords are not loaded because they are not supported in project editor // BinaryResource is not used at all now // BookVersionResource is not used in publish process (it is used only for eXist-db) // Create snapshot var newDbSnapshot = new DataEntities.Database.Entities.Snapshot { Project = project, BookTypes = bookTypes, DefaultBookType = defaultBookType, Comment = m_comment, CreateTime = now, PublishTime = now, CreatedByUser = user, VersionNumber = versionNumber + 1, ResourceVersions = resourceVersions }; project.LatestPublishedSnapshot = newDbSnapshot; m_projectRepository.Update(project); var snapshotId = (long)m_projectRepository.Create(newDbSnapshot); // Publish snapshot to fulltext database var orderedTextResourceVersions = textResourceVersions.OrderBy(x => ((PageResource)x.ResourcePage.LatestVersion).Position).ToList(); m_fulltextStorage.CreateSnapshot(newDbSnapshot, orderedTextResourceVersions, metadataResourceVersion); return(snapshotId); }