diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMemberRepository.cs index 9534aead90..c9ac555ee9 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMemberRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IMemberRepository.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using System.Xml.Linq; using Umbraco.Core.Models; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence.Querying; @@ -54,5 +55,12 @@ namespace Umbraco.Core.Persistence.Repositories Sql sql, int pageIndex, int pageSize, out int totalRecords, Func, int[]> resolveIds); + /// + /// Used to add/update published xml for the media item + /// + /// + /// + void AddOrUpdateContentXml(IMember content, Func xml); + } } \ No newline at end of file diff --git a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs index 9188f5328f..95a2f88909 100644 --- a/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/MemberRepository.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Linq.Expressions; +using System.Xml.Linq; using Umbraco.Core.Configuration; using Umbraco.Core.IO; using Umbraco.Core.Models.EntityBase; @@ -24,6 +25,7 @@ namespace Umbraco.Core.Persistence.Repositories { private readonly IMemberTypeRepository _memberTypeRepository; private readonly IMemberGroupRepository _memberGroupRepository; + private readonly ContentXmlRepository _contentXmlRepository; public MemberRepository(IDatabaseUnitOfWork work, IMemberTypeRepository memberTypeRepository, IMemberGroupRepository memberGroupRepository) : base(work) @@ -31,6 +33,7 @@ namespace Umbraco.Core.Persistence.Repositories if (memberTypeRepository == null) throw new ArgumentNullException("memberTypeRepository"); _memberTypeRepository = memberTypeRepository; _memberGroupRepository = memberGroupRepository; + _contentXmlRepository = new ContentXmlRepository(work, NullCacheProvider.Current); } public MemberRepository(IDatabaseUnitOfWork work, IRepositoryCacheProvider cache, IMemberTypeRepository memberTypeRepository, IMemberGroupRepository memberGroupRepository) @@ -39,6 +42,7 @@ namespace Umbraco.Core.Persistence.Repositories if (memberTypeRepository == null) throw new ArgumentNullException("memberTypeRepository"); _memberTypeRepository = memberTypeRepository; _memberGroupRepository = memberGroupRepository; + _contentXmlRepository = new ContentXmlRepository(work, NullCacheProvider.Current); } #region Overrides of RepositoryBase @@ -594,6 +598,13 @@ namespace Umbraco.Core.Persistence.Repositories return GetAll(resolveIds(pagedResult.Items)).ToArray(); } + public void AddOrUpdateContentXml(IMember content, Func xml) + { + var contentExists = Database.ExecuteScalar("SELECT COUNT(nodeId) FROM cmsContentXml WHERE nodeId = @Id", new { Id = content.Id }) != 0; + + _contentXmlRepository.AddOrUpdate(new ContentXmlEntity(contentExists, content, xml)); + } + private IMember BuildFromDto(List dtos) { if (dtos == null || dtos.Any() == false) diff --git a/src/Umbraco.Core/Services/MemberService.cs b/src/Umbraco.Core/Services/MemberService.cs index 306db69d6a..d42ea973d0 100644 --- a/src/Umbraco.Core/Services/MemberService.cs +++ b/src/Umbraco.Core/Services/MemberService.cs @@ -740,11 +740,9 @@ namespace Umbraco.Core.Services using (var repository = _repositoryFactory.CreateMemberRepository(uow)) { repository.AddOrUpdate(member); - uow.Commit(); - //insert the xml - var xml = _entitySerializer.Serialize(_dataTypeService, member); - CreateAndSaveMemberXml(xml, member.Id, uow.Database); + repository.AddOrUpdateContentXml(member, m => _entitySerializer.Serialize(_dataTypeService, m)); + uow.Commit(); } Saved.RaiseEvent(new SaveEventArgs(member, false), this); @@ -848,10 +846,8 @@ namespace Umbraco.Core.Services using (var repository = _repositoryFactory.CreateMemberRepository(uow)) { repository.AddOrUpdate(entity); + repository.AddOrUpdateContentXml(entity, m => _entitySerializer.Serialize(_dataTypeService, m)); uow.Commit(); - - var xml = _entitySerializer.Serialize(_dataTypeService, entity); - CreateAndSaveMemberXml(xml, entity.Id, uow.Database); } if (raiseEvents) @@ -875,16 +871,11 @@ namespace Umbraco.Core.Services foreach (var member in asArray) { repository.AddOrUpdate(member); + repository.AddOrUpdateContentXml(member, m => _entitySerializer.Serialize(_dataTypeService, m)); } //commit the whole lot in one go uow.Commit(); - - foreach (var member in asArray) - { - var xml = _entitySerializer.Serialize(_dataTypeService, member); - CreateAndSaveMemberXml(xml, member.Id, uow.Database); - } } if (raiseEvents) @@ -1143,14 +1134,7 @@ namespace Umbraco.Core.Services } } } - - private void CreateAndSaveMemberXml(XElement xml, int id, UmbracoDatabase db) - { - var poco = new ContentXmlDto { NodeId = id, Xml = xml.ToString(SaveOptions.None) }; - var exists = db.FirstOrDefault("WHERE nodeId = @Id", new { Id = id }) != null; - int result = exists ? db.Update(poco) : Convert.ToInt32(db.Insert(poco)); - } - + #region Event Handlers /// diff --git a/src/Umbraco.Tests/Services/MemberServiceTests.cs b/src/Umbraco.Tests/Services/MemberServiceTests.cs index 73b312e2bf..e8bc946f6e 100644 --- a/src/Umbraco.Tests/Services/MemberServiceTests.cs +++ b/src/Umbraco.Tests/Services/MemberServiceTests.cs @@ -7,6 +7,8 @@ using Umbraco.Core.Models.Membership; using Umbraco.Core.Models.Rdbms; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Querying; +using Umbraco.Core.Persistence.Repositories; +using Umbraco.Core.Persistence.UnitOfWork; using Umbraco.Core.Services; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.Entities; @@ -977,5 +979,23 @@ namespace Umbraco.Tests.Services Assert.IsTrue(found.IsApproved); } + [Test] + public void Ensure_Content_Xml_Created() + { + IMemberType memberType = MockedContentTypes.CreateSimpleMemberType(); + ServiceContext.MemberTypeService.Save(memberType); + + var customMember = MockedMember.CreateSimpleMember(memberType, "hello", "hello@test.com", "hello", "hello"); + ServiceContext.MemberService.Save(customMember); + + var provider = new PetaPocoUnitOfWorkProvider(); + var uow = provider.GetUnitOfWork(); + using (RepositoryResolver.Current.ResolveByType(uow)) + { + Assert.IsTrue(uow.Database.Exists(customMember.Id)); + } + + } + } } \ No newline at end of file