From b86bfdd87b3087f9ffa7668ed713b973f4976b77 Mon Sep 17 00:00:00 2001 From: sitereactor Date: Wed, 31 Oct 2012 08:20:45 -0100 Subject: [PATCH] Refactoring usage of UOW in ContentService --- .../Models/Rdbms/DocumentTypeDto.cs | 6 +- .../Repositories/ContentTypeRepository.cs | 3 + .../Services/ContentServiceTests.cs | 26 ++++- src/Umbraco.Web/Services/ContentService.cs | 104 ++++++++---------- 4 files changed, 74 insertions(+), 65 deletions(-) diff --git a/src/Umbraco.Core/Models/Rdbms/DocumentTypeDto.cs b/src/Umbraco.Core/Models/Rdbms/DocumentTypeDto.cs index 1f6af49cba..7fbf15f00f 100644 --- a/src/Umbraco.Core/Models/Rdbms/DocumentTypeDto.cs +++ b/src/Umbraco.Core/Models/Rdbms/DocumentTypeDto.cs @@ -9,13 +9,13 @@ namespace Umbraco.Core.Models.Rdbms internal class DocumentTypeDto { [Column("contentTypeNodeId")] - [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_cmsDocumentType", OnColumns = "[contentTypeNodeId], [templateNodeId]")] - [ForeignKey(typeof(ContentTypeDto))] + [PrimaryKeyColumn(AutoIncrement = false, Name = "PK_cmsDocumentType", OnColumns = "contentTypeNodeId, templateNodeId")] + [ForeignKey(typeof(ContentTypeDto), Column = "nodeId")] [ForeignKey(typeof(NodeDto))] public int ContentTypeNodeId { get; set; } [Column("templateNodeId")] - [ForeignKey(typeof(TemplateDto))] + /*[ForeignKey(typeof(TemplateDto))]*/ public int TemplateNodeId { get; set; } [Column("IsDefault")] diff --git a/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs index 863fef29c6..8977e66911 100644 --- a/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/ContentTypeRepository.cs @@ -159,6 +159,9 @@ namespace Umbraco.Core.Persistence.Repositories var dto = factory.BuildDto(entity); PersistNewBaseContentType(dto.ContentTypeDto, entity); + //Inserts data into the cmsDocumentType table - currently only the ContentTypeNodeId is added/updated + dto.ContentTypeNodeId = entity.Id; + Database.Insert(dto); //TODO Insert new DocumentType entries - NOTE only seems relevant as long as Templates resides in the DB? //TODO Insert allowed Templates diff --git a/src/Umbraco.Tests/Services/ContentServiceTests.cs b/src/Umbraco.Tests/Services/ContentServiceTests.cs index 618cec7853..40410b5fc5 100644 --- a/src/Umbraco.Tests/Services/ContentServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentServiceTests.cs @@ -49,7 +49,7 @@ namespace Umbraco.Tests.Services var contentService = ServiceContext.ContentService; // Act - IContent content = contentService.GetById(1046); + var content = contentService.GetById(1046); // Assert Assert.That(content, Is.Not.Null); @@ -63,16 +63,28 @@ namespace Umbraco.Tests.Services var contentService = ServiceContext.ContentService; // Act - IEnumerable contents = contentService.GetByLevel(1); + var contents = contentService.GetByLevel(2); // Assert Assert.That(contents, Is.Not.Null); Assert.That(contents.Any(), Is.True); - Assert.That(contents.Count(), Is.EqualTo(1)); + Assert.That(contents.Count(), Is.GreaterThanOrEqualTo(2)); } + [Test] public void Can_Get_Children_Of_Content_Id() - { } + { + // Arrange + var contentService = ServiceContext.ContentService; + + // Act + var contents = contentService.GetChildren(1046); + + // Assert + Assert.That(contents, Is.Not.Null); + Assert.That(contents.Any(), Is.True); + Assert.That(contents.Count(), Is.GreaterThanOrEqualTo(2)); + } public void Can_Get_All_Versions_Of_Content() { } @@ -142,7 +154,11 @@ namespace Umbraco.Tests.Services //Create and Save Content "Text Page 1" based on "umbTextpage" -> 1047 Content subpage = MockedContent.CreateTextpageContent(contentType, "Text Page 1", textpage.Id); - ServiceContext.ContentService.Save(subpage, 0);//This content object is currently not saved!? Have to figure out why + ServiceContext.ContentService.Save(subpage, 0); + + //Create and Save Content "Text Page 1" based on "umbTextpage" -> 1048 + Content subpage2 = MockedContent.CreateTextpageContent(contentType, "Text Page 2", textpage.Id); + ServiceContext.ContentService.Save(subpage2, 0); } } } \ No newline at end of file diff --git a/src/Umbraco.Web/Services/ContentService.cs b/src/Umbraco.Web/Services/ContentService.cs index 676a7dcb8a..6b63fa5624 100644 --- a/src/Umbraco.Web/Services/ContentService.cs +++ b/src/Umbraco.Web/Services/ContentService.cs @@ -46,8 +46,7 @@ namespace Umbraco.Web.Services /// public IContent CreateContent(int parentId, string contentTypeAlias) { - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); var query = Query.Builder.Where(x => x.Alias == contentTypeAlias); var contentTypes = repository.GetByQuery(query); @@ -57,7 +56,7 @@ namespace Umbraco.Web.Services var contentType = contentTypes.First(); if (contentType == null) - throw new Exception(string.Format("No ContentType matching the passed in Alias: '{0}' was found", contentTypeAlias)); + throw new Exception(string.Format("ContentType matching the passed in Alias: '{0}' was null", contentTypeAlias)); return new Content(parentId, contentType); } @@ -69,8 +68,7 @@ namespace Umbraco.Web.Services /// public IContent GetById(int id) { - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); return repository.Get(id); } @@ -81,8 +79,7 @@ namespace Umbraco.Web.Services /// An Enumerable list of objects public IEnumerable GetContentOfContentType(int id) { - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); var query = Query.Builder.Where(x => x.ContentTypeId == id); var contents = repository.GetByQuery(query); @@ -97,8 +94,7 @@ namespace Umbraco.Web.Services /// An Enumerable list of objects public IEnumerable GetByLevel(int level) { - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); var query = Query.Builder.Where(x => x.Level == level); var contents = repository.GetByQuery(query); @@ -113,8 +109,7 @@ namespace Umbraco.Web.Services /// An Enumerable list of objects public IEnumerable GetChildren(int id) { - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); var query = Query.Builder.Where(x => x.ParentId == id); var contents = repository.GetByQuery(query); @@ -129,8 +124,7 @@ namespace Umbraco.Web.Services /// An Enumerable list of objects public IEnumerable GetVersions(int id) { - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); var versions = repository.GetAllVersions(id); return versions; } @@ -141,8 +135,7 @@ namespace Umbraco.Web.Services /// An Enumerable list of objects public IEnumerable GetRootContent() { - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); var query = Query.Builder.Where(x => x.ParentId == -1); var contents = repository.GetByQuery(query); @@ -156,8 +149,7 @@ namespace Umbraco.Web.Services /// An Enumerable list of objects public IEnumerable GetContentForExpiration() { - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); var query = Query.Builder.Where(x => x.Published == true && x.ExpireDate != null && x.ExpireDate.Value <= DateTime.Now); var contents = repository.GetByQuery(query); @@ -171,8 +163,7 @@ namespace Umbraco.Web.Services /// An Enumerable list of objects public IEnumerable GetContentForRelease() { - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); var query = Query.Builder.Where(x => x.Published == true && x.ReleaseDate != null && x.ReleaseDate.Value <= DateTime.Now); var contents = repository.GetByQuery(query); @@ -186,8 +177,7 @@ namespace Umbraco.Web.Services /// An Enumerable list of objects public IEnumerable GetContentInRecycleBin() { - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); var query = Query.Builder.Where(x => x.ParentId == -20); var contents = repository.GetByQuery(query); @@ -202,8 +192,7 @@ namespace Umbraco.Web.Services /// True if publishing succeeded, otherwise False public bool RePublishAll(int userId) { - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); var list = new List(); @@ -228,7 +217,7 @@ namespace Umbraco.Web.Services repository.AddOrUpdate(item); } - unitOfWork.Commit(); + _unitOfWork.Commit(); //TODO Change this so we can avoid a depencency to the horrible library method / umbraco.content (singleton) class. global::umbraco.library.RefreshContent(); @@ -256,8 +245,7 @@ namespace Umbraco.Web.Services /// True if publishing succeeded, otherwise False public bool PublishWithChildren(IContent content, int userId) { - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); //Check if parent is published - if parent isn't published this Content cannot be published var parent = GetById(content.ParentId); @@ -293,7 +281,7 @@ namespace Umbraco.Web.Services repository.AddOrUpdate(item); } - unitOfWork.Commit(); + _unitOfWork.Commit(); //TODO Change this so we can avoid a depencency to the horrible library method / umbraco.content (singleton) class. //TODO Need to investigate if it will also update the cache for children of the Content object @@ -311,15 +299,14 @@ namespace Umbraco.Web.Services /// True if unpublishing succeeded, otherwise False public bool UnPublish(IContent content, int userId) { - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); var unpublished = _publishingStrategy.UnPublish(content, userId); if (unpublished) { repository.AddOrUpdate(content); - unitOfWork.Commit(); + _unitOfWork.Commit(); //TODO Change this so we can avoid a depencency to the horrible library method / umbraco.content class. global::umbraco.library.UnPublishSingleNode(content.Id); @@ -362,8 +349,7 @@ namespace Umbraco.Web.Services /// True if publishing succeeded, otherwise False public bool SaveAndPublish(IContent content, int userId) { - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); //Check if parent is published - if parent isn't published this Content cannot be published var parent = GetById(content.ParentId); @@ -389,7 +375,7 @@ namespace Umbraco.Web.Services if (published) { repository.AddOrUpdate(content); - unitOfWork.Commit(); + _unitOfWork.Commit(); //TODO Change this so we can avoid a depencency to the horrible library method / umbraco.content (singleton) class. global::umbraco.library.UpdateDocumentCache(content.Id); @@ -405,7 +391,6 @@ namespace Umbraco.Web.Services /// Id of the User saving the Content public void Save(IContent content, int userId) { - //var unitOfWork = _provider.GetUnitOfWork(); var repository = RepositoryResolver.ResolveByType(_unitOfWork); repository.AddOrUpdate(content); _unitOfWork.Commit(); @@ -418,13 +403,12 @@ namespace Umbraco.Web.Services /// Id of the User saving the Content public void Save(IEnumerable contents, int userId) { - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); foreach (var content in contents) { repository.AddOrUpdate(content); } - unitOfWork.Commit(); + _unitOfWork.Commit(); } /// @@ -434,8 +418,7 @@ namespace Umbraco.Web.Services /// Id of the public void DeleteContentOfType(int contentTypeId) { - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); //NOTE What about content that has the contenttype as part of its composition? var query = Query.Builder.Where(x => x.ContentTypeId == contentTypeId); @@ -447,7 +430,7 @@ namespace Umbraco.Web.Services repository.AddOrUpdate(content); } - unitOfWork.Commit(); + _unitOfWork.Commit(); } /// @@ -461,10 +444,9 @@ namespace Umbraco.Web.Services //TODO Ensure that content is unpublished when deleted //TODO This method should handle/react to errors when there is a constraint issue with the content being deleted //TODO Children should either be deleted or moved to the recycle bin - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); repository.Delete(content); - unitOfWork.Commit(); + _unitOfWork.Commit(); } /// @@ -477,23 +459,34 @@ namespace Umbraco.Web.Services { //TODO If content item has children those should also be moved to the recycle bin //TODO Unpublish deleted content + children - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); ((Content)content).ChangeTrashedState(true); repository.AddOrUpdate(content); - unitOfWork.Commit(); + _unitOfWork.Commit(); } /// - /// Moves an object to a new location + /// Moves an object to a new location by changing its parent id. /// + /// + /// If the object is already published it will be + /// published after being moved to its new location. Otherwise it'll just + /// be saved with a new parent id. + /// /// The to move /// Id of the Content's new Parent /// Id of the User moving the Content public void Move(IContent content, int parentId, int userId) { content.ParentId = parentId; - SaveAndPublish(content, userId); + if(content.Published) + { + SaveAndPublish(content, userId); + } + else + { + Save(content, userId); + } } /// @@ -501,8 +494,7 @@ namespace Umbraco.Web.Services /// public void EmptyRecycleBin() { - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); var query = Query.Builder.Where(x => x.ParentId == -20); var contents = repository.GetByQuery(query); @@ -511,7 +503,7 @@ namespace Umbraco.Web.Services { repository.Delete(content); } - unitOfWork.Commit(); + _unitOfWork.Commit(); } /// @@ -527,11 +519,10 @@ namespace Umbraco.Web.Services var copy = ((Content) content).Clone(); copy.ParentId = parentId; - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); repository.AddOrUpdate(copy); - unitOfWork.Commit(); + _unitOfWork.Commit(); return copy; } @@ -570,12 +561,11 @@ namespace Umbraco.Web.Services public IContent Rollback(int id, Guid versionId, int userId) { //TODO Need to test if this actually works - var unitOfWork = _provider.GetUnitOfWork(); - var repository = RepositoryResolver.ResolveByType(unitOfWork); + var repository = RepositoryResolver.ResolveByType(_unitOfWork); var content = repository.GetByVersion(id, versionId); repository.AddOrUpdate(content); - unitOfWork.Commit(); + _unitOfWork.Commit(); return content; }