diff --git a/src/Umbraco.Core/Models/Content.cs b/src/Umbraco.Core/Models/Content.cs index 012170cda8..1d34a56f8b 100644 --- a/src/Umbraco.Core/Models/Content.cs +++ b/src/Umbraco.Core/Models/Content.cs @@ -327,7 +327,9 @@ namespace Umbraco.Core.Models internal override void AddingEntity() { base.AddingEntity(); - Key = Guid.NewGuid(); + + if(Key == Guid.Empty) + Key = Guid.NewGuid(); } /// diff --git a/src/Umbraco.Core/Services/ContentService.cs b/src/Umbraco.Core/Services/ContentService.cs index ca8fa099fe..ce5773777a 100644 --- a/src/Umbraco.Core/Services/ContentService.cs +++ b/src/Umbraco.Core/Services/ContentService.cs @@ -77,6 +77,20 @@ namespace Umbraco.Core.Services return repository.Get(id); } + /// + /// Gets an object by its 'UniqueId' + /// + /// Guid key of the Content to retrieve + /// + public IContent GetById(Guid key) + { + var repository = RepositoryResolver.ResolveByType(_unitOfWork); + var query = Query.Builder.Where(x => x.Key == key); + var contents = repository.GetByQuery(query); + return contents.SingleOrDefault(); + } + + /// /// Gets a collection of objects by the Id of the /// @@ -740,7 +754,7 @@ namespace Umbraco.Core.Services //If a user id was passed in we use that content.CreatorId = userId; } - else if(_userService != null) + else if (UserServiceOrContext()) { var profile = _httpContext == null ? _userService.GetCurrentBackOfficeUser() @@ -766,7 +780,7 @@ namespace Umbraco.Core.Services //If a user id was passed in we use that content.WriterId = userId; } - else if (_userService != null) + else if (UserServiceOrContext()) { var profile = _httpContext == null ? _userService.GetCurrentBackOfficeUser() @@ -780,6 +794,11 @@ namespace Umbraco.Core.Services } } + private bool UserServiceOrContext() + { + return _userService != null && (HttpContext.Current != null || _httpContext != null); + } + //TODO Add method to remove versions from Content //TODO Add method to remove versions from all Content - parameters to select date-interval, ea. remove versions older then. } diff --git a/src/Umbraco.Core/Services/IContentService.cs b/src/Umbraco.Core/Services/IContentService.cs index 9549bde49b..ab60a661be 100644 --- a/src/Umbraco.Core/Services/IContentService.cs +++ b/src/Umbraco.Core/Services/IContentService.cs @@ -31,6 +31,13 @@ namespace Umbraco.Core.Services /// IContent GetById(int id); + /// + /// Gets an object by its 'UniqueId' + /// + /// Guid key of the Content to retrieve + /// + IContent GetById(Guid key); + /// /// Gets a collection of objects by the Id of the /// diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs index 46400fd748..3401bf99cb 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs @@ -295,18 +295,56 @@ namespace Umbraco.Tests.Persistence.Repositories Assert.That(result, Is.GreaterThanOrEqualTo(2)); } + [Test] + public void Can_Verify_Keys_Set() + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(); + var unitOfWork = provider.GetUnitOfWork(); + var repository = RepositoryResolver.ResolveByType(unitOfWork); + + // Act + var textpage = repository.Get(1046); + var subpage = repository.Get(1047); + + // Assert + Assert.That(textpage.Key.ToString().ToUpper(), Is.EqualTo("B58B3AD4-62C2-4E27-B1BE-837BD7C533E0")); + Assert.That(subpage.Key.ToString().ToUpper(), Is.EqualTo("FF11402B-7E53-4654-81A7-462AC2108059")); + } + + [Test] + public void Can_Get_Content_By_Guid_Key() + { + // Arrange + var provider = new PetaPocoUnitOfWorkProvider(); + var unitOfWork = provider.GetUnitOfWork(); + var repository = RepositoryResolver.ResolveByType(unitOfWork); + + // Act + var query = Query.Builder.Where(x => x.Key == new Guid("B58B3AD4-62C2-4E27-B1BE-837BD7C533E0")); + var content = repository.GetByQuery(query).SingleOrDefault(); + + // Assert + Assert.That(content, Is.Not.Null); + Assert.That(content.Id, Is.EqualTo(1046)); + + } + public void CreateTestData() { //Create and Save ContentType "umbTextpage" -> 1045 ContentType contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage", "Textpage"); + contentType.Key = new Guid("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522"); ServiceContext.ContentTypeService.Save(contentType); //Create and Save Content "Homepage" based on "umbTextpage" -> 1046 Content textpage = MockedContent.CreateSimpleContent(contentType); + textpage.Key = new Guid("B58B3AD4-62C2-4E27-B1BE-837BD7C533E0"); ServiceContext.ContentService.Save(textpage, 0); //Create and Save Content "Text Page 1" based on "umbTextpage" -> 1047 Content subpage = MockedContent.CreateSimpleContent(contentType, "Text Page 1", textpage.Id); + subpage.Key = new Guid("FF11402B-7E53-4654-81A7-462AC2108059"); ServiceContext.ContentService.Save(subpage, 0); //Create and Save Content "Text Page 1" based on "umbTextpage" -> 1048 diff --git a/src/Umbraco.Tests/Services/ContentServiceTests.cs b/src/Umbraco.Tests/Services/ContentServiceTests.cs index 48d6630488..4d41b9ba7f 100644 --- a/src/Umbraco.Tests/Services/ContentServiceTests.cs +++ b/src/Umbraco.Tests/Services/ContentServiceTests.cs @@ -47,7 +47,7 @@ namespace Umbraco.Tests.Services } [Test] - public void Can_Create_Content_Using_HttpContext() + public void Can_Create_Content_Using_HttpContext_To_Set_User() { // Arrange var userId = @@ -87,6 +87,44 @@ namespace Umbraco.Tests.Services Assert.That(content.CreatorId, Is.EqualTo(userId)); } + [Test] + public void Can_Create_Content_Without_HttpContext_To_Set_User() + { + // Arrange + var userId = + Convert.ToInt32( + DatabaseContext.Database.Insert(new UserDto + { + ContentStartId = -1, + DefaultPermissions = null, + DefaultToLiveEditing = false, + Disabled = false, + Email = "my@email.com", + Login = "editor", + MediaStartId = -1, + NoConsole = false, + Password = "1234", + Type = 3, + UserLanguage = "en", + UserName = "John Doe the Editor" + })); + + DatabaseContext.Database.Insert(new UserLoginDto + { + UserId = userId, + ContextId = new Guid("FBA996E7-D6BE-489B-B199-2B0F3D2DD826"), + Timeout = 634596443995451258 + }); + + // Act + var content = ServiceContext.ContentService.CreateContent(-1, "umbTextpage"); + + // Assert + Assert.That(content, Is.Not.Null); + Assert.That(content.HasIdentity, Is.False); + Assert.That(content.CreatorId, Is.EqualTo(0));//Default to zero/administrator + } + [Test] public void Cannot_Create_Content_With_Non_Existing_ContentType_Alias() { @@ -111,6 +149,20 @@ namespace Umbraco.Tests.Services Assert.That(content.Id, Is.EqualTo(1046)); } + [Test] + public void Can_Get_Content_By_Guid_Key() + { + // Arrange + var contentService = ServiceContext.ContentService; + + // Act + var content = contentService.GetById(new Guid("B58B3AD4-62C2-4E27-B1BE-837BD7C533E0")); + + // Assert + Assert.That(content, Is.Not.Null); + Assert.That(content.Id, Is.EqualTo(1046)); + } + [Test] public void Can_Get_Content_By_Level() { @@ -643,10 +695,12 @@ namespace Umbraco.Tests.Services //Create and Save ContentType "umbTextpage" -> 1045 ContentType contentType = MockedContentTypes.CreateSimpleContentType("umbTextpage", "Textpage"); + contentType.Key = new Guid("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522"); ServiceContext.ContentTypeService.Save(contentType); //Create and Save Content "Homepage" based on "umbTextpage" -> 1046 Content textpage = MockedContent.CreateSimpleContent(contentType); + textpage.Key = new Guid("B58B3AD4-62C2-4E27-B1BE-837BD7C533E0"); ServiceContext.ContentService.Save(textpage, 0); //Create and Save Content "Text Page 1" based on "umbTextpage" -> 1047