diff --git a/src/Umbraco.Core/Constants-ObjectTypes.cs b/src/Umbraco.Core/Constants-ObjectTypes.cs index 97213ae935..adc154174a 100644 --- a/src/Umbraco.Core/Constants-ObjectTypes.cs +++ b/src/Umbraco.Core/Constants-ObjectTypes.cs @@ -124,6 +124,11 @@ namespace Umbraco.Core /// public const string MemberGroup = "366E63B9-880F-4E13-A61C-98069B029728"; + /// + /// Guid for a Member Group object. + /// + public static readonly Guid MemberGroupGuid = new Guid(MemberGroup); + /// /// Guid for a Member Type object. /// diff --git a/src/Umbraco.Core/Services/EntityService.cs b/src/Umbraco.Core/Services/EntityService.cs index 4201891779..14ae18fb99 100644 --- a/src/Umbraco.Core/Services/EntityService.cs +++ b/src/Umbraco.Core/Services/EntityService.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; using Umbraco.Core.Cache; using Umbraco.Core.CodeAnnotations; using Umbraco.Core.Events; @@ -81,28 +80,16 @@ namespace Umbraco.Core.Services { using (var uow = UowProvider.GetUnitOfWork(readOnly:true)) { - switch (umbracoObjectType) - { - case UmbracoObjectTypes.Document: - case UmbracoObjectTypes.MemberType: - case UmbracoObjectTypes.Media: - case UmbracoObjectTypes.Template: - case UmbracoObjectTypes.MediaType: - case UmbracoObjectTypes.DocumentType: - case UmbracoObjectTypes.Member: - case UmbracoObjectTypes.DataType: - case UmbracoObjectTypes.DocumentTypeContainer: - case UmbracoObjectTypes.MemberGroup: - return uow.Database.ExecuteScalar(new Sql().Select("id").From().Where(dto => dto.UniqueId == key)); - case UmbracoObjectTypes.RecycleBin: - case UmbracoObjectTypes.Stylesheet: - case UmbracoObjectTypes.ContentItem: - case UmbracoObjectTypes.ContentItemType: - case UmbracoObjectTypes.ROOT: - case UmbracoObjectTypes.Unknown: - default: - throw new NotSupportedException(); - } + var nodeObjectType = GetNodeObjectTypeGuid(umbracoObjectType); + + var sql = new Sql() + .Select("id") + .From() + .Where( + dto => + dto.UniqueId == key && + dto.NodeObjectType == nodeObjectType); + return uow.Database.ExecuteScalar(sql); } }); return result.HasValue ? Attempt.Succeed(result.Value) : Attempt.Fail(); @@ -120,32 +107,54 @@ namespace Umbraco.Core.Services { using (var uow = UowProvider.GetUnitOfWork(readOnly:true)) { - switch (umbracoObjectType) - { - case UmbracoObjectTypes.Document: - case UmbracoObjectTypes.MemberType: - case UmbracoObjectTypes.Media: - case UmbracoObjectTypes.Template: - case UmbracoObjectTypes.MediaType: - case UmbracoObjectTypes.DocumentType: - case UmbracoObjectTypes.Member: - case UmbracoObjectTypes.DataType: - case UmbracoObjectTypes.MemberGroup: - return uow.Database.ExecuteScalar(new Sql().Select("uniqueID").From().Where(dto => dto.NodeId == id)); - case UmbracoObjectTypes.RecycleBin: - case UmbracoObjectTypes.Stylesheet: - case UmbracoObjectTypes.ContentItem: - case UmbracoObjectTypes.ContentItemType: - case UmbracoObjectTypes.ROOT: - case UmbracoObjectTypes.Unknown: - default: - throw new NotSupportedException("Unsupported object type (" + umbracoObjectType + ")."); - } + var nodeObjectType = GetNodeObjectTypeGuid(umbracoObjectType); + + var sql = new Sql() + .Select("uniqueID") + .From() + .Where( + dto => + dto.NodeId == id && + dto.NodeObjectType == nodeObjectType); + return uow.Database.ExecuteScalar(sql); } }); return result.HasValue ? Attempt.Succeed(result.Value) : Attempt.Fail(); } + private static Guid GetNodeObjectTypeGuid(UmbracoObjectTypes umbracoObjectType) + { + switch (umbracoObjectType) + { + case UmbracoObjectTypes.Document: + return Constants.ObjectTypes.DocumentGuid; + case UmbracoObjectTypes.MemberType: + return Constants.ObjectTypes.MemberTypeGuid; + case UmbracoObjectTypes.Media: + return Constants.ObjectTypes.MediaGuid; + case UmbracoObjectTypes.Template: + return Constants.ObjectTypes.TemplateTypeGuid; + case UmbracoObjectTypes.MediaType: + return Constants.ObjectTypes.MediaTypeGuid; + case UmbracoObjectTypes.DocumentType: + return Constants.ObjectTypes.DocumentTypeGuid; + case UmbracoObjectTypes.Member: + return Constants.ObjectTypes.MemberGuid; + case UmbracoObjectTypes.DataType: + return Constants.ObjectTypes.DataTypeGuid; + case UmbracoObjectTypes.MemberGroup: + return Constants.ObjectTypes.MemberGroupGuid; + case UmbracoObjectTypes.RecycleBin: + case UmbracoObjectTypes.Stylesheet: + case UmbracoObjectTypes.ContentItem: + case UmbracoObjectTypes.ContentItemType: + case UmbracoObjectTypes.ROOT: + case UmbracoObjectTypes.Unknown: + default: + throw new NotSupportedException("Unsupported object type (" + umbracoObjectType + ")."); + } + } + public IUmbracoEntity GetByKey(Guid key, bool loadBaseType = true) { if (loadBaseType) diff --git a/src/Umbraco.Tests/Services/BaseServiceTest.cs b/src/Umbraco.Tests/Services/BaseServiceTest.cs index ebd0be3b55..9c319a29a2 100644 --- a/src/Umbraco.Tests/Services/BaseServiceTest.cs +++ b/src/Umbraco.Tests/Services/BaseServiceTest.cs @@ -27,27 +27,27 @@ namespace Umbraco.Tests.Services { //NOTE Maybe not the best way to create/save test data as we are using the services, which are being tested. - //Create and Save ContentType "umbTextpage" -> 1045 + //Create and Save ContentType "umbTextpage" -> 1060 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 + //Create and Save Content "Homepage" based on "umbTextpage" -> 1061 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 + //Create and Save Content "Text Page 1" based on "umbTextpage" -> 1062 Content subpage = MockedContent.CreateSimpleContent(contentType, "Text Page 1", textpage.Id); subpage.ReleaseDate = DateTime.Now.AddMinutes(-5); subpage.ChangePublishedState(PublishedState.Saved); ServiceContext.ContentService.Save(subpage, 0); - //Create and Save Content "Text Page 1" based on "umbTextpage" -> 1048 + //Create and Save Content "Text Page 1" based on "umbTextpage" -> 1063 Content subpage2 = MockedContent.CreateSimpleContent(contentType, "Text Page 2", textpage.Id); ServiceContext.ContentService.Save(subpage2, 0); - //Create and Save Content "Text Page Deleted" based on "umbTextpage" -> 1049 + //Create and Save Content "Text Page Deleted" based on "umbTextpage" -> 1064 Content trashed = MockedContent.CreateSimpleContent(contentType, "Text Page Deleted", -20); trashed.Trashed = true; ServiceContext.ContentService.Save(trashed, 0); diff --git a/src/Umbraco.Tests/Services/EntityServiceTests.cs b/src/Umbraco.Tests/Services/EntityServiceTests.cs index de8cc7753d..656915c3f9 100644 --- a/src/Umbraco.Tests/Services/EntityServiceTests.cs +++ b/src/Umbraco.Tests/Services/EntityServiceTests.cs @@ -533,6 +533,44 @@ namespace Umbraco.Tests.Services Assert.AreEqual(mediaObjectType, UmbracoObjectTypes.MediaType); } + [Test] + public void EntityService_Can_Get_Key_For_Id() + { + var service = ServiceContext.EntityService; + var result = service.GetKeyForId(1060, UmbracoObjectTypes.DocumentType); + + Assert.IsTrue(result.Success); + Assert.AreEqual(Guid.Parse("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522"), result.Result); + } + + [Test] + public void EntityService_Cannot_Get_Key_For_Id_With_Incorrect_Object_Type() + { + var service = ServiceContext.EntityService; + var result = service.GetKeyForId(1060, UmbracoObjectTypes.MediaType); + + Assert.IsFalse(result.Success); + } + + [Test] + public void EntityService_Can_Get_Id_For_Key() + { + var service = ServiceContext.EntityService; + var result = service.GetIdForKey(Guid.Parse("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522"), UmbracoObjectTypes.DocumentType); + + Assert.IsTrue(result.Success); + Assert.AreEqual(1060, result.Result); + } + + [Test] + public void EntityService_Cannot_Get_Id_For_Key_With_Incorrect_Object_Type() + { + var service = ServiceContext.EntityService; + var result = service.GetIdForKey(Guid.Parse("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522"), UmbracoObjectTypes.MediaType); + + Assert.IsFalse(result.Success); + } + private static bool _isSetup = false; private int folderId;