Fixes: U4-4754 Member and Media repositories need to generate preview xml when EnableGlobalPreviewStorage is true

This commit is contained in:
Shannon
2014-04-29 09:58:38 +10:00
parent 2f53698bc5
commit aba1862811
13 changed files with 222 additions and 145 deletions

View File

@@ -1083,7 +1083,7 @@ namespace Umbraco.Core.Configuration
bool globalPreviewEnabled = false;
string value = GetKey("/settings/content/GlobalPreviewStorageEnabled");
if (bool.TryParse(value, out globalPreviewEnabled))
return !globalPreviewEnabled;
return globalPreviewEnabled;
// Return default
return false;
}

View File

@@ -0,0 +1,21 @@
using System;
using System.Xml.Linq;
namespace Umbraco.Core.Models
{
/// <summary>
/// Used content repository in order to add an entity to the persisted collection to be saved
/// in a single transaction during saving an entity
/// </summary>
internal class ContentPreviewEntity<TContent> : ContentXmlEntity<TContent>
where TContent : IContentBase
{
public ContentPreviewEntity(bool previewExists, TContent content, Func<TContent, XElement> xml)
: base(previewExists, content, xml)
{
Version = content.Version;
}
public Guid Version { get; private set; }
}
}

View File

@@ -0,0 +1,109 @@
using System;
using System.Collections.Generic;
using System.Xml.Linq;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Rdbms;
using Umbraco.Core.Persistence.Caching;
using Umbraco.Core.Persistence.Querying;
using Umbraco.Core.Persistence.UnitOfWork;
namespace Umbraco.Core.Persistence.Repositories
{
/// <summary>
/// Private class to handle preview insert/update based on standard principles and units of work with transactions
/// </summary>
internal class ContentPreviewRepository<TContent> : PetaPocoRepositoryBase<int, ContentPreviewEntity<TContent>>
where TContent : IContentBase
{
public ContentPreviewRepository(IDatabaseUnitOfWork work, IRepositoryCacheProvider cache)
: base(work, cache)
{
}
#region Not implemented (don't need to for the purposes of this repo)
protected override ContentPreviewEntity<TContent> PerformGet(int id)
{
throw new NotImplementedException();
}
protected override IEnumerable<ContentPreviewEntity<TContent>> PerformGetAll(params int[] ids)
{
throw new NotImplementedException();
}
protected override IEnumerable<ContentPreviewEntity<TContent>> PerformGetByQuery(IQuery<ContentPreviewEntity<TContent>> query)
{
throw new NotImplementedException();
}
protected override Sql GetBaseQuery(bool isCount)
{
throw new NotImplementedException();
}
protected override string GetBaseWhereClause()
{
throw new NotImplementedException();
}
protected override IEnumerable<string> GetDeleteClauses()
{
return new List<string>();
}
protected override Guid NodeObjectTypeId
{
get { throw new NotImplementedException(); }
}
protected override void PersistDeletedItem(ContentPreviewEntity<TContent> entity)
{
throw new NotImplementedException();
}
#endregion
protected override void PersistNewItem(ContentPreviewEntity<TContent> entity)
{
if (entity.Content.HasIdentity == false)
{
throw new InvalidOperationException("Cannot insert a preview for a content item that has no identity");
}
var previewPoco = new PreviewXmlDto
{
NodeId = entity.Id,
Timestamp = DateTime.Now,
VersionId = entity.Version,
Xml = entity.Xml.ToString(SaveOptions.None)
};
Database.Insert(previewPoco);
}
protected override void PersistUpdatedItem(ContentPreviewEntity<TContent> entity)
{
if (entity.Content.HasIdentity == false)
{
throw new InvalidOperationException("Cannot update a preview for a content item that has no identity");
}
var previewPoco = new PreviewXmlDto
{
NodeId = entity.Id,
Timestamp = DateTime.Now,
VersionId = entity.Version,
Xml = entity.Xml.ToString(SaveOptions.None)
};
Database.Update<PreviewXmlDto>(
"SET xml = @Xml, timestamp = @Timestamp WHERE nodeId = @Id AND versionId = @Version",
new
{
Xml = previewPoco.Xml,
Timestamp = previewPoco.Timestamp,
Id = previewPoco.NodeId,
Version = previewPoco.VersionId
});
}
}
}

View File

