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; }
}