diff --git a/src/Umbraco.Core/Persistence/Repositories/IContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IContentRepository.cs index f7341d112b..217719e144 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IContentRepository.cs @@ -19,6 +19,12 @@ namespace Umbraco.Core.Persistence.Repositories /// Current version is first, and then versions are ordered with most recent first. IEnumerable GetAllVersions(int nodeId); + /// + /// Gets versions. + /// + /// Current version is first, and then versions are ordered with most recent first. + IEnumerable GetAllVersionsSlim(int nodeId, int skip, int take); + /// /// Gets version identifiers. /// diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs index 34bc3713f3..36b7ab07f1 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs @@ -53,6 +53,10 @@ namespace Umbraco.Core.Persistence.Repositories.Implement // gets all versions, current first public abstract IEnumerable GetAllVersions(int nodeId); + // gets all versions, current first + public virtual IEnumerable GetAllVersionsSlim(int nodeId, int skip, int take) + => GetAllVersions(nodeId).Skip(skip).Take(take); + // gets all version ids, current first public virtual IEnumerable GetVersionIds(int nodeId, int maxRows) { diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs index df389c738a..20c26b2f66 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs @@ -220,6 +220,16 @@ namespace Umbraco.Core.Persistence.Repositories.Implement return MapDtosToContent(Database.Fetch(sql), true); } + public override IEnumerable GetAllVersionsSlim(int nodeId, int skip, int take) + { + var sql = GetBaseQuery(QueryType.Many, false) + .Where(x => x.NodeId == nodeId) + .OrderByDescending(x => x.Current) + .AndByDescending(x => x.VersionDate); + + return MapDtosToContent(Database.Fetch(sql), true, true); + } + public override IContent GetVersion(int versionId) { var sql = GetBaseQuery(QueryType.Single, false) @@ -911,7 +921,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement return base.ApplySystemOrdering(ref sql, ordering); } - private IEnumerable MapDtosToContent(List dtos, bool withCache = false) + private IEnumerable MapDtosToContent(List dtos, bool withCache = false, bool slim = false) { var temps = new List>(); var contentTypes = new Dictionary(); @@ -944,47 +954,53 @@ namespace Umbraco.Core.Persistence.Repositories.Implement var c = content[i] = ContentBaseFactory.BuildEntity(dto, contentType); - // need templates - var templateId = dto.DocumentVersionDto.TemplateId; - if (templateId.HasValue && templateId.Value > 0) - templateIds.Add(templateId.Value); - if (dto.Published) + if (!slim) { - templateId = dto.PublishedVersionDto.TemplateId; + // need templates + var templateId = dto.DocumentVersionDto.TemplateId; if (templateId.HasValue && templateId.Value > 0) templateIds.Add(templateId.Value); - } + if (dto.Published) + { + templateId = dto.PublishedVersionDto.TemplateId; + if (templateId.HasValue && templateId.Value > 0) + templateIds.Add(templateId.Value); + } - // need properties - var versionId = dto.DocumentVersionDto.Id; - var publishedVersionId = dto.Published ? dto.PublishedVersionDto.Id : 0; - var temp = new TempContent(dto.NodeId, versionId, publishedVersionId, contentType, c) - { - Template1Id = dto.DocumentVersionDto.TemplateId - }; - if (dto.Published) temp.Template2Id = dto.PublishedVersionDto.TemplateId; - temps.Add(temp); + // need properties + var versionId = dto.DocumentVersionDto.Id; + var publishedVersionId = dto.Published ? dto.PublishedVersionDto.Id : 0; + var temp = new TempContent(dto.NodeId, versionId, publishedVersionId, contentType, c) + { + Template1Id = dto.DocumentVersionDto.TemplateId + }; + if (dto.Published) temp.Template2Id = dto.PublishedVersionDto.TemplateId; + temps.Add(temp); + } } - // load all required templates in 1 query, and index - var templates = _templateRepository.GetMany(templateIds.ToArray()) - .ToDictionary(x => x.Id, x => x); - - // load all properties for all documents from database in 1 query - indexed by version id - var properties = GetPropertyCollections(temps); - - // assign templates and properties - foreach (var temp in temps) + if (!slim) { - // complete the item - if (temp.Template1Id.HasValue && templates.TryGetValue(temp.Template1Id.Value, out var template)) - temp.Content.Template = template; - if (temp.Template2Id.HasValue && templates.TryGetValue(temp.Template2Id.Value, out template)) - temp.Content.PublishTemplate = template; - temp.Content.Properties = properties[temp.VersionId]; + // load all required templates in 1 query, and index + var templates = _templateRepository.GetMany(templateIds.ToArray()) + .ToDictionary(x => x.Id, x => x); - // reset dirty initial properties (U4-1946) - temp.Content.ResetDirtyProperties(false); + // load all properties for all documents from database in 1 query - indexed by version id + var properties = GetPropertyCollections(temps); + + // assign templates and properties + foreach (var temp in temps) + { + // complete the item + if (temp.Template1Id.HasValue && templates.TryGetValue(temp.Template1Id.Value, out var template)) + temp.Content.Template = template; + if (temp.Template2Id.HasValue && templates.TryGetValue(temp.Template2Id.Value, out template)) + temp.Content.PublishTemplate = template; + temp.Content.Properties = properties[temp.VersionId]; + + // reset dirty initial properties (U4-1946) + temp.Content.ResetDirtyProperties(false); + } } // set variations, if varying diff --git a/src/Umbraco.Core/Services/IContentService.cs b/src/Umbraco.Core/Services/IContentService.cs index 436b8e6172..64877e393e 100644 --- a/src/Umbraco.Core/Services/IContentService.cs +++ b/src/Umbraco.Core/Services/IContentService.cs @@ -134,6 +134,12 @@ namespace Umbraco.Core.Services /// Versions are ordered with current first, then most recent first. IEnumerable GetVersions(int id); + /// + /// Gets all versions of a document. + /// + /// Versions are ordered with current first, then most recent first. + IEnumerable GetVersionsSlim(int id, int skip, int take); + /// /// Gets top versions of a document. /// diff --git a/src/Umbraco.Core/Services/Implement/ContentService.cs b/src/Umbraco.Core/Services/Implement/ContentService.cs index e3baff8439..92ffba952f 100644 --- a/src/Umbraco.Core/Services/Implement/ContentService.cs +++ b/src/Umbraco.Core/Services/Implement/ContentService.cs @@ -474,6 +474,19 @@ namespace Umbraco.Core.Services.Implement } } + /// + /// Gets a collection of an objects versions by Id + /// + /// An Enumerable list of objects + public IEnumerable GetVersionsSlim(int id, int skip, int take) + { + using (var scope = ScopeProvider.CreateScope(autoComplete: true)) + { + scope.ReadLock(Constants.Locks.ContentTree); + return _documentRepository.GetAllVersionsSlim(id, skip, take); + } + } + /// /// Gets a list of all version Ids for the given content item ordered so latest is first /// diff --git a/src/Umbraco.Web/Editors/ContentController.cs b/src/Umbraco.Web/Editors/ContentController.cs index be4801ae61..cce9a2d2ed 100644 --- a/src/Umbraco.Web/Editors/ContentController.cs +++ b/src/Umbraco.Web/Editors/ContentController.cs @@ -1706,14 +1706,16 @@ namespace Umbraco.Web.Editors public IEnumerable GetRollbackVersions(int contentId, string culture = null) { var rollbackVersions = new List(); + var writerIds = new HashSet(); - //Return a list of all versions of a specific content node - var versions = Services.ContentService.GetVersions(contentId); + //Return a list of all versions of a specific content node + // fixme - cap at 50 versions for now? + var versions = Services.ContentService.GetVersionsSlim(contentId, 0, 50); //Not all nodes are variants & thus culture can be null - //Only filter the collection if (culture != null) { + //Get cultures that were published with the version = their update date is equal to the version's versions = versions.Where(x => x.UpdateDate == x.GetUpdateDate(culture)); } @@ -1722,20 +1724,26 @@ namespace Umbraco.Web.Editors foreach (var version in versions) { - var rollbackVersion = new RollbackVersion(); - - //Version ID - rollbackVersion.VersionId = version.VersionId; - - //Date of version - rollbackVersion.VersionDate = version.UpdateDate; - - //Name of writer/publisher/user - var writerId = version.WriterId; - var user = Services.UserService.GetUserById(writerId); - rollbackVersion.VersionAuthorName = user.Name; + var rollbackVersion = new RollbackVersion + { + VersionId = version.VersionId, + VersionDate = version.UpdateDate, + VersionAuthorId = version.WriterId + }; rollbackVersions.Add(rollbackVersion); + + writerIds.Add(version.WriterId); + } + + var users = Services.UserService + .GetUsersById(writerIds.ToArray()) + .ToDictionary(x => x.Id, x => x.Name); + + foreach (var rollbackVersion in rollbackVersions) + { + if (users.TryGetValue(rollbackVersion.VersionAuthorId, out var userName)) + rollbackVersion.VersionAuthorName = userName; } return rollbackVersions; diff --git a/src/Umbraco.Web/Models/ContentEditing/RollbackVersion.cs b/src/Umbraco.Web/Models/ContentEditing/RollbackVersion.cs index 88df12883d..dad1341a8c 100644 --- a/src/Umbraco.Web/Models/ContentEditing/RollbackVersion.cs +++ b/src/Umbraco.Web/Models/ContentEditing/RollbackVersion.cs @@ -12,6 +12,9 @@ namespace Umbraco.Web.Models.ContentEditing [DataMember(Name = "versionDate")] public DateTime VersionDate { get; set; } + [DataMember(Name = "versionAuthorId")] + public int VersionAuthorId { get; set; } + [DataMember(Name = "versionAuthorName")] public string VersionAuthorName { get; set; } }