@@ -26,7 +26,7 @@ namespace Umbraco.Core.Persistence.Repositories
private readonly IContentTypeRepository _contentTypeRepository;
private readonly ITemplateRepository _templateRepository;
private readonly CacheHelper _cacheHelper;
private readonly ContentPreviewRepository _contentPreviewRepository;
private readonly ContentPreviewRepository<IContent> _contentPreviewRepository;
private readonly ContentXmlRepository<IContent> _contentXmlRepository;
public ContentRepository(IDatabaseUnitOfWork work, IContentTypeRepository contentTypeRepository, ITemplateRepository templateRepository, CacheHelper cacheHelper)
@@ -35,7 +35,7 @@ namespace Umbraco.Core.Persistence.Repositories
_contentTypeRepository = contentTypeRepository;
_templateRepository = templateRepository;
_cacheHelper = cacheHelper;
_contentPreviewRepository = new ContentPreviewRepository(work, NullCacheProvider.Current);
_contentPreviewRepository = new ContentPreviewRepository<IContent>(work, NullCacheProvider.Current);
_contentXmlRepository = new ContentXmlRepository<IContent>(work, NullCacheProvider.Current);
EnsureUniqueNaming = true;
@@ -47,7 +47,7 @@ namespace Umbraco.Core.Persistence.Repositories
_contentTypeRepository = contentTypeRepository;
_templateRepository = templateRepository;
_cacheHelper = cacheHelper;
_contentPreviewRepository = new ContentPreviewRepository(work, NullCacheProvider.Current);
_contentPreviewRepository = new ContentPreviewRepository<IContent>(work, NullCacheProvider.Current);
_contentXmlRepository = new ContentXmlRepository<IContent>(work, NullCacheProvider.Current);
EnsureUniqueNaming = true;
@@ -586,7 +586,7 @@ namespace Umbraco.Core.Persistence.Repositories
Database.ExecuteScalar<int>("SELECT COUNT(nodeId) FROM cmsPreviewXml WHERE nodeId = @Id AND versionId = @Version",
new { Id = content.Id, Version = content.Version }) != 0;
_contentPreviewRepository.AddOrUpdate(new ContentPreviewEntity(previewExists, content, xml));
_contentPreviewRepository.AddOrUpdate(new ContentPreviewEntity<IContent>(previewExists, content, xml));
}
#endregion
@@ -650,122 +650,5 @@ namespace Umbraco.Core.Persistence.Repositories
return currentName;
}
#region Private classes
/// <summary>
/// Used content repository in order to add an entity to the persisted collection to be saved
/// in a single transaction during saving an entity
/// </summary>
private class ContentPreviewEntity : ContentXmlEntity<IContent>
{
public ContentPreviewEntity(bool previewExists, IContent content, Func<IContent, XElement> xml)
: base(previewExists, content, xml)
{
Version = content.Version;
}
public Guid Version { get; private set; }
}
/// <summary>
/// Private class to handle preview insert/update based on standard principles and units of work with transactions
/// </summary>
private class ContentPreviewRepository : PetaPocoRepositoryBase<int, ContentPreviewEntity>
{
public ContentPreviewRepository(IDatabaseUnitOfWork work, IRepositoryCacheProvider cache)
: base(work, cache)
{
}
#region Not implemented (don't need to for the purposes of this repo)
protected override ContentPreviewEntity PerformGet(int id)
{
throw new NotImplementedException();
}
protected override IEnumerable<ContentPreviewEntity> PerformGetAll(params int[] ids)
{
throw new NotImplementedException();
}
protected override IEnumerable<ContentPreviewEntity> PerformGetByQuery(IQuery<ContentPreviewEntity> query)
{
throw new NotImplementedException();
}
protected override Sql GetBaseQuery(bool isCount)
{
throw new NotImplementedException();
}
protected override string GetBaseWhereClause()
{
throw new NotImplementedException();
}
protected override IEnumerable<string> GetDeleteClauses()
{
return new List<string>();
}
protected override Guid NodeObjectTypeId
{
get { throw new NotImplementedException(); }
}
protected override void PersistDeletedItem(ContentPreviewEntity entity)
{
throw new NotImplementedException();
}
#endregion
protected override void PersistNewItem(ContentPreviewEntity entity)
{
if (entity.Content.HasIdentity == false)
{
throw new InvalidOperationException("Cannot insert a preview for a content item that has no identity");
}
var previewPoco = new PreviewXmlDto
{
NodeId = entity.Id,
Timestamp = DateTime.Now,
VersionId = entity.Version,
Xml = entity.Xml.ToString(SaveOptions.None)
};
Database.Insert(previewPoco);
}
protected override void PersistUpdatedItem(ContentPreviewEntity entity)
{
if (entity.Content.HasIdentity == false)
{
throw new InvalidOperationException("Cannot update a preview for a content item that has no identity");
}
var previewPoco = new PreviewXmlDto
{
NodeId = entity.Id,
Timestamp = DateTime.Now,
VersionId = entity.Version,
Xml = entity.Xml.ToString(SaveOptions.None)
};
Database.Update<PreviewXmlDto>(
"SET xml = @Xml, timestamp = @Timestamp WHERE nodeId = @Id AND versionId = @Version",
new
{
Xml = previewPoco.Xml,
Timestamp = previewPoco.Timestamp,
Id = previewPoco.NodeId,
Version = previewPoco.VersionId
});
}
}
#endregion
}
}

