diff --git a/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs b/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs index de2aea0b10..0fd0fc4e76 100644 --- a/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/EntityRepository.cs @@ -49,6 +49,34 @@ namespace Umbraco.Core.Persistence.Repositories #region Query Methods + public IUmbracoEntity GetByKey(Guid key) + { + var sql = GetBaseWhere(GetBase, false, false, key); + var nodeDto = _work.Database.FirstOrDefault(sql); + if (nodeDto == null) + return null; + + var factory = new UmbracoEntityFactory(); + var entity = factory.BuildEntity(nodeDto); + + return entity; + } + + public IUmbracoEntity GetByKey(Guid key, Guid objectTypeId) + { + bool isContent = objectTypeId == new Guid(Constants.ObjectTypes.Document); + bool isMedia = objectTypeId == new Guid(Constants.ObjectTypes.Media); + var sql = GetBaseWhere(GetBase, isContent, isMedia, objectTypeId, key).Append(GetGroupBy(isContent, isMedia)); + var nodeDto = _work.Database.FirstOrDefault(sql); + if (nodeDto == null) + return null; + + var factory = new UmbracoEntityFactory(); + var entity = factory.BuildEntity(nodeDto); + + return entity; + } + public virtual IUmbracoEntity Get(int id) { var sql = GetBaseWhere(GetBase, false, false, id); @@ -239,10 +267,10 @@ namespace Umbraco.Core.Persistence.Repositories return sql; } - protected virtual Sql GetBaseWhere(Func baseQuery, bool isContent, bool isMedia, string additionWhereStatement, Guid id) + protected virtual Sql GetBaseWhere(Func baseQuery, bool isContent, bool isMedia, string additionWhereStatement, Guid nodeObjectType) { var sql = baseQuery(isContent, isMedia, additionWhereStatement) - .Where("umbracoNode.nodeObjectType = @NodeObjectType", new { NodeObjectType = id }); + .Where("umbracoNode.nodeObjectType = @NodeObjectType", new { NodeObjectType = nodeObjectType }); return sql; } @@ -254,11 +282,27 @@ namespace Umbraco.Core.Persistence.Repositories return sql; } - protected virtual Sql GetBaseWhere(Func baseQuery, bool isContent, bool isMedia, Guid objectId, int id) + protected virtual Sql GetBaseWhere(Func baseQuery, bool isContent, bool isMedia, Guid key) + { + var sql = baseQuery(isContent, isMedia, " AND umbracoNode.uniqueID = '" + key + "'") + .Where("umbracoNode.uniqueID = @UniqueID", new { UniqueID = key }) + .Append(GetGroupBy(isContent, isMedia)); + return sql; + } + + protected virtual Sql GetBaseWhere(Func baseQuery, bool isContent, bool isMedia, Guid nodeObjectType, int id) { var sql = baseQuery(isContent, isMedia, " AND umbracoNode.id = '"+ id +"'") .Where("umbracoNode.id = @Id AND umbracoNode.nodeObjectType = @NodeObjectType", - new {Id = id, NodeObjectType = objectId}); + new {Id = id, NodeObjectType = nodeObjectType}); + return sql; + } + + protected virtual Sql GetBaseWhere(Func baseQuery, bool isContent, bool isMedia, Guid nodeObjectType, Guid key) + { + var sql = baseQuery(isContent, isMedia, " AND umbracoNode.uniqueID = '" + key + "'") + .Where("umbracoNode.uniqueID = @UniqueID AND umbracoNode.nodeObjectType = @NodeObjectType", + new { UniqueID = key, NodeObjectType = nodeObjectType }); return sql; } diff --git a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IEntityRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IEntityRepository.cs index 6df0293be0..510ef18421 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Interfaces/IEntityRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Interfaces/IEntityRepository.cs @@ -7,6 +7,8 @@ namespace Umbraco.Core.Persistence.Repositories { public interface IEntityRepository : IRepository { + IUmbracoEntity GetByKey(Guid key); + IUmbracoEntity GetByKey(Guid key, Guid objectTypeId); IUmbracoEntity Get(int id); IUmbracoEntity Get(int id, Guid objectTypeId); IEnumerable GetAll(Guid objectTypeId, params int[] ids); diff --git a/src/Umbraco.Core/Services/EntityService.cs b/src/Umbraco.Core/Services/EntityService.cs index 7e103c687b..af50d81d2b 100644 --- a/src/Umbraco.Core/Services/EntityService.cs +++ b/src/Umbraco.Core/Services/EntityService.cs @@ -39,6 +39,27 @@ namespace Umbraco.Core.Services }; } + public IUmbracoEntity GetByKey(Guid key, bool loadBaseType = true) + { + if (loadBaseType) + { + using (var repository = _repositoryFactory.CreateEntityRepository(_uowProvider.GetUnitOfWork())) + { + return repository.GetByKey(key); + } + } + + //SD: TODO: Need to enable this at some stage ... just need to ask Morten what the deal is with what this does. + throw new NotSupportedException(); + + //var objectType = GetObjectType(key); + //var entityType = GetEntityType(objectType); + //var typeFullName = entityType.FullName; + //var entity = _supportedObjectTypes[typeFullName].Item2(id); + + //return entity; + } + /// /// Gets an UmbracoEntity by its Id, and optionally loads the complete object graph. /// @@ -66,6 +87,27 @@ namespace Umbraco.Core.Services return entity; } + public IUmbracoEntity GetByKey(Guid key, UmbracoObjectTypes umbracoObjectType, bool loadBaseType = true) + { + if (loadBaseType) + { + var objectTypeId = umbracoObjectType.GetGuid(); + using (var repository = _repositoryFactory.CreateEntityRepository(_uowProvider.GetUnitOfWork())) + { + return repository.GetByKey(key, objectTypeId); + } + } + + //SD: TODO: Need to enable this at some stage ... just need to ask Morten what the deal is with what this does. + throw new NotSupportedException(); + + //var entityType = GetEntityType(umbracoObjectType); + //var typeFullName = entityType.FullName; + //var entity = _supportedObjectTypes[typeFullName].Item2(id); + + //return entity; + } + /// /// Gets an UmbracoEntity by its Id and UmbracoObjectType, and optionally loads the complete object graph. /// @@ -94,6 +136,11 @@ namespace Umbraco.Core.Services return entity; } + public IUmbracoEntity GetByKey(Guid key, bool loadBaseType = true) where T : IUmbracoEntity + { + throw new NotImplementedException(); + } + /// /// Gets an UmbracoEntity by its Id and specified Type. Optionally loads the complete object graph. /// @@ -326,6 +373,22 @@ namespace Umbraco.Core.Services } } + /// + /// Gets the UmbracoObjectType from the integer id of an IUmbracoEntity. + /// + /// Unique Id of the entity + /// + public virtual UmbracoObjectTypes GetObjectType(Guid key) + { + using (var uow = _uowProvider.GetUnitOfWork()) + { + var sql = new Sql().Select("nodeObjectType").From().Where(x => x.UniqueId == key); + var nodeObjectTypeId = uow.Database.ExecuteScalar(sql); + var objectTypeId = new Guid(nodeObjectTypeId); + return UmbracoObjectTypesExtensions.GetUmbracoObjectType(objectTypeId); + } + } + /// /// Gets the UmbracoObjectType from an IUmbracoEntity. /// diff --git a/src/Umbraco.Core/Services/IEntityService.cs b/src/Umbraco.Core/Services/IEntityService.cs index c32d755c3f..e7cbece1e1 100644 --- a/src/Umbraco.Core/Services/IEntityService.cs +++ b/src/Umbraco.Core/Services/IEntityService.cs @@ -7,6 +7,18 @@ namespace Umbraco.Core.Services { public interface IEntityService { + + /// + /// Gets an UmbracoEntity by its Id, and optionally loads the complete object graph. + /// + /// + /// By default this will load the base type with a minimum set of properties. + /// + /// Unique Id of the object to retrieve + /// Optional bool to load the complete object graph when set to False. + /// An + IUmbracoEntity GetByKey(Guid key, bool loadBaseType = true); + /// /// Gets an UmbracoEntity by its Id, and optionally loads the complete object graph. /// @@ -18,6 +30,18 @@ namespace Umbraco.Core.Services /// An IUmbracoEntity Get(int id, bool loadBaseType = true); + /// + /// Gets an UmbracoEntity by its Id and UmbracoObjectType, and optionally loads the complete object graph. + /// + /// + /// By default this will load the base type with a minimum set of properties. + /// + /// Unique Id of the object to retrieve + /// UmbracoObjectType of the entity to retrieve + /// Optional bool to load the complete object graph when set to False. + /// An + IUmbracoEntity GetByKey(Guid key, UmbracoObjectTypes umbracoObjectType, bool loadBaseType = true); + /// /// Gets an UmbracoEntity by its Id and UmbracoObjectType, and optionally loads the complete object graph. /// @@ -30,6 +54,18 @@ namespace Umbraco.Core.Services /// An IUmbracoEntity Get(int id, UmbracoObjectTypes umbracoObjectType, bool loadBaseType = true); + /// + /// Gets an UmbracoEntity by its Id and specified Type. Optionally loads the complete object graph. + /// + /// + /// By default this will load the base type with a minimum set of properties. + /// + /// Type of the model to retrieve. Must be based on an + /// Unique Id of the object to retrieve + /// Optional bool to load the complete object graph when set to False. + /// An + IUmbracoEntity GetByKey(Guid key, bool loadBaseType = true) where T : IUmbracoEntity; + /// /// Gets an UmbracoEntity by its Id and specified Type. Optionally loads the complete object graph. /// diff --git a/src/Umbraco.Web.UI.Client/src/common/resources/entity.resource.js b/src/Umbraco.Web.UI.Client/src/common/resources/entity.resource.js index e1230dfae8..e8160ee2d0 100644 --- a/src/Umbraco.Web.UI.Client/src/common/resources/entity.resource.js +++ b/src/Umbraco.Web.UI.Client/src/common/resources/entity.resource.js @@ -99,6 +99,17 @@ function entityResource($q, $http, umbRequestHelper) { 'Failed to retreive entity data for id ' + id); }, + getByKey: function (key, type) { + return umbRequestHelper.resourcePromise( + $http.get( + umbRequestHelper.getApiUrl( + "entityApiBaseUrl", + "GetByKey", + [{ key: key }, { type: type }])), + 'Failed to retreive entity data for key ' + key); + }, + + /** * @ngdoc method * @name umbraco.resources.entityResource#getByIds diff --git a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/memberpicker.controller.js b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/memberpicker.controller.js index 42b936f19c..cbdfcc9654 100644 --- a/src/Umbraco.Web.UI.Client/src/views/common/dialogs/memberpicker.controller.js +++ b/src/Umbraco.Web.UI.Client/src/views/common/dialogs/memberpicker.controller.js @@ -6,7 +6,7 @@ angular.module("umbraco").controller("Umbraco.Dialogs.MemberPickerController", $scope.results = []; /** Method used for selecting a node */ - function select(text, id, entity) { + function select(text, key, entity) { $scope.showSearch = false; $scope.results = []; @@ -14,7 +14,7 @@ angular.module("umbraco").controller("Umbraco.Dialogs.MemberPickerController", $scope.oldTerm = undefined; if (dialogOptions.multiPicker) { - $scope.select(id); + $scope.select(key); } else { //if an entity has been passed in, use it @@ -23,7 +23,7 @@ angular.module("umbraco").controller("Umbraco.Dialogs.MemberPickerController", } else { //otherwise we have to get it from the server - entityResource.getById(id, "Member").then(function (ent) { + entityResource.getByKey(key, "Member").then(function (ent) { $scope.submit(ent); }); } diff --git a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/memberpicker/memberpicker.html b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/memberpicker/memberpicker.html index ff6007445e..d8558dd928 100644 --- a/src/Umbraco.Web.UI.Client/src/views/propertyeditors/memberpicker/memberpicker.html +++ b/src/Umbraco.Web.UI.Client/src/views/propertyeditors/memberpicker/memberpicker.html @@ -16,7 +16,7 @@ -