View File

@@ -14,5 +14,12 @@ namespace Umbraco.Core.Persistence.Repositories
/// <param name="xml"></param>
void AddOrUpdateContentXml(IMedia content, Func<IMedia, XElement> xml);
/// <summary>
/// Used to add/update preview xml for the content item
/// </summary>
/// <param name="content"></param>
/// <param name="xml"></param>
void AddOrUpdatePreviewXml(IMedia content, Func<IMedia, XElement> xml);
}
}

View File

@@ -62,5 +62,12 @@ namespace Umbraco.Core.Persistence.Repositories
/// <param name="xml"></param>
void AddOrUpdateContentXml(IMember content, Func<IMember, XElement> xml);
/// <summary>
/// Used to add/update preview xml for the content item
/// </summary>
/// <param name="content"></param>
/// <param name="xml"></param>
void AddOrUpdatePreviewXml(IMember content, Func<IMember, XElement> xml);
}
}

View File

@@ -22,13 +22,14 @@ namespace Umbraco.Core.Persistence.Repositories
{
private readonly IMediaTypeRepository _mediaTypeRepository;
private readonly ContentXmlRepository<IMedia> _contentXmlRepository;
private readonly ContentPreviewRepository<IMedia> _contentPreviewRepository;
public MediaRepository(IDatabaseUnitOfWork work, IMediaTypeRepository mediaTypeRepository)
: base(work)
{
_mediaTypeRepository = mediaTypeRepository;
_contentXmlRepository = new ContentXmlRepository<IMedia>(work, NullCacheProvider.Current);
_contentPreviewRepository = new ContentPreviewRepository<IMedia>(work, NullCacheProvider.Current);
EnsureUniqueNaming = true;
}
@@ -37,7 +38,7 @@ namespace Umbraco.Core.Persistence.Repositories
{
_mediaTypeRepository = mediaTypeRepository;
_contentXmlRepository = new ContentXmlRepository<IMedia>(work, NullCacheProvider.Current);
_contentPreviewRepository = new ContentPreviewRepository<IMedia>(work, NullCacheProvider.Current);
EnsureUniqueNaming = true;
}
@@ -185,6 +186,15 @@ namespace Umbraco.Core.Persistence.Repositories
_contentXmlRepository.AddOrUpdate(new ContentXmlEntity<IMedia>(contentExists, content, xml));
}
public void AddOrUpdatePreviewXml(IMedia content, Func<IMedia, XElement> xml)
{
var previewExists =
Database.ExecuteScalar<int>("SELECT COUNT(nodeId) FROM cmsPreviewXml WHERE nodeId = @Id AND versionId = @Version",
new { Id = content.Id, Version = content.Version }) != 0;
_contentPreviewRepository.AddOrUpdate(new ContentPreviewEntity<IMedia>(previewExists, content, xml));
}
protected override void PerformDeleteVersion(int id, Guid versionId)
{
Database.Delete<PreviewXmlDto>("WHERE nodeId = @Id AND versionId = @VersionId", new { Id = id, VersionId = versionId });

View File

@@ -26,6 +26,7 @@ namespace Umbraco.Core.Persistence.Repositories
private readonly IMemberTypeRepository _memberTypeRepository;
private readonly IMemberGroupRepository _memberGroupRepository;
private readonly ContentXmlRepository<IMember> _contentXmlRepository;
private readonly ContentPreviewRepository<IMember> _contentPreviewRepository;
public MemberRepository(IDatabaseUnitOfWork work, IMemberTypeRepository memberTypeRepository, IMemberGroupRepository memberGroupRepository)
: base(work)
@@ -34,6 +35,7 @@ namespace Umbraco.Core.Persistence.Repositories
_memberTypeRepository = memberTypeRepository;
_memberGroupRepository = memberGroupRepository;
_contentXmlRepository = new ContentXmlRepository<IMember>(work, NullCacheProvider.Current);
_contentPreviewRepository = new ContentPreviewRepository<IMember>(work, NullCacheProvider.Current);
}
public MemberRepository(IDatabaseUnitOfWork work, IRepositoryCacheProvider cache, IMemberTypeRepository memberTypeRepository, IMemberGroupRepository memberGroupRepository)
@@ -43,6 +45,7 @@ namespace Umbraco.Core.Persistence.Repositories
_memberTypeRepository = memberTypeRepository;
_memberGroupRepository = memberGroupRepository;
_contentXmlRepository = new ContentXmlRepository<IMember>(work, NullCacheProvider.Current);
_contentPreviewRepository = new ContentPreviewRepository<IMember>(work, NullCacheProvider.Current);
}
#region Overrides of RepositoryBase<int, IMembershipUser>
@@ -605,6 +608,15 @@ namespace Umbraco.Core.Persistence.Repositories
_contentXmlRepository.AddOrUpdate(new ContentXmlEntity<IMember>(contentExists, content, xml));
}
public void AddOrUpdatePreviewXml(IMember content, Func<IMember, XElement> xml)
{
var previewExists =
Database.ExecuteScalar<int>("SELECT COUNT(nodeId) FROM cmsPreviewXml WHERE nodeId = @Id AND versionId = @Version",
new { Id = content.Id, Version = content.Version }) != 0;
_contentPreviewRepository.AddOrUpdate(new ContentPreviewEntity<IMember>(previewExists, content, xml));
}
private IMember BuildFromDto(List<MemberReadOnlyDto> dtos)
{
if (dtos == null || dtos.Any() == false)

View File

@@ -5,6 +5,7 @@ using System.Linq;
using System.Threading;
using System.Xml.Linq;
using Umbraco.Core.Auditing;
using Umbraco.Core.Configuration;
using Umbraco.Core.Events;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Rdbms;
@@ -158,6 +159,11 @@ namespace Umbraco.Core.Services
repository.AddOrUpdate(media);
repository.AddOrUpdateContentXml(media, m => _entitySerializer.Serialize(this, _dataTypeService, m));
// generate preview for blame history?
if (UmbracoSettings.EnableGlobalPreviewStorage)
{
repository.AddOrUpdatePreviewXml(media, m => _entitySerializer.Serialize(this, _dataTypeService, m));
}
uow.Commit();
}
@@ -212,6 +218,12 @@ namespace Umbraco.Core.Services
media.CreatorId = userId;
repository.AddOrUpdate(media);
repository.AddOrUpdateContentXml(media, m => _entitySerializer.Serialize(this, _dataTypeService, m));
// generate preview for blame history?
if (UmbracoSettings.EnableGlobalPreviewStorage)
{
repository.AddOrUpdatePreviewXml(media, m => _entitySerializer.Serialize(this, _dataTypeService, m));
}
uow.Commit();
}
}
@@ -808,6 +820,11 @@ namespace Umbraco.Core.Services
media.CreatorId = userId;
repository.AddOrUpdate(media);
repository.AddOrUpdateContentXml(media, m => _entitySerializer.Serialize(this, _dataTypeService, m));
// generate preview for blame history?
if (UmbracoSettings.EnableGlobalPreviewStorage)
{
repository.AddOrUpdatePreviewXml(media, m => _entitySerializer.Serialize(this, _dataTypeService, m));
}
uow.Commit();
}
@@ -845,6 +862,11 @@ namespace Umbraco.Core.Services
media.CreatorId = userId;
repository.AddOrUpdate(media);
repository.AddOrUpdateContentXml(media, m => _entitySerializer.Serialize(this, _dataTypeService, m));
// generate preview for blame history?
if (UmbracoSettings.EnableGlobalPreviewStorage)
{
repository.AddOrUpdatePreviewXml(media, m => _entitySerializer.Serialize(this, _dataTypeService, m));
}
}
//commit the whole lot in one go
@@ -898,6 +920,11 @@ namespace Umbraco.Core.Services
repository.AddOrUpdate(media);
repository.AddOrUpdateContentXml(media, m => _entitySerializer.Serialize(this, _dataTypeService, m));
// generate preview for blame history?
if (UmbracoSettings.EnableGlobalPreviewStorage)
{
repository.AddOrUpdatePreviewXml(media, m => _entitySerializer.Serialize(this, _dataTypeService, m));
}
}
uow.Commit();

View File

@@ -5,6 +5,7 @@ using System.Threading;
using System.Web.Security;
using System.Xml.Linq;
using Umbraco.Core.Auditing;
using Umbraco.Core.Configuration;
using Umbraco.Core.Events;
using Umbraco.Core.Models;
using Umbraco.Core.Models.EntityBase;
@@ -20,6 +21,7 @@ using Umbraco.Core.Security;
namespace Umbraco.Core.Services
{
/// <summary>
/// Represents the MemberService.
/// </summary>
@@ -742,6 +744,12 @@ namespace Umbraco.Core.Services
repository.AddOrUpdate(member);
//insert the xml
repository.AddOrUpdateContentXml(member, m => _entitySerializer.Serialize(_dataTypeService, m));
// generate preview for blame history?
if (UmbracoSettings.EnableGlobalPreviewStorage)
{
repository.AddOrUpdatePreviewXml(member, m => _entitySerializer.Serialize(_dataTypeService, m));
}
uow.Commit();
}
@@ -847,6 +855,12 @@ namespace Umbraco.Core.Services
{
repository.AddOrUpdate(entity);
repository.AddOrUpdateContentXml(entity, m => _entitySerializer.Serialize(_dataTypeService, m));
// generate preview for blame history?
if (UmbracoSettings.EnableGlobalPreviewStorage)
{
repository.AddOrUpdatePreviewXml(entity, m => _entitySerializer.Serialize(_dataTypeService, m));
}
uow.Commit();
}
@@ -872,6 +886,11 @@ namespace Umbraco.Core.Services
{
repository.AddOrUpdate(member);
repository.AddOrUpdateContentXml(member, m => _entitySerializer.Serialize(_dataTypeService, m));
// generate preview for blame history?
if (UmbracoSettings.EnableGlobalPreviewStorage)
{
repository.AddOrUpdatePreviewXml(member, m => _entitySerializer.Serialize(_dataTypeService, m));
}
}
//commit the whole lot in one go

View File

@@ -190,6 +190,7 @@
<Compile Include="IO\FileSystemWrapper.cs" />
<Compile Include="MacroErrorBehaviour.cs" />
<Compile Include="Media\IImageUrlProvider.cs" />
<Compile Include="Models\ContentPreviewEntity.cs" />
<Compile Include="Models\ContentTypeBase.cs" />
<Compile Include="Models\ContentTypeCompositionBase.cs" />
<Compile Include="Models\ContentTypeExtensions.cs" />
@@ -233,6 +234,7 @@
<Compile Include="Persistence\Querying\StringPropertyMatchType.cs" />
<Compile Include="Persistence\Querying\TextColumnType.cs" />
<Compile Include="Persistence\Querying\ValuePropertyMatchType.cs" />
<Compile Include="Persistence\Repositories\ContentPreviewRepository.cs" />
<Compile Include="Persistence\Repositories\ContentXmlRepository.cs" />
<Compile Include="Persistence\Repositories\Interfaces\IMemberGroupRepository.cs" />
<Compile Include="Persistence\Repositories\NotificationsRepository.cs" />

View File

@@ -282,17 +282,7 @@ namespace umbraco.cms.businesslogic.media
base.VersionDate = MediaItem.UpdateDate;
base.Save();
XmlDocument xd = new XmlDocument();
XmlGenerate(xd);
// generate preview for blame history?
if (UmbracoSettings.EnableGlobalPreviewStorage)
{
// Version as new guid to ensure different versions are generated as media are not versioned currently!
SavePreviewXml(generateXmlWithoutSaving(xd), Guid.NewGuid());
}
FireAfterSave(e);
}
}

View File

@@ -613,16 +613,6 @@ namespace umbraco.cms.businesslogic.member
base.Save();
XmlDocument xd = new XmlDocument();
XmlGenerate(xd);
// generate preview for blame history?
if (UmbracoSettings.EnableGlobalPreviewStorage)
{
// Version as new guid to ensure different versions are generated as media are not versioned currently!
SavePreviewXml(generateXmlWithoutSaving(xd), Guid.NewGuid());
}
if (raiseEvents)
{
FireAfterSave(e);