From d23933a5b1be58c3a2baa34e2acfda159a093c8a Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 15 Jan 2018 11:32:30 +0100 Subject: [PATCH] DataType refactoring preparation - Entity refactoring --- src/Umbraco.Core/Cache/CacheRefresherBase.cs | 2 +- .../Cache/DeepCloneRuntimeCacheProvider.cs | 2 +- .../Cache/DefaultRepositoryCachePolicy.cs | 2 +- .../Cache/FullDataSetRepositoryCachePolicy.cs | 2 +- .../Cache/IRepositoryCachePolicy.cs | 2 +- .../Cache/NoCacheRepositoryCachePolicy.cs | 2 +- .../Cache/RepositoryCachePolicyBase.cs | 2 +- .../SingleItemsOnlyRepositoryCachePolicy.cs | 2 +- .../Collections/DeepCloneableList.cs | 2 +- .../Events/CancellableObjectEventArgs.cs | 1 - .../Events/QueuingEventDispatcherBase.cs | 2 +- .../Migrations/Install/DatabaseDataCreator.cs | 48 +- src/Umbraco.Core/Models/AuditItem.cs | 4 +- src/Umbraco.Core/Models/ContentBase.cs | 137 +-- src/Umbraco.Core/Models/ContentExtensions.cs | 2 +- src/Umbraco.Core/Models/ContentTypeBase.cs | 136 +-- src/Umbraco.Core/Models/ContentTypeSort.cs | 2 +- src/Umbraco.Core/Models/DataType.cs | 117 +-- src/Umbraco.Core/Models/DictionaryItem.cs | 4 +- .../Models/DictionaryTranslation.cs | 4 +- .../{EntityBase => Entities}/BeingDirty.cs | 2 +- .../BeingDirtyBase.cs | 3 +- .../Models/Entities/ContentEntitySlim.cs | 17 + .../Models/Entities/DocumentEntitySlim.cs | 14 + .../{EntityBase => Entities}/EntityBase.cs | 2 +- .../Models/Entities/EntitySlim.cs | 220 +++++ .../{EntityBase => Entities}/ICanBeDirty.cs | 60 +- .../Models/Entities/IContentEntitySlim.cs | 23 + .../Models/Entities/IDocumentEntitySlim.cs | 18 + .../{EntityBase => Entities}/IEntity.cs | 91 +- .../Models/Entities/IEntitySlim.cs | 25 + .../IRememberBeingDirty.cs | 66 +- .../{EntityBase => Entities}/ITreeEntity.cs | 23 +- .../Models/Entities/IUmbracoEntity.cs | 29 + .../{EntityBase => Entities}/IValueObject.cs | 22 +- .../Models/Entities/TreeEntityBase.cs | 124 +++ .../TreeEntityPath.cs | 2 +- .../Models/EntityBase/IUmbracoEntity.cs | 34 - src/Umbraco.Core/Models/EntityContainer.cs | 33 +- src/Umbraco.Core/Models/EntityExtensions.cs | 7 +- src/Umbraco.Core/Models/File.cs | 4 +- src/Umbraco.Core/Models/Folder.cs | 4 +- src/Umbraco.Core/Models/IContentBase.cs | 2 +- src/Umbraco.Core/Models/IContentTypeBase.cs | 8 +- src/Umbraco.Core/Models/IDataType.cs | 2 +- src/Umbraco.Core/Models/IDictionaryItem.cs | 2 +- .../Models/IDictionaryTranslation.cs | 2 +- src/Umbraco.Core/Models/IDomain.cs | 2 +- src/Umbraco.Core/Models/IFile.cs | 2 +- src/Umbraco.Core/Models/ILanguage.cs | 2 +- src/Umbraco.Core/Models/IMacro.cs | 2 +- src/Umbraco.Core/Models/IMacroProperty.cs | 2 +- src/Umbraco.Core/Models/IMemberGroup.cs | 2 +- src/Umbraco.Core/Models/IMigrationEntry.cs | 2 +- src/Umbraco.Core/Models/IRedirectUrl.cs | 2 +- src/Umbraco.Core/Models/IRelation.cs | 2 +- src/Umbraco.Core/Models/IRelationType.cs | 2 +- .../Models/IServerRegistration.cs | 2 +- src/Umbraco.Core/Models/ITag.cs | 2 +- src/Umbraco.Core/Models/ITemplate.cs | 2 +- .../Models/Identity/BackOfficeIdentityUser.cs | 2 +- .../Models/Identity/IIdentityUserLogin.cs | 2 +- .../Models/Identity/IdentityUserLogin.cs | 4 +- src/Umbraco.Core/Models/Language.cs | 4 +- src/Umbraco.Core/Models/Macro.cs | 4 +- src/Umbraco.Core/Models/MacroProperty.cs | 4 +- src/Umbraco.Core/Models/MemberGroup.cs | 4 +- .../Models/Membership/ContentPermissionSet.cs | 2 +- .../Models/Membership/IMembershipUser.cs | 2 +- src/Umbraco.Core/Models/Membership/IUser.cs | 2 +- .../Models/Membership/IUserGroup.cs | 2 +- .../Models/Membership/IUserType.cs | 2 +- src/Umbraco.Core/Models/Membership/User.cs | 4 +- .../Models/Membership/UserGroup.cs | 4 +- .../Models/Membership/UserType.cs | 4 +- src/Umbraco.Core/Models/MigrationEntry.cs | 4 +- src/Umbraco.Core/Models/ObjectTypes.cs | 163 ++++ .../Models/PathValidationExtensions.cs | 115 +++ src/Umbraco.Core/Models/Property.cs | 4 +- src/Umbraco.Core/Models/PropertyGroup.cs | 4 +- .../Models/PropertyGroupCollection.cs | 1 - src/Umbraco.Core/Models/PropertyType.cs | 4 +- src/Umbraco.Core/Models/PublicAccessEntry.cs | 4 +- src/Umbraco.Core/Models/PublicAccessRule.cs | 4 +- src/Umbraco.Core/Models/RedirectUrl.cs | 4 +- src/Umbraco.Core/Models/Relation.cs | 4 +- src/Umbraco.Core/Models/RelationType.cs | 4 +- src/Umbraco.Core/Models/ServerRegistration.cs | 4 +- src/Umbraco.Core/Models/StylesheetProperty.cs | 2 +- src/Umbraco.Core/Models/Tag.cs | 4 +- src/Umbraco.Core/Models/Task.cs | 4 +- src/Umbraco.Core/Models/TaskType.cs | 4 +- src/Umbraco.Core/Models/Template.cs | 1 - src/Umbraco.Core/Models/UmbracoDomain.cs | 4 +- src/Umbraco.Core/Models/UmbracoEntity.cs | 251 ------ .../Models/UmbracoEntityExtensions.cs | 143 +-- .../Models/UmbracoObjectTypesExtensions.cs | 138 --- src/Umbraco.Core/Models/UserExtensions.cs | 3 +- .../Persistence/Dtos/DataTypeDto.cs | 2 +- .../Factories/ContentTypeFactory.cs | 2 +- .../Persistence/Factories/DataTypeFactory.cs | 4 +- .../Factories/PropertyGroupFactory.cs | 2 +- .../Persistence/Factories/TemplateFactory.cs | 2 +- .../Persistence/Mappers/DataTypeMapper.cs | 2 +- .../Persistence/Mappers/MemberMapper.cs | 2 +- .../Persistence/Mappers/PropertyTypeMapper.cs | 2 +- .../Mappers/UmbracoEntityMapper.cs | 2 +- .../Querying/ModelToSqlExpressionVisitor.cs | 2 +- .../Repositories/IContentRepository.cs | 2 +- .../Repositories/IEntityRepository.cs | 50 +- .../Repositories/INotificationsRepository.cs | 2 +- .../Implement/ContentRepositoryBase.cs | 2 +- .../Implement/ContentTypeRepository.cs | 1 - .../Implement/ContentTypeRepositoryBase.cs | 6 +- .../Implement/DataTypeRepository.cs | 2 +- .../Implement/DictionaryRepository.cs | 2 +- .../Implement/DocumentRepository.cs | 1 - .../Implement/EntityContainerRepository.cs | 1 - .../Implement/EntityRepository.cs | 107 +-- .../Implement/ExternalLoginRepository.cs | 2 +- .../Repositories/Implement/FileRepository.cs | 2 +- .../Implement/LanguageRepository.cs | 2 +- .../Repositories/Implement/MacroRepository.cs | 2 +- .../Repositories/Implement/MediaRepository.cs | 1 - .../Implement/MemberRepository.cs | 1 - .../Implement/NPocoRepositoryBase.cs | 2 +- .../Implement/NotificationsRepository.cs | 2 +- .../Implement/PermissionRepository.cs | 2 +- .../Implement/RelationRepository.cs | 2 +- .../Implement/RelationTypeRepository.cs | 2 +- .../Implement/RepositoryBaseOfTIdTEntity.cs | 2 +- .../Implement/SimpleGetRepository.cs | 2 +- .../Repositories/Implement/TagRepository.cs | 2 +- .../Implement/TemplateRepository.cs | 6 +- .../Implement/UserGroupRepository.cs | 2 +- .../Repositories/Implement/UserRepository.cs | 2 +- .../PropertyEditors/PropertyEditor.cs | 21 +- .../Security/BackOfficeUserStore.cs | 1 - .../Security/BackOfficeUserValidator.cs | 1 - src/Umbraco.Core/Services/IEntityService.cs | 411 ++++----- .../Services/INotificationService.cs | 2 +- src/Umbraco.Core/Services/IRelationService.cs | 2 +- ...peServiceBaseOfTRepositoryTItemTService.cs | 7 +- .../Services/Implement/DataTypeService.cs | 9 +- .../Services/Implement/EntityService.cs | 831 ++++++++---------- .../Services/Implement/NotificationService.cs | 2 +- .../Services/Implement/PackagingService.cs | 4 +- .../Services/Implement/RelationService.cs | 18 +- src/Umbraco.Core/Sync/IServerAddress.cs | 4 +- src/Umbraco.Core/UdiGetterExtensions.cs | 2 +- src/Umbraco.Core/Umbraco.Core.csproj | 31 +- .../DeepCloneRuntimeCacheProviderTests.cs | 2 +- src/Umbraco.Tests/Models/Collections/Item.cs | 2 +- src/Umbraco.Tests/Models/ContentTests.cs | 2 +- src/Umbraco.Tests/Models/ContentTypeTests.cs | 2 +- src/Umbraco.Tests/Models/LightEntityTest.cs | 48 + src/Umbraco.Tests/Models/MacroTests.cs | 2 +- src/Umbraco.Tests/Models/MemberTests.cs | 2 +- .../Models/PathValidationTests.cs | 139 +++ .../Models/UmbracoEntityTests.cs | 266 ------ .../Models/UserExtensionsTests.cs | 2 +- .../Persistence/Mappers/DataTypeMapperTest.cs | 2 +- .../Querying/ContentTypeSqlMappingTests.cs | 2 +- .../Repositories/ContentTypeRepositoryTest.cs | 2 +- .../Repositories/MediaRepositoryTest.cs | 2 +- .../NotificationsRepositoryTest.cs | 2 +- .../Scoping/ScopedNuCacheTests.cs | 7 +- .../Services/EntityServiceTests.cs | 27 +- .../Services/MemberServiceTests.cs | 2 +- .../TestHelpers/Entities/MockedEntity.cs | 2 +- src/Umbraco.Tests/TestHelpers/TestHelper.cs | 2 +- src/Umbraco.Tests/TestHelpers/TestObjects.cs | 2 - src/Umbraco.Tests/Umbraco.Tests.csproj | 3 +- .../Controllers/ContentControllerUnitTests.cs | 2 +- ...terAllowedOutgoingContentAttributeTests.cs | 2 +- .../Controllers/MediaControllerUnitTests.cs | 2 +- .../UserEditorAuthorizationHelperTests.cs | 2 +- .../Web/TemplateUtilitiesTests.cs | 4 +- .../Editors/DataTypeValidateAttribute.cs | 1 - src/Umbraco.Web/Editors/EntityController.cs | 6 +- src/Umbraco.Web/Editors/MediaController.cs | 6 +- .../Editors/MediaTypeController.cs | 5 +- .../EnsureListViewDataTypeIsCreated.cs | 6 +- .../Models/Mapping/EntityMapperProfile.cs | 16 +- .../Models/Mapping/EntityProfileExtensions.cs | 2 +- .../Models/Mapping/UserMapperProfile.cs | 13 +- src/Umbraco.Web/Models/Trees/MenuItem.cs | 2 +- .../NotificationServiceExtensions.cs | 2 +- .../Routing/NotFoundHandlerHelper.cs | 2 +- src/Umbraco.Web/Routing/UrlProvider.cs | 8 +- src/Umbraco.Web/Security/MembershipHelper.cs | 2 +- .../Strategies/NotificationsComponent.cs | 2 +- .../Trees/ContentBlueprintTreeController.cs | 6 +- .../Trees/ContentTreeController.cs | 43 +- .../Trees/ContentTreeControllerBase.cs | 35 +- .../Trees/ContentTypeTreeController.cs | 13 +- .../Trees/DataTypeTreeController.cs | 6 +- .../Trees/DictionaryTreeController.cs | 3 +- .../Trees/LanguageTreeController.cs | 3 +- src/Umbraco.Web/Trees/MacrosTreeController.cs | 3 +- src/Umbraco.Web/Trees/MediaTreeController.cs | 18 +- .../Trees/MediaTypeTreeController.cs | 8 +- src/Umbraco.Web/Trees/MemberTreeController.cs | 2 +- .../Trees/RelationTypeTreeController.cs | 3 +- .../Trees/TemplatesTreeController.cs | 9 +- src/Umbraco.Web/Trees/TreeControllerBase.cs | 11 +- .../UI/Pages/UmbracoEnsuredPage.cs | 3 +- src/Umbraco.Web/UmbracoHelper.cs | 6 +- .../EnsureUserPermissionForMediaAttribute.cs | 2 +- src/Umbraco.Web/_Legacy/BusinessLogic/Task.cs | 2 +- .../umbraco/Trees/BaseTree.cs | 1 - .../umbraco/dialogs/notifications.aspx.cs | 2 +- .../umbraco/dialogs/sendToTranslation.aspx.cs | 2 +- 213 files changed, 2149 insertions(+), 2478 deletions(-) rename src/Umbraco.Core/Models/{EntityBase => Entities}/BeingDirty.cs (97%) rename src/Umbraco.Core/Models/{EntityBase => Entities}/BeingDirtyBase.cs (98%) create mode 100644 src/Umbraco.Core/Models/Entities/ContentEntitySlim.cs create mode 100644 src/Umbraco.Core/Models/Entities/DocumentEntitySlim.cs rename src/Umbraco.Core/Models/{EntityBase => Entities}/EntityBase.cs (99%) create mode 100644 src/Umbraco.Core/Models/Entities/EntitySlim.cs rename src/Umbraco.Core/Models/{EntityBase => Entities}/ICanBeDirty.cs (91%) create mode 100644 src/Umbraco.Core/Models/Entities/IContentEntitySlim.cs create mode 100644 src/Umbraco.Core/Models/Entities/IDocumentEntitySlim.cs rename src/Umbraco.Core/Models/{EntityBase => Entities}/IEntity.cs (91%) create mode 100644 src/Umbraco.Core/Models/Entities/IEntitySlim.cs rename src/Umbraco.Core/Models/{EntityBase => Entities}/IRememberBeingDirty.cs (94%) rename src/Umbraco.Core/Models/{EntityBase => Entities}/ITreeEntity.cs (69%) create mode 100644 src/Umbraco.Core/Models/Entities/IUmbracoEntity.cs rename src/Umbraco.Core/Models/{EntityBase => Entities}/IValueObject.cs (79%) create mode 100644 src/Umbraco.Core/Models/Entities/TreeEntityBase.cs rename src/Umbraco.Core/Models/{EntityBase => Entities}/TreeEntityPath.cs (90%) delete mode 100644 src/Umbraco.Core/Models/EntityBase/IUmbracoEntity.cs create mode 100644 src/Umbraco.Core/Models/ObjectTypes.cs create mode 100644 src/Umbraco.Core/Models/PathValidationExtensions.cs delete mode 100644 src/Umbraco.Core/Models/UmbracoEntity.cs delete mode 100644 src/Umbraco.Core/Models/UmbracoObjectTypesExtensions.cs create mode 100644 src/Umbraco.Tests/Models/LightEntityTest.cs create mode 100644 src/Umbraco.Tests/Models/PathValidationTests.cs delete mode 100644 src/Umbraco.Tests/Models/UmbracoEntityTests.cs diff --git a/src/Umbraco.Core/Cache/CacheRefresherBase.cs b/src/Umbraco.Core/Cache/CacheRefresherBase.cs index bb0aa9f589..dbb0c6cc81 100644 --- a/src/Umbraco.Core/Cache/CacheRefresherBase.cs +++ b/src/Umbraco.Core/Cache/CacheRefresherBase.cs @@ -1,7 +1,7 @@ using System; using Umbraco.Core.Events; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Sync; -using Umbraco.Core.Models.EntityBase; namespace Umbraco.Core.Cache { diff --git a/src/Umbraco.Core/Cache/DeepCloneRuntimeCacheProvider.cs b/src/Umbraco.Core/Cache/DeepCloneRuntimeCacheProvider.cs index 0c6fd1127f..255d7b526d 100644 --- a/src/Umbraco.Core/Cache/DeepCloneRuntimeCacheProvider.cs +++ b/src/Umbraco.Core/Cache/DeepCloneRuntimeCacheProvider.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Web.Caching; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Cache { diff --git a/src/Umbraco.Core/Cache/DefaultRepositoryCachePolicy.cs b/src/Umbraco.Core/Cache/DefaultRepositoryCachePolicy.cs index dde212988f..8387f547d3 100644 --- a/src/Umbraco.Core/Cache/DefaultRepositoryCachePolicy.cs +++ b/src/Umbraco.Core/Cache/DefaultRepositoryCachePolicy.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Scoping; namespace Umbraco.Core.Cache diff --git a/src/Umbraco.Core/Cache/FullDataSetRepositoryCachePolicy.cs b/src/Umbraco.Core/Cache/FullDataSetRepositoryCachePolicy.cs index 44eb00d5b9..8cef4e0296 100644 --- a/src/Umbraco.Core/Cache/FullDataSetRepositoryCachePolicy.cs +++ b/src/Umbraco.Core/Cache/FullDataSetRepositoryCachePolicy.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using Umbraco.Core.Collections; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Scoping; namespace Umbraco.Core.Cache diff --git a/src/Umbraco.Core/Cache/IRepositoryCachePolicy.cs b/src/Umbraco.Core/Cache/IRepositoryCachePolicy.cs index e0a95290c6..305ed00f9a 100644 --- a/src/Umbraco.Core/Cache/IRepositoryCachePolicy.cs +++ b/src/Umbraco.Core/Cache/IRepositoryCachePolicy.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Scoping; namespace Umbraco.Core.Cache diff --git a/src/Umbraco.Core/Cache/NoCacheRepositoryCachePolicy.cs b/src/Umbraco.Core/Cache/NoCacheRepositoryCachePolicy.cs index 035a9967e4..a3e7335d7f 100644 --- a/src/Umbraco.Core/Cache/NoCacheRepositoryCachePolicy.cs +++ b/src/Umbraco.Core/Cache/NoCacheRepositoryCachePolicy.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Scoping; namespace Umbraco.Core.Cache diff --git a/src/Umbraco.Core/Cache/RepositoryCachePolicyBase.cs b/src/Umbraco.Core/Cache/RepositoryCachePolicyBase.cs index 6c656257a2..2d21d410a7 100644 --- a/src/Umbraco.Core/Cache/RepositoryCachePolicyBase.cs +++ b/src/Umbraco.Core/Cache/RepositoryCachePolicyBase.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Scoping; namespace Umbraco.Core.Cache diff --git a/src/Umbraco.Core/Cache/SingleItemsOnlyRepositoryCachePolicy.cs b/src/Umbraco.Core/Cache/SingleItemsOnlyRepositoryCachePolicy.cs index a4bb63706a..d89524d4f9 100644 --- a/src/Umbraco.Core/Cache/SingleItemsOnlyRepositoryCachePolicy.cs +++ b/src/Umbraco.Core/Cache/SingleItemsOnlyRepositoryCachePolicy.cs @@ -1,4 +1,4 @@ -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Scoping; namespace Umbraco.Core.Cache diff --git a/src/Umbraco.Core/Collections/DeepCloneableList.cs b/src/Umbraco.Core/Collections/DeepCloneableList.cs index d0eb7db414..4853f89560 100644 --- a/src/Umbraco.Core/Collections/DeepCloneableList.cs +++ b/src/Umbraco.Core/Collections/DeepCloneableList.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Collections { diff --git a/src/Umbraco.Core/Events/CancellableObjectEventArgs.cs b/src/Umbraco.Core/Events/CancellableObjectEventArgs.cs index c2998352c0..748ecb31ed 100644 --- a/src/Umbraco.Core/Events/CancellableObjectEventArgs.cs +++ b/src/Umbraco.Core/Events/CancellableObjectEventArgs.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using System.Linq; using System.Security.Permissions; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; namespace Umbraco.Core.Events { diff --git a/src/Umbraco.Core/Events/QueuingEventDispatcherBase.cs b/src/Umbraco.Core/Events/QueuingEventDispatcherBase.cs index 3f5bad4734..2cc7046078 100644 --- a/src/Umbraco.Core/Events/QueuingEventDispatcherBase.cs +++ b/src/Umbraco.Core/Events/QueuingEventDispatcherBase.cs @@ -2,8 +2,8 @@ using System.Collections.Generic; using System.Linq; using Umbraco.Core.Collections; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Composing; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Events { diff --git a/src/Umbraco.Core/Migrations/Install/DatabaseDataCreator.cs b/src/Umbraco.Core/Migrations/Install/DatabaseDataCreator.cs index 0ffb330356..f8042e7220 100644 --- a/src/Umbraco.Core/Migrations/Install/DatabaseDataCreator.cs +++ b/src/Umbraco.Core/Migrations/Install/DatabaseDataCreator.cs @@ -224,32 +224,32 @@ namespace Umbraco.Core.Migrations.Install private void CreateDataTypeData() { //TODO Check which of the DataTypeIds below doesn't exist in umbracoNode, which results in a foreign key constraint errors. - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 1, DataTypeId = -49, PropertyEditorAlias = Constants.PropertyEditors.TrueFalseAlias, DbType = "Integer" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 2, DataTypeId = -51, PropertyEditorAlias = Constants.PropertyEditors.IntegerAlias, DbType = "Integer" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 3, DataTypeId = -87, PropertyEditorAlias = Constants.PropertyEditors.TinyMCEAlias, DbType = "Ntext" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 4, DataTypeId = -88, PropertyEditorAlias = Constants.PropertyEditors.TextboxAlias, DbType = "Nvarchar" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 5, DataTypeId = -89, PropertyEditorAlias = Constants.PropertyEditors.TextboxMultipleAlias, DbType = "Ntext" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 6, DataTypeId = -90, PropertyEditorAlias = Constants.PropertyEditors.UploadFieldAlias, DbType = "Nvarchar" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 7, DataTypeId = -92, PropertyEditorAlias = Constants.PropertyEditors.NoEditAlias, DbType = "Nvarchar" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 8, DataTypeId = -36, PropertyEditorAlias = Constants.PropertyEditors.DateTimeAlias, DbType = "Date" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 9, DataTypeId = -37, PropertyEditorAlias = Constants.PropertyEditors.ColorPickerAlias, DbType = "Nvarchar" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 11, DataTypeId = -39, PropertyEditorAlias = Constants.PropertyEditors.DropDownListMultipleAlias, DbType = "Nvarchar" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 12, DataTypeId = -40, PropertyEditorAlias = Constants.PropertyEditors.RadioButtonListAlias, DbType = "Nvarchar" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 13, DataTypeId = -41, PropertyEditorAlias = Constants.PropertyEditors.DateAlias, DbType = "Date" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 14, DataTypeId = -42, PropertyEditorAlias = Constants.PropertyEditors.DropDownListAlias, DbType = "Integer" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 15, DataTypeId = -43, PropertyEditorAlias = Constants.PropertyEditors.CheckBoxListAlias, DbType = "Nvarchar" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 22, DataTypeId = 1041, PropertyEditorAlias = Constants.PropertyEditors.TagsAlias, DbType = "Ntext" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 24, DataTypeId = 1043, PropertyEditorAlias = Constants.PropertyEditors.ImageCropperAlias, DbType = "Ntext" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = -26, DataTypeId = Constants.DataTypes.DefaultContentListView, PropertyEditorAlias = Constants.PropertyEditors.ListViewAlias, DbType = "Nvarchar" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = -27, DataTypeId = Constants.DataTypes.DefaultMediaListView, PropertyEditorAlias = Constants.PropertyEditors.ListViewAlias, DbType = "Nvarchar" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = -28, DataTypeId = Constants.DataTypes.DefaultMembersListView, PropertyEditorAlias = Constants.PropertyEditors.ListViewAlias, DbType = "Nvarchar" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 1, DataTypeId = -49, EditorAlias = Constants.PropertyEditors.TrueFalseAlias, DbType = "Integer" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 2, DataTypeId = -51, EditorAlias = Constants.PropertyEditors.IntegerAlias, DbType = "Integer" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 3, DataTypeId = -87, EditorAlias = Constants.PropertyEditors.TinyMCEAlias, DbType = "Ntext" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 4, DataTypeId = -88, EditorAlias = Constants.PropertyEditors.TextboxAlias, DbType = "Nvarchar" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 5, DataTypeId = -89, EditorAlias = Constants.PropertyEditors.TextboxMultipleAlias, DbType = "Ntext" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 6, DataTypeId = -90, EditorAlias = Constants.PropertyEditors.UploadFieldAlias, DbType = "Nvarchar" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 7, DataTypeId = -92, EditorAlias = Constants.PropertyEditors.NoEditAlias, DbType = "Nvarchar" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 8, DataTypeId = -36, EditorAlias = Constants.PropertyEditors.DateTimeAlias, DbType = "Date" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 9, DataTypeId = -37, EditorAlias = Constants.PropertyEditors.ColorPickerAlias, DbType = "Nvarchar" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 11, DataTypeId = -39, EditorAlias = Constants.PropertyEditors.DropDownListMultipleAlias, DbType = "Nvarchar" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 12, DataTypeId = -40, EditorAlias = Constants.PropertyEditors.RadioButtonListAlias, DbType = "Nvarchar" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 13, DataTypeId = -41, EditorAlias = Constants.PropertyEditors.DateAlias, DbType = "Date" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 14, DataTypeId = -42, EditorAlias = Constants.PropertyEditors.DropDownListAlias, DbType = "Integer" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 15, DataTypeId = -43, EditorAlias = Constants.PropertyEditors.CheckBoxListAlias, DbType = "Nvarchar" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 22, DataTypeId = 1041, EditorAlias = Constants.PropertyEditors.TagsAlias, DbType = "Ntext" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 24, DataTypeId = 1043, EditorAlias = Constants.PropertyEditors.ImageCropperAlias, DbType = "Ntext" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = -26, DataTypeId = Constants.DataTypes.DefaultContentListView, EditorAlias = Constants.PropertyEditors.ListViewAlias, DbType = "Nvarchar" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = -27, DataTypeId = Constants.DataTypes.DefaultMediaListView, EditorAlias = Constants.PropertyEditors.ListViewAlias, DbType = "Nvarchar" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = -28, DataTypeId = Constants.DataTypes.DefaultMembersListView, EditorAlias = Constants.PropertyEditors.ListViewAlias, DbType = "Nvarchar" }); //New UDI pickers with newer Ids - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 26, DataTypeId = 1046, PropertyEditorAlias = Constants.PropertyEditors.ContentPicker2Alias, DbType = "Nvarchar" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 27, DataTypeId = 1047, PropertyEditorAlias = Constants.PropertyEditors.MemberPicker2Alias, DbType = "Nvarchar" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 28, DataTypeId = 1048, PropertyEditorAlias = Constants.PropertyEditors.MediaPicker2Alias, DbType = "Ntext" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 29, DataTypeId = 1049, PropertyEditorAlias = Constants.PropertyEditors.MediaPicker2Alias, DbType = "Ntext" }); - _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 30, DataTypeId = 1050, PropertyEditorAlias = Constants.PropertyEditors.RelatedLinks2Alias, DbType = "Ntext" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 26, DataTypeId = 1046, EditorAlias = Constants.PropertyEditors.ContentPicker2Alias, DbType = "Nvarchar" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 27, DataTypeId = 1047, EditorAlias = Constants.PropertyEditors.MemberPicker2Alias, DbType = "Nvarchar" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 28, DataTypeId = 1048, EditorAlias = Constants.PropertyEditors.MediaPicker2Alias, DbType = "Ntext" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 29, DataTypeId = 1049, EditorAlias = Constants.PropertyEditors.MediaPicker2Alias, DbType = "Ntext" }); + _database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 30, DataTypeId = 1050, EditorAlias = Constants.PropertyEditors.RelatedLinks2Alias, DbType = "Ntext" }); //TODO: We're not creating these for 7.0 //_database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 19, DataTypeId = 1038, PropertyEditorAlias = Constants.PropertyEditors.MarkdownEditorAlias, DbType = "Ntext" }); diff --git a/src/Umbraco.Core/Models/AuditItem.cs b/src/Umbraco.Core/Models/AuditItem.cs index 993eb784d6..519f288ef0 100644 --- a/src/Umbraco.Core/Models/AuditItem.cs +++ b/src/Umbraco.Core/Models/AuditItem.cs @@ -1,8 +1,8 @@ -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { - public sealed class AuditItem : EntityBase.EntityBase + public sealed class AuditItem : EntityBase { public AuditItem(int objectId, string comment, AuditType type, int userId) { diff --git a/src/Umbraco.Core/Models/ContentBase.cs b/src/Umbraco.Core/Models/ContentBase.cs index 7863e5b6d8..4d3f81d0e1 100644 --- a/src/Umbraco.Core/Models/ContentBase.cs +++ b/src/Umbraco.Core/Models/ContentBase.cs @@ -7,8 +7,7 @@ using System.Linq; using System.Reflection; using System.Runtime.Serialization; using System.Web; -using Umbraco.Core.Models.EntityBase; -using Umbraco.Core.Services; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { @@ -18,20 +17,13 @@ namespace Umbraco.Core.Models [Serializable] [DataContract(IsReference = true)] [DebuggerDisplay("Id: {Id}, Name: {Name}, ContentType: {ContentTypeBase.Alias}")] - public abstract class ContentBase : EntityBase.EntityBase, IContentBase + public abstract class ContentBase : TreeEntityBase, IContentBase { private static readonly Lazy Ps = new Lazy(); + private IDictionary _additionalData; private int _contentTypeId; protected IContentTypeComposition ContentTypeBase; - - private Lazy _parentId; - private int _level; - private string _path; - private int _sortOrder; - - private bool _trashed; - private int _creatorId; private int _writerId; // fixme need to deal with localized names, how? @@ -40,10 +32,6 @@ namespace Umbraco.Core.Models private PropertyCollection _properties; - [EditorBrowsable(EditorBrowsableState.Never)] - IDictionary IUmbracoEntity.AdditionalData => _lazyAdditionalData.Value; - private readonly Lazy> _lazyAdditionalData = new Lazy>(); - /// /// Initializes a new instance of the class. /// @@ -51,7 +39,7 @@ namespace Umbraco.Core.Models : this(name, contentType, properties) { if (parentId == 0) throw new ArgumentOutOfRangeException(nameof(parentId)); - _parentId = new Lazy(() => parentId); + ParentId = parentId; } /// @@ -61,7 +49,7 @@ namespace Umbraco.Core.Models : this(name, contentType, properties) { if (parent == null) throw new ArgumentNullException(nameof(parent)); - _parentId = new Lazy(() => parent.Id); + SetParent(parent); } private ContentBase(string name, IContentTypeComposition contentType, PropertyCollection properties) @@ -72,7 +60,7 @@ namespace Umbraco.Core.Models Id = 0; // no identity VersionId = 0; // no versions - _name = name; + Name = _name = name; _contentTypeId = contentType.Id; _properties = properties ?? throw new ArgumentNullException(nameof(properties)); _properties.EnsurePropertyTypes(PropertyTypes); @@ -81,116 +69,27 @@ namespace Umbraco.Core.Models // ReSharper disable once ClassNeverInstantiated.Local private class PropertySelectors { - public readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); - public readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo(x => x.Level); - public readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path); - public readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); - public readonly PropertyInfo TrashedSelector = ExpressionHelper.GetPropertyInfo(x => x.Trashed); - public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); - public readonly PropertyInfo CreatorIdSelector = ExpressionHelper.GetPropertyInfo(x => x.CreatorId); public readonly PropertyInfo DefaultContentTypeIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ContentTypeId); public readonly PropertyInfo PropertyCollectionSelector = ExpressionHelper.GetPropertyInfo(x => x.Properties); public readonly PropertyInfo WriterSelector = ExpressionHelper.GetPropertyInfo(x => x.WriterId); } + /// + [EditorBrowsable(EditorBrowsableState.Never)] + [DataMember] + [DoNotClone] + IDictionary IUmbracoEntity.AdditionalData => _additionalData ?? (_additionalData = new Dictionary()); + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + [IgnoreDataMember] + bool IUmbracoEntity.HasAdditionalData => _additionalData != null; + protected void PropertiesChanged(object sender, NotifyCollectionChangedEventArgs e) { OnPropertyChanged(Ps.Value.PropertyCollectionSelector); } - /// - /// Gets or sets the identifier of the parent entity. - /// - [DataMember] - public virtual int ParentId - { - get - { - var val = _parentId.Value; - if (val == 0) - { - throw new InvalidOperationException("The ParentId cannot have a value of 0. Perhaps the parent object used to instantiate this object has not been persisted to the data store."); - } - return val; - } - set - { - _parentId = new Lazy(() => value); - OnPropertyChanged(Ps.Value.ParentIdSelector); - } - } - - /// - /// Sets the identifier of the parent entity. - /// - /// Id of the Parent - protected internal void SetLazyParentId(Lazy parentId) - { - _parentId = parentId; - OnPropertyChanged(Ps.Value.ParentIdSelector); - } - - /// - /// Gets or sets the level of the entity. - /// - [DataMember] - public virtual int Level - { - get => _level; - set => SetPropertyValueAndDetectChanges(value, ref _level, Ps.Value.LevelSelector); - } - - /// - /// Gets or sets the path of the entity. - /// - [DataMember] - public virtual string Path //Setting this value should be handled by the class not the user - { - get => _path; - set => SetPropertyValueAndDetectChanges(value, ref _path, Ps.Value.PathSelector); - } - - /// - /// Gets or sets the sort order of the entity. - /// - [DataMember] - public virtual int SortOrder - { - get => _sortOrder; - set => SetPropertyValueAndDetectChanges(value, ref _sortOrder, Ps.Value.SortOrderSelector); - } - - /// - /// Gets or sets a value indicating whether the entity is trashed. - /// - /// A trashed entity is unpublished and in the recycle bin. - [DataMember] - public virtual bool Trashed // fixme setting this value should be handled by the class not the user - { - get => _trashed; - internal set => SetPropertyValueAndDetectChanges(value, ref _trashed, Ps.Value.TrashedSelector); - } - - /// - /// Gets or sets the name of the entity. - /// - [DataMember] - public virtual string Name - { - get => _name; - set => SetPropertyValueAndDetectChanges(value, ref _name, Ps.Value.NameSelector); - } - - /// - /// Gets or sets the identifier of the user who created the entity. - /// - [DataMember] - public virtual int CreatorId - { - get => _creatorId; - set => SetPropertyValueAndDetectChanges(value, ref _creatorId, Ps.Value.CreatorIdSelector); - } - /// /// Id of the user who wrote/updated this entity /// @@ -220,7 +119,7 @@ namespace Umbraco.Core.Models } return _contentTypeId; } - protected set { SetPropertyValueAndDetectChanges(value, ref _contentTypeId, Ps.Value.DefaultContentTypeIdSelector); } + protected set => SetPropertyValueAndDetectChanges(value, ref _contentTypeId, Ps.Value.DefaultContentTypeIdSelector); } /// diff --git a/src/Umbraco.Core/Models/ContentExtensions.cs b/src/Umbraco.Core/Models/ContentExtensions.cs index 31532c5d64..35ed634f84 100644 --- a/src/Umbraco.Core/Models/ContentExtensions.cs +++ b/src/Umbraco.Core/Models/ContentExtensions.cs @@ -9,7 +9,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Umbraco.Core.Composing; using Umbraco.Core.IO; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; using Umbraco.Core.Services.Implement; diff --git a/src/Umbraco.Core/Models/ContentTypeBase.cs b/src/Umbraco.Core/Models/ContentTypeBase.cs index d54ce27443..9c9a93223c 100644 --- a/src/Umbraco.Core/Models/ContentTypeBase.cs +++ b/src/Umbraco.Core/Models/ContentTypeBase.cs @@ -6,7 +6,7 @@ using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Strings; namespace Umbraco.Core.Models @@ -17,23 +17,17 @@ namespace Umbraco.Core.Models [Serializable] [DataContract(IsReference = true)] [DebuggerDisplay("Id: {Id}, Name: {Name}, Alias: {Alias}")] - public abstract class ContentTypeBase : EntityBase.EntityBase, IContentTypeBase + public abstract class ContentTypeBase : TreeEntityBase, IContentTypeBase { private static readonly Lazy Ps = new Lazy(); - private Lazy _parentId; - private string _name; - private int _level; - private string _path; + private IDictionary _additionalData; private string _alias; private string _description; - private int _sortOrder; private string _icon = "icon-folder"; private string _thumbnail = "folder.png"; - private int _creatorId; private bool _allowedAsRoot; // note: only one that's not 'pure element type' private bool _isContainer; - private bool _trashed; private PropertyGroupCollection _propertyGroups; private PropertyTypeCollection _propertyTypes; private IEnumerable _allowedContentTypes; @@ -43,11 +37,10 @@ namespace Umbraco.Core.Models protected ContentTypeBase(int parentId) { if (parentId == 0) throw new ArgumentOutOfRangeException(nameof(parentId)); + ParentId = parentId; - _parentId = new Lazy(() => parentId); _allowedContentTypes = new List(); _propertyGroups = new PropertyGroupCollection(); - _additionalData = new Dictionary(); // actually OK as IsPublishing is constant // ReSharper disable once VirtualMemberCallInConstructor @@ -64,12 +57,11 @@ namespace Umbraco.Core.Models protected ContentTypeBase(IContentTypeBase parent, string alias) { if (parent == null) throw new ArgumentNullException(nameof(parent)); + SetParent(parent); _alias = alias; - _parentId = new Lazy(() => parent.Id); _allowedContentTypes = new List(); _propertyGroups = new PropertyGroupCollection(); - _additionalData = new Dictionary(); // actually OK as IsPublishing is constant // ReSharper disable once VirtualMemberCallInConstructor @@ -79,6 +71,17 @@ namespace Umbraco.Core.Models _variations = ContentVariation.InvariantNeutral; } + /// + [EditorBrowsable(EditorBrowsableState.Never)] + [DataMember] + [DoNotClone] + IDictionary IUmbracoEntity.AdditionalData => _additionalData ?? (_additionalData = new Dictionary()); + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + [IgnoreDataMember] + bool IUmbracoEntity.HasAdditionalData => _additionalData != null; + /// /// Gets a value indicating whether the content type is publishing. /// @@ -95,19 +98,12 @@ namespace Umbraco.Core.Models // ReSharper disable once ClassNeverInstantiated.Local private class PropertySelectors { - public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); - public readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); - public readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); - public readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo(x => x.Level); - public readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path); public readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); public readonly PropertyInfo DescriptionSelector = ExpressionHelper.GetPropertyInfo(x => x.Description); public readonly PropertyInfo IconSelector = ExpressionHelper.GetPropertyInfo(x => x.Icon); public readonly PropertyInfo ThumbnailSelector = ExpressionHelper.GetPropertyInfo(x => x.Thumbnail); - public readonly PropertyInfo CreatorIdSelector = ExpressionHelper.GetPropertyInfo(x => x.CreatorId); public readonly PropertyInfo AllowedAsRootSelector = ExpressionHelper.GetPropertyInfo(x => x.AllowedAsRoot); public readonly PropertyInfo IsContainerSelector = ExpressionHelper.GetPropertyInfo(x => x.IsContainer); - public readonly PropertyInfo TrashedSelector = ExpressionHelper.GetPropertyInfo(x => x.Trashed); public readonly PropertyInfo AllowedContentTypesSelector = ExpressionHelper.GetPropertyInfo>(x => x.AllowedContentTypes); public readonly PropertyInfo PropertyGroupCollectionSelector = ExpressionHelper.GetPropertyInfo(x => x.PropertyGroups); public readonly PropertyInfo PropertyTypeCollectionSelector = ExpressionHelper.GetPropertyInfo>(x => x.PropertyTypes); @@ -131,59 +127,6 @@ namespace Umbraco.Core.Models OnPropertyChanged(Ps.Value.PropertyTypeCollectionSelector); } - /// - /// Gets or sets the Id of the Parent entity - /// - /// Might not be necessary if handled as a relation? - [DataMember] - public virtual int ParentId - { - get - { - var val = _parentId.Value; - if (val == 0) - { - throw new InvalidOperationException("The ParentId cannot be a value of 0. Perhaps the parent object used to instantiate this object has not been persisted to the data store."); - } - return val; - } - set - { - _parentId = new Lazy(() => value); - OnPropertyChanged(Ps.Value.ParentIdSelector); - } - } - - /// - /// Gets or sets the name of the current entity - /// - [DataMember] - public virtual string Name - { - get => _name; - set => SetPropertyValueAndDetectChanges(value, ref _name, Ps.Value.NameSelector); - } - - /// - /// Gets or sets the level of the content entity - /// - [DataMember] - public virtual int Level //NOTE Is this relevant for a ContentType? - { - get => _level; - set => SetPropertyValueAndDetectChanges(value, ref _level, Ps.Value.LevelSelector); - } - - /// - /// Gets of sets the path - /// - [DataMember] - public virtual string Path //NOTE Is this relevant for a ContentType? - { - get => _path; - set => SetPropertyValueAndDetectChanges(value, ref _path, Ps.Value.PathSelector); - } - /// /// The Alias of the ContentType /// @@ -207,16 +150,6 @@ namespace Umbraco.Core.Models set => SetPropertyValueAndDetectChanges(value, ref _description, Ps.Value.DescriptionSelector); } - /// - /// Gets or sets the sort order of the content entity - /// - [DataMember] - public virtual int SortOrder - { - get => _sortOrder; - set => SetPropertyValueAndDetectChanges(value, ref _sortOrder, Ps.Value.SortOrderSelector); - } - /// /// Name of the icon (sprite class) used to identify the ContentType /// @@ -237,16 +170,6 @@ namespace Umbraco.Core.Models set => SetPropertyValueAndDetectChanges(value, ref _thumbnail, Ps.Value.ThumbnailSelector); } - /// - /// Gets or sets the Id of the user who created this ContentType - /// - [DataMember] - public virtual int CreatorId - { - get => _creatorId; - set => SetPropertyValueAndDetectChanges(value, ref _creatorId, Ps.Value.CreatorIdSelector); - } - /// /// Gets or Sets a boolean indicating whether this ContentType is allowed at the root /// @@ -270,24 +193,6 @@ namespace Umbraco.Core.Models set => SetPropertyValueAndDetectChanges(value, ref _isContainer, Ps.Value.IsContainerSelector); } - /// - /// Boolean indicating whether this ContentType is Trashed or not. - /// If ContentType is Trashed it will be located in the Recyclebin. - /// - [DataMember] - public virtual bool Trashed //NOTE Is this relevant for a ContentType? - { - get => _trashed; - set => SetPropertyValueAndDetectChanges(value, ref _trashed, Ps.Value.TrashedSelector); - } - - private readonly IDictionary _additionalData; - /// - /// Some entities may expose additional data that other's might not, this custom data will be available in this collection - /// - [EditorBrowsable(EditorBrowsableState.Never)] - IDictionary IUmbracoEntity.AdditionalData => _additionalData; - /// /// Gets or sets a list of integer Ids for allowed ContentTypes /// @@ -493,15 +398,6 @@ namespace Umbraco.Core.Models OnPropertyChanged(Ps.Value.PropertyGroupCollectionSelector); } - /// - /// Sets the ParentId from the lazy integer id - /// - /// Id of the Parent - public void SetLazyParentId(Lazy id) - { - _parentId = id; - } - /// /// PropertyTypes that are not part of a PropertyGroup /// diff --git a/src/Umbraco.Core/Models/ContentTypeSort.cs b/src/Umbraco.Core/Models/ContentTypeSort.cs index 92984c2fad..d689a58e82 100644 --- a/src/Umbraco.Core/Models/ContentTypeSort.cs +++ b/src/Umbraco.Core/Models/ContentTypeSort.cs @@ -1,5 +1,5 @@ using System; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { diff --git a/src/Umbraco.Core/Models/DataType.cs b/src/Umbraco.Core/Models/DataType.cs index 73c1f0003f..bc31c262f2 100644 --- a/src/Umbraco.Core/Models/DataType.cs +++ b/src/Umbraco.Core/Models/DataType.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { @@ -12,18 +12,11 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - public class DataType : EntityBase.EntityBase, IDataType + public class DataType : TreeEntityBase, IDataType { private static readonly Lazy Ps = new Lazy(); - private readonly IDictionary _additionalData; + private IDictionary _additionalData; - private int _parentId; - private string _name; - private int _sortOrder; - private int _level; - private string _path; - private int _creatorId; - private bool _trashed; private string _propertyEditorAlias; private DataTypeDatabaseType _databaseType; @@ -32,10 +25,8 @@ namespace Umbraco.Core.Models /// public DataType(int parentId, string propertyEditorAlias) { - _parentId = parentId; + ParentId = parentId; _propertyEditorAlias = propertyEditorAlias; - - _additionalData = new Dictionary(); } /// @@ -43,106 +34,34 @@ namespace Umbraco.Core.Models /// public DataType(string propertyEditorAlias) { - _parentId = -1; + ParentId = -1; _propertyEditorAlias = propertyEditorAlias; - - _additionalData = new Dictionary(); } // ReSharper disable once ClassNeverInstantiated.Local private class PropertySelectors { - public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); - public readonly PropertyInfo ParentIdSelector = ExpressionHelper.GetPropertyInfo(x => x.ParentId); - public readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); - public readonly PropertyInfo LevelSelector = ExpressionHelper.GetPropertyInfo(x => x.Level); - public readonly PropertyInfo PathSelector = ExpressionHelper.GetPropertyInfo(x => x.Path); - public readonly PropertyInfo UserIdSelector = ExpressionHelper.GetPropertyInfo(x => x.CreatorId); - public readonly PropertyInfo TrashedSelector = ExpressionHelper.GetPropertyInfo(x => x.Trashed); public readonly PropertyInfo PropertyEditorAliasSelector = ExpressionHelper.GetPropertyInfo(x => x.EditorAlias); public readonly PropertyInfo DatabaseTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.DatabaseType); } /// + [EditorBrowsable(EditorBrowsableState.Never)] [DataMember] - public int ParentId - { - get => _parentId; - set => SetPropertyValueAndDetectChanges(value, ref _parentId, Ps.Value.ParentIdSelector); - } + [DoNotClone] + IDictionary IUmbracoEntity.AdditionalData => _additionalData ?? (_additionalData = new Dictionary()); /// - [DataMember] - public string Name - { - get => _name; - set => SetPropertyValueAndDetectChanges(value, ref _name, Ps.Value.NameSelector); - } - - /// - [DataMember] - public int SortOrder - { - get => _sortOrder; - set => SetPropertyValueAndDetectChanges(value, ref _sortOrder, Ps.Value.SortOrderSelector); - } - - /// - [DataMember] - public int Level - { - get => _level; - set => SetPropertyValueAndDetectChanges(value, ref _level, Ps.Value.LevelSelector); - } - - /// - // fixme - setting this value should be handled by the class not the user - [DataMember] - public string Path - { - get => _path; - set => SetPropertyValueAndDetectChanges(value, ref _path, Ps.Value.PathSelector); - } - - /// - [DataMember] - public int CreatorId - { - get => _creatorId; - set => SetPropertyValueAndDetectChanges(value, ref _creatorId, Ps.Value.UserIdSelector); - } - - /// - // fixme - data types cannot be trashed? - [DataMember] - public bool Trashed - { - get => _trashed; - internal set - { - SetPropertyValueAndDetectChanges(value, ref _trashed, Ps.Value.TrashedSelector); - - // this is a custom property that is not exposed in IUmbracoEntity so add it to the additional data - _additionalData["Trashed"] = value; - } - } - - // fixme - what exactly are we doing with _additionalData? - // are we allocating 1 dictionary for *every* entity? - // not doing it for other entities? + [EditorBrowsable(EditorBrowsableState.Never)] + [IgnoreDataMember] + bool IUmbracoEntity.HasAdditionalData => _additionalData != null; /// [DataMember] public string EditorAlias { get => _propertyEditorAlias; - set - { - SetPropertyValueAndDetectChanges(value, ref _propertyEditorAlias, Ps.Value.PropertyEditorAliasSelector); - - // this is a custom property that is not exposed in IUmbracoEntity so add it to the additional data - _additionalData["DatabaseType"] = value; - } + set => SetPropertyValueAndDetectChanges(value, ref _propertyEditorAlias, Ps.Value.PropertyEditorAliasSelector); } /// @@ -150,21 +69,11 @@ namespace Umbraco.Core.Models public DataTypeDatabaseType DatabaseType { get => _databaseType; - set - { - SetPropertyValueAndDetectChanges(value, ref _databaseType, Ps.Value.DatabaseTypeSelector); - - // this is a custom property that is not exposed in IUmbracoEntity so add it to the additional data - _additionalData["DatabaseType"] = value; - } + set => SetPropertyValueAndDetectChanges(value, ref _databaseType, Ps.Value.DatabaseTypeSelector); } // fixme - implement that one !! [DataMember] public object Configuration { get; set; } - - /// - [EditorBrowsable(EditorBrowsableState.Never)] - IDictionary IUmbracoEntity.AdditionalData => _additionalData; } } diff --git a/src/Umbraco.Core/Models/DictionaryItem.cs b/src/Umbraco.Core/Models/DictionaryItem.cs index f97742076b..42f7e04fff 100644 --- a/src/Umbraco.Core/Models/DictionaryItem.cs +++ b/src/Umbraco.Core/Models/DictionaryItem.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { @@ -12,7 +12,7 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - public class DictionaryItem : EntityBase.EntityBase, IDictionaryItem + public class DictionaryItem : EntityBase, IDictionaryItem { public Func GetLanguage { get; set; } private Guid? _parentId; diff --git a/src/Umbraco.Core/Models/DictionaryTranslation.cs b/src/Umbraco.Core/Models/DictionaryTranslation.cs index 1df0c4b618..ef41cedc91 100644 --- a/src/Umbraco.Core/Models/DictionaryTranslation.cs +++ b/src/Umbraco.Core/Models/DictionaryTranslation.cs @@ -1,7 +1,7 @@ using System; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Mappers; namespace Umbraco.Core.Models @@ -11,7 +11,7 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - public class DictionaryTranslation : EntityBase.EntityBase, IDictionaryTranslation + public class DictionaryTranslation : EntityBase, IDictionaryTranslation { internal Func GetLanguage { get; set; } diff --git a/src/Umbraco.Core/Models/EntityBase/BeingDirty.cs b/src/Umbraco.Core/Models/Entities/BeingDirty.cs similarity index 97% rename from src/Umbraco.Core/Models/EntityBase/BeingDirty.cs rename to src/Umbraco.Core/Models/Entities/BeingDirty.cs index 906208f0ac..ec447a62dc 100644 --- a/src/Umbraco.Core/Models/EntityBase/BeingDirty.cs +++ b/src/Umbraco.Core/Models/Entities/BeingDirty.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Reflection; -namespace Umbraco.Core.Models.EntityBase +namespace Umbraco.Core.Models.Entities { /// /// Provides a concrete implementation of . diff --git a/src/Umbraco.Core/Models/EntityBase/BeingDirtyBase.cs b/src/Umbraco.Core/Models/Entities/BeingDirtyBase.cs similarity index 98% rename from src/Umbraco.Core/Models/EntityBase/BeingDirtyBase.cs rename to src/Umbraco.Core/Models/Entities/BeingDirtyBase.cs index c673088984..4e2279caaf 100644 --- a/src/Umbraco.Core/Models/EntityBase/BeingDirtyBase.cs +++ b/src/Umbraco.Core/Models/Entities/BeingDirtyBase.cs @@ -5,9 +5,8 @@ using System.ComponentModel; using System.Linq; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Composing; -namespace Umbraco.Core.Models.EntityBase +namespace Umbraco.Core.Models.Entities { /// /// Provides a base implementation of and . diff --git a/src/Umbraco.Core/Models/Entities/ContentEntitySlim.cs b/src/Umbraco.Core/Models/Entities/ContentEntitySlim.cs new file mode 100644 index 0000000000..6eeed53a89 --- /dev/null +++ b/src/Umbraco.Core/Models/Entities/ContentEntitySlim.cs @@ -0,0 +1,17 @@ +namespace Umbraco.Core.Models.Entities +{ + /// + /// Implements . + /// + public class ContentEntitySlim : EntitySlim, IContentEntitySlim + { + /// + public string ContentTypeAlias { get; set; } + + /// + public string ContentTypeIcon { get; set; } + + /// + public string ContentTypeThumbnail { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Entities/DocumentEntitySlim.cs b/src/Umbraco.Core/Models/Entities/DocumentEntitySlim.cs new file mode 100644 index 0000000000..57cffa793c --- /dev/null +++ b/src/Umbraco.Core/Models/Entities/DocumentEntitySlim.cs @@ -0,0 +1,14 @@ +namespace Umbraco.Core.Models.Entities +{ + /// + /// Implements . + /// + public class DocumentEntitySlim : ContentEntitySlim, IDocumentEntitySlim + { + /// + public bool Published { get; set; } + + /// + public bool Edited { get; set; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/EntityBase/EntityBase.cs b/src/Umbraco.Core/Models/Entities/EntityBase.cs similarity index 99% rename from src/Umbraco.Core/Models/EntityBase/EntityBase.cs rename to src/Umbraco.Core/Models/Entities/EntityBase.cs index 2055ba584b..ab57d57ab6 100644 --- a/src/Umbraco.Core/Models/EntityBase/EntityBase.cs +++ b/src/Umbraco.Core/Models/Entities/EntityBase.cs @@ -3,7 +3,7 @@ using System.Diagnostics; using System.Reflection; using System.Runtime.Serialization; -namespace Umbraco.Core.Models.EntityBase +namespace Umbraco.Core.Models.Entities { /// /// Provides a base class for entities. diff --git a/src/Umbraco.Core/Models/Entities/EntitySlim.cs b/src/Umbraco.Core/Models/Entities/EntitySlim.cs new file mode 100644 index 0000000000..fbef1fafbd --- /dev/null +++ b/src/Umbraco.Core/Models/Entities/EntitySlim.cs @@ -0,0 +1,220 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using Umbraco.Core.Exceptions; + +namespace Umbraco.Core.Models.Entities +{ + // fixme - changing the name of some properties that were in additionalData => must update corresponding javascript? + + /// + /// Implementation of for internal use. + /// + /// + /// Although it implements , this class does not + /// implement and everything this interface defines, throws. + /// Although it implements , this class does not + /// implement and deep-cloning throws. + /// + public class EntitySlim : IEntitySlim + { + private IDictionary _additionalData; + + /// + /// Gets an entity representing "root". + /// + public static readonly IEntitySlim Root = new EntitySlim { Path = "-1", Name = "root", HasChildren = true }; + + + // implement IEntity + + /// + [DataMember] + public int Id { get; set; } + + /// + [DataMember] + public Guid Key { get; set; } + + /// + [DataMember] + public DateTime CreateDate { get; set; } + + /// + [DataMember] + public DateTime UpdateDate { get; set; } + + /// + [DataMember] + public DateTime? DeleteDate { get; set; } + + /// + [DataMember] + public bool HasIdentity => Id != 0; + + + // implement ITreeEntity + + /// + [DataMember] + public string Name { get; set; } + + /// + [DataMember] + public int CreatorId { get; set; } + + /// + [DataMember] + public int ParentId { get; set; } + + /// + public void SetParent(ITreeEntity parent) => throw new WontImplementException(); + + /// + [DataMember] + public int Level { get; set; } + + /// + [DataMember] + public string Path { get; set; } + + /// + [DataMember] + public int SortOrder { get; set; } + + /// + [DataMember] + public bool Trashed { get; set; } + + + // implement IUmbracoEntity + + /// + [DataMember] + public IDictionary AdditionalData => _additionalData ?? (_additionalData = new Dictionary()); + + /// + [IgnoreDataMember] + public bool HasAdditionalData => _additionalData != null; + + + // implement IEntitySlim + + /// + [DataMember] + public Guid NodeObjectType { get; set; } + + /// + [DataMember] + public bool HasChildren { get; set; } + + /// + [DataMember] + public virtual bool IsContainer { get; set; } + + + /// + /// Represents a lightweight property. + /// + public class PropertySlim + { + /// + /// Initializes a new instance of the class. + /// + public PropertySlim(string editorAlias, object value) + { + PropertyEditorAlias = editorAlias; + Value = value; + } + + /// + /// Gets the property editor alias. + /// + public string PropertyEditorAlias { get; } + + /// + /// Gets the property value. + /// + public object Value { get; } + + protected bool Equals(PropertySlim other) + { + return PropertyEditorAlias.Equals(other.PropertyEditorAlias) && Equals(Value, other.Value); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != GetType()) return false; + return Equals((PropertySlim) obj); + } + + public override int GetHashCode() + { + unchecked + { + return (PropertyEditorAlias.GetHashCode() * 397) ^ (Value != null ? Value.GetHashCode() : 0); + } + } + } + + #region IDeepCloneable + + /// + public object DeepClone() + { + throw new WontImplementException(); + } + + #endregion + + #region IRememberBeingDirty + + // IEntitySlim does *not* track changes, but since it indirectly implements IUmbracoEntity, + // and therefore IRememberBeingDirty, we have to have those methods - which all throw. + + public bool IsDirty() + { + throw new WontImplementException(); + } + + public bool IsPropertyDirty(string propName) + { + throw new WontImplementException(); + } + + public IEnumerable GetDirtyProperties() + { + throw new WontImplementException(); + } + + public void ResetDirtyProperties() + { + throw new WontImplementException(); + } + + public bool WasDirty() + { + throw new WontImplementException(); + } + + public bool WasPropertyDirty(string propertyName) + { + throw new WontImplementException(); + } + + public void ResetWereDirtyProperties() + { + throw new WontImplementException(); + } + + public void ResetDirtyProperties(bool rememberDirty) + { + throw new WontImplementException(); + } + + #endregion + } +} diff --git a/src/Umbraco.Core/Models/EntityBase/ICanBeDirty.cs b/src/Umbraco.Core/Models/Entities/ICanBeDirty.cs similarity index 91% rename from src/Umbraco.Core/Models/EntityBase/ICanBeDirty.cs rename to src/Umbraco.Core/Models/Entities/ICanBeDirty.cs index 30b79121f1..fc95161d7e 100644 --- a/src/Umbraco.Core/Models/EntityBase/ICanBeDirty.cs +++ b/src/Umbraco.Core/Models/Entities/ICanBeDirty.cs @@ -1,30 +1,30 @@ -using System.Collections.Generic; - -namespace Umbraco.Core.Models.EntityBase -{ - /// - /// Defines an entity that tracks property changes and can be dirty. - /// - public interface ICanBeDirty - { - /// - /// Determines whether the current entity is dirty. - /// - bool IsDirty(); - - /// - /// Determines whether a specific property is dirty. - /// - bool IsPropertyDirty(string propName); - - /// - /// Gets properties that are dirty. - /// - IEnumerable GetDirtyProperties(); - - /// - /// Resets dirty properties. - /// - void ResetDirtyProperties(); - } -} +using System.Collections.Generic; + +namespace Umbraco.Core.Models.Entities +{ + /// + /// Defines an entity that tracks property changes and can be dirty. + /// + public interface ICanBeDirty + { + /// + /// Determines whether the current entity is dirty. + /// + bool IsDirty(); + + /// + /// Determines whether a specific property is dirty. + /// + bool IsPropertyDirty(string propName); + + /// + /// Gets properties that are dirty. + /// + IEnumerable GetDirtyProperties(); + + /// + /// Resets dirty properties. + /// + void ResetDirtyProperties(); + } +} diff --git a/src/Umbraco.Core/Models/Entities/IContentEntitySlim.cs b/src/Umbraco.Core/Models/Entities/IContentEntitySlim.cs new file mode 100644 index 0000000000..dc986a4cd9 --- /dev/null +++ b/src/Umbraco.Core/Models/Entities/IContentEntitySlim.cs @@ -0,0 +1,23 @@ +namespace Umbraco.Core.Models.Entities +{ + /// + /// Represents a lightweight content entity, managed by the entity service. + /// + public interface IContentEntitySlim : IEntitySlim + { + /// + /// Gets the content type alias. + /// + string ContentTypeAlias { get; } + + /// + /// Gets the content type icon. + /// + string ContentTypeIcon { get; } + + /// + /// Gets the content type thumbnail. + /// + string ContentTypeThumbnail { get; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Entities/IDocumentEntitySlim.cs b/src/Umbraco.Core/Models/Entities/IDocumentEntitySlim.cs new file mode 100644 index 0000000000..471c0ba1e1 --- /dev/null +++ b/src/Umbraco.Core/Models/Entities/IDocumentEntitySlim.cs @@ -0,0 +1,18 @@ +namespace Umbraco.Core.Models.Entities +{ + /// + /// Represents a lightweight document entity, managed by the entity service. + /// + public interface IDocumentEntitySlim : IContentEntitySlim + { + /// + /// Gets a value indicating whether the document is published. + /// + bool Published { get; } + + /// + /// Gets a value indicating whether the document has edited properties. + /// + bool Edited { get; } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/EntityBase/IEntity.cs b/src/Umbraco.Core/Models/Entities/IEntity.cs similarity index 91% rename from src/Umbraco.Core/Models/EntityBase/IEntity.cs rename to src/Umbraco.Core/Models/Entities/IEntity.cs index d6f017a7e8..0b060e4dbd 100644 --- a/src/Umbraco.Core/Models/EntityBase/IEntity.cs +++ b/src/Umbraco.Core/Models/Entities/IEntity.cs @@ -1,46 +1,45 @@ -using System; -using System.Runtime.Serialization; - -namespace Umbraco.Core.Models.EntityBase -{ - /// - /// Defines an entity. - /// - public interface IEntity : IDeepCloneable - { - /// - /// Gets or sets the integer identifier of the entity. - /// - int Id { get; set; } - - /// - /// Gets or sets the Guid unique identifier of the entity. - /// - Guid Key { get; set; } - - /// - /// Gets or sets the creation date. - /// - DateTime CreateDate { get; set; } - - /// - /// Gets or sets the last update date. - /// - DateTime UpdateDate { get; set; } - - /// - /// Gets or sets the delete date. - /// - /// - /// The delete date is null when the entity has not been deleted. - /// The delete date has a value when the entity instance has been deleted, but this value - /// is transient and not persisted in database (since the entity does not exist anymore). - /// - DateTime? DeleteDate { get; set; } - - /// - /// Gets a value indicating whether the entity has an identity. - /// - bool HasIdentity { get; } - } -} +using System; + +namespace Umbraco.Core.Models.Entities +{ + /// + /// Defines an entity. + /// + public interface IEntity : IDeepCloneable + { + /// + /// Gets or sets the integer identifier of the entity. + /// + int Id { get; set; } + + /// + /// Gets or sets the Guid unique identifier of the entity. + /// + Guid Key { get; set; } + + /// + /// Gets or sets the creation date. + /// + DateTime CreateDate { get; set; } + + /// + /// Gets or sets the last update date. + /// + DateTime UpdateDate { get; set; } + + /// + /// Gets or sets the delete date. + /// + /// + /// The delete date is null when the entity has not been deleted. + /// The delete date has a value when the entity instance has been deleted, but this value + /// is transient and not persisted in database (since the entity does not exist anymore). + /// + DateTime? DeleteDate { get; set; } + + /// + /// Gets a value indicating whether the entity has an identity. + /// + bool HasIdentity { get; } + } +} diff --git a/src/Umbraco.Core/Models/Entities/IEntitySlim.cs b/src/Umbraco.Core/Models/Entities/IEntitySlim.cs new file mode 100644 index 0000000000..356f891d00 --- /dev/null +++ b/src/Umbraco.Core/Models/Entities/IEntitySlim.cs @@ -0,0 +1,25 @@ +using System; + +namespace Umbraco.Core.Models.Entities +{ + /// + /// Represents a lightweight entity, managed by the entity service. + /// + public interface IEntitySlim : IUmbracoEntity + { + /// + /// Gets or sets the entity object type. + /// + Guid NodeObjectType { get; } + + /// + /// Gets or sets a value indicating whether the entity has children. + /// + bool HasChildren { get; } + + /// + /// Gets a value indicating whether the entity is a container. + /// + bool IsContainer { get; } + } +} diff --git a/src/Umbraco.Core/Models/EntityBase/IRememberBeingDirty.cs b/src/Umbraco.Core/Models/Entities/IRememberBeingDirty.cs similarity index 94% rename from src/Umbraco.Core/Models/EntityBase/IRememberBeingDirty.cs rename to src/Umbraco.Core/Models/Entities/IRememberBeingDirty.cs index 2e4fb50fe8..75faba729b 100644 --- a/src/Umbraco.Core/Models/EntityBase/IRememberBeingDirty.cs +++ b/src/Umbraco.Core/Models/Entities/IRememberBeingDirty.cs @@ -1,33 +1,33 @@ -namespace Umbraco.Core.Models.EntityBase -{ - /// - /// Defines an entity that tracks property changes and can be dirty, and remembers - /// which properties were dirty when the changes were committed. - /// - public interface IRememberBeingDirty : ICanBeDirty - { - /// - /// Determines whether the current entity is dirty. - /// - /// A property was dirty if it had been changed and the changes were committed. - bool WasDirty(); - - /// - /// Determines whether a specific property was dirty. - /// - /// A property was dirty if it had been changed and the changes were committed. - bool WasPropertyDirty(string propertyName); - - /// - /// Resets properties that were dirty. - /// - void ResetWereDirtyProperties(); - - /// - /// Resets dirty properties. - /// - /// A value indicating whether to remember dirty properties. - /// When is true, dirty properties are saved so they can be checked with WasDirty. - void ResetDirtyProperties(bool rememberDirty); - } -} +namespace Umbraco.Core.Models.Entities +{ + /// + /// Defines an entity that tracks property changes and can be dirty, and remembers + /// which properties were dirty when the changes were committed. + /// + public interface IRememberBeingDirty : ICanBeDirty + { + /// + /// Determines whether the current entity is dirty. + /// + /// A property was dirty if it had been changed and the changes were committed. + bool WasDirty(); + + /// + /// Determines whether a specific property was dirty. + /// + /// A property was dirty if it had been changed and the changes were committed. + bool WasPropertyDirty(string propertyName); + + /// + /// Resets properties that were dirty. + /// + void ResetWereDirtyProperties(); + + /// + /// Resets dirty properties. + /// + /// A value indicating whether to remember dirty properties. + /// When is true, dirty properties are saved so they can be checked with WasDirty. + void ResetDirtyProperties(bool rememberDirty); + } +} diff --git a/src/Umbraco.Core/Models/EntityBase/ITreeEntity.cs b/src/Umbraco.Core/Models/Entities/ITreeEntity.cs similarity index 69% rename from src/Umbraco.Core/Models/EntityBase/ITreeEntity.cs rename to src/Umbraco.Core/Models/Entities/ITreeEntity.cs index 6948e77826..afa3399202 100644 --- a/src/Umbraco.Core/Models/EntityBase/ITreeEntity.cs +++ b/src/Umbraco.Core/Models/Entities/ITreeEntity.cs @@ -1,6 +1,4 @@ -using System; - -namespace Umbraco.Core.Models.EntityBase +namespace Umbraco.Core.Models.Entities { /// /// Defines an entity that belongs to a tree. @@ -12,11 +10,25 @@ namespace Umbraco.Core.Models.EntityBase /// string Name { get; set; } + /// + /// Gets or sets the identifier of the user who created this entity. + /// + int CreatorId { get; set; } + /// /// Gets or sets the identifier of the parent entity. /// int ParentId { get; set; } + /// + /// Sets the parent entity. + /// + /// Use this method to set the parent entity when the parent entity is known, but has not + /// been persistent and does not yet have an identity. The parent identifier will we retrieved + /// from the parent entity when needed. If the parent entity still does not have an entity by that + /// time, an exception will be thrown by getter. + void SetParent(ITreeEntity parent); + /// /// Gets or sets the level of the entity. /// @@ -40,10 +52,5 @@ namespace Umbraco.Core.Models.EntityBase /// Always false for entities that do not support being trashed. /// bool Trashed { get; } - - /// - /// Gets or sets the identifier of the user who created this entity. - /// - int CreatorId { get; set; } } } \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Entities/IUmbracoEntity.cs b/src/Umbraco.Core/Models/Entities/IUmbracoEntity.cs new file mode 100644 index 0000000000..ab775b781e --- /dev/null +++ b/src/Umbraco.Core/Models/Entities/IUmbracoEntity.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; + +namespace Umbraco.Core.Models.Entities +{ + /// + /// Represents an entity that can be managed by the entity service. + /// + /// + /// An IUmbracoEntity can be related to another via the IRelationService. + /// IUmbracoEntities can be retrieved with the IEntityService. + /// An IUmbracoEntity can participate in notifications. + /// + public interface IUmbracoEntity : ITreeEntity, IRememberBeingDirty + { + /// + /// Gets additional data for this entity. + /// + /// Can be empty, but never null. To avoid allocating, do not + /// test for emptyness, but use instead. + IDictionary AdditionalData { get; } + + /// + /// Determines whether this entity has additional data. + /// + /// Use this property to check for additional data without + /// getting , to avoid allocating. + bool HasAdditionalData { get; } + } +} diff --git a/src/Umbraco.Core/Models/EntityBase/IValueObject.cs b/src/Umbraco.Core/Models/Entities/IValueObject.cs similarity index 79% rename from src/Umbraco.Core/Models/EntityBase/IValueObject.cs rename to src/Umbraco.Core/Models/Entities/IValueObject.cs index a13cda2fa6..2d2e69e7ae 100644 --- a/src/Umbraco.Core/Models/EntityBase/IValueObject.cs +++ b/src/Umbraco.Core/Models/Entities/IValueObject.cs @@ -1,11 +1,11 @@ -namespace Umbraco.Core.Models.EntityBase -{ - /// - /// Marker interface for value object, eg. objects without - /// the same kind of identity as an Entity (with its Id). - /// - public interface IValueObject - { - - } -} +namespace Umbraco.Core.Models.Entities +{ + /// + /// Marker interface for value object, eg. objects without + /// the same kind of identity as an Entity (with its Id). + /// + public interface IValueObject + { + + } +} diff --git a/src/Umbraco.Core/Models/Entities/TreeEntityBase.cs b/src/Umbraco.Core/Models/Entities/TreeEntityBase.cs new file mode 100644 index 0000000000..18e53a8a04 --- /dev/null +++ b/src/Umbraco.Core/Models/Entities/TreeEntityBase.cs @@ -0,0 +1,124 @@ +using System; +using System.Reflection; +using System.Runtime.Serialization; + +namespace Umbraco.Core.Models.Entities +{ + /// + /// Provides a base class for tree entities. + /// + public abstract class TreeEntityBase : EntityBase, ITreeEntity + { + private static PropertySelectors _selectors; + private static PropertySelectors Selectors => _selectors ?? (_selectors = new PropertySelectors()); + + private string _name; + private int _creatorId; + private int _parentId; + private bool _hasParentId; + private ITreeEntity _parent; + private int _level; + private string _path; + private int _sortOrder; + private bool _trashed; + + private class PropertySelectors + { + public readonly PropertyInfo Name = ExpressionHelper.GetPropertyInfo(x => x.Name); + public readonly PropertyInfo CreatorId = ExpressionHelper.GetPropertyInfo(x => x.CreatorId); + public readonly PropertyInfo ParentId = ExpressionHelper.GetPropertyInfo(x => x.ParentId); + public readonly PropertyInfo Level = ExpressionHelper.GetPropertyInfo(x => x.Level); + public readonly PropertyInfo Path = ExpressionHelper.GetPropertyInfo(x => x.Path); + public readonly PropertyInfo SortOrder = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); + public readonly PropertyInfo Trashed = ExpressionHelper.GetPropertyInfo(x => x.Trashed); + } + + // fixme + // ParentId, Path, Level and Trashed all should be consistent, and all derive from parentId, really + + /// + [DataMember] + public string Name + { + get => _name; + set => SetPropertyValueAndDetectChanges(value, ref _name, Selectors.Name); + } + + /// + [DataMember] + public int CreatorId + { + get => _creatorId; + set => SetPropertyValueAndDetectChanges(value, ref _creatorId, Selectors.CreatorId); + } + + /// + [DataMember] + public int ParentId + { + get + { + if (_hasParentId) return _parentId; + + if (_parent == null) throw new InvalidOperationException("Content does not have a parent."); + if (!_parent.HasIdentity) throw new InvalidOperationException("Content's parent does not have an identity."); + + _parentId = _parent.Id; + if (_parentId == 0) + throw new Exception("Panic: parent has an identity but id is zero."); + + _hasParentId = true; + _parent = null; + return _parentId; + } + set + { + if (value == 0) + throw new ArgumentException("Value cannot be zero.", nameof(value)); + SetPropertyValueAndDetectChanges(value, ref _parentId, Selectors.ParentId); + _hasParentId = true; + _parent = null; + } + } + + /// + public void SetParent(ITreeEntity parent) + { + _hasParentId = false; + _parent = parent; + OnPropertyChanged(Selectors.ParentId); + } + + /// + [DataMember] + public int Level + { + get => _level; + set => SetPropertyValueAndDetectChanges(value, ref _level, Selectors.Level); + } + + /// + [DataMember] + public string Path + { + get => _path; + set => SetPropertyValueAndDetectChanges(value, ref _path, Selectors.Path); + } + + /// + [DataMember] + public int SortOrder + { + get => _sortOrder; + set => SetPropertyValueAndDetectChanges(value, ref _sortOrder, Selectors.SortOrder); + } + + /// + [DataMember] + public bool Trashed + { + get => _trashed; + set => SetPropertyValueAndDetectChanges(value, ref _trashed, Selectors.Trashed); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/EntityBase/TreeEntityPath.cs b/src/Umbraco.Core/Models/Entities/TreeEntityPath.cs similarity index 90% rename from src/Umbraco.Core/Models/EntityBase/TreeEntityPath.cs rename to src/Umbraco.Core/Models/Entities/TreeEntityPath.cs index 746011a85a..54142a7527 100644 --- a/src/Umbraco.Core/Models/EntityBase/TreeEntityPath.cs +++ b/src/Umbraco.Core/Models/Entities/TreeEntityPath.cs @@ -1,4 +1,4 @@ -namespace Umbraco.Core.Models.EntityBase +namespace Umbraco.Core.Models.Entities { /// /// Represents the path of a tree entity. diff --git a/src/Umbraco.Core/Models/EntityBase/IUmbracoEntity.cs b/src/Umbraco.Core/Models/EntityBase/IUmbracoEntity.cs deleted file mode 100644 index ca10bb1e18..0000000000 --- a/src/Umbraco.Core/Models/EntityBase/IUmbracoEntity.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Umbraco.Core.Models.EntityBase -{ - /// - /// Represents fixme what exactly? - /// - /// - /// An IUmbracoEntity can be related to another via the IRelationService. - /// IUmbracoEntities can be retrieved with the IEntityService. - /// An IUmbracoEntity can participate in notifications. - /// - public interface IUmbracoEntity : ITreeEntity, IRememberBeingDirty - { - /// - /// Gets additional data for this entity. - /// - IDictionary AdditionalData { get; } - - // fixme AdditionalData is never null, then we need a HasAdditionalData for checking values? - - ///// - ///// Gets a value indicating whether this entity has children. - ///// - //bool HasChildren { get; } - - ///// - ///// Gets the node object type of the entity. - ///// - //Guid NodeObjectType { get; } - - } -} diff --git a/src/Umbraco.Core/Models/EntityContainer.cs b/src/Umbraco.Core/Models/EntityContainer.cs index 1c5514bdc6..8a796a5691 100644 --- a/src/Umbraco.Core/Models/EntityContainer.cs +++ b/src/Umbraco.Core/Models/EntityContainer.cs @@ -1,15 +1,19 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; +using System.Runtime.Serialization; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { /// /// Represents a folder for organizing entities such as content types and data types. /// - public sealed class EntityContainer : UmbracoEntity + public sealed class EntityContainer : TreeEntityBase, IUmbracoEntity { private readonly Guid _containedObjectType; + private IDictionary _additionalData; private static readonly Dictionary ObjectTypeMap = new Dictionary { @@ -24,7 +28,7 @@ namespace Umbraco.Core.Models public EntityContainer(Guid containedObjectType) { if (ObjectTypeMap.ContainsKey(containedObjectType) == false) - throw new ArgumentException("Not a contained object type.", "containedObjectType"); + throw new ArgumentException("Not a contained object type.", nameof(containedObjectType)); _containedObjectType = containedObjectType; ParentId = -1; @@ -52,18 +56,12 @@ namespace Umbraco.Core.Models /// /// Gets or sets the node object type of the contained objects. /// - public Guid ContainedObjectType - { - get { return _containedObjectType; } - } + public Guid ContainedObjectType => _containedObjectType; /// /// Gets the node object type of the container objects. /// - public Guid ContainerObjectType - { - get { return ObjectTypeMap[_containedObjectType]; } - } + public Guid ContainerObjectType => ObjectTypeMap[_containedObjectType]; /// /// Gets the container object type corresponding to a contained object type. @@ -73,7 +71,7 @@ namespace Umbraco.Core.Models public static Guid GetContainerObjectType(Guid containedObjectType) { if (ObjectTypeMap.ContainsKey(containedObjectType) == false) - throw new ArgumentException("Not a contained object type.", "containedObjectType"); + throw new ArgumentException("Not a contained object type.", nameof(containedObjectType)); return ObjectTypeMap[containedObjectType]; } @@ -86,8 +84,19 @@ namespace Umbraco.Core.Models { var contained = ObjectTypeMap.FirstOrDefault(x => x.Value == containerObjectType).Key; if (contained == null) - throw new ArgumentException("Not a container object type.", "containerObjectType"); + throw new ArgumentException("Not a container object type.", nameof(containerObjectType)); return contained; } + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + [DataMember] + [DoNotClone] + IDictionary IUmbracoEntity.AdditionalData => _additionalData ?? (_additionalData = new Dictionary()); + + /// + [EditorBrowsable(EditorBrowsableState.Never)] + [IgnoreDataMember] + bool IUmbracoEntity.HasAdditionalData => _additionalData != null; } } diff --git a/src/Umbraco.Core/Models/EntityExtensions.cs b/src/Umbraco.Core/Models/EntityExtensions.cs index 0759426062..9929e73dda 100644 --- a/src/Umbraco.Core/Models/EntityExtensions.cs +++ b/src/Umbraco.Core/Models/EntityExtensions.cs @@ -1,4 +1,4 @@ -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { @@ -14,10 +14,9 @@ namespace Umbraco.Core.Models /// This is useful when handling events to determine if an entity is a brand new entity or was /// already existing. /// - public static bool IsNewEntity(this IEntity entity) + public static bool IsNewEntity(this IRememberBeingDirty entity) { - var dirty = (IRememberBeingDirty) entity; - return dirty.WasPropertyDirty("Id"); + return entity.WasPropertyDirty("Id"); } } } diff --git a/src/Umbraco.Core/Models/File.cs b/src/Umbraco.Core/Models/File.cs index 46e6ec633e..cf202ea54f 100644 --- a/src/Umbraco.Core/Models/File.cs +++ b/src/Umbraco.Core/Models/File.cs @@ -4,7 +4,7 @@ using System.Reflection; using System.Runtime.Serialization; using System.Text; using Umbraco.Core.IO; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { @@ -13,7 +13,7 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - public abstract class File : EntityBase.EntityBase, IFile + public abstract class File : EntityBase, IFile { private string _path; private string _originalPath; diff --git a/src/Umbraco.Core/Models/Folder.cs b/src/Umbraco.Core/Models/Folder.cs index 321d6b69e6..e23f944604 100644 --- a/src/Umbraco.Core/Models/Folder.cs +++ b/src/Umbraco.Core/Models/Folder.cs @@ -1,8 +1,8 @@ -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { - internal sealed class Folder : EntityBase.EntityBase + internal sealed class Folder : EntityBase { public Folder(string folderPath) { diff --git a/src/Umbraco.Core/Models/IContentBase.cs b/src/Umbraco.Core/Models/IContentBase.cs index 66242386a9..76df5b2f6f 100644 --- a/src/Umbraco.Core/Models/IContentBase.cs +++ b/src/Umbraco.Core/Models/IContentBase.cs @@ -1,5 +1,5 @@ using System.Collections.Generic; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { diff --git a/src/Umbraco.Core/Models/IContentTypeBase.cs b/src/Umbraco.Core/Models/IContentTypeBase.cs index 815d7d52ec..72b8df8de9 100644 --- a/src/Umbraco.Core/Models/IContentTypeBase.cs +++ b/src/Umbraco.Core/Models/IContentTypeBase.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { @@ -80,12 +80,6 @@ namespace Umbraco.Core.Models /// Name of the to remove void RemovePropertyGroup(string propertyGroupName); - /// - /// Sets the ParentId from the lazy integer id - /// - /// Id of the Parent - void SetLazyParentId(Lazy id); - /// /// Checks whether a PropertyType with a given alias already exists /// diff --git a/src/Umbraco.Core/Models/IDataType.cs b/src/Umbraco.Core/Models/IDataType.cs index b6d70b890f..e419d175cb 100644 --- a/src/Umbraco.Core/Models/IDataType.cs +++ b/src/Umbraco.Core/Models/IDataType.cs @@ -1,4 +1,4 @@ -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { diff --git a/src/Umbraco.Core/Models/IDictionaryItem.cs b/src/Umbraco.Core/Models/IDictionaryItem.cs index 52b969dc4d..6983a536d3 100644 --- a/src/Umbraco.Core/Models/IDictionaryItem.cs +++ b/src/Umbraco.Core/Models/IDictionaryItem.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { diff --git a/src/Umbraco.Core/Models/IDictionaryTranslation.cs b/src/Umbraco.Core/Models/IDictionaryTranslation.cs index 48badb570a..c66322b75d 100644 --- a/src/Umbraco.Core/Models/IDictionaryTranslation.cs +++ b/src/Umbraco.Core/Models/IDictionaryTranslation.cs @@ -1,5 +1,5 @@ using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Mappers; namespace Umbraco.Core.Models diff --git a/src/Umbraco.Core/Models/IDomain.cs b/src/Umbraco.Core/Models/IDomain.cs index ef95f59ded..55d5bc88c2 100644 --- a/src/Umbraco.Core/Models/IDomain.cs +++ b/src/Umbraco.Core/Models/IDomain.cs @@ -1,4 +1,4 @@ -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { diff --git a/src/Umbraco.Core/Models/IFile.cs b/src/Umbraco.Core/Models/IFile.cs index 18dcdcdf80..9b974276c1 100644 --- a/src/Umbraco.Core/Models/IFile.cs +++ b/src/Umbraco.Core/Models/IFile.cs @@ -1,5 +1,5 @@ using System; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { diff --git a/src/Umbraco.Core/Models/ILanguage.cs b/src/Umbraco.Core/Models/ILanguage.cs index 2fc82df3a8..8eb9063302 100644 --- a/src/Umbraco.Core/Models/ILanguage.cs +++ b/src/Umbraco.Core/Models/ILanguage.cs @@ -1,6 +1,6 @@ using System.Globalization; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { diff --git a/src/Umbraco.Core/Models/IMacro.cs b/src/Umbraco.Core/Models/IMacro.cs index 7521b22a48..1100212190 100644 --- a/src/Umbraco.Core/Models/IMacro.cs +++ b/src/Umbraco.Core/Models/IMacro.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { diff --git a/src/Umbraco.Core/Models/IMacroProperty.cs b/src/Umbraco.Core/Models/IMacroProperty.cs index 253e856a27..b3c592fd5d 100644 --- a/src/Umbraco.Core/Models/IMacroProperty.cs +++ b/src/Umbraco.Core/Models/IMacroProperty.cs @@ -1,6 +1,6 @@ using System; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { diff --git a/src/Umbraco.Core/Models/IMemberGroup.cs b/src/Umbraco.Core/Models/IMemberGroup.cs index 1a3d8a3909..c92484d4c0 100644 --- a/src/Umbraco.Core/Models/IMemberGroup.cs +++ b/src/Umbraco.Core/Models/IMemberGroup.cs @@ -1,5 +1,5 @@ using System.Collections.Generic; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { diff --git a/src/Umbraco.Core/Models/IMigrationEntry.cs b/src/Umbraco.Core/Models/IMigrationEntry.cs index db820b565e..5ab4853542 100644 --- a/src/Umbraco.Core/Models/IMigrationEntry.cs +++ b/src/Umbraco.Core/Models/IMigrationEntry.cs @@ -1,6 +1,6 @@ using System; using Semver; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { diff --git a/src/Umbraco.Core/Models/IRedirectUrl.cs b/src/Umbraco.Core/Models/IRedirectUrl.cs index ed28f16855..f3c65fe89c 100644 --- a/src/Umbraco.Core/Models/IRedirectUrl.cs +++ b/src/Umbraco.Core/Models/IRedirectUrl.cs @@ -1,6 +1,6 @@ using System; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { diff --git a/src/Umbraco.Core/Models/IRelation.cs b/src/Umbraco.Core/Models/IRelation.cs index 33aafa4f4e..bb8d218d9c 100644 --- a/src/Umbraco.Core/Models/IRelation.cs +++ b/src/Umbraco.Core/Models/IRelation.cs @@ -1,5 +1,5 @@ using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { diff --git a/src/Umbraco.Core/Models/IRelationType.cs b/src/Umbraco.Core/Models/IRelationType.cs index df71fdd541..c52075efac 100644 --- a/src/Umbraco.Core/Models/IRelationType.cs +++ b/src/Umbraco.Core/Models/IRelationType.cs @@ -1,6 +1,6 @@ using System; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { diff --git a/src/Umbraco.Core/Models/IServerRegistration.cs b/src/Umbraco.Core/Models/IServerRegistration.cs index df7ad57923..70d3964fc5 100644 --- a/src/Umbraco.Core/Models/IServerRegistration.cs +++ b/src/Umbraco.Core/Models/IServerRegistration.cs @@ -1,5 +1,5 @@ using System; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Sync; namespace Umbraco.Core.Models diff --git a/src/Umbraco.Core/Models/ITag.cs b/src/Umbraco.Core/Models/ITag.cs index 734a355efe..76f7a46900 100644 --- a/src/Umbraco.Core/Models/ITag.cs +++ b/src/Umbraco.Core/Models/ITag.cs @@ -1,5 +1,5 @@ using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { diff --git a/src/Umbraco.Core/Models/ITemplate.cs b/src/Umbraco.Core/Models/ITemplate.cs index 49037e6804..8e3571a83c 100644 --- a/src/Umbraco.Core/Models/ITemplate.cs +++ b/src/Umbraco.Core/Models/ITemplate.cs @@ -1,6 +1,6 @@ using System; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { diff --git a/src/Umbraco.Core/Models/Identity/BackOfficeIdentityUser.cs b/src/Umbraco.Core/Models/Identity/BackOfficeIdentityUser.cs index 28659d6ffe..3de0d11de1 100644 --- a/src/Umbraco.Core/Models/Identity/BackOfficeIdentityUser.cs +++ b/src/Umbraco.Core/Models/Identity/BackOfficeIdentityUser.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Reflection; using System.Security.Claims; using System.Threading.Tasks; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Core.Security; diff --git a/src/Umbraco.Core/Models/Identity/IIdentityUserLogin.cs b/src/Umbraco.Core/Models/Identity/IIdentityUserLogin.cs index 39a3b911a4..198f87cf21 100644 --- a/src/Umbraco.Core/Models/Identity/IIdentityUserLogin.cs +++ b/src/Umbraco.Core/Models/Identity/IIdentityUserLogin.cs @@ -1,4 +1,4 @@ -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models.Identity { diff --git a/src/Umbraco.Core/Models/Identity/IdentityUserLogin.cs b/src/Umbraco.Core/Models/Identity/IdentityUserLogin.cs index 46a9f6186b..28a9fe2f15 100644 --- a/src/Umbraco.Core/Models/Identity/IdentityUserLogin.cs +++ b/src/Umbraco.Core/Models/Identity/IdentityUserLogin.cs @@ -1,5 +1,5 @@ using System; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models.Identity { @@ -7,7 +7,7 @@ namespace Umbraco.Core.Models.Identity /// Entity type for a user's login (i.e. facebook, google) /// /// - public class IdentityUserLogin : EntityBase.EntityBase, IIdentityUserLogin + public class IdentityUserLogin : EntityBase, IIdentityUserLogin { public IdentityUserLogin(string loginProvider, string providerKey, int userId) { diff --git a/src/Umbraco.Core/Models/Language.cs b/src/Umbraco.Core/Models/Language.cs index 5cc9d4948e..6dfe59778f 100644 --- a/src/Umbraco.Core/Models/Language.cs +++ b/src/Umbraco.Core/Models/Language.cs @@ -2,7 +2,7 @@ using System.Globalization; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { @@ -11,7 +11,7 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - public class Language : EntityBase.EntityBase, ILanguage + public class Language : EntityBase, ILanguage { private static readonly Lazy Ps = new Lazy(); diff --git a/src/Umbraco.Core/Models/Macro.cs b/src/Umbraco.Core/Models/Macro.cs index 6ae76505f4..bd05abb1c1 100644 --- a/src/Umbraco.Core/Models/Macro.cs +++ b/src/Umbraco.Core/Models/Macro.cs @@ -5,7 +5,7 @@ using System.ComponentModel; using System.Linq; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Strings; namespace Umbraco.Core.Models @@ -15,7 +15,7 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - public class Macro : EntityBase.EntityBase, IMacro + public class Macro : EntityBase, IMacro { public Macro() { diff --git a/src/Umbraco.Core/Models/MacroProperty.cs b/src/Umbraco.Core/Models/MacroProperty.cs index 5936344a79..5d67664206 100644 --- a/src/Umbraco.Core/Models/MacroProperty.cs +++ b/src/Umbraco.Core/Models/MacroProperty.cs @@ -1,7 +1,7 @@ using System; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.PropertyEditors; namespace Umbraco.Core.Models @@ -84,7 +84,7 @@ namespace Umbraco.Core.Models public readonly PropertyInfo AliasSelector = ExpressionHelper.GetPropertyInfo(x => x.Alias); public readonly PropertyInfo NameSelector = ExpressionHelper.GetPropertyInfo(x => x.Name); public readonly PropertyInfo SortOrderSelector = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); - public readonly PropertyInfo IdSelector = ExpressionHelper.GetPropertyInfo(x => x.Id); + public readonly PropertyInfo IdSelector = ExpressionHelper.GetPropertyInfo(x => x.Id); public readonly PropertyInfo PropertyTypeSelector = ExpressionHelper.GetPropertyInfo(x => x.EditorAlias); } diff --git a/src/Umbraco.Core/Models/MemberGroup.cs b/src/Umbraco.Core/Models/MemberGroup.cs index d1dbedab20..b18168f398 100644 --- a/src/Umbraco.Core/Models/MemberGroup.cs +++ b/src/Umbraco.Core/Models/MemberGroup.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { @@ -11,7 +11,7 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - public class MemberGroup : EntityBase.EntityBase, IMemberGroup + public class MemberGroup : EntityBase, IMemberGroup { public MemberGroup() { diff --git a/src/Umbraco.Core/Models/Membership/ContentPermissionSet.cs b/src/Umbraco.Core/Models/Membership/ContentPermissionSet.cs index 9eba76a09d..f683db2830 100644 --- a/src/Umbraco.Core/Models/Membership/ContentPermissionSet.cs +++ b/src/Umbraco.Core/Models/Membership/ContentPermissionSet.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models.Membership { diff --git a/src/Umbraco.Core/Models/Membership/IMembershipUser.cs b/src/Umbraco.Core/Models/Membership/IMembershipUser.cs index 15ce8bae46..6cffa5bcd8 100644 --- a/src/Umbraco.Core/Models/Membership/IMembershipUser.cs +++ b/src/Umbraco.Core/Models/Membership/IMembershipUser.cs @@ -1,5 +1,5 @@ using System; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models.Membership { diff --git a/src/Umbraco.Core/Models/Membership/IUser.cs b/src/Umbraco.Core/Models/Membership/IUser.cs index af0f0b8da7..dec0095243 100644 --- a/src/Umbraco.Core/Models/Membership/IUser.cs +++ b/src/Umbraco.Core/Models/Membership/IUser.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models.Membership { diff --git a/src/Umbraco.Core/Models/Membership/IUserGroup.cs b/src/Umbraco.Core/Models/Membership/IUserGroup.cs index 7b27657d09..de5842df61 100644 --- a/src/Umbraco.Core/Models/Membership/IUserGroup.cs +++ b/src/Umbraco.Core/Models/Membership/IUserGroup.cs @@ -1,5 +1,5 @@ using System.Collections.Generic; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models.Membership { diff --git a/src/Umbraco.Core/Models/Membership/IUserType.cs b/src/Umbraco.Core/Models/Membership/IUserType.cs index 084e0b6c7f..118d66074f 100644 --- a/src/Umbraco.Core/Models/Membership/IUserType.cs +++ b/src/Umbraco.Core/Models/Membership/IUserType.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.ComponentModel; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models.Membership { diff --git a/src/Umbraco.Core/Models/Membership/User.cs b/src/Umbraco.Core/Models/Membership/User.cs index 61b6077c0a..de410ffb9a 100644 --- a/src/Umbraco.Core/Models/Membership/User.cs +++ b/src/Umbraco.Core/Models/Membership/User.cs @@ -9,7 +9,7 @@ using System.Runtime.Serialization; using Umbraco.Core.Composing; using Umbraco.Core.Configuration; using Umbraco.Core.Logging; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models.Membership { @@ -18,7 +18,7 @@ namespace Umbraco.Core.Models.Membership /// [Serializable] [DataContract(IsReference = true)] - public class User : EntityBase.EntityBase, IUser, IProfile + public class User : EntityBase, IUser, IProfile { /// /// Constructor for creating a new/empty user diff --git a/src/Umbraco.Core/Models/Membership/UserGroup.cs b/src/Umbraco.Core/Models/Membership/UserGroup.cs index cd9e993bce..ccd60f5861 100644 --- a/src/Umbraco.Core/Models/Membership/UserGroup.cs +++ b/src/Umbraco.Core/Models/Membership/UserGroup.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Strings; namespace Umbraco.Core.Models.Membership @@ -12,7 +12,7 @@ namespace Umbraco.Core.Models.Membership /// [Serializable] [DataContract(IsReference = true)] - internal class UserGroup : EntityBase.EntityBase, IUserGroup, IReadOnlyUserGroup + internal class UserGroup : EntityBase, IUserGroup, IReadOnlyUserGroup { private int? _startContentId; private int? _startMediaId; diff --git a/src/Umbraco.Core/Models/Membership/UserType.cs b/src/Umbraco.Core/Models/Membership/UserType.cs index 1f80d0f4b3..d2e4a8f6cb 100644 --- a/src/Umbraco.Core/Models/Membership/UserType.cs +++ b/src/Umbraco.Core/Models/Membership/UserType.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Strings; namespace Umbraco.Core.Models.Membership @@ -12,7 +12,7 @@ namespace Umbraco.Core.Models.Membership [EditorBrowsable(EditorBrowsableState.Never)] [Serializable] [DataContract(IsReference = true)] - internal class UserType : EntityBase.EntityBase, IUserType + internal class UserType : EntityBase, IUserType { private string _alias; private string _name; diff --git a/src/Umbraco.Core/Models/MigrationEntry.cs b/src/Umbraco.Core/Models/MigrationEntry.cs index 9407be8950..9ac9ae58a4 100644 --- a/src/Umbraco.Core/Models/MigrationEntry.cs +++ b/src/Umbraco.Core/Models/MigrationEntry.cs @@ -1,11 +1,11 @@ using System; using System.Reflection; using Semver; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { - public class MigrationEntry : EntityBase.EntityBase, IMigrationEntry + public class MigrationEntry : EntityBase, IMigrationEntry { public MigrationEntry() { diff --git a/src/Umbraco.Core/Models/ObjectTypes.cs b/src/Umbraco.Core/Models/ObjectTypes.cs new file mode 100644 index 0000000000..2eb4d70a3a --- /dev/null +++ b/src/Umbraco.Core/Models/ObjectTypes.cs @@ -0,0 +1,163 @@ +using System; +using System.Collections.Concurrent; +using System.Reflection; +using Umbraco.Core.CodeAnnotations; + +namespace Umbraco.Core.Models +{ + /// + /// Provides utilities and extension methods to handle object types. + /// + public static class ObjectTypes + { + // must be concurrent to avoid thread collisions! + private static readonly ConcurrentDictionary UmbracoGuids = new ConcurrentDictionary(); + private static readonly ConcurrentDictionary UmbracoUdiTypes = new ConcurrentDictionary(); + private static readonly ConcurrentDictionary UmbracoFriendlyNames = new ConcurrentDictionary(); + private static readonly ConcurrentDictionary UmbracoTypes = new ConcurrentDictionary(); + private static readonly ConcurrentDictionary GuidUdiTypes = new ConcurrentDictionary(); + private static readonly ConcurrentDictionary GuidObjectTypes = new ConcurrentDictionary(); + private static readonly ConcurrentDictionary GuidTypes = new ConcurrentDictionary(); + + private static FieldInfo GetEnumField(string name) + { + return typeof (UmbracoObjectTypes).GetField(name, BindingFlags.Public | BindingFlags.Static); + } + + private static FieldInfo GetEnumField(Guid guid) + { + var fields = typeof (UmbracoObjectTypes).GetFields(BindingFlags.Public | BindingFlags.Static); + foreach (var field in fields) + { + var attribute = field.GetCustomAttribute(false); + if (attribute != null && attribute.ObjectId == guid) return field; + } + + return null; + } + + /// + /// Gets the Umbraco object type corresponding to a name. + /// + public static UmbracoObjectTypes GetUmbracoObjectType(string name) + { + return (UmbracoObjectTypes) Enum.Parse(typeof (UmbracoObjectTypes), name, false); + } + + #region Guid object type utilities + + /// + /// Gets the Umbraco object type corresponding to an object type Guid. + /// + public static UmbracoObjectTypes GetUmbracoObjectType(Guid objectType) + { + return GuidObjectTypes.GetOrAdd(objectType, t => + { + var field = GetEnumField(objectType); + if (field == null) return UmbracoObjectTypes.Unknown; + + return (UmbracoObjectTypes) field.GetValue(null); + }); + } + + /// + /// Gets the Udi type corresponding to an object type Guid. + /// + public static string GetUdiType(Guid objectType) + { + return GuidUdiTypes.GetOrAdd(objectType, t => + { + var field = GetEnumField(objectType); + if (field == null) return Constants.UdiEntityType.Unknown; + + var attribute = field.GetCustomAttribute(false); + return attribute?.UdiType ?? Constants.UdiEntityType.Unknown; + }); + } + + /// + /// Gets the Clr type corresponding to an object type Guid. + /// + public static Type GetClrType(Guid objectType) + { + return GuidTypes.GetOrAdd(objectType, t => + { + var field = GetEnumField(objectType); + if (field == null) return null; + + var attribute = field.GetCustomAttribute(false); + return attribute?.ModelType; + }); + } + + #endregion + + #region UmbracoObjectTypes extension methods + + /// + /// Gets the object type Guid corresponding to this Umbraco object type. + /// + public static Guid GetGuid(this UmbracoObjectTypes objectType) + { + return UmbracoGuids.GetOrAdd(objectType, t => + { + var field = GetEnumField(t.ToString()); + var attribute = field.GetCustomAttribute(false); + + return attribute?.ObjectId ?? Guid.Empty; + }); + } + + /// + /// Gets the Udi type corresponding to this Umbraco object type. + /// + public static string GetUdiType(this UmbracoObjectTypes objectType) + { + return UmbracoUdiTypes.GetOrAdd(objectType, t => + { + var field = GetEnumField(t.ToString()); + var attribute = field.GetCustomAttribute(false); + + return attribute?.UdiType ?? Constants.UdiEntityType.Unknown; + }); + } + + /// + /// Gets the name corresponding to this Umbraco object type. + /// + public static string GetName(this UmbracoObjectTypes objectType) + { + return Enum.GetName(typeof (UmbracoObjectTypes), objectType); + } + + /// + /// Gets the friendly name corresponding to this Umbraco object type. + /// + public static string GetFriendlyName(this UmbracoObjectTypes objectType) + { + return UmbracoFriendlyNames.GetOrAdd(objectType, t => + { + var field = GetEnumField(t.ToString()); + var attribute = field.GetCustomAttribute(false); + + return attribute?.ToString() ?? string.Empty; + }); + } + + /// + /// Gets the Clr type corresponding to this Umbraco object type. + /// + public static Type GetClrType(this UmbracoObjectTypes objectType) + { + return UmbracoTypes.GetOrAdd(objectType, t => + { + var field = GetEnumField(t.ToString()); + var attribute = field.GetCustomAttribute(false); + + return attribute?.ModelType; + }); + } + + #endregion + } +} diff --git a/src/Umbraco.Core/Models/PathValidationExtensions.cs b/src/Umbraco.Core/Models/PathValidationExtensions.cs new file mode 100644 index 0000000000..e3c0b785e4 --- /dev/null +++ b/src/Umbraco.Core/Models/PathValidationExtensions.cs @@ -0,0 +1,115 @@ +using System; +using System.IO; +using Umbraco.Core.Logging; +using Umbraco.Core.Models.Entities; +using Umbraco.Core.Persistence.Dtos; + +namespace Umbraco.Core.Models +{ + /// + /// Provides extension methods for path validation. + /// + internal static class PathValidationExtensions + { + /// + /// Does a quick check on the entity's set path to ensure that it's valid and consistent + /// + /// + /// + public static void ValidatePathWithException(this NodeDto entity) + { + //don't validate if it's empty and it has no id + if (entity.NodeId == default(int) && entity.Path.IsNullOrWhiteSpace()) + return; + + if (entity.Path.IsNullOrWhiteSpace()) + throw new InvalidDataException($"The content item {entity.NodeId} has an empty path: {entity.Path} with parentID: {entity.ParentId}"); + + var pathParts = entity.Path.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + if (pathParts.Length < 2) + { + //a path cannot be less than 2 parts, at a minimum it must be root (-1) and it's own id + throw new InvalidDataException($"The content item {entity.NodeId} has an invalid path: {entity.Path} with parentID: {entity.ParentId}"); + } + + if (entity.ParentId != default(int) && pathParts[pathParts.Length - 2] != entity.ParentId.ToInvariantString()) + { + //the 2nd last id in the path must be it's parent id + throw new InvalidDataException($"The content item {entity.NodeId} has an invalid path: {entity.Path} with parentID: {entity.ParentId}"); + } + } + + /// + /// Does a quick check on the entity's set path to ensure that it's valid and consistent + /// + /// + /// + public static bool ValidatePath(this IUmbracoEntity entity) + { + //don't validate if it's empty and it has no id + if (entity.HasIdentity == false && entity.Path.IsNullOrWhiteSpace()) + return true; + + if (entity.Path.IsNullOrWhiteSpace()) + return false; + + var pathParts = entity.Path.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + if (pathParts.Length < 2) + { + //a path cannot be less than 2 parts, at a minimum it must be root (-1) and it's own id + return false; + } + + if (entity.ParentId != default(int) && pathParts[pathParts.Length - 2] != entity.ParentId.ToInvariantString()) + { + //the 2nd last id in the path must be it's parent id + return false; + } + + return true; + } + + /// + /// This will validate the entity's path and if it's invalid it will fix it, if fixing is required it will recursively + /// check and fix all ancestors if required. + /// + /// + /// + /// A callback specified to retrieve the parent entity of the entity + /// A callback specified to update a fixed entity + public static void EnsureValidPath(this T entity, + ILogger logger, + Func getParent, + Action update) + where T: IUmbracoEntity + { + if (entity.HasIdentity == false) + throw new InvalidOperationException("Could not ensure the entity path, the entity has not been assigned an identity"); + + if (entity.ValidatePath() == false) + { + logger.Warn(typeof(UmbracoEntityExtensions), $"The content item {entity.Id} has an invalid path: {entity.Path} with parentID: {entity.ParentId}"); + if (entity.ParentId == -1) + { + entity.Path = string.Concat("-1,", entity.Id); + //path changed, update it + update(entity); + } + else + { + var parent = getParent(entity); + if (parent == null) + throw new NullReferenceException("Could not ensure path for entity " + entity.Id + " could not resolve it's parent " + entity.ParentId); + + //the parent must also be valid! + parent.EnsureValidPath(logger, getParent, update); + + entity.Path = string.Concat(parent.Path, ",", entity.Id); + //path changed, update it + update(entity); + } + } + } + + } +} \ No newline at end of file diff --git a/src/Umbraco.Core/Models/Property.cs b/src/Umbraco.Core/Models/Property.cs index 365247669c..28379069c8 100644 --- a/src/Umbraco.Core/Models/Property.cs +++ b/src/Umbraco.Core/Models/Property.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Reflection; using System.Runtime.Serialization; using Umbraco.Core.Collections; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { @@ -14,7 +14,7 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - public class Property : EntityBase.EntityBase + public class Property : EntityBase { private List _tagChanges; diff --git a/src/Umbraco.Core/Models/PropertyGroup.cs b/src/Umbraco.Core/Models/PropertyGroup.cs index a458edb387..02007c34fb 100644 --- a/src/Umbraco.Core/Models/PropertyGroup.cs +++ b/src/Umbraco.Core/Models/PropertyGroup.cs @@ -3,7 +3,7 @@ using System.Collections.Specialized; using System.Diagnostics; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { @@ -13,7 +13,7 @@ namespace Umbraco.Core.Models [Serializable] [DataContract(IsReference = true)] [DebuggerDisplay("Id: {Id}, Name: {Name}")] - public class PropertyGroup : EntityBase.EntityBase, IEquatable + public class PropertyGroup : EntityBase, IEquatable { private static readonly Lazy Ps = new Lazy(); diff --git a/src/Umbraco.Core/Models/PropertyGroupCollection.cs b/src/Umbraco.Core/Models/PropertyGroupCollection.cs index fda40644f4..abec6febcb 100644 --- a/src/Umbraco.Core/Models/PropertyGroupCollection.cs +++ b/src/Umbraco.Core/Models/PropertyGroupCollection.cs @@ -5,7 +5,6 @@ using System.Collections.Specialized; using System.Linq; using System.Runtime.Serialization; using System.Threading; -using Umbraco.Core.Models.EntityBase; namespace Umbraco.Core.Models { diff --git a/src/Umbraco.Core/Models/PropertyType.cs b/src/Umbraco.Core/Models/PropertyType.cs index 515a7086ea..5d0f70ac01 100644 --- a/src/Umbraco.Core/Models/PropertyType.cs +++ b/src/Umbraco.Core/Models/PropertyType.cs @@ -3,7 +3,7 @@ using System.Diagnostics; using System.Reflection; using System.Runtime.Serialization; using System.Text.RegularExpressions; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Strings; @@ -15,7 +15,7 @@ namespace Umbraco.Core.Models [Serializable] [DataContract(IsReference = true)] [DebuggerDisplay("Id: {Id}, Name: {Name}, Alias: {Alias}")] - public class PropertyType : EntityBase.EntityBase, IEquatable + public class PropertyType : EntityBase, IEquatable { private static readonly Lazy Ps = new Lazy(); diff --git a/src/Umbraco.Core/Models/PublicAccessEntry.cs b/src/Umbraco.Core/Models/PublicAccessEntry.cs index 0b04bc9782..a9f568e43a 100644 --- a/src/Umbraco.Core/Models/PublicAccessEntry.cs +++ b/src/Umbraco.Core/Models/PublicAccessEntry.cs @@ -5,13 +5,13 @@ using System.Collections.Specialized; using System.Linq; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { [Serializable] [DataContract(IsReference = true)] - public class PublicAccessEntry : EntityBase.EntityBase + public class PublicAccessEntry : EntityBase { private readonly ObservableCollection _ruleCollection; private int _protectedNodeId; diff --git a/src/Umbraco.Core/Models/PublicAccessRule.cs b/src/Umbraco.Core/Models/PublicAccessRule.cs index cc21e7a27a..67b9ece2f9 100644 --- a/src/Umbraco.Core/Models/PublicAccessRule.cs +++ b/src/Umbraco.Core/Models/PublicAccessRule.cs @@ -1,13 +1,13 @@ using System; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { [Serializable] [DataContract(IsReference = true)] - public class PublicAccessRule : EntityBase.EntityBase + public class PublicAccessRule : EntityBase { private string _ruleValue; private string _ruleType; diff --git a/src/Umbraco.Core/Models/RedirectUrl.cs b/src/Umbraco.Core/Models/RedirectUrl.cs index 6b42a5c662..187d9fdd6e 100644 --- a/src/Umbraco.Core/Models/RedirectUrl.cs +++ b/src/Umbraco.Core/Models/RedirectUrl.cs @@ -1,7 +1,7 @@ using System; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { @@ -10,7 +10,7 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - public class RedirectUrl : EntityBase.EntityBase, IRedirectUrl + public class RedirectUrl : EntityBase, IRedirectUrl { /// /// Initializes a new instance of the class. diff --git a/src/Umbraco.Core/Models/Relation.cs b/src/Umbraco.Core/Models/Relation.cs index a6d3023235..a06ca44441 100644 --- a/src/Umbraco.Core/Models/Relation.cs +++ b/src/Umbraco.Core/Models/Relation.cs @@ -1,7 +1,7 @@ using System; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Mappers; namespace Umbraco.Core.Models @@ -11,7 +11,7 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - public class Relation : EntityBase.EntityBase, IRelation + public class Relation : EntityBase, IRelation { //NOTE: The datetime column from umbracoRelation is set on CreateDate on the Entity private int _parentId; diff --git a/src/Umbraco.Core/Models/RelationType.cs b/src/Umbraco.Core/Models/RelationType.cs index 70f14e3571..65d44d43d9 100644 --- a/src/Umbraco.Core/Models/RelationType.cs +++ b/src/Umbraco.Core/Models/RelationType.cs @@ -2,7 +2,7 @@ using System.Reflection; using System.Runtime.Serialization; using Umbraco.Core.Exceptions; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Mappers; namespace Umbraco.Core.Models @@ -12,7 +12,7 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - public class RelationType : EntityBase.EntityBase, IRelationType + public class RelationType : EntityBase, IRelationType { private string _name; private string _alias; diff --git a/src/Umbraco.Core/Models/ServerRegistration.cs b/src/Umbraco.Core/Models/ServerRegistration.cs index 9e0eef340a..7e65111f7d 100644 --- a/src/Umbraco.Core/Models/ServerRegistration.cs +++ b/src/Umbraco.Core/Models/ServerRegistration.cs @@ -1,14 +1,14 @@ using System; using System.Globalization; using System.Reflection; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { /// /// Represents a registered server in a multiple-servers environment. /// - public class ServerRegistration : EntityBase.EntityBase, IServerRegistration + public class ServerRegistration : EntityBase, IServerRegistration { private string _serverAddress; private string _serverIdentity; diff --git a/src/Umbraco.Core/Models/StylesheetProperty.cs b/src/Umbraco.Core/Models/StylesheetProperty.cs index d014590a06..2793cd0414 100644 --- a/src/Umbraco.Core/Models/StylesheetProperty.cs +++ b/src/Umbraco.Core/Models/StylesheetProperty.cs @@ -1,7 +1,7 @@ using System; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { diff --git a/src/Umbraco.Core/Models/Tag.cs b/src/Umbraco.Core/Models/Tag.cs index 7d45d3afcf..755e809338 100644 --- a/src/Umbraco.Core/Models/Tag.cs +++ b/src/Umbraco.Core/Models/Tag.cs @@ -2,13 +2,13 @@ using System.Collections; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { [Serializable] [DataContract(IsReference = true)] - public class Tag : EntityBase.EntityBase, ITag + public class Tag : EntityBase, ITag { public Tag() { diff --git a/src/Umbraco.Core/Models/Task.cs b/src/Umbraco.Core/Models/Task.cs index 2b0203b75e..1899463c49 100644 --- a/src/Umbraco.Core/Models/Task.cs +++ b/src/Umbraco.Core/Models/Task.cs @@ -1,7 +1,7 @@ using System; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { @@ -10,7 +10,7 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - public class Task : EntityBase.EntityBase + public class Task : EntityBase { private bool _closed; private TaskType _taskType; diff --git a/src/Umbraco.Core/Models/TaskType.cs b/src/Umbraco.Core/Models/TaskType.cs index 8440e8b846..3b1b3ecff2 100644 --- a/src/Umbraco.Core/Models/TaskType.cs +++ b/src/Umbraco.Core/Models/TaskType.cs @@ -1,7 +1,7 @@ using System; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { @@ -10,7 +10,7 @@ namespace Umbraco.Core.Models /// [Serializable] [DataContract(IsReference = true)] - public class TaskType : EntityBase.EntityBase + public class TaskType : EntityBase { private string _alias; diff --git a/src/Umbraco.Core/Models/Template.cs b/src/Umbraco.Core/Models/Template.cs index aafb36eaeb..f7d74b2d5f 100644 --- a/src/Umbraco.Core/Models/Template.cs +++ b/src/Umbraco.Core/Models/Template.cs @@ -8,7 +8,6 @@ using System.Text; using Umbraco.Core.Configuration; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Services; using Umbraco.Core.Strings; diff --git a/src/Umbraco.Core/Models/UmbracoDomain.cs b/src/Umbraco.Core/Models/UmbracoDomain.cs index 839a8edf51..d7266f77fe 100644 --- a/src/Umbraco.Core/Models/UmbracoDomain.cs +++ b/src/Umbraco.Core/Models/UmbracoDomain.cs @@ -1,13 +1,13 @@ using System; using System.Reflection; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { [Serializable] [DataContract(IsReference = true)] - public class UmbracoDomain : EntityBase.EntityBase, IDomain + public class UmbracoDomain : EntityBase, IDomain { public UmbracoDomain(string domainName) { diff --git a/src/Umbraco.Core/Models/UmbracoEntity.cs b/src/Umbraco.Core/Models/UmbracoEntity.cs deleted file mode 100644 index d2130c3f86..0000000000 --- a/src/Umbraco.Core/Models/UmbracoEntity.cs +++ /dev/null @@ -1,251 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using Umbraco.Core.Models.EntityBase; - -namespace Umbraco.Core.Models -{ - // fixme - changing the name of some properties that were in additionalData => must update corresponding javascript? - - public class UmbracoContentEntity : UmbracoEntity - { - private static PropertySelectors _selectors; - private static PropertySelectors Selectors => _selectors ?? (_selectors = new PropertySelectors()); - - private string _contentTypeAlias; - - private class PropertySelectors - { - public readonly PropertyInfo ContentTypeAlias = ExpressionHelper.GetPropertyInfo(x => x.ContentTypeAlias); - } - - public string ContentTypeAlias - { - get => _contentTypeAlias; - set => SetPropertyValueAndDetectChanges(value, ref _contentTypeAlias, Selectors.ContentTypeAlias); - } - } - - public class UmbracoDocumentEntity : UmbracoContentEntity - { - private static PropertySelectors _selectors; - private static PropertySelectors Selectors => _selectors ?? (_selectors = new PropertySelectors()); - - private bool _published; - private bool _edited; - - private class PropertySelectors - { - public readonly PropertyInfo Published = ExpressionHelper.GetPropertyInfo(x => x.Published); - public readonly PropertyInfo Edited = ExpressionHelper.GetPropertyInfo(x => x.Edited); - } - - public bool Published - { - get => _published; - set => SetPropertyValueAndDetectChanges(value, ref _published, Selectors.Published); - } - - public bool Edited - { - get => _edited; - set => SetPropertyValueAndDetectChanges(value, ref _edited, Selectors.Edited); - } - } - - /// - /// Implementation of the for internal use. - /// - public class UmbracoEntity : EntityBase.EntityBase, IUmbracoEntity - { - private static PropertySelectors _selectors; - private static PropertySelectors Selectors => _selectors ?? (_selectors = new PropertySelectors()); - - private Guid _nodeObjectType; - - private int _creatorId; - - private int _level; - private string _name; - private int _parentId; - private string _path; - private int _sortOrder; - private bool _trashed; - - private bool _hasChildren; - - // fixme - usage - private string _contentTypeIcon; - private string _contentTypeThumbnail; - - // fixme - are we tracking changes on something that's basically READONLY? - private class PropertySelectors - { - public readonly PropertyInfo CreatorId = ExpressionHelper.GetPropertyInfo(x => x.CreatorId); - public readonly PropertyInfo Level = ExpressionHelper.GetPropertyInfo(x => x.Level); - public readonly PropertyInfo Name = ExpressionHelper.GetPropertyInfo(x => x.Name); - public readonly PropertyInfo ParentId = ExpressionHelper.GetPropertyInfo(x => x.ParentId); - public readonly PropertyInfo Path = ExpressionHelper.GetPropertyInfo(x => x.Path); - public readonly PropertyInfo SortOrder = ExpressionHelper.GetPropertyInfo(x => x.SortOrder); - public readonly PropertyInfo Trashed = ExpressionHelper.GetPropertyInfo(x => x.Trashed); - public readonly PropertyInfo HasChildren = ExpressionHelper.GetPropertyInfo(x => x.HasChildren); - public readonly PropertyInfo NodeObjectType = ExpressionHelper.GetPropertyInfo(x => x.NodeObjectType); - public readonly PropertyInfo ContentTypeIcon = ExpressionHelper.GetPropertyInfo(x => x.ContentTypeIcon); - public readonly PropertyInfo ContentTypeThumbnail = ExpressionHelper.GetPropertyInfo(x => x.ContentTypeThumbnail); - } - - public static readonly UmbracoEntity Root = new UmbracoEntity { Path = "-1", Name = "root", HasChildren = true }; - - public UmbracoEntity() - { - AdditionalData = new Dictionary(); - } - - public int CreatorId - { - get => _creatorId; - set => SetPropertyValueAndDetectChanges(value, ref _creatorId, Selectors.CreatorId); - } - - public int Level - { - get => _level; - set => SetPropertyValueAndDetectChanges(value, ref _level, Selectors.Level); - } - - public string Name - { - get => _name; - set => SetPropertyValueAndDetectChanges(value, ref _name, Selectors.Name); - } - - public int ParentId - { - get => _parentId; - set => SetPropertyValueAndDetectChanges(value, ref _parentId, Selectors.ParentId); - } - - public string Path - { - get => _path; - set => SetPropertyValueAndDetectChanges(value, ref _path, Selectors.Path); - } - - public int SortOrder - { - get => _sortOrder; - set => SetPropertyValueAndDetectChanges(value, ref _sortOrder, Selectors.SortOrder); - } - - public bool Trashed - { - get => _trashed; - set => SetPropertyValueAndDetectChanges(value, ref _trashed, Selectors.Trashed); - } - - public bool HasChildren - { - get => _hasChildren; - set => SetPropertyValueAndDetectChanges(value, ref _hasChildren, Selectors.HasChildren); - } - - public Guid NodeObjectType - { - get => _nodeObjectType; - set => SetPropertyValueAndDetectChanges(value, ref _nodeObjectType, Selectors.NodeObjectType); - } - - - - - - public IDictionary AdditionalData { get; } - - - public string ContentTypeIcon - { - get => _contentTypeIcon; - set - { - SetPropertyValueAndDetectChanges(value, ref _contentTypeIcon, Selectors.ContentTypeIcon); - AdditionalData["ContentTypeIcon"] = value; // custom and not in IUmbracoEntity - } - } - - public string ContentTypeThumbnail - { - get => _contentTypeThumbnail; - set - { - SetPropertyValueAndDetectChanges(value, ref _contentTypeThumbnail, Selectors.ContentTypeThumbnail); - AdditionalData["ContentTypeThumbnail"] = value; // custom and not in IUmbracoEntity - } - } - - public override object DeepClone() - { - var clone = (UmbracoEntity) base.DeepClone(); - - // disable change tracking - clone.DisableChangeTracking(); - - // deep clone additional data properties - // fixme - BUT the values are... only set in EntityRepository to non-deepclonable stuff?! - foreach (var key in clone.AdditionalData.Keys.ToArray()) - { - if (clone.AdditionalData[key] is IDeepCloneable deepCloneable) - clone.AdditionalData[key] = deepCloneable.DeepClone(); - } - - // enable tracking - clone.EnableChangeTracking(); - - return clone; - } - - // fixme - // wtf? is clone.AdditionalData at least shallow cloned? - // and, considering the only thing we put in EntityProperty are strings, - // what's the point of EntityProperty ??? - - /// - /// A struction that can be contained in the additional data of an UmbracoEntity representing - /// a user defined property - /// - public class EntityProperty : IDeepCloneable - { - public string PropertyEditorAlias { get; set; } - public object Value { get; set; } - - public object DeepClone() - { - //Memberwise clone on Entity will work since it doesn't have any deep elements - // for any sub class this will work for standard properties as well that aren't complex object's themselves. - var clone = MemberwiseClone(); - return clone; - } - - protected bool Equals(EntityProperty other) - { - return PropertyEditorAlias.Equals(other.PropertyEditorAlias) && Equals(Value, other.Value); - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) return false; - if (ReferenceEquals(this, obj)) return true; - if (obj.GetType() != GetType()) return false; - return Equals((EntityProperty) obj); - } - - public override int GetHashCode() - { - unchecked - { - return (PropertyEditorAlias.GetHashCode() * 397) ^ (Value != null ? Value.GetHashCode() : 0); - } - } - } - } -} diff --git a/src/Umbraco.Core/Models/UmbracoEntityExtensions.cs b/src/Umbraco.Core/Models/UmbracoEntityExtensions.cs index e5ed355b2a..e39be8b382 100644 --- a/src/Umbraco.Core/Models/UmbracoEntityExtensions.cs +++ b/src/Umbraco.Core/Models/UmbracoEntityExtensions.cs @@ -1,153 +1,14 @@ -using System; -using System.IO; -using Umbraco.Core.Logging; -using Umbraco.Core.Models.EntityBase; -using Umbraco.Core.Persistence.Dtos; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { + // fixme - this needs to go or be refactored! internal static class UmbracoEntityExtensions { - /// - /// Does a quick check on the entity's set path to ensure that it's valid and consistent - /// - /// - /// - public static void ValidatePathWithException(this NodeDto entity) - { - //don't validate if it's empty and it has no id - if (entity.NodeId == default(int) && entity.Path.IsNullOrWhiteSpace()) - return; - - if (entity.Path.IsNullOrWhiteSpace()) - throw new InvalidDataException($"The content item {entity.NodeId} has an empty path: {entity.Path} with parentID: {entity.ParentId}"); - - var pathParts = entity.Path.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - if (pathParts.Length < 2) - { - //a path cannot be less than 2 parts, at a minimum it must be root (-1) and it's own id - throw new InvalidDataException($"The content item {entity.NodeId} has an invalid path: {entity.Path} with parentID: {entity.ParentId}"); - } - - if (entity.ParentId != default(int) && pathParts[pathParts.Length - 2] != entity.ParentId.ToInvariantString()) - { - //the 2nd last id in the path must be it's parent id - throw new InvalidDataException($"The content item {entity.NodeId} has an invalid path: {entity.Path} with parentID: {entity.ParentId}"); - } - } - - /// - /// Does a quick check on the entity's set path to ensure that it's valid and consistent - /// - /// - /// - public static bool ValidatePath(this IUmbracoEntity entity) - { - //don't validate if it's empty and it has no id - if (entity.HasIdentity == false && entity.Path.IsNullOrWhiteSpace()) - return true; - - if (entity.Path.IsNullOrWhiteSpace()) - return false; - - var pathParts = entity.Path.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - if (pathParts.Length < 2) - { - //a path cannot be less than 2 parts, at a minimum it must be root (-1) and it's own id - return false; - } - - if (entity.ParentId != default(int) && pathParts[pathParts.Length - 2] != entity.ParentId.ToInvariantString()) - { - //the 2nd last id in the path must be it's parent id - return false; - } - - return true; - } - - /// - /// This will validate the entity's path and if it's invalid it will fix it, if fixing is required it will recursively - /// check and fix all ancestors if required. - /// - /// - /// - /// A callback specified to retrieve the parent entity of the entity - /// A callback specified to update a fixed entity - public static void EnsureValidPath(this T entity, - ILogger logger, - Func getParent, - Action update) - where T: IUmbracoEntity - { - if (entity.HasIdentity == false) - throw new InvalidOperationException("Could not ensure the entity path, the entity has not been assigned an identity"); - - if (entity.ValidatePath() == false) - { - logger.Warn(typeof(UmbracoEntityExtensions), $"The content item {entity.Id} has an invalid path: {entity.Path} with parentID: {entity.ParentId}"); - if (entity.ParentId == -1) - { - entity.Path = string.Concat("-1,", entity.Id); - //path changed, update it - update(entity); - } - else - { - var parent = getParent(entity); - if (parent == null) - throw new NullReferenceException("Could not ensure path for entity " + entity.Id + " could not resolve it's parent " + entity.ParentId); - - //the parent must also be valid! - parent.EnsureValidPath(logger, getParent, update); - - entity.Path = string.Concat(parent.Path, ",", entity.Id); - //path changed, update it - update(entity); - } - } - } - - /// - /// When resolved from EntityService this checks if the entity has the HasChildren flag - /// - /// - /// - public static bool HasChildren(this IUmbracoEntity entity) - { - // fixme - //return entity.HasChildren; // but then we would not need this extension method? - if (entity.AdditionalData.ContainsKey("HasChildren")) - { - var convert = entity.AdditionalData["HasChildren"].TryConvertTo(); - if (convert) - { - return convert.Result; - } - } - return false; - } - public static object GetAdditionalDataValueIgnoreCase(this IUmbracoEntity entity, string key, object defaultVal) { if (entity.AdditionalData.ContainsKeyIgnoreCase(key) == false) return defaultVal; return entity.AdditionalData.GetValueIgnoreCase(key, defaultVal); } - - /// - /// When resolved from EntityService this checks if the entity has the IsContainer flag - /// - /// - /// - public static bool IsContainer(this IUmbracoEntity entity) - { - if (entity.AdditionalData.ContainsKeyIgnoreCase("IsContainer") == false) return false; - var val = entity.AdditionalData.GetValueIgnoreCase("IsContainer", null); - if (val is bool && (bool) val) - { - return true; - } - return false; - } } } diff --git a/src/Umbraco.Core/Models/UmbracoObjectTypesExtensions.cs b/src/Umbraco.Core/Models/UmbracoObjectTypesExtensions.cs deleted file mode 100644 index 93582d337d..0000000000 --- a/src/Umbraco.Core/Models/UmbracoObjectTypesExtensions.cs +++ /dev/null @@ -1,138 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using Umbraco.Core.CodeAnnotations; - -namespace Umbraco.Core.Models -{ - /// - /// Extension methods for the UmbracoObjectTypes enum - /// - public static class UmbracoObjectTypesExtensions - { - //MUST be concurrent to avoid thread collisions! - private static readonly ConcurrentDictionary UmbracoObjectTypeCache = new ConcurrentDictionary(); - private static readonly ConcurrentDictionary UmbracoObjectTypeUdiCache = new ConcurrentDictionary(); - - /// - /// Get an UmbracoObjectTypes value from it's name - /// - /// Enum value name - /// an UmbracoObjectTypes Enum value - public static UmbracoObjectTypes GetUmbracoObjectType(string name) - { - return (UmbracoObjectTypes)Enum.Parse(typeof(UmbracoObjectTypes), name, false); - } - - /// - /// Get an instance of an UmbracoObjectTypes enum value from it's GUID - /// - /// Enum value GUID - /// an UmbracoObjectTypes Enum value - public static UmbracoObjectTypes GetUmbracoObjectType(Guid guid) - { - var umbracoObjectType = UmbracoObjectTypes.Unknown; - - foreach (var name in Enum.GetNames(typeof(UmbracoObjectTypes))) - { - if (GetUmbracoObjectType(name).GetGuid() == guid) - { - umbracoObjectType = GetUmbracoObjectType(name); - } - } - - return umbracoObjectType; - } - - public static string GetUdiType(Guid guid) - { - var umbracoObjectType = Constants.UdiEntityType.Unknown; - - foreach (var name in Enum.GetNames(typeof(UmbracoObjectTypes))) - { - var objType = GetUmbracoObjectType(name); - if (objType.GetGuid() == guid) - { - umbracoObjectType = GetUdiType(objType); - } - } - return umbracoObjectType; - } - - /// - /// Extension method for the UmbracoObjectTypes enum to return the enum GUID - /// - /// UmbracoObjectTypes Enum value - /// a GUID value of the UmbracoObjectTypes - public static Guid GetGuid(this UmbracoObjectTypes umbracoObjectType) - { - return UmbracoObjectTypeCache.GetOrAdd(umbracoObjectType, types => - { - var type = typeof (UmbracoObjectTypes); - var memberInfo = type.GetMember(umbracoObjectType.ToString()); - var attributes = memberInfo[0].GetCustomAttributes(typeof (UmbracoObjectTypeAttribute), false); - - if (attributes.Length == 0) - return Guid.Empty; - - var attribute = (UmbracoObjectTypeAttribute) attributes[0]; - if (attribute == null) - return Guid.Empty; - - return attribute.ObjectId; - }); - } - - public static string GetUdiType(this UmbracoObjectTypes umbracoObjectType) - { - return UmbracoObjectTypeUdiCache.GetOrAdd(umbracoObjectType, types => - { - var type = typeof(UmbracoObjectTypes); - var memInfo = type.GetMember(umbracoObjectType.ToString()); - var attributes = memInfo[0].GetCustomAttributes(typeof(UmbracoUdiTypeAttribute), - false); - - if (attributes.Length == 0) - return Constants.UdiEntityType.Unknown; - - var attribute = ((UmbracoUdiTypeAttribute)attributes[0]); - if (attribute == null) - return Constants.UdiEntityType.Unknown; - - return attribute.UdiType; - }); - } - - /// - /// Extension method for the UmbracoObjectTypes enum to return the enum name - /// - /// UmbracoObjectTypes value - /// The enum name of the UmbracoObjectTypes value - public static string GetName(this UmbracoObjectTypes umbracoObjectType) - { - return Enum.GetName(typeof(UmbracoObjectTypes), umbracoObjectType); - } - - /// - /// Extension method for the UmbracoObejctTypes enum to return the enum friendly name - /// - /// UmbracoObjectTypes value - /// a string of the FriendlyName - public static string GetFriendlyName(this UmbracoObjectTypes umbracoObjectType) - { - var type = typeof(UmbracoObjectTypes); - var memInfo = type.GetMember(umbracoObjectType.ToString()); - var attributes = memInfo[0].GetCustomAttributes(typeof(FriendlyNameAttribute), - false); - - if (attributes.Length == 0) - return string.Empty; - - var attribute = ((FriendlyNameAttribute)attributes[0]); - if (attribute == null) - return string.Empty; - - return attribute.ToString(); - } - } -} diff --git a/src/Umbraco.Core/Models/UserExtensions.cs b/src/Umbraco.Core/Models/UserExtensions.cs index 015ddc94f2..fe90ec8bfb 100644 --- a/src/Umbraco.Core/Models/UserExtensions.cs +++ b/src/Umbraco.Core/Models/UserExtensions.cs @@ -6,8 +6,7 @@ using System.Net; using Umbraco.Core.Cache; using Umbraco.Core.Configuration; using Umbraco.Core.Composing; -using Umbraco.Core.Models.EntityBase; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; diff --git a/src/Umbraco.Core/Persistence/Dtos/DataTypeDto.cs b/src/Umbraco.Core/Persistence/Dtos/DataTypeDto.cs index fceb077f35..f9c94a8125 100644 --- a/src/Umbraco.Core/Persistence/Dtos/DataTypeDto.cs +++ b/src/Umbraco.Core/Persistence/Dtos/DataTypeDto.cs @@ -18,7 +18,7 @@ namespace Umbraco.Core.Persistence.Dtos public int DataTypeId { get; set; } [Column("propertyEditorAlias")] - public string PropertyEditorAlias { get; set; } + public string EditorAlias { get; set; } [Column("dbType")] [Length(50)] diff --git a/src/Umbraco.Core/Persistence/Factories/ContentTypeFactory.cs b/src/Umbraco.Core/Persistence/Factories/ContentTypeFactory.cs index 5aa8968ecd..9cd9f8ab0a 100644 --- a/src/Umbraco.Core/Persistence/Factories/ContentTypeFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/ContentTypeFactory.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence.Dtos; diff --git a/src/Umbraco.Core/Persistence/Factories/DataTypeFactory.cs b/src/Umbraco.Core/Persistence/Factories/DataTypeFactory.cs index 4e174f6476..7da0326a9b 100644 --- a/src/Umbraco.Core/Persistence/Factories/DataTypeFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/DataTypeFactory.cs @@ -19,7 +19,7 @@ namespace Umbraco.Core.Persistence.Factories public IDataType BuildEntity(DataTypeDto dto) { - var dataTypeDefinition = new DataType(dto.PropertyEditorAlias); + var dataTypeDefinition = new DataType(dto.EditorAlias); try @@ -53,7 +53,7 @@ namespace Umbraco.Core.Persistence.Factories { var dataTypeDto = new DataTypeDto { - PropertyEditorAlias = entity.EditorAlias, + EditorAlias = entity.EditorAlias, DataTypeId = entity.Id, DbType = entity.DatabaseType.ToString(), NodeDto = BuildNodeDto(entity) diff --git a/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs b/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs index a682550690..2b9ea82228 100644 --- a/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/PropertyGroupFactory.cs @@ -58,7 +58,7 @@ namespace Umbraco.Core.Persistence.Factories foreach (var typeDto in typeDtos) { var tempGroupDto = groupDto; - var propertyType = _propertyTypeCtor(typeDto.DataTypeDto.PropertyEditorAlias, + var propertyType = _propertyTypeCtor(typeDto.DataTypeDto.EditorAlias, typeDto.DataTypeDto.DbType.EnumParse(true), typeDto.Alias); diff --git a/src/Umbraco.Core/Persistence/Factories/TemplateFactory.cs b/src/Umbraco.Core/Persistence/Factories/TemplateFactory.cs index e02bd1c6b0..a5be4d05bc 100644 --- a/src/Umbraco.Core/Persistence/Factories/TemplateFactory.cs +++ b/src/Umbraco.Core/Persistence/Factories/TemplateFactory.cs @@ -5,7 +5,7 @@ using System.Linq; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Dtos; namespace Umbraco.Core.Persistence.Factories diff --git a/src/Umbraco.Core/Persistence/Mappers/DataTypeMapper.cs b/src/Umbraco.Core/Persistence/Mappers/DataTypeMapper.cs index 3213095f6c..a67f9301b2 100644 --- a/src/Umbraco.Core/Persistence/Mappers/DataTypeMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/DataTypeMapper.cs @@ -28,7 +28,7 @@ namespace Umbraco.Core.Persistence.Mappers CacheMap(src => src.Trashed, dto => dto.Trashed); CacheMap(src => src.Key, dto => dto.UniqueId); CacheMap(src => src.CreatorId, dto => dto.UserId); - CacheMap(src => src.EditorAlias, dto => dto.PropertyEditorAlias); + CacheMap(src => src.EditorAlias, dto => dto.EditorAlias); CacheMap(src => src.DatabaseType, dto => dto.DbType); } diff --git a/src/Umbraco.Core/Persistence/Mappers/MemberMapper.cs b/src/Umbraco.Core/Persistence/Mappers/MemberMapper.cs index 7b1671cc51..9137df341b 100644 --- a/src/Umbraco.Core/Persistence/Mappers/MemberMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/MemberMapper.cs @@ -1,6 +1,6 @@ using System.Collections.Concurrent; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Dtos; namespace Umbraco.Core.Persistence.Mappers diff --git a/src/Umbraco.Core/Persistence/Mappers/PropertyTypeMapper.cs b/src/Umbraco.Core/Persistence/Mappers/PropertyTypeMapper.cs index 4e70ef4188..fa66a855ff 100644 --- a/src/Umbraco.Core/Persistence/Mappers/PropertyTypeMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/PropertyTypeMapper.cs @@ -28,7 +28,7 @@ namespace Umbraco.Core.Persistence.Mappers CacheMap(src => src.Name, dto => dto.Name); CacheMap(src => src.SortOrder, dto => dto.SortOrder); CacheMap(src => src.ValidationRegExp, dto => dto.ValidationRegExp); - CacheMap(src => src.PropertyEditorAlias, dto => dto.PropertyEditorAlias); + CacheMap(src => src.PropertyEditorAlias, dto => dto.EditorAlias); CacheMap(src => src.DataTypeDatabaseType, dto => dto.DbType); } } diff --git a/src/Umbraco.Core/Persistence/Mappers/UmbracoEntityMapper.cs b/src/Umbraco.Core/Persistence/Mappers/UmbracoEntityMapper.cs index fa16eb4bfb..b5fb374d78 100644 --- a/src/Umbraco.Core/Persistence/Mappers/UmbracoEntityMapper.cs +++ b/src/Umbraco.Core/Persistence/Mappers/UmbracoEntityMapper.cs @@ -1,5 +1,5 @@ using System.Collections.Concurrent; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Dtos; namespace Umbraco.Core.Persistence.Mappers diff --git a/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionVisitor.cs b/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionVisitor.cs index d1a8468185..9f57e61db9 100644 --- a/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionVisitor.cs +++ b/src/Umbraco.Core/Persistence/Querying/ModelToSqlExpressionVisitor.cs @@ -1,9 +1,9 @@ using System; using System.Linq.Expressions; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Composing; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Persistence.Querying { diff --git a/src/Umbraco.Core/Persistence/Repositories/IContentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IContentRepository.cs index 8572f7e125..fea0a61589 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IContentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IContentRepository.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Querying; diff --git a/src/Umbraco.Core/Persistence/Repositories/IEntityRepository.cs b/src/Umbraco.Core/Persistence/Repositories/IEntityRepository.cs index 3586bf8e27..b53b117a1a 100644 --- a/src/Umbraco.Core/Persistence/Repositories/IEntityRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/IEntityRepository.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Querying; @@ -9,14 +9,16 @@ 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 objectType, params int[] ids); - IEnumerable GetAll(Guid objectType, params Guid[] keys); - IEnumerable GetByQuery(IQuery query); - IEnumerable GetByQuery(IQuery query, Guid objectType); + IEntitySlim Get(int id); + IEntitySlim Get(Guid key); + IEntitySlim Get(int id, Guid objectTypeId); + IEntitySlim Get(Guid key, Guid objectTypeId); + + IEnumerable GetAll(Guid objectType, params int[] ids); + IEnumerable GetAll(Guid objectType, params Guid[] keys); + + IEnumerable GetByQuery(IQuery query); + IEnumerable GetByQuery(IQuery query, Guid objectType); UmbracoObjectTypes GetObjectType(int id); UmbracoObjectTypes GetObjectType(Guid key); @@ -24,34 +26,10 @@ namespace Umbraco.Core.Persistence.Repositories IEnumerable GetAllPaths(Guid objectType, params int[] ids); IEnumerable GetAllPaths(Guid objectType, params Guid[] keys); - /// - /// Gets paged results - /// - /// Query to excute - /// - /// Page number - /// Page size - /// Total records query would return without paging - /// Field to order by - /// Direction to order by - /// - /// An Enumerable list of objects - IEnumerable GetPagedResultsByQuery(IQuery query, Guid objectType, long pageIndex, int pageSize, out long totalRecords, - string orderBy, Direction orderDirection, IQuery filter = null); - - /// - /// Returns true if the entity exists - /// - /// - /// + bool Exists(int id); bool Exists(Guid key); - /// - /// Returns true if the entity exists - /// - /// - /// - bool Exists(int id); - + IEnumerable GetPagedResultsByQuery(IQuery query, Guid objectType, long pageIndex, int pageSize, out long totalRecords, + string orderBy, Direction orderDirection, IQuery filter = null); } } diff --git a/src/Umbraco.Core/Persistence/Repositories/INotificationsRepository.cs b/src/Umbraco.Core/Persistence/Repositories/INotificationsRepository.cs index 1c3f6e93e6..d24e981085 100644 --- a/src/Umbraco.Core/Persistence/Repositories/INotificationsRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/INotificationsRepository.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; namespace Umbraco.Core.Persistence.Repositories diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs index b085951159..6ee64a2e53 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/ContentRepositoryBase.cs @@ -9,7 +9,7 @@ using Umbraco.Core.Events; using Umbraco.Core.Logging; using Umbraco.Core.Models; using Umbraco.Core.Models.Editors; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Factories; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepository.cs index e439956879..8ba25b2a50 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepository.cs @@ -5,7 +5,6 @@ using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.SqlSyntax; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs index 354a431d89..e538b23406 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/ContentTypeRepositoryBase.cs @@ -10,7 +10,7 @@ using Umbraco.Core.Events; using Umbraco.Core.Exceptions; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; @@ -228,7 +228,7 @@ AND umbracoNode.nodeObjectType = @objectType", //Update the current PropertyType with correct PropertyEditorAlias and DatabaseType var dataTypeDto = Database.FirstOrDefault("WHERE nodeId = @Id", new { Id = propertyTypeDto.DataTypeId }); - propertyType.PropertyEditorAlias = dataTypeDto.PropertyEditorAlias; + propertyType.PropertyEditorAlias = dataTypeDto.EditorAlias; propertyType.DataTypeDatabaseType = dataTypeDto.DbType.EnumParse(true); } } @@ -500,7 +500,7 @@ AND umbracoNode.id <> @id", var list = new List(); foreach (var dto in dtos.Where(x => x.PropertyTypeGroupId <= 0)) { - var propType = CreatePropertyType(dto.DataTypeDto.PropertyEditorAlias, dto.DataTypeDto.DbType.EnumParse(true), dto.Alias); + var propType = CreatePropertyType(dto.DataTypeDto.EditorAlias, dto.DataTypeDto.DbType.EnumParse(true), dto.Alias); propType.DataTypeDefinitionId = dto.DataTypeId; propType.Description = dto.Description; propType.Id = dto.Id; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeRepository.cs index 9159eaacf9..2582ba3d12 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/DataTypeRepository.cs @@ -9,7 +9,7 @@ using Umbraco.Core.Events; using Umbraco.Core.Exceptions; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DictionaryRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/DictionaryRepository.cs index 856fe6af31..75bcb5e0c0 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/DictionaryRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/DictionaryRepository.cs @@ -5,7 +5,7 @@ using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs index ea08c727a9..18e27503f0 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/DocumentRepository.cs @@ -7,7 +7,6 @@ using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Exceptions; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Dtos; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/EntityContainerRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/EntityContainerRepository.cs index 71c266d210..209edce8de 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/EntityContainerRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/EntityContainerRepository.cs @@ -6,7 +6,6 @@ using Umbraco.Core.Cache; using Umbraco.Core.Exceptions; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Scoping; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs index fad35d0d3c..ed12a3a4eb 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using NPoco; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Querying; @@ -14,10 +14,11 @@ namespace Umbraco.Core.Persistence.Repositories.Implement // fixme - use sql templates everywhere! /// - /// Represents the EntityRepository used to query objects. + /// Represents the EntityRepository used to query entity objects. /// /// - /// This is limited to objects that are based in the umbracoNode-table. + /// Limited to objects that have a corresponding node (in umbracoNode table). + /// Returns objects, i.e. lightweight representation of entities. /// internal class EntityRepository : IEntityRepository { @@ -33,7 +34,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement #region Repository // get a page of entities - public IEnumerable GetPagedResultsByQuery(IQuery query, Guid objectType, long pageIndex, int pageSize, out long totalRecords, + public IEnumerable GetPagedResultsByQuery(IQuery query, Guid objectType, long pageIndex, int pageSize, out long totalRecords, string orderBy, Direction orderDirection, IQuery filter = null) { var isContent = objectType == Constants.ObjectTypes.Document || objectType == Constants.ObjectTypes.DocumentBlueprint; @@ -134,14 +135,14 @@ namespace Umbraco.Core.Persistence.Repositories.Implement return entities; } - public IUmbracoEntity GetByKey(Guid key) + public IEntitySlim Get(Guid key) { var sql = GetBaseWhere(false, false, false, key); var dto = Database.FirstOrDefault(sql); return dto == null ? null : BuildEntity(false, false, dto); } - public IUmbracoEntity GetByKey(Guid key, Guid objectTypeId) + public IEntitySlim Get(Guid key, Guid objectTypeId) { var isContent = objectTypeId == Constants.ObjectTypes.Document || objectTypeId == Constants.ObjectTypes.DocumentBlueprint; var isMedia = objectTypeId == Constants.ObjectTypes.Media; @@ -158,14 +159,14 @@ namespace Umbraco.Core.Persistence.Repositories.Implement return entity; } - public virtual IUmbracoEntity Get(int id) + public virtual IEntitySlim Get(int id) { var sql = GetBaseWhere(false, false, false, id); var dto = Database.FirstOrDefault(sql); return dto == null ? null : BuildEntity(false, false, dto); } - public virtual IUmbracoEntity Get(int id, Guid objectTypeId) + public virtual IEntitySlim Get(int id, Guid objectTypeId) { var isContent = objectTypeId == Constants.ObjectTypes.Document || objectTypeId == Constants.ObjectTypes.DocumentBlueprint; var isMedia = objectTypeId == Constants.ObjectTypes.Media; @@ -182,28 +183,28 @@ namespace Umbraco.Core.Persistence.Repositories.Implement return entity; } - public virtual IEnumerable GetAll(Guid objectType, params int[] ids) + public virtual IEnumerable GetAll(Guid objectType, params int[] ids) { return ids.Length > 0 ? PerformGetAll(objectType, sql => sql.WhereIn(x => x.NodeId, ids.Distinct())) : PerformGetAll(objectType); } - public virtual IEnumerable GetAll(Guid objectType, params Guid[] keys) + public virtual IEnumerable GetAll(Guid objectType, params Guid[] keys) { return keys.Length > 0 ? PerformGetAll(objectType, sql => sql.WhereIn(x => x.UniqueId, keys.Distinct())) : PerformGetAll(objectType); } - private IEnumerable PerformGetAll(Guid objectType, Action> filter = null) + private IEnumerable PerformGetAll(Guid objectType, Action> filter = null) { var isContent = objectType == Constants.ObjectTypes.Document || objectType == Constants.ObjectTypes.DocumentBlueprint; var isMedia = objectType == Constants.ObjectTypes.Media; var sql = GetFullSqlForEntityType(isContent, isMedia, objectType, filter); var dtos = Database.Fetch(sql); - if (dtos.Count == 0) return Enumerable.Empty(); + if (dtos.Count == 0) return Enumerable.Empty(); var entities = dtos.Select(x => BuildEntity(isContent, isMedia, x)).ToArray(); @@ -234,7 +235,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement return Database.Fetch(sql); } - public virtual IEnumerable GetByQuery(IQuery query) + public virtual IEnumerable GetByQuery(IQuery query) { var sqlClause = GetBase(false, false, null); var translator = new SqlTranslator(sqlClause, query); @@ -244,7 +245,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement return dtos.Select(x => BuildEntity(false, false, x)).ToList(); } - public virtual IEnumerable GetByQuery(IQuery query, Guid objectType) + public virtual IEnumerable GetByQuery(IQuery query, Guid objectType) { var isContent = objectType == Constants.ObjectTypes.Document || objectType == Constants.ObjectTypes.DocumentBlueprint; var isMedia = objectType == Constants.ObjectTypes.Media; @@ -254,7 +255,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement sql = translator.Translate(); sql = AddGroupBy(isContent, isMedia, sql); var dtos = Database.Fetch(sql); - if (dtos.Count == 0) return Enumerable.Empty(); + if (dtos.Count == 0) return Enumerable.Empty(); var entities = dtos.Select(x => BuildEntity(isContent, isMedia, x)).ToArray(); @@ -267,13 +268,13 @@ namespace Umbraco.Core.Persistence.Repositories.Implement public UmbracoObjectTypes GetObjectType(int id) { var sql = Sql().Select(x => x.NodeObjectType).From().Where(x => x.NodeId == id); - return UmbracoObjectTypesExtensions.GetUmbracoObjectType(Database.ExecuteScalar(sql)); + return ObjectTypes.GetUmbracoObjectType(Database.ExecuteScalar(sql)); } public UmbracoObjectTypes GetObjectType(Guid key) { var sql = Sql().Select(x => x.NodeObjectType).From().Where(x => x.UniqueId == key); - return UmbracoObjectTypesExtensions.GetUmbracoObjectType(Database.ExecuteScalar(sql)); + return ObjectTypes.GetUmbracoObjectType(Database.ExecuteScalar(sql)); } public bool Exists(Guid key) @@ -288,14 +289,14 @@ namespace Umbraco.Core.Persistence.Repositories.Implement return Database.ExecuteScalar(sql) > 0; } - private void BuildProperties(UmbracoEntity entity, BaseDto dto) + private void BuildProperties(EntitySlim entity, BaseDto dto) { var pdtos = Database.Fetch(GetPropertyData(dto.VersionId)); foreach (var pdto in pdtos) BuildProperty(entity, pdto); } - private void BuildProperties(UmbracoEntity[] entities, List dtos) + private void BuildProperties(EntitySlim[] entities, List dtos) { var versionIds = dtos.Select(x => x.VersionId).Distinct().ToArray(); var pdtos = Database.FetchByGroups(versionIds, 2000, GetPropertyData); @@ -310,18 +311,14 @@ namespace Umbraco.Core.Persistence.Repositories.Implement } } - private void BuildProperty(UmbracoEntity entity, PropertyDataDto pdto) + private void BuildProperty(EntitySlim entity, PropertyDataDto pdto) { // explain ?! var value = string.IsNullOrWhiteSpace(pdto.TextValue) ? pdto.VarcharValue : pdto.TextValue.ConvertToJsonIfPossible(); - entity.AdditionalData[pdto.PropertyTypeDto.Alias] = new UmbracoEntity.EntityProperty - { - PropertyEditorAlias = pdto.PropertyTypeDto.DataTypeDto.PropertyEditorAlias, - Value = value - }; + entity.AdditionalData[pdto.PropertyTypeDto.Alias] = new EntitySlim.PropertySlim(pdto.PropertyTypeDto.DataTypeDto.EditorAlias, value); } #endregion @@ -761,29 +758,20 @@ namespace Umbraco.Core.Persistence.Repositories.Implement #region Factory - private static UmbracoEntity BuildEntity(bool isContent, bool isMedia, BaseDto dto) + private static EntitySlim BuildEntity(bool isContent, bool isMedia, BaseDto dto) { if (isContent) return BuildDocumentEntity(dto); if (isMedia) return BuildContentEntity(dto); - var entity = new UmbracoEntity(); - - try - { - entity.DisableChangeTracking(); - BuildEntity(entity, dto); - } - finally - { - entity.EnableChangeTracking(); - } - + // EntitySlim does not track changes + var entity = new EntitySlim(); + BuildEntity(entity, dto); return entity; } - private static void BuildEntity(UmbracoEntity entity, BaseDto dto) + private static void BuildEntity(EntitySlim entity, BaseDto dto) { entity.Trashed = dto.Trashed; entity.CreateDate = dto.CreateDate; @@ -797,56 +785,37 @@ namespace Umbraco.Core.Persistence.Repositories.Implement entity.Path = dto.Path; entity.SortOrder = dto.SortOrder; entity.HasChildren = dto.Children > 0; + entity.IsContainer = dto.IsContainer; } - private static void BuildContentEntity(UmbracoContentEntity entity, BaseDto dto) + private static void BuildContentEntity(ContentEntitySlim entity, BaseDto dto) { BuildEntity(entity, dto); entity.ContentTypeAlias = dto.Alias; - - // fixme more here... entity.ContentTypeIcon = dto.Icon; entity.ContentTypeThumbnail = dto.Thumbnail; } - private static void BuildDocumentEntity(UmbracoDocumentEntity entity, BaseDto dto) + private static void BuildDocumentEntity(DocumentEntitySlim entity, BaseDto dto) { BuildContentEntity(entity, dto); entity.Published = dto.Published; entity.Edited = dto.Edited; } - private static UmbracoEntity BuildContentEntity(BaseDto dto) + private static EntitySlim BuildContentEntity(BaseDto dto) { - var entity = new UmbracoContentEntity(); - - try - { - entity.DisableChangeTracking(); - BuildContentEntity(entity, dto); - } - finally - { - entity.EnableChangeTracking(); - } - + // EntitySlim does not track changes + var entity = new ContentEntitySlim(); + BuildContentEntity(entity, dto); return entity; } - private static UmbracoEntity BuildDocumentEntity(BaseDto dto) + private static EntitySlim BuildDocumentEntity(BaseDto dto) { - var entity = new UmbracoDocumentEntity(); - - try - { - entity.DisableChangeTracking(); - BuildDocumentEntity(entity, dto); - } - finally - { - entity.EnableChangeTracking(); - } - + // EntitySlim does not track changes + var entity = new DocumentEntitySlim(); + BuildDocumentEntity(entity, dto); return entity; } diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/ExternalLoginRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/ExternalLoginRepository.cs index 9d31c06d49..1678fd6a46 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/ExternalLoginRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/ExternalLoginRepository.cs @@ -5,7 +5,7 @@ using Microsoft.AspNet.Identity; using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Logging; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Identity; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Factories; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/FileRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/FileRepository.cs index e97ac8aa05..fb7ccff420 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/FileRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/FileRepository.cs @@ -3,7 +3,7 @@ using System.IO; using System.Text; using Umbraco.Core.IO; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Scoping; namespace Umbraco.Core.Persistence.Repositories.Implement diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/LanguageRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/LanguageRepository.cs index ffcf771a39..784191279d 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/LanguageRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/LanguageRepository.cs @@ -5,7 +5,7 @@ using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MacroRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/MacroRepository.cs index 4583fdaef3..c492d9be81 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/MacroRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/MacroRepository.cs @@ -5,7 +5,7 @@ using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MediaRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/MediaRepository.cs index c4f4a385ce..3beaf8825f 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/MediaRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/MediaRepository.cs @@ -8,7 +8,6 @@ using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Exceptions; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Factories; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs index 3be50c3c55..9daf174f67 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs @@ -6,7 +6,6 @@ using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Factories; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/NPocoRepositoryBase.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/NPocoRepositoryBase.cs index d34651dbe2..df7517469c 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/NPocoRepositoryBase.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/NPocoRepositoryBase.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Logging; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.SqlSyntax; using Umbraco.Core.Scoping; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/NotificationsRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/NotificationsRepository.cs index 60ad3bebc9..e24d964d2d 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/NotificationsRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/NotificationsRepository.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Scoping; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/PermissionRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/PermissionRepository.cs index 8421678996..8261ed2ea3 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/PermissionRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/PermissionRepository.cs @@ -6,7 +6,7 @@ using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Exceptions; using Umbraco.Core.Logging; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Querying; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/RelationRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/RelationRepository.cs index 2a7955fdfe..f79344028f 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/RelationRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/RelationRepository.cs @@ -7,7 +7,7 @@ using Umbraco.Core.Cache; using Umbraco.Core.Composing.CompositionRoots; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/RelationTypeRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/RelationTypeRepository.cs index 39402a5d5b..f5b064516f 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/RelationTypeRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/RelationTypeRepository.cs @@ -5,7 +5,7 @@ using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs index 3fbcab7b99..64489bb059 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using Umbraco.Core.Cache; using Umbraco.Core.Logging; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Scoping; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/SimpleGetRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/SimpleGetRepository.cs index 568ac65d54..7a3bfdb757 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/SimpleGetRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/SimpleGetRepository.cs @@ -5,7 +5,7 @@ using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Exceptions; using Umbraco.Core.Logging; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Scoping; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/TagRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/TagRepository.cs index cb9ba006bb..132eea2de6 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/TagRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/TagRepository.cs @@ -5,7 +5,7 @@ using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/TemplateRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/TemplateRepository.cs index ced61658e4..e204a708a4 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/TemplateRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/TemplateRepository.cs @@ -10,7 +10,7 @@ using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Factories; using Umbraco.Core.Persistence.Querying; @@ -76,7 +76,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement // later to populate the template item's properties var childIds = (ids.Any() ? GetAxisDefinitions(dtos.ToArray()) - : dtos.Select(x => new UmbracoEntity + : dtos.Select(x => new EntitySlim { Id = x.NodeId, ParentId = x.NodeDto.ParentId, @@ -336,7 +336,7 @@ namespace Umbraco.Core.Persistence.Repositories.Implement new {parentIds = templates.Select(x => x.NodeDto.ParentId), childIds = templates.Select(x => x.NodeId)}); var childIds = Database.Fetch(childIdsSql) - .Select(x => new UmbracoEntity + .Select(x => new EntitySlim { Id = x.nodeId, ParentId = x.parentID, diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/UserGroupRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/UserGroupRepository.cs index 877b26a27b..9f9cae3288 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/UserGroupRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/UserGroupRepository.cs @@ -6,7 +6,7 @@ using Umbraco.Core.Cache; using Umbraco.Core.Exceptions; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Factories; diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/UserRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/UserRepository.cs index 480c0f6f33..9ce7358408 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/UserRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/UserRepository.cs @@ -8,7 +8,7 @@ using Newtonsoft.Json; using NPoco; using Umbraco.Core.Cache; using Umbraco.Core.Logging; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Dtos; diff --git a/src/Umbraco.Core/PropertyEditors/PropertyEditor.cs b/src/Umbraco.Core/PropertyEditors/PropertyEditor.cs index a7c2b92223..8d1d02f14c 100644 --- a/src/Umbraco.Core/PropertyEditors/PropertyEditor.cs +++ b/src/Umbraco.Core/PropertyEditors/PropertyEditor.cs @@ -217,15 +217,16 @@ namespace Umbraco.Core.PropertyEditors } } - public class PropertyEditor : PropertyEditor - { - public PropertyEditor(ILogger logger) - : base(logger) - { } + // fixme clear that one! breaking everything! + //public class PropertyEditor : PropertyEditor + //{ + // public PropertyEditor(ILogger logger) + // : base(logger) + // { } - public virtual TConfiguration MapConfiguration(string configuration) - { - return JsonConvert.DeserializeObject(configuration); - } - } + // public virtual TConfiguration MapConfiguration(string configuration) + // { + // return JsonConvert.DeserializeObject(configuration); + // } + //} } diff --git a/src/Umbraco.Core/Security/BackOfficeUserStore.cs b/src/Umbraco.Core/Security/BackOfficeUserStore.cs index dd862ea715..1935aa91c3 100644 --- a/src/Umbraco.Core/Security/BackOfficeUserStore.cs +++ b/src/Umbraco.Core/Security/BackOfficeUserStore.cs @@ -10,7 +10,6 @@ using Microsoft.AspNet.Identity; using Microsoft.Owin; using Umbraco.Core.Exceptions; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Identity; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; diff --git a/src/Umbraco.Core/Security/BackOfficeUserValidator.cs b/src/Umbraco.Core/Security/BackOfficeUserValidator.cs index dd73d76ec4..8f15de2378 100644 --- a/src/Umbraco.Core/Security/BackOfficeUserValidator.cs +++ b/src/Umbraco.Core/Security/BackOfficeUserValidator.cs @@ -1,6 +1,5 @@ using System.Threading.Tasks; using Microsoft.AspNet.Identity; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Identity; namespace Umbraco.Core.Security diff --git a/src/Umbraco.Core/Services/IEntityService.cs b/src/Umbraco.Core/Services/IEntityService.cs index 38eb2a0f05..c28202ba8b 100644 --- a/src/Umbraco.Core/Services/IEntityService.cs +++ b/src/Umbraco.Core/Services/IEntityService.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.DatabaseModelDefinitions; namespace Umbraco.Core.Services @@ -9,283 +9,288 @@ namespace Umbraco.Core.Services public interface IEntityService { /// - /// Returns true if the entity exists + /// Gets an entity. /// - /// - /// - bool Exists(Guid key); + /// The identifier of the entity. + IEntitySlim Get(int id); /// - /// Returns true if the entity exists + /// Gets an entity. /// - /// - /// + /// The identifier of the entity. + /// A value indicating whether to load a light entity, or the full entity. + /// Returns either a , or an actual entity, depending on . + IUmbracoEntity Get(int id, bool full); + + /// + /// Gets an entity. + /// + /// The unique key of the entity. + IEntitySlim Get(Guid key); + + /// + /// Gets an entity. + /// + /// The unique key of the entity. + /// A value indicating whether to load a light entity, or the full entity. + /// Returns either a , or an actual entity, depending on . + IUmbracoEntity Get(Guid key, bool full); + + /// + /// Gets an entity. + /// + /// The identifier of the entity. + /// The object type of the entity. + IEntitySlim Get(int id, UmbracoObjectTypes objectType); + + /// + /// Gets an entity. + /// + /// The identifier of the entity. + /// The object type of the entity. + /// A value indicating whether to load a light entity, or the full entity. + /// Returns either a , or an actual entity, depending on . + IUmbracoEntity Get(int id, UmbracoObjectTypes objectType, bool full); + + /// + /// Gets an entity. + /// + /// The unique key of the entity. + /// The object type of the entity. + IEntitySlim Get(Guid key, UmbracoObjectTypes objectType); + + /// + /// Gets an entity. + /// + /// The unique key of the entity. + /// The object type of the entity. + /// A value indicating whether to load a light entity, or the full entity. + /// Returns either a , or an actual entity, depending on . + IUmbracoEntity Get(Guid key, UmbracoObjectTypes objectType, bool full); + + /// + /// Gets an entity. + /// + /// The type used to determine the object type of the entity. + /// The identifier of the entity. + IEntitySlim Get(int id) where T : IUmbracoEntity; + + /// + /// Gets an entity. + /// + /// The type used to determine the object type of the entity. + /// The identifier of the entity. + /// A value indicating whether to load a light entity, or the full entity. + /// Returns either a , or an actual entity, depending on . + IUmbracoEntity Get(int id, bool full) where T : IUmbracoEntity; + + /// + /// Gets an entity. + /// + /// The type used to determine the object type of the entity. + /// The unique key of the entity. + IEntitySlim Get(Guid key) where T : IUmbracoEntity; + + /// + /// Gets an entity. + /// + /// The type used to determine the object type of the entity. + /// The unique key of the entity. + /// A value indicating whether to load a light entity, or the full entity. + /// Returns either a , or an actual entity, depending on . + IUmbracoEntity Get(Guid key, bool full) where T : IUmbracoEntity; + + /// + /// Determines whether an entity exists. + /// + /// The identifier of the entity. bool Exists(int id); /// - /// Returns the integer id for a given GUID + /// Determines whether an entity exists. /// - /// - /// - /// - Attempt GetIdForKey(Guid key, UmbracoObjectTypes umbracoObjectType); + /// The unique key of the entity. + bool Exists(Guid key); /// - /// Returns the integer id for a given Udi + /// Gets entities of a given object type. /// - /// - /// - Attempt GetIdForUdi(Udi udi); + /// The type used to determine the object type of the entities. + IEnumerable GetAll() where T : IUmbracoEntity; /// - /// Returns the GUID for a given integer id + /// Gets entities of a given object type. /// - /// - /// - /// - Attempt GetKeyForId(int id, UmbracoObjectTypes umbracoObjectType); + /// The type used to determine the object type of the entities. + /// The identifiers of the entities. + /// If is empty, returns all entities. + IEnumerable GetAll(params int[] ids) where T : IUmbracoEntity; /// - /// Gets an UmbracoEntity by its Id, and optionally loads the complete object graph. + /// Gets entities of a given object type. /// - /// - /// 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); + /// The object type of the entities. + IEnumerable GetAll(UmbracoObjectTypes objectType); /// - /// Gets an UmbracoEntity by its Id, and optionally loads the complete object graph. + /// Gets entities of a given object type. /// - /// - /// By default this will load the base type with a minimum set of properties. - /// - /// Id of the object to retrieve - /// Optional bool to load the complete object graph when set to False. - /// An - IUmbracoEntity Get(int id, bool loadBaseType = true); + /// The object type of the entities. + /// The identifiers of the entities. + /// If is empty, returns all entities. + IEnumerable GetAll(UmbracoObjectTypes objectType, params int[] ids); /// - /// Gets an UmbracoEntity by its Id and UmbracoObjectType, and optionally loads the complete object graph. + /// Gets entities of a given object type. /// - /// - /// 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); + /// The object type of the entities. + IEnumerable GetAll(Guid objectType); /// - /// Gets an UmbracoEntity by its Id and UmbracoObjectType, and optionally loads the complete object graph. + /// Gets entities of a given object type. /// - /// - /// By default this will load the base type with a minimum set of properties. - /// - /// 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 Get(int id, UmbracoObjectTypes umbracoObjectType, bool loadBaseType = true); + /// The object type of the entities. + /// The identifiers of the entities. + /// If is empty, returns all entities. + IEnumerable GetAll(Guid objectType, params int[] ids); /// - /// Gets an UmbracoEntity by its Id and specified Type. Optionally loads the complete object graph. + /// Gets entities of a given object type. /// - /// - /// 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; + /// The type used to determine the object type of the entities. + /// The unique identifiers of the entities. + /// If is empty, returns all entities. + IEnumerable GetAll(params Guid[] keys) where T : IUmbracoEntity; /// - /// Gets an UmbracoEntity by its Id and specified Type. Optionally loads the complete object graph. + /// Gets entities of a given object type. /// - /// - /// 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 - /// Id of the object to retrieve - /// Optional bool to load the complete object graph when set to False. - /// An - IUmbracoEntity Get(int id, bool loadBaseType = true) where T : IUmbracoEntity; + /// The object type of the entities. + /// The unique identifiers of the entities. + /// If is empty, returns all entities. + IEnumerable GetAll(UmbracoObjectTypes objectType, Guid[] keys); /// - /// Gets the parent of entity by its id + /// Gets entities of a given object type. /// - /// Id of the entity to retrieve the Parent for - /// An - IUmbracoEntity GetParent(int id); + /// The object type of the entities. + /// The unique identifiers of the entities. + /// If is empty, returns all entities. + IEnumerable GetAll(Guid objectType, params Guid[] keys); /// - /// Gets the parent of entity by its id and UmbracoObjectType + /// Gets entities at root. /// - /// Id of the entity to retrieve the Parent for - /// UmbracoObjectType of the parent to retrieve - /// An - IUmbracoEntity GetParent(int id, UmbracoObjectTypes umbracoObjectType); + /// The object type of the entities. + IEnumerable GetRootEntities(UmbracoObjectTypes objectType); /// - /// Gets a collection of children by the parents Id + /// Gets the parent of an entity. /// - /// Id of the parent to retrieve children for - /// An enumerable list of objects - IEnumerable GetChildren(int parentId); + /// The identifier of the entity. + IEntitySlim GetParent(int id); /// - /// Gets a collection of children by the parents Id and UmbracoObjectType + /// Gets the parent of an entity. /// - /// Id of the parent to retrieve children for - /// UmbracoObjectType of the children to retrieve - /// An enumerable list of objects - IEnumerable GetChildren(int parentId, UmbracoObjectTypes umbracoObjectType); + /// The identifier of the entity. + /// The object type of the parent. + IEntitySlim GetParent(int id, UmbracoObjectTypes objectType); /// - /// Returns a paged collection of children + /// Gets the children of an entity. /// - /// The parent id to return children for - /// - /// - /// - /// - /// - /// - /// - /// - IEnumerable GetPagedChildren(int parentId, UmbracoObjectTypes umbracoObjectType, long pageIndex, int pageSize, out long totalRecords, + /// The identifier of the entity. + IEnumerable GetChildren(int id); + + /// + /// Gets the children of an entity. + /// + /// The identifier of the entity. + /// The object type of the children. + IEnumerable GetChildren(int id, UmbracoObjectTypes objectType); + + /// + /// Gets the descendants of an entity. + /// + /// The identifier of the entity. + IEnumerable GetDescendants(int id); + + /// + /// Gets the descendants of an entity. + /// + /// The identifier of the entity. + /// The object type of the descendants. + IEnumerable GetDescendants(int id, UmbracoObjectTypes objectType); + + /// + /// Gets children of an entity. + /// + IEnumerable GetPagedChildren(int id, UmbracoObjectTypes objectType, long pageIndex, int pageSize, out long totalRecords, string orderBy = "SortOrder", Direction orderDirection = Direction.Ascending, string filter = ""); /// - /// Returns a paged collection of descendants + /// Gets descendants of an entity. /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - IEnumerable GetPagedDescendants(int id, UmbracoObjectTypes umbracoObjectType, long pageIndex, int pageSize, out long totalRecords, + IEnumerable GetPagedDescendants(int id, UmbracoObjectTypes objectType, long pageIndex, int pageSize, out long totalRecords, string orderBy = "path", Direction orderDirection = Direction.Ascending, string filter = ""); /// - /// Returns a paged collection of descendants + /// Gets descendants of entities. /// - IEnumerable GetPagedDescendants(IEnumerable ids, UmbracoObjectTypes umbracoObjectType, long pageIndex, int pageSize, out long totalRecords, + IEnumerable GetPagedDescendants(IEnumerable ids, UmbracoObjectTypes objectType, long pageIndex, int pageSize, out long totalRecords, string orderBy = "path", Direction orderDirection = Direction.Ascending, string filter = ""); /// - /// Returns a paged collection of descendants from the root + /// Gets descendants of root. /// - /// - /// - /// - /// - /// - /// - /// - /// true/false to include trashed objects - /// - IEnumerable GetPagedDescendantsFromRoot(UmbracoObjectTypes umbracoObjectType, long pageIndex, int pageSize, out long totalRecords, + IEnumerable GetPagedDescendants(UmbracoObjectTypes objectType, long pageIndex, int pageSize, out long totalRecords, string orderBy = "path", Direction orderDirection = Direction.Ascending, string filter = "", bool includeTrashed = true); /// - /// Gets a collection of descendents by the parents Id + /// Gets the object type of an entity. /// - /// Id of entity to retrieve descendents for - /// An enumerable list of objects - IEnumerable GetDescendents(int id); - - /// - /// Gets a collection of descendents by the parents Id - /// - /// Id of entity to retrieve descendents for - /// UmbracoObjectType of the descendents to retrieve - /// An enumerable list of objects - IEnumerable GetDescendents(int id, UmbracoObjectTypes umbracoObjectType); - - /// - /// Gets a collection of the entities at the root, which corresponds to the entities with a Parent Id of -1. - /// - /// UmbracoObjectType of the root entities to retrieve - /// An enumerable list of objects - IEnumerable GetRootEntities(UmbracoObjectTypes umbracoObjectType); - - /// - /// Gets a collection of all of a given type. - /// - /// Type of the entities to retrieve - /// An enumerable list of objects - IEnumerable GetAll(params int[] ids) where T : IUmbracoEntity; - - /// - /// Gets a collection of all of a given type. - /// - /// UmbracoObjectType of the entities to return - /// - /// An enumerable list of objects - IEnumerable GetAll(UmbracoObjectTypes umbracoObjectType, params int[] ids); - - /// - /// Gets a collection of all of a given type. - /// - /// UmbracoObjectType of the entities to return - /// - /// An enumerable list of objects - IEnumerable GetAll(UmbracoObjectTypes umbracoObjectType, Guid[] keys); - - /// - /// Gets a collection of - /// - /// Guid id of the UmbracoObjectType - /// - /// An enumerable list of objects - IEnumerable GetAll(Guid objectTypeId, params int[] ids); - - /// - /// Gets paths for entities. - /// - IEnumerable GetAllPaths(UmbracoObjectTypes umbracoObjectType, params int[] ids); - - /// - /// Gets paths for entities. - /// - IEnumerable GetAllPaths(UmbracoObjectTypes umbracoObjectType, params Guid[] keys); - - /// - /// Gets the UmbracoObjectType from the integer id of an IUmbracoEntity. - /// - /// Id of the entity - /// UmbracoObjectTypes GetObjectType(int id); /// - /// Gets the UmbracoObjectType from an IUmbracoEntity. + /// Gets the object type of an entity. + /// + UmbracoObjectTypes GetObjectType(Guid key); + + /// + /// Gets the object type of an entity. /// - /// - /// UmbracoObjectTypes GetObjectType(IUmbracoEntity entity); /// - /// Gets the Type of an entity by its Id + /// Gets the Clr type of an entity. /// - /// Id of the entity - /// Type of the entity Type GetEntityType(int id); /// - /// Gets the Type of an entity by its + /// Gets the integer identifier corresponding to a unique Guid identifier. /// - /// - /// Type of the entity - Type GetEntityType(UmbracoObjectTypes umbracoObjectType); + Attempt GetId(Guid key, UmbracoObjectTypes objectType); + + /// + /// Gets the integer identifier corresponding to a Udi. + /// + Attempt GetId(Udi udi); + + /// + /// Gets the unique Guid identifier corresponding to an integer identifier. + /// + Attempt GetKey(int id, UmbracoObjectTypes umbracoObjectType); + + /// + /// Gets paths for entities. + /// + IEnumerable GetAllPaths(UmbracoObjectTypes objectType, params int[] ids); + + /// + /// Gets paths for entities. + /// + IEnumerable GetAllPaths(UmbracoObjectTypes objectType, params Guid[] keys); /// /// Reserves an identifier for a key. diff --git a/src/Umbraco.Core/Services/INotificationService.cs b/src/Umbraco.Core/Services/INotificationService.cs index 06e3a78f2e..3af603a31c 100644 --- a/src/Umbraco.Core/Services/INotificationService.cs +++ b/src/Umbraco.Core/Services/INotificationService.cs @@ -5,7 +5,7 @@ using System.Text; using System.Threading.Tasks; using System.Web; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence; diff --git a/src/Umbraco.Core/Services/IRelationService.cs b/src/Umbraco.Core/Services/IRelationService.cs index 2b402a3b75..0fa02823e4 100644 --- a/src/Umbraco.Core/Services/IRelationService.cs +++ b/src/Umbraco.Core/Services/IRelationService.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Services { diff --git a/src/Umbraco.Core/Services/Implement/ContentTypeServiceBaseOfTRepositoryTItemTService.cs b/src/Umbraco.Core/Services/Implement/ContentTypeServiceBaseOfTRepositoryTItemTService.cs index ce3ec2d343..d05930564e 100644 --- a/src/Umbraco.Core/Services/Implement/ContentTypeServiceBaseOfTRepositoryTItemTService.cs +++ b/src/Umbraco.Core/Services/Implement/ContentTypeServiceBaseOfTRepositoryTItemTService.cs @@ -5,7 +5,7 @@ using Umbraco.Core.Events; using Umbraco.Core.Exceptions; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.Repositories.Implement; using Umbraco.Core.Scoping; @@ -878,10 +878,11 @@ namespace Umbraco.Core.Services.Implement var container = _containerRepository.Get(containerId); if (container == null) return OperationResult.Attempt.NoOperation(evtMsgs); + // 'container' here does not know about its children, so we need + // to get it again from the entity repository, as a light entity var entity = _entityRepository.Get(container.Id); - if (entity.HasChildren()) // fixme because container.HasChildren() does not work? + if (entity.HasChildren) { - // fixme - here and everywhere, original v8 would not Complete, thus causing rollback = ? scope.Complete(); return Attempt.Fail(new OperationResult(OperationResultType.FailedCannot, evtMsgs)); } diff --git a/src/Umbraco.Core/Services/Implement/DataTypeService.cs b/src/Umbraco.Core/Services/Implement/DataTypeService.cs index 67b5387cbb..82e2548966 100644 --- a/src/Umbraco.Core/Services/Implement/DataTypeService.cs +++ b/src/Umbraco.Core/Services/Implement/DataTypeService.cs @@ -161,9 +161,14 @@ namespace Umbraco.Core.Services.Implement var container = _dataTypeContainerRepository.Get(containerId); if (container == null) return OperationResult.Attempt.NoOperation(evtMsgs); + // 'container' here does not know about its children, so we need + // to get it again from the entity repository, as a light entity var entity = _entityRepository.Get(container.Id); - if (entity.HasChildren()) // because container.HasChildren() does not work? - return Attempt.Fail(new OperationResult(OperationResultType.FailedCannot, evtMsgs)); // causes rollback + if (entity.HasChildren) + { + scope.Complete(); + return Attempt.Fail(new OperationResult(OperationResultType.FailedCannot, evtMsgs)); + } if (scope.Events.DispatchCancelable(DeletingContainer, this, new DeleteEventArgs(container, evtMsgs))) { diff --git a/src/Umbraco.Core/Services/Implement/EntityService.cs b/src/Umbraco.Core/Services/Implement/EntityService.cs index df5daf40aa..e41cd17f72 100644 --- a/src/Umbraco.Core/Services/Implement/EntityService.cs +++ b/src/Umbraco.Core/Services/Implement/EntityService.cs @@ -2,13 +2,10 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; -using NPoco; -using Umbraco.Core.Cache; -using Umbraco.Core.CodeAnnotations; using Umbraco.Core.Events; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using Umbraco.Core.Persistence.Dtos; @@ -21,7 +18,7 @@ namespace Umbraco.Core.Services.Implement public class EntityService : ScopeRepositoryService, IEntityService { private readonly IEntityRepository _entityRepository; - private readonly Dictionary>> _supportedObjectTypes; + private readonly Dictionary GetById, Func GetByKey)> _objectTypes; private IQuery _queryRootEntity; private readonly IdkMap _idkMap; @@ -30,265 +27,356 @@ namespace Umbraco.Core.Services.Implement IMediaService mediaService, IMediaTypeService mediaTypeService, IDataTypeService dataTypeService, IMemberService memberService, IMemberTypeService memberTypeService, IdkMap idkMap, - IRuntimeCacheProvider runtimeCache, IEntityRepository entityRepository) : base(provider, logger, eventMessagesFactory) { _idkMap = idkMap; _entityRepository = entityRepository; - _supportedObjectTypes = new Dictionary>> + _objectTypes = new Dictionary, Func)> { - {typeof (IDataType).FullName, new Tuple>(UmbracoObjectTypes.DataType, dataTypeService.GetDataTypeDefinitionById)}, - {typeof (IContent).FullName, new Tuple>(UmbracoObjectTypes.Document, contentService.GetById)}, - {typeof (IContentType).FullName, new Tuple>(UmbracoObjectTypes.DocumentType, contentTypeService.Get)}, - {typeof (IMedia).FullName, new Tuple>(UmbracoObjectTypes.Media, mediaService.GetById)}, - {typeof (IMediaType).FullName, new Tuple>(UmbracoObjectTypes.MediaType, mediaTypeService.Get)}, - {typeof (IMember).FullName, new Tuple>(UmbracoObjectTypes.Member, memberService.GetById)}, - {typeof (IMemberType).FullName, new Tuple>(UmbracoObjectTypes.MemberType, memberTypeService.Get)}, + { typeof (IDataType).FullName, (UmbracoObjectTypes.DataType, dataTypeService.GetDataTypeDefinitionById, dataTypeService.GetDataTypeDefinitionById) }, + { typeof (IContent).FullName, (UmbracoObjectTypes.Document, contentService.GetById, contentService.GetById) }, + { typeof (IContentType).FullName, (UmbracoObjectTypes.DocumentType, contentTypeService.Get, contentTypeService.Get) }, + { typeof (IMedia).FullName, (UmbracoObjectTypes.Media, mediaService.GetById, mediaService.GetById) }, + { typeof (IMediaType).FullName, (UmbracoObjectTypes.MediaType, mediaTypeService.Get, mediaTypeService.Get) }, + { typeof (IMember).FullName, (UmbracoObjectTypes.Member, memberService.GetById, memberService.GetByKey) }, + { typeof (IMemberType).FullName, (UmbracoObjectTypes.MemberType, memberTypeService.Get, memberTypeService.Get) }, }; } #region Static Queries // lazy-constructed because when the ctor runs, the query factory may not be ready - private IQuery QueryRootEntity => _queryRootEntity ?? (_queryRootEntity = Query().Where(x => x.ParentId == -1)); #endregion - /// - /// Returns the integer id for a given GUID - /// - /// - /// - /// - public Attempt GetIdForKey(Guid key, UmbracoObjectTypes umbracoObjectType) + // gets the getters, throws if not supported + private (UmbracoObjectTypes ObjectType, Func GetById, Func GetByKey) GetGetters(Type type) { - return _idkMap.GetIdForKey(key, umbracoObjectType); + if (type?.FullName == null || !_objectTypes.TryGetValue(type.FullName, out var getters)) + throw new NotSupportedException($"Type \"{type?.FullName ?? ""}\" is not supported here."); + return getters; } - public Attempt GetIdForUdi(Udi udi) + /// + public IEntitySlim Get(int id) { - return _idkMap.GetIdForUdi(udi); + return (IEntitySlim) Get(id, false); } - /// - /// Returns the GUID for a given integer id - /// - /// - /// - /// - public Attempt GetKeyForId(int id, UmbracoObjectTypes umbracoObjectType) + /// + public IUmbracoEntity Get(int id, bool full) { - return _idkMap.GetKeyForId(id, umbracoObjectType); - } - - public IUmbracoEntity GetByKey(Guid key, bool loadBaseType = true) - { - if (loadBaseType) + if (!full) { - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) - { - return _entityRepository.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. - /// - /// - /// By default this will load the base type with a minimum set of properties. - /// - /// Id of the object to retrieve - /// Optional bool to load the complete object graph when set to False. - /// An - public virtual IUmbracoEntity Get(int id, bool loadBaseType = true) - { - if (loadBaseType) - { - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) + // get the light entity + using (ScopeProvider.CreateScope(autoComplete: true)) { return _entityRepository.Get(id); } } + // get the full entity var objectType = GetObjectType(id); - var entityType = GetEntityType(objectType); - var typeFullName = entityType.FullName; - var entity = _supportedObjectTypes[typeFullName].Item2(id); - - return entity; + var entityType = objectType.GetClrType(); + var getters = GetGetters(entityType); + return getters.GetById(id); } - public IUmbracoEntity GetByKey(Guid key, UmbracoObjectTypes umbracoObjectType, bool loadBaseType = true) + /// + public IEntitySlim Get(Guid key) { - if (loadBaseType) + return (IEntitySlim) Get(key, false); + } + + /// + public IUmbracoEntity Get(Guid key, bool full) + { + if (!full) { - var objectTypeId = umbracoObjectType.GetGuid(); - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) + // get the light entity + using (ScopeProvider.CreateScope(autoComplete: true)) { - return _entityRepository.GetByKey(key, objectTypeId); + return _entityRepository.Get(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 entityType = GetEntityType(umbracoObjectType); - //var typeFullName = entityType.FullName; - //var entity = _supportedObjectTypes[typeFullName].Item2(id); - - //return entity; + // get the full entity + var objectType = GetObjectType(key); + var entityType = objectType.GetClrType(); + var getters = GetGetters(entityType); + return getters.GetByKey(key); } - /// - /// 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. - /// - /// 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 - public virtual IUmbracoEntity Get(int id, UmbracoObjectTypes umbracoObjectType, bool loadBaseType = true) + /// + public virtual IEntitySlim Get(int id, UmbracoObjectTypes objectType) { - if (loadBaseType) + return (IEntitySlim) Get(id, objectType, false); + } + + /// + public virtual IUmbracoEntity Get(int id, UmbracoObjectTypes objectType, bool full) + { + if (!full) { - var objectTypeId = umbracoObjectType.GetGuid(); - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) + // get the light entity + using (ScopeProvider.CreateScope(autoComplete: true)) { - return _entityRepository.Get(id, objectTypeId); + return _entityRepository.Get(id, objectType.GetGuid()); } } - var entityType = GetEntityType(umbracoObjectType); - var typeFullName = entityType.FullName; - var entity = _supportedObjectTypes[typeFullName].Item2(id); - - return entity; + // get the full entity + var entityType = objectType.GetClrType(); + var getters = GetGetters(entityType); + return getters.GetById(id); } - public IUmbracoEntity GetByKey(Guid key, bool loadBaseType = true) where T : IUmbracoEntity + /// + public IEntitySlim Get(Guid key, UmbracoObjectTypes objectType) { - throw new NotImplementedException(); + return (IEntitySlim) Get(key, objectType, false); } - /// - /// 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 - /// Id of the object to retrieve - /// Optional bool to load the complete object graph when set to False. - /// An - public virtual IUmbracoEntity Get(int id, bool loadBaseType = true) where T : IUmbracoEntity + /// + public IUmbracoEntity Get(Guid key, UmbracoObjectTypes objectType, bool full) { - if (loadBaseType) + if (!full) { - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) + // get the light entity + using (ScopeProvider.CreateScope(autoComplete: true)) + { + return _entityRepository.Get(key, objectType.GetGuid()); + } + } + + // get the full entity + var entityType = objectType.GetClrType(); + var getters = GetGetters(entityType); + return getters.GetByKey(key); + } + + /// + public virtual IEntitySlim Get(int id) + where T : IUmbracoEntity + { + return (IEntitySlim) Get(id, false); + } + + /// + public virtual IUmbracoEntity Get(int id, bool full) + where T : IUmbracoEntity + { + if (!full) + { + // get the light entity + using (ScopeProvider.CreateScope(autoComplete: true)) { return _entityRepository.Get(id); } } - var typeFullName = typeof(T).FullName; - if (_supportedObjectTypes.ContainsKey(typeFullName) == false) - throw new NotSupportedException("The passed in type is not supported"); - var entity = _supportedObjectTypes[typeFullName].Item2(id); - - return entity; + // get the full entity + var entityType = typeof (T); + var getters = GetGetters(entityType); + return getters.GetById(id); } - /// - /// Gets the parent of entity by its id - /// - /// Id of the entity to retrieve the Parent for - /// An - public virtual IUmbracoEntity GetParent(int id) + /// + public virtual IEntitySlim Get(Guid key) + where T : IUmbracoEntity { - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) + return (IEntitySlim) Get(key, false); + } + + /// + public IUmbracoEntity Get(Guid key, bool full) + where T : IUmbracoEntity + { + if (!full) + { + // get the light entity + using (ScopeProvider.CreateScope(autoComplete: true)) + { + return _entityRepository.Get(key); + } + } + + // get the full entity + var entityType = typeof (T); + var getters = GetGetters(entityType); + return getters.GetByKey(key); + } + + /// + public bool Exists(int id) + { + using (ScopeProvider.CreateScope(autoComplete: true)) + { + return _entityRepository.Exists(id); + } + } + + /// + public bool Exists(Guid key) + { + using (ScopeProvider.CreateScope(autoComplete: true)) + { + return _entityRepository.Exists(key); + } + } + + + /// + public virtual IEnumerable GetAll() where T : IUmbracoEntity + => GetAll(Array.Empty()); + + /// + public virtual IEnumerable GetAll(params int[] ids) + where T : IUmbracoEntity + { + var entityType = typeof (T); + var getters = GetGetters(entityType); + var objectType = getters.ObjectType; + var objectTypeId = objectType.GetGuid(); + + using (ScopeProvider.CreateScope(autoComplete: true)) + { + return _entityRepository.GetAll(objectTypeId, ids); + } + } + + /// + public virtual IEnumerable GetAll(UmbracoObjectTypes objectType) + => GetAll(objectType, Array.Empty()); + + /// + public virtual IEnumerable GetAll(UmbracoObjectTypes objectType, params int[] ids) + { + var entityType = objectType.GetClrType(); + GetGetters(entityType); + + using (ScopeProvider.CreateScope(autoComplete: true)) + { + return _entityRepository.GetAll(objectType.GetGuid(), ids); + } + } + + /// + public virtual IEnumerable GetAll(Guid objectType) + => GetAll(objectType, Array.Empty()); + + /// + public virtual IEnumerable GetAll(Guid objectType, params int[] ids) + { + var entityType = ObjectTypes.GetClrType(objectType); + GetGetters(entityType); + + using (ScopeProvider.CreateScope(autoComplete: true)) + { + return _entityRepository.GetAll(objectType, ids); + } + } + + /// + public virtual IEnumerable GetAll(params Guid[] keys) + where T : IUmbracoEntity + { + var entityType = typeof (T); + var getters = GetGetters(entityType); + var objectType = getters.ObjectType; + var objectTypeId = objectType.GetGuid(); + + using (ScopeProvider.CreateScope(autoComplete: true)) + { + return _entityRepository.GetAll(objectTypeId, keys); + } + } + + /// + public IEnumerable GetAll(UmbracoObjectTypes objectType, Guid[] keys) + { + var entityType = objectType.GetClrType(); + GetGetters(entityType); + + using (ScopeProvider.CreateScope(autoComplete: true)) + { + return _entityRepository.GetAll(objectType.GetGuid(), keys); + } + } + + /// + public virtual IEnumerable GetAll(Guid objectType, params Guid[] keys) + { + var entityType = ObjectTypes.GetClrType(objectType); + GetGetters(entityType); + + using (ScopeProvider.CreateScope(autoComplete: true)) + { + return _entityRepository.GetAll(objectType, keys); + } + } + + /// + public virtual IEnumerable GetRootEntities(UmbracoObjectTypes objectType) + { + using (ScopeProvider.CreateScope(autoComplete: true)) + { + return _entityRepository.GetByQuery(QueryRootEntity, objectType.GetGuid()); + } + } + + /// + public virtual IEntitySlim GetParent(int id) + { + using (ScopeProvider.CreateScope(autoComplete: true)) { var entity = _entityRepository.Get(id); if (entity.ParentId == -1 || entity.ParentId == -20 || entity.ParentId == -21) return null; - return _entityRepository.Get(entity.ParentId); } } - /// - /// Gets the parent of entity by its id and UmbracoObjectType - /// - /// Id of the entity to retrieve the Parent for - /// UmbracoObjectType of the parent to retrieve - /// An - public virtual IUmbracoEntity GetParent(int id, UmbracoObjectTypes umbracoObjectType) + /// + public virtual IEntitySlim GetParent(int id, UmbracoObjectTypes objectType) { - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) + using (ScopeProvider.CreateScope(autoComplete: true)) { var entity = _entityRepository.Get(id); if (entity.ParentId == -1 || entity.ParentId == -20 || entity.ParentId == -21) return null; - - var objectTypeId = umbracoObjectType.GetGuid(); - return _entityRepository.Get(entity.ParentId, objectTypeId); + return _entityRepository.Get(entity.ParentId, objectType.GetGuid()); } } - /// - /// Gets a collection of children by the parents Id - /// - /// Id of the parent to retrieve children for - /// An enumerable list of objects - public virtual IEnumerable GetChildren(int parentId) + /// + public virtual IEnumerable GetChildren(int parentId) { - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) + using (ScopeProvider.CreateScope(autoComplete: true)) { var query = Query().Where(x => x.ParentId == parentId); return _entityRepository.GetByQuery(query); } } - /// - /// Gets a collection of children by the parents Id and UmbracoObjectType - /// - /// Id of the parent to retrieve children for - /// UmbracoObjectType of the children to retrieve - /// An enumerable list of objects - public virtual IEnumerable GetChildren(int parentId, UmbracoObjectTypes umbracoObjectType) + /// + public virtual IEnumerable GetChildren(int parentId, UmbracoObjectTypes objectType) { - var objectTypeId = umbracoObjectType.GetGuid(); - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) + using (ScopeProvider.CreateScope(autoComplete: true)) { var query = Query().Where(x => x.ParentId == parentId); - return _entityRepository.GetByQuery(query, objectTypeId).ToList(); // run within using! // run within using! + return _entityRepository.GetByQuery(query, objectType.GetGuid()); } } - /// - /// Gets a collection of descendents by the parents Id - /// - /// Id of entity to retrieve descendents for - /// An enumerable list of objects - public virtual IEnumerable GetDescendents(int id) + /// + public virtual IEnumerable GetDescendants(int id) { - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) + using (ScopeProvider.CreateScope(autoComplete: true)) { var entity = _entityRepository.Get(id); var pathMatch = entity.Path + ","; @@ -297,403 +385,200 @@ namespace Umbraco.Core.Services.Implement } } - /// - /// Gets a collection of descendents by the parents Id - /// - /// Id of entity to retrieve descendents for - /// UmbracoObjectType of the descendents to retrieve - /// An enumerable list of objects - public virtual IEnumerable GetDescendents(int id, UmbracoObjectTypes umbracoObjectType) + /// + public virtual IEnumerable GetDescendants(int id, UmbracoObjectTypes objectType) { - var objectTypeId = umbracoObjectType.GetGuid(); - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) + using (ScopeProvider.CreateScope(autoComplete: true)) { var entity = _entityRepository.Get(id); var query = Query().Where(x => x.Path.StartsWith(entity.Path) && x.Id != id); - return _entityRepository.GetByQuery(query, objectTypeId); + return _entityRepository.GetByQuery(query, objectType.GetGuid()); } } - /// - /// Returns a paged collection of children - /// - /// The parent id to return children for - /// - /// - /// - /// - /// - /// - /// - /// - public IEnumerable GetPagedChildren(int parentId, UmbracoObjectTypes umbracoObjectType, long pageIndex, int pageSize, out long totalRecords, + /// + public IEnumerable GetPagedChildren(int id, UmbracoObjectTypes objectType, long pageIndex, int pageSize, out long totalRecords, string orderBy = "SortOrder", Direction orderDirection = Direction.Ascending, string filter = "") { - var objectTypeId = umbracoObjectType.GetGuid(); - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) + using (ScopeProvider.CreateScope(autoComplete: true)) { - var query = Query().Where(x => x.ParentId == parentId && x.Trashed == false); + var query = Query().Where(x => x.ParentId == id && x.Trashed == false); - IQuery filterQuery = null; - if (filter.IsNullOrWhiteSpace() == false) - { - filterQuery = Query().Where(x => x.Name.Contains(filter)); - } - - var contents = _entityRepository.GetPagedResultsByQuery(query, objectTypeId, pageIndex, pageSize, out totalRecords, orderBy, orderDirection, filterQuery); - return contents; + var filterQuery = string.IsNullOrWhiteSpace(filter) ? null : Query().Where(x => x.Name.Contains(filter)); + return _entityRepository.GetPagedResultsByQuery(query, objectType.GetGuid(), pageIndex, pageSize, out totalRecords, orderBy, orderDirection, filterQuery); } } - /// - /// Returns a paged collection of descendants - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - public IEnumerable GetPagedDescendants(int id, UmbracoObjectTypes umbracoObjectType, long pageIndex, int pageSize, out long totalRecords, + /// + public IEnumerable GetPagedDescendants(int id, UmbracoObjectTypes objectType, long pageIndex, int pageSize, out long totalRecords, string orderBy = "path", Direction orderDirection = Direction.Ascending, string filter = "") { - var objectTypeId = umbracoObjectType.GetGuid(); - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) + using (ScopeProvider.CreateScope(autoComplete: true)) { + var objectTypeGuid = objectType.GetGuid(); var query = Query(); - //if the id is System Root, then just get all - //if the id is System Root, then just get all if (id != Constants.System.Root) { - //lookup the path so we can use it in the prefix query below - var itemPaths = _entityRepository.GetAllPaths(objectTypeId, id).ToArray(); - if (itemPaths.Length == 0) + // lookup the path so we can use it in the prefix query below + var paths = _entityRepository.GetAllPaths(objectTypeGuid, id).ToArray(); + if (paths.Length == 0) { totalRecords = 0; - return Enumerable.Empty(); + return Enumerable.Empty(); } - var itemPath = itemPaths[0].Path; - - query.Where(x => x.Path.SqlStartsWith(itemPath + ",", TextColumnType.NVarchar)); + var path = paths[0].Path; + query.Where(x => x.Path.SqlStartsWith(path + ",", TextColumnType.NVarchar)); } - IQuery filterQuery = null; - if (filter.IsNullOrWhiteSpace() == false) - { - filterQuery = Query().Where(x => x.Name.Contains(filter)); - } - var contents = _entityRepository.GetPagedResultsByQuery(query, objectTypeId, pageIndex, pageSize, out totalRecords, orderBy, orderDirection, filterQuery); - return contents; + var filterQuery = string.IsNullOrWhiteSpace(filter) ? null : Query().Where(x => x.Name.Contains(filter)); + return _entityRepository.GetPagedResultsByQuery(query, objectTypeGuid, pageIndex, pageSize, out totalRecords, orderBy, orderDirection, filterQuery); } } - /// - /// Returns a paged collection of descendants. - /// - public IEnumerable GetPagedDescendants(IEnumerable ids, UmbracoObjectTypes umbracoObjectType, long pageIndex, int pageSize, out long totalRecords, + + /// + public IEnumerable GetPagedDescendants(IEnumerable ids, UmbracoObjectTypes objectType, long pageIndex, int pageSize, out long totalRecords, string orderBy = "path", Direction orderDirection = Direction.Ascending, string filter = "") { totalRecords = 0; var idsA = ids.ToArray(); if (idsA.Length == 0) - return Enumerable.Empty(); + return Enumerable.Empty(); - var objectTypeId = umbracoObjectType.GetGuid(); - - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) + using (ScopeProvider.CreateScope(autoComplete: true)) { + var objectTypeGuid = objectType.GetGuid(); var query = Query(); + if (idsA.All(x => x != Constants.System.Root)) { - //lookup the paths so we can use it in the prefix query below - //lookup the paths so we can use it in the prefix query below - var itemPaths = _entityRepository.GetAllPaths(objectTypeId, idsA).ToArray(); - - if (itemPaths.Length == 0) + var paths = _entityRepository.GetAllPaths(objectTypeGuid, idsA).ToArray(); + if (paths.Length == 0) { totalRecords = 0; - return Enumerable.Empty(); + return Enumerable.Empty(); } var clauses = new List>>(); foreach (var id in idsA) { - //if the id is root then don't add any clauses - if (id != Constants.System.Root) - { - var itemPath = itemPaths.FirstOrDefault(x => x.Id == id); - if (itemPath == null) continue; - var path = itemPath.Path; - var qid = id; - clauses.Add(x => x.Path.SqlStartsWith(path + ",", TextColumnType.NVarchar) || x.Path.SqlEndsWith("," + qid, TextColumnType.NVarchar)); - } + // if the id is root then don't add any clauses + if (id == Constants.System.Root) continue; + + var entityPath = paths.FirstOrDefault(x => x.Id == id); + if (entityPath == null) continue; + + var path = entityPath.Path; + var qid = id; + clauses.Add(x => x.Path.SqlStartsWith(path + ",", TextColumnType.NVarchar) || x.Path.SqlEndsWith("," + qid, TextColumnType.NVarchar)); } query.WhereAny(clauses); } - IQuery filterQuery = null; - if (filter.IsNullOrWhiteSpace() == false) - { - filterQuery = Query().Where(x => x.Name.Contains(filter)); - } - - var contents = _entityRepository.GetPagedResultsByQuery(query, objectTypeId, pageIndex, pageSize, out totalRecords, orderBy, orderDirection, filterQuery); - return contents; + var filterQuery = string.IsNullOrWhiteSpace(filter) ? null : Query().Where(x => x.Name.Contains(filter)); + return _entityRepository.GetPagedResultsByQuery(query, objectTypeGuid, pageIndex, pageSize, out totalRecords, orderBy, orderDirection, filterQuery); } } - /// - /// Returns a paged collection of descendants from the root - /// - /// - /// - /// - /// - /// - /// - /// - /// true/false to include trashed objects - /// - public IEnumerable GetPagedDescendantsFromRoot(UmbracoObjectTypes umbracoObjectType, long pageIndex, int pageSize, out long totalRecords, + /// + public IEnumerable GetPagedDescendants(UmbracoObjectTypes objectType, long pageIndex, int pageSize, out long totalRecords, string orderBy = "path", Direction orderDirection = Direction.Ascending, string filter = "", bool includeTrashed = true) { - var objectTypeId = umbracoObjectType.GetGuid(); - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) + using (ScopeProvider.CreateScope(autoComplete: true)) { var query = Query(); - //don't include trashed if specfied - //don't include trashed if specfied - if (includeTrashed == false) - { query.Where(x => x.Trashed == false); - } - IQuery filterQuery = null; - if (filter.IsNullOrWhiteSpace() == false) - { - filterQuery = Query().Where(x => x.Name.Contains(filter)); - } - var contents = _entityRepository.GetPagedResultsByQuery(query, objectTypeId, pageIndex, pageSize, out totalRecords, orderBy, orderDirection, filterQuery); - return contents; + var filterQuery = string.IsNullOrWhiteSpace(filter) ? null : Query().Where(x => x.Name.Contains(filter)); + return _entityRepository.GetPagedResultsByQuery(query, objectType.GetGuid(), pageIndex, pageSize, out totalRecords, orderBy, orderDirection, filterQuery); } } - /// - /// Gets a collection of the entities at the root, which corresponds to the entities with a Parent Id of -1. - /// - /// UmbracoObjectType of the root entities to retrieve - /// An enumerable list of objects - public virtual IEnumerable GetRootEntities(UmbracoObjectTypes umbracoObjectType) - { - var objectTypeId = umbracoObjectType.GetGuid(); - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) - { - return _entityRepository.GetByQuery(QueryRootEntity, objectTypeId); - } - } - - /// - /// Gets a collection of all of a given type. - /// - /// Type of the entities to retrieve - /// An enumerable list of objects - public virtual IEnumerable GetAll(params int[] ids) where T : IUmbracoEntity - { - var typeFullName = typeof(T).FullName; - if (typeFullName == null || _supportedObjectTypes.ContainsKey(typeFullName) == false) - throw new NotSupportedException("The passed in type is not supported"); - - var objectType = _supportedObjectTypes[typeFullName].Item1; - return GetAll(objectType, ids); - } - - /// - /// Gets a collection of all of a given type. - /// - /// UmbracoObjectType of the entities to return - /// - /// An enumerable list of objects - public virtual IEnumerable GetAll(UmbracoObjectTypes umbracoObjectType, params int[] ids) - { - var entityType = GetEntityType(umbracoObjectType); - - var typeFullName = entityType.FullName; - if (typeFullName == null || _supportedObjectTypes.ContainsKey(typeFullName) == false) - throw new NotSupportedException("The passed in type is not supported"); - - var objectTypeId = umbracoObjectType.GetGuid(); - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) - { - return _entityRepository.GetAll(objectTypeId, ids); - } - } - - public IEnumerable GetAll(UmbracoObjectTypes umbracoObjectType, Guid[] keys) - { - var entityType = GetEntityType(umbracoObjectType); - - var typeFullName = entityType.FullName; - if (typeFullName == null || _supportedObjectTypes.ContainsKey(typeFullName) == false) - throw new NotSupportedException("The passed in type is not supported"); - - var objectTypeId = umbracoObjectType.GetGuid(); - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) - { - return _entityRepository.GetAll(objectTypeId, keys); - } - } - - public virtual IEnumerable GetAllPaths(UmbracoObjectTypes umbracoObjectType, params int[] ids) - { - var entityType = GetEntityType(umbracoObjectType); - var typeFullName = entityType.FullName; - if (typeFullName == null || _supportedObjectTypes.ContainsKey(typeFullName) == false) - throw new NotSupportedException("The passed in type is not supported."); - - var objectTypeId = umbracoObjectType.GetGuid(); - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) - { - return _entityRepository.GetAllPaths(objectTypeId, ids); - } - } - - public virtual IEnumerable GetAllPaths(UmbracoObjectTypes umbracoObjectType, params Guid[] keys) - { - var entityType = GetEntityType(umbracoObjectType); - var typeFullName = entityType.FullName; - if (typeFullName == null || _supportedObjectTypes.ContainsKey(typeFullName) == false) - throw new NotSupportedException("The passed in type is not supported."); - - var objectTypeId = umbracoObjectType.GetGuid(); - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) - { - return _entityRepository.GetAllPaths(objectTypeId, keys); - } - } - - /// - /// Gets a collection of - /// - /// Guid id of the UmbracoObjectType - /// - /// An enumerable list of objects - public virtual IEnumerable GetAll(Guid objectTypeId, params int[] ids) - { - var umbracoObjectType = UmbracoObjectTypesExtensions.GetUmbracoObjectType(objectTypeId); - var entityType = GetEntityType(umbracoObjectType); - - var typeFullName = entityType.FullName; - if (typeFullName == null || _supportedObjectTypes.ContainsKey(typeFullName) == false) - throw new NotSupportedException("The passed in type is not supported"); - - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) - { - return _entityRepository.GetAll(objectTypeId, ids); - } - } - - /// - /// Gets the UmbracoObjectType from the integer id of an IUmbracoEntity. - /// - /// Id of the entity - /// + /// public virtual UmbracoObjectTypes GetObjectType(int id) { using (var scope = ScopeProvider.CreateScope(autoComplete: true)) { var sql = scope.SqlContext.Sql() - .Select("nodeObjectType") + .Select(x => x.NodeObjectType) .From() .Where(x => x.NodeId == id); - var nodeObjectTypeId = scope.Database.ExecuteScalar(sql); - var objectTypeId = nodeObjectTypeId; - return UmbracoObjectTypesExtensions.GetUmbracoObjectType(objectTypeId); + + var guid = scope.Database.ExecuteScalar(sql); + return ObjectTypes.GetUmbracoObjectType(guid); } } - /// - /// Gets the UmbracoObjectType from the integer id of an IUmbracoEntity. - /// - /// Unique Id of the entity - /// + /// public virtual UmbracoObjectTypes GetObjectType(Guid key) { using (var scope = ScopeProvider.CreateScope(autoComplete: true)) { var sql = scope.SqlContext.Sql() - .Select("nodeObjectType") + .Select(x => x.NodeObjectType) .From() .Where(x => x.UniqueId == key); - var nodeObjectTypeId = scope.Database.ExecuteScalar(sql); - var objectTypeId = nodeObjectTypeId; - return UmbracoObjectTypesExtensions.GetUmbracoObjectType(objectTypeId); + + var guid = scope.Database.ExecuteScalar(sql); + return ObjectTypes.GetUmbracoObjectType(guid); } } - /// - /// Gets the UmbracoObjectType from an IUmbracoEntity. - /// - /// - /// + /// public virtual UmbracoObjectTypes GetObjectType(IUmbracoEntity entity) { - return entity is UmbracoEntity entityImpl - ? UmbracoObjectTypesExtensions.GetUmbracoObjectType(entityImpl.NodeObjectType) + return entity is IEntitySlim light + ? ObjectTypes.GetUmbracoObjectType(light.NodeObjectType) : GetObjectType(entity.Id); } - /// - /// Gets the Type of an entity by its Id - /// - /// Id of the entity - /// Type of the entity + /// public virtual Type GetEntityType(int id) { var objectType = GetObjectType(id); - return GetEntityType(objectType); + return objectType.GetClrType(); } - /// - /// Gets the Type of an entity by its - /// - /// - /// Type of the entity - public virtual Type GetEntityType(UmbracoObjectTypes umbracoObjectType) + /// + public Attempt GetId(Guid key, UmbracoObjectTypes objectType) { - var type = typeof(UmbracoObjectTypes); - var memInfo = type.GetMember(umbracoObjectType.ToString()); - var attributes = memInfo[0].GetCustomAttributes(typeof(UmbracoObjectTypeAttribute), - false); - - var attribute = ((UmbracoObjectTypeAttribute)attributes[0]); - if (attribute == null) - throw new NullReferenceException("The passed in UmbracoObjectType does not contain an UmbracoObjectTypeAttribute, which is used to retrieve the Type."); - - if (attribute.ModelType == null) - throw new NullReferenceException("The passed in UmbracoObjectType does not contain a Type definition"); - - return attribute.ModelType; + return _idkMap.GetIdForKey(key, objectType); } - public bool Exists(Guid key) + /// + public Attempt GetId(Udi udi) { - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) - { - var exists = _entityRepository.Exists(key); - return exists; + return _idkMap.GetIdForUdi(udi); + } + + /// + public Attempt GetKey(int id, UmbracoObjectTypes umbracoObjectType) + { + return _idkMap.GetKeyForId(id, umbracoObjectType); + } + + /// + public virtual IEnumerable GetAllPaths(UmbracoObjectTypes objectType, params int[] ids) + { + var entityType = objectType.GetClrType(); + GetGetters(entityType); + + using (ScopeProvider.CreateScope(autoComplete: true)) + { + return _entityRepository.GetAllPaths(objectType.GetGuid(), ids); } } - public bool Exists(int id) + /// + public virtual IEnumerable GetAllPaths(UmbracoObjectTypes objectType, params Guid[] keys) { - using (var scope = ScopeProvider.CreateScope(autoComplete: true)) - { - var exists = _entityRepository.Exists(id); - return exists; + var entityType = objectType.GetClrType(); + GetGetters(entityType); + + using (ScopeProvider.CreateScope(autoComplete: true)) + { + return _entityRepository.GetAllPaths(objectType.GetGuid(), keys); } } @@ -703,9 +588,15 @@ namespace Umbraco.Core.Services.Implement NodeDto node; using (var scope = ScopeProvider.CreateScope()) { - var sql = new Sql("SELECT * FROM umbracoNode WHERE uniqueID=@0 AND nodeObjectType=@1", key, Constants.ObjectTypes.IdReservation); + var sql = scope.SqlContext.Sql() + .Select() + .From() + .Where(x => x.UniqueId == key && x.NodeObjectType == Constants.ObjectTypes.IdReservation); + node = scope.Database.SingleOrDefault(sql); - if (node != null) throw new InvalidOperationException("An identifier has already been reserved for this Udi."); + if (node != null) + throw new InvalidOperationException("An identifier has already been reserved for this Udi."); + node = new NodeDto { UniqueId = key, diff --git a/src/Umbraco.Core/Services/Implement/NotificationService.cs b/src/Umbraco.Core/Services/Implement/NotificationService.cs index d0150f8a2e..ccc9e10bd4 100644 --- a/src/Umbraco.Core/Services/Implement/NotificationService.cs +++ b/src/Umbraco.Core/Services/Implement/NotificationService.cs @@ -11,7 +11,7 @@ using Umbraco.Core.Configuration; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Scoping; diff --git a/src/Umbraco.Core/Services/Implement/PackagingService.cs b/src/Umbraco.Core/Services/Implement/PackagingService.cs index 4c1ea6d5ba..376a654958 100644 --- a/src/Umbraco.Core/Services/Implement/PackagingService.cs +++ b/src/Umbraco.Core/Services/Implement/PackagingService.cs @@ -14,7 +14,7 @@ using Umbraco.Core.Exceptions; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Packaging; using Umbraco.Core.Packaging; using Umbraco.Core.Packaging.Models; @@ -579,7 +579,7 @@ namespace Umbraco.Core.Services.Implement ? _importedContentTypes[masterAlias] : _contentTypeService.Get(masterAlias); - contentType.SetLazyParentId(new Lazy(() => parent.Id)); + contentType.SetParent(parent); } //Update Compositions on the ContentType to ensure that they are as is defined in the package xml diff --git a/src/Umbraco.Core/Services/Implement/RelationService.cs b/src/Umbraco.Core/Services/Implement/RelationService.cs index e7f84cb52b..f3af15c882 100644 --- a/src/Umbraco.Core/Services/Implement/RelationService.cs +++ b/src/Umbraco.Core/Services/Implement/RelationService.cs @@ -4,7 +4,7 @@ using System.Linq; using Umbraco.Core.Events; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Scoping; @@ -290,7 +290,7 @@ namespace Umbraco.Core.Services.Implement /// An public IUmbracoEntity GetChildEntityFromRelation(IRelation relation, bool loadBaseType = false) { - var objectType = UmbracoObjectTypesExtensions.GetUmbracoObjectType(relation.RelationType.ChildObjectType); + var objectType = ObjectTypes.GetUmbracoObjectType(relation.RelationType.ChildObjectType); return _entityService.Get(relation.ChildId, objectType, loadBaseType); } @@ -302,7 +302,7 @@ namespace Umbraco.Core.Services.Implement /// An public IUmbracoEntity GetParentEntityFromRelation(IRelation relation, bool loadBaseType = false) { - var objectType = UmbracoObjectTypesExtensions.GetUmbracoObjectType(relation.RelationType.ParentObjectType); + var objectType = ObjectTypes.GetUmbracoObjectType(relation.RelationType.ParentObjectType); return _entityService.Get(relation.ParentId, objectType, loadBaseType); } @@ -314,8 +314,8 @@ namespace Umbraco.Core.Services.Implement /// Returns a Tuple with Parent (item1) and Child (item2) public Tuple GetEntitiesFromRelation(IRelation relation, bool loadBaseType = false) { - var childObjectType = UmbracoObjectTypesExtensions.GetUmbracoObjectType(relation.RelationType.ChildObjectType); - var parentObjectType = UmbracoObjectTypesExtensions.GetUmbracoObjectType(relation.RelationType.ParentObjectType); + var childObjectType = ObjectTypes.GetUmbracoObjectType(relation.RelationType.ChildObjectType); + var parentObjectType = ObjectTypes.GetUmbracoObjectType(relation.RelationType.ParentObjectType); var child = _entityService.Get(relation.ChildId, childObjectType, loadBaseType); var parent = _entityService.Get(relation.ParentId, parentObjectType, loadBaseType); @@ -333,7 +333,7 @@ namespace Umbraco.Core.Services.Implement { foreach (var relation in relations) { - var objectType = UmbracoObjectTypesExtensions.GetUmbracoObjectType(relation.RelationType.ChildObjectType); + var objectType = ObjectTypes.GetUmbracoObjectType(relation.RelationType.ChildObjectType); yield return _entityService.Get(relation.ChildId, objectType, loadBaseType); } } @@ -348,7 +348,7 @@ namespace Umbraco.Core.Services.Implement { foreach (var relation in relations) { - var objectType = UmbracoObjectTypesExtensions.GetUmbracoObjectType(relation.RelationType.ParentObjectType); + var objectType = ObjectTypes.GetUmbracoObjectType(relation.RelationType.ParentObjectType); yield return _entityService.Get(relation.ParentId, objectType, loadBaseType); } } @@ -363,8 +363,8 @@ namespace Umbraco.Core.Services.Implement { foreach (var relation in relations) { - var childObjectType = UmbracoObjectTypesExtensions.GetUmbracoObjectType(relation.RelationType.ChildObjectType); - var parentObjectType = UmbracoObjectTypesExtensions.GetUmbracoObjectType(relation.RelationType.ParentObjectType); + var childObjectType = ObjectTypes.GetUmbracoObjectType(relation.RelationType.ChildObjectType); + var parentObjectType = ObjectTypes.GetUmbracoObjectType(relation.RelationType.ParentObjectType); var child = _entityService.Get(relation.ChildId, childObjectType, loadBaseType); var parent = _entityService.Get(relation.ParentId, parentObjectType, loadBaseType); diff --git a/src/Umbraco.Core/Sync/IServerAddress.cs b/src/Umbraco.Core/Sync/IServerAddress.cs index b71db6f16c..bbcd865c5f 100644 --- a/src/Umbraco.Core/Sync/IServerAddress.cs +++ b/src/Umbraco.Core/Sync/IServerAddress.cs @@ -1,6 +1,4 @@ -using Umbraco.Core.Models.EntityBase; - -namespace Umbraco.Core.Sync +namespace Umbraco.Core.Sync { /// /// Provides the address of a server. diff --git a/src/Umbraco.Core/UdiGetterExtensions.cs b/src/Umbraco.Core/UdiGetterExtensions.cs index fd3d430132..e94f228e4c 100644 --- a/src/Umbraco.Core/UdiGetterExtensions.cs +++ b/src/Umbraco.Core/UdiGetterExtensions.cs @@ -1,6 +1,6 @@ using System; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Core { diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj index a460d1ae5f..cae2a9ed85 100644 --- a/src/Umbraco.Core/Umbraco.Core.csproj +++ b/src/Umbraco.Core/Umbraco.Core.csproj @@ -314,8 +314,15 @@ - - + + + + + + + + + @@ -560,14 +567,14 @@ - - - - - - - - + + + + + + + + @@ -765,10 +772,10 @@ - + - + diff --git a/src/Umbraco.Tests/Cache/DeepCloneRuntimeCacheProviderTests.cs b/src/Umbraco.Tests/Cache/DeepCloneRuntimeCacheProviderTests.cs index 4fd4c49eb0..169100153e 100644 --- a/src/Umbraco.Tests/Cache/DeepCloneRuntimeCacheProviderTests.cs +++ b/src/Umbraco.Tests/Cache/DeepCloneRuntimeCacheProviderTests.cs @@ -7,7 +7,7 @@ using Umbraco.Core; using Umbraco.Core.Cache; using Umbraco.Core.Collections; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence.Repositories; using Umbraco.Tests.Collections; diff --git a/src/Umbraco.Tests/Models/Collections/Item.cs b/src/Umbraco.Tests/Models/Collections/Item.cs index bd9427ad24..dcb192bcdf 100644 --- a/src/Umbraco.Tests/Models/Collections/Item.cs +++ b/src/Umbraco.Tests/Models/Collections/Item.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Reflection; using System.Runtime.Serialization; using Umbraco.Core; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Tests.Models.Collections { diff --git a/src/Umbraco.Tests/Models/ContentTests.cs b/src/Umbraco.Tests/Models/ContentTests.cs index 424ae83a96..34f2966539 100644 --- a/src/Umbraco.Tests/Models/ContentTests.cs +++ b/src/Umbraco.Tests/Models/ContentTests.cs @@ -12,7 +12,7 @@ using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Serialization; using Umbraco.Core.Services; using Umbraco.Tests.TestHelpers; diff --git a/src/Umbraco.Tests/Models/ContentTypeTests.cs b/src/Umbraco.Tests/Models/ContentTypeTests.cs index cc97e2307b..6efc2c8896 100644 --- a/src/Umbraco.Tests/Models/ContentTypeTests.cs +++ b/src/Umbraco.Tests/Models/ContentTypeTests.cs @@ -4,7 +4,7 @@ using System.Linq; using NUnit.Framework; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Serialization; using Umbraco.Tests.TestHelpers.Entities; using Umbraco.Tests.TestHelpers.Stubs; diff --git a/src/Umbraco.Tests/Models/LightEntityTest.cs b/src/Umbraco.Tests/Models/LightEntityTest.cs new file mode 100644 index 0000000000..1ec9f05822 --- /dev/null +++ b/src/Umbraco.Tests/Models/LightEntityTest.cs @@ -0,0 +1,48 @@ +using System; +using System.Diagnostics; +using NUnit.Framework; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Entities; +using Umbraco.Core.Serialization; + +namespace Umbraco.Tests.Models +{ + [TestFixture] + public class LightEntityTest + { + [Test] + public void Can_Serialize_Without_Error() + { + var ss = new SerializationService(new JsonNetSerializer()); + + var item = new DocumentEntitySlim() + { + Id = 3, + ContentTypeAlias = "test1", + CreatorId = 4, + Key = Guid.NewGuid(), + UpdateDate = DateTime.Now, + CreateDate = DateTime.Now, + Name = "Test", + ParentId = 5, + SortOrder = 6, + Path = "-1,23", + Level = 7, + ContentTypeIcon = "icon", + ContentTypeThumbnail = "thumb", + HasChildren = true, + Edited = true, + Published = true, + NodeObjectType = Guid.NewGuid() + }; + item.AdditionalData.Add("test1", 3); + item.AdditionalData.Add("test2", "valuie"); + item.AdditionalData.Add("test3", new EntitySlim.PropertySlim("TestPropertyEditor", "test")); + item.AdditionalData.Add("test4", new EntitySlim.PropertySlim("TestPropertyEditor2", "test2")); + + var result = ss.ToStream(item); + var json = result.ResultStream.ToJsonString(); + Debug.Print(json); // fixme compare with v7 + } + } +} diff --git a/src/Umbraco.Tests/Models/MacroTests.cs b/src/Umbraco.Tests/Models/MacroTests.cs index 414b00650d..64e485c965 100644 --- a/src/Umbraco.Tests/Models/MacroTests.cs +++ b/src/Umbraco.Tests/Models/MacroTests.cs @@ -2,7 +2,7 @@ using System.Linq; using NUnit.Framework; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Tests.TestHelpers; namespace Umbraco.Tests.Models diff --git a/src/Umbraco.Tests/Models/MemberTests.cs b/src/Umbraco.Tests/Models/MemberTests.cs index 6b4cc4b3e8..c1e3798192 100644 --- a/src/Umbraco.Tests/Models/MemberTests.cs +++ b/src/Umbraco.Tests/Models/MemberTests.cs @@ -3,7 +3,7 @@ using System.Diagnostics; using System.Linq; using NUnit.Framework; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Serialization; using Umbraco.Tests.TestHelpers.Entities; diff --git a/src/Umbraco.Tests/Models/PathValidationTests.cs b/src/Umbraco.Tests/Models/PathValidationTests.cs new file mode 100644 index 0000000000..dab362cc35 --- /dev/null +++ b/src/Umbraco.Tests/Models/PathValidationTests.cs @@ -0,0 +1,139 @@ +using System; +using Moq; +using NUnit.Framework; +using Umbraco.Core.Logging; +using Umbraco.Core.Models; +using Umbraco.Core.Models.Entities; + +namespace Umbraco.Tests.Models +{ + [TestFixture] + public class PathValidationTests + { + [Test] + public void Validate_Path() + { + var entity = new EntitySlim(); + + //it's empty with no id so we need to allow it + Assert.IsTrue(entity.ValidatePath()); + + entity.Id = 1234; + + //it has an id but no path, so we can't allow it + Assert.IsFalse(entity.ValidatePath()); + + entity.Path = "-1"; + + //invalid path + Assert.IsFalse(entity.ValidatePath()); + + entity.Path = string.Concat("-1,", entity.Id); + + //valid path + Assert.IsTrue(entity.ValidatePath()); + } + + [Test] + public void Ensure_Path_Throws_Without_Id() + { + var entity = new EntitySlim(); + + //no id assigned + Assert.Throws(() => entity.EnsureValidPath(Mock.Of(), umbracoEntity => new EntitySlim(), umbracoEntity => { })); + } + + [Test] + public void Ensure_Path_Throws_Without_Parent() + { + var entity = new EntitySlim { Id = 1234 }; + + //no parent found + Assert.Throws(() => entity.EnsureValidPath(Mock.Of(), umbracoEntity => null, umbracoEntity => { })); + } + + [Test] + public void Ensure_Path_Entity_At_Root() + { + var entity = new EntitySlim + { + Id = 1234, + ParentId = -1 + }; + + + entity.EnsureValidPath(Mock.Of(), umbracoEntity => null, umbracoEntity => { }); + + //works because it's under the root + Assert.AreEqual("-1,1234", entity.Path); + } + + [Test] + public void Ensure_Path_Entity_Valid_Parent() + { + var entity = new EntitySlim + { + Id = 1234, + ParentId = 888 + }; + + entity.EnsureValidPath(Mock.Of(), umbracoEntity => umbracoEntity.ParentId == 888 ? new EntitySlim { Id = 888, Path = "-1,888" } : null, umbracoEntity => { }); + + //works because the parent was found + Assert.AreEqual("-1,888,1234", entity.Path); + } + + [Test] + public void Ensure_Path_Entity_Valid_Recursive_Parent() + { + var parentA = new EntitySlim + { + Id = 999, + ParentId = -1 + }; + + var parentB = new EntitySlim + { + Id = 888, + ParentId = 999 + }; + + var parentC = new EntitySlim + { + Id = 777, + ParentId = 888 + }; + + var entity = new EntitySlim + { + Id = 1234, + ParentId = 777 + }; + + Func getParent = umbracoEntity => + { + switch (umbracoEntity.ParentId) + { + case 999: + return parentA; + case 888: + return parentB; + case 777: + return parentC; + case 1234: + return entity; + default: + return null; + } + }; + + //this will recursively fix all paths + entity.EnsureValidPath(Mock.Of(), getParent, umbracoEntity => { }); + + Assert.AreEqual("-1,999", parentA.Path); + Assert.AreEqual("-1,999,888", parentB.Path); + Assert.AreEqual("-1,999,888,777", parentC.Path); + Assert.AreEqual("-1,999,888,777,1234", entity.Path); + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/Models/UmbracoEntityTests.cs b/src/Umbraco.Tests/Models/UmbracoEntityTests.cs deleted file mode 100644 index 5325fb4271..0000000000 --- a/src/Umbraco.Tests/Models/UmbracoEntityTests.cs +++ /dev/null @@ -1,266 +0,0 @@ -using System; -using System.Diagnostics; -using Moq; -using NUnit.Framework; -using Umbraco.Core.Logging; -using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; -using Umbraco.Core.Serialization; - -namespace Umbraco.Tests.Models -{ - [TestFixture] - public class UmbracoEntityTests - { - [Test] - public void Validate_Path() - { - var entity = new UmbracoEntity(); - - //it's empty with no id so we need to allow it - Assert.IsTrue(entity.ValidatePath()); - - entity.Id = 1234; - - //it has an id but no path, so we can't allow it - Assert.IsFalse(entity.ValidatePath()); - - entity.Path = "-1"; - - //invalid path - Assert.IsFalse(entity.ValidatePath()); - - entity.Path = string.Concat("-1,", entity.Id); - - //valid path - Assert.IsTrue(entity.ValidatePath()); - } - - [Test] - public void Ensure_Path_Throws_Without_Id() - { - var entity = new UmbracoEntity(); - - //no id assigned - Assert.Throws(() => entity.EnsureValidPath(Mock.Of(), umbracoEntity => new UmbracoEntity(), umbracoEntity => { })); - } - - [Test] - public void Ensure_Path_Throws_Without_Parent() - { - var entity = new UmbracoEntity { Id = 1234 }; - - //no parent found - Assert.Throws(() => entity.EnsureValidPath(Mock.Of(), umbracoEntity => null, umbracoEntity => { })); - } - - [Test] - public void Ensure_Path_Entity_At_Root() - { - var entity = new UmbracoEntity - { - Id = 1234, - ParentId = -1 - }; - - - entity.EnsureValidPath(Mock.Of(), umbracoEntity => null, umbracoEntity => { }); - - //works because it's under the root - Assert.AreEqual("-1,1234", entity.Path); - } - - [Test] - public void Ensure_Path_Entity_Valid_Parent() - { - var entity = new UmbracoEntity - { - Id = 1234, - ParentId = 888 - }; - - entity.EnsureValidPath(Mock.Of(), umbracoEntity => umbracoEntity.ParentId == 888 ? new UmbracoEntity { Id = 888, Path = "-1,888" } : null, umbracoEntity => { }); - - //works because the parent was found - Assert.AreEqual("-1,888,1234", entity.Path); - } - - [Test] - public void Ensure_Path_Entity_Valid_Recursive_Parent() - { - var parentA = new UmbracoEntity - { - Id = 999, - ParentId = -1 - }; - - var parentB = new UmbracoEntity - { - Id = 888, - ParentId = 999 - }; - - var parentC = new UmbracoEntity - { - Id = 777, - ParentId = 888 - }; - - var entity = new UmbracoEntity - { - Id = 1234, - ParentId = 777 - }; - - Func getParent = umbracoEntity => - { - switch (umbracoEntity.ParentId) - { - case 999: - return parentA; - case 888: - return parentB; - case 777: - return parentC; - case 1234: - return entity; - default: - return null; - } - }; - - //this will recursively fix all paths - entity.EnsureValidPath(Mock.Of(), getParent, umbracoEntity => { }); - - Assert.AreEqual("-1,999", parentA.Path); - Assert.AreEqual("-1,999,888", parentB.Path); - Assert.AreEqual("-1,999,888,777", parentC.Path); - Assert.AreEqual("-1,999,888,777,1234", entity.Path); - } - - [Test] - public void UmbracoEntity_Can_Be_Initialized_From_Dynamic() - { - var boolIsTrue = true; - ulong ulongIsTrue = 1; // because MySql might return ulong - - var trashedWithBool = new UmbracoEntity((dynamic)boolIsTrue); - var trashedWithInt = new UmbracoEntity((dynamic)ulongIsTrue); - - Assert.IsTrue(trashedWithBool.Trashed); - Assert.IsTrue(trashedWithInt.Trashed); - } - - [Test] - public void Can_Deep_Clone() - { - var item = new UmbracoEntity() - { - Id = 3, - ContentTypeAlias = "test1", - CreatorId = 4, - Key = Guid.NewGuid(), - UpdateDate = DateTime.Now, - CreateDate = DateTime.Now, - Name = "Test", - ParentId = 5, - SortOrder = 6, - Path = "-1,23", - Level = 7, - ContentTypeIcon = "icon", - ContentTypeThumbnail = "thumb", - HasChildren = true, - Edited = true, - Published = true, - NodeObjectType = Guid.NewGuid() - }; - item.AdditionalData.Add("test1", 3); - item.AdditionalData.Add("test2", "valuie"); - - item.AdditionalData.Add("test3", new UmbracoEntity.EntityProperty() - { - Value = "test", - PropertyEditorAlias = "TestPropertyEditor" - }); - item.AdditionalData.Add("test4", new UmbracoEntity.EntityProperty() - { - Value = "test2", - PropertyEditorAlias = "TestPropertyEditor2" - }); - - var clone = (UmbracoEntity)item.DeepClone(); - - Assert.AreNotSame(clone, item); - Assert.AreEqual(clone, item); - Assert.AreEqual(clone.CreateDate, item.CreateDate); - Assert.AreEqual(clone.ContentTypeAlias, item.ContentTypeAlias); - Assert.AreEqual(clone.CreatorId, item.CreatorId); - Assert.AreEqual(clone.Id, item.Id); - Assert.AreEqual(clone.Key, item.Key); - Assert.AreEqual(clone.Level, item.Level); - Assert.AreEqual(clone.Name, item.Name); - Assert.AreEqual(clone.ParentId, item.ParentId); - Assert.AreEqual(clone.SortOrder, item.SortOrder); - Assert.AreEqual(clone.Path, item.Path); - Assert.AreEqual(clone.ContentTypeIcon, item.ContentTypeIcon); - Assert.AreEqual(clone.ContentTypeThumbnail, item.ContentTypeThumbnail); - Assert.AreEqual(clone.HasChildren, item.HasChildren); - Assert.AreEqual(clone.Edited, item.Edited); - Assert.AreEqual(clone.Published, item.Published); - Assert.AreEqual(clone.NodeObjectType, item.NodeObjectType); - Assert.AreEqual(clone.UpdateDate, item.UpdateDate); - Assert.AreEqual(clone.AdditionalData.Count, item.AdditionalData.Count); - Assert.AreEqual(clone.AdditionalData, item.AdditionalData); - - //This double verifies by reflection - var allProps = clone.GetType().GetProperties(); - foreach (var propertyInfo in allProps) - { - Assert.AreEqual(propertyInfo.GetValue(clone, null), propertyInfo.GetValue(item, null)); - } - } - - [Test] - public void Can_Serialize_Without_Error() - { - var ss = new SerializationService(new JsonNetSerializer()); - - var item = new UmbracoEntity() - { - Id = 3, - ContentTypeAlias = "test1", - CreatorId = 4, - Key = Guid.NewGuid(), - UpdateDate = DateTime.Now, - CreateDate = DateTime.Now, - Name = "Test", - ParentId = 5, - SortOrder = 6, - Path = "-1,23", - Level = 7, - ContentTypeIcon = "icon", - ContentTypeThumbnail = "thumb", - HasChildren = true, - Edited = true, - Published = true, - NodeObjectType = Guid.NewGuid() - }; - item.AdditionalData.Add("test1", 3); - item.AdditionalData.Add("test2", "valuie"); - item.AdditionalData.Add("test3", new UmbracoEntity.EntityProperty() - { - Value = "test", - PropertyEditorAlias = "TestPropertyEditor" - }); - item.AdditionalData.Add("test4", new UmbracoEntity.EntityProperty() - { - Value = "test2", - PropertyEditorAlias = "TestPropertyEditor2" - }); - - var result = ss.ToStream(item); - var json = result.ResultStream.ToJsonString(); - Debug.Print(json); - } - } -} diff --git a/src/Umbraco.Tests/Models/UserExtensionsTests.cs b/src/Umbraco.Tests/Models/UserExtensionsTests.cs index 2c6f927262..0e042d8a46 100644 --- a/src/Umbraco.Tests/Models/UserExtensionsTests.cs +++ b/src/Umbraco.Tests/Models/UserExtensionsTests.cs @@ -4,7 +4,7 @@ using System.Linq; using Moq; using NUnit.Framework; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; diff --git a/src/Umbraco.Tests/Persistence/Mappers/DataTypeMapperTest.cs b/src/Umbraco.Tests/Persistence/Mappers/DataTypeMapperTest.cs index 1c04b2f467..43ec3545d8 100644 --- a/src/Umbraco.Tests/Persistence/Mappers/DataTypeMapperTest.cs +++ b/src/Umbraco.Tests/Persistence/Mappers/DataTypeMapperTest.cs @@ -45,7 +45,7 @@ namespace Umbraco.Tests.Persistence.Mappers { // Act - string column = new DataTypeMapper().Map(new SqlCeSyntaxProvider(), "PropertyEditorAlias"); + string column = new DataTypeMapper().Map(new SqlCeSyntaxProvider(), "EditorAlias"); // Assert Assert.That(column, Is.EqualTo("[cmsDataType].[propertyEditorAlias]")); diff --git a/src/Umbraco.Tests/Persistence/Querying/ContentTypeSqlMappingTests.cs b/src/Umbraco.Tests/Persistence/Querying/ContentTypeSqlMappingTests.cs index 2034968d4d..0cb0b5aa2a 100644 --- a/src/Umbraco.Tests/Persistence/Querying/ContentTypeSqlMappingTests.cs +++ b/src/Umbraco.Tests/Persistence/Querying/ContentTypeSqlMappingTests.cs @@ -149,7 +149,7 @@ namespace Umbraco.Tests.Persistence.Querying scope.Database.Execute(new Sql(string.Format("SET IDENTITY_INSERT {0} OFF ", SqlSyntax.GetQuotedTableName("umbracoNode")))); scope.Database.Execute(new Sql(string.Format("SET IDENTITY_INSERT {0} ON ", SqlSyntax.GetQuotedTableName(Constants.DatabaseSchema.Tables.DataType)))); - scope.Database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 44444, DataTypeId = 55555, PropertyEditorAlias = Constants.PropertyEditors.TextboxAlias, DbType = "Nvarchar" }); + scope.Database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = 44444, DataTypeId = 55555, EditorAlias = Constants.PropertyEditors.TextboxAlias, DbType = "Nvarchar" }); scope.Database.Execute(new Sql(string.Format("SET IDENTITY_INSERT {0} OFF ", SqlSyntax.GetQuotedTableName(Constants.DatabaseSchema.Tables.DataType)))); scope.Database.Execute(new Sql(string.Format("SET IDENTITY_INSERT {0} ON ", SqlSyntax.GetQuotedTableName("cmsContentType")))); diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentTypeRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentTypeRepositoryTest.cs index abed7f9d91..010184e793 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentTypeRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentTypeRepositoryTest.cs @@ -9,7 +9,7 @@ using Umbraco.Core.Cache; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.IO; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Repositories; diff --git a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs index 9b7186a79c..2e72a2e14c 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs @@ -5,7 +5,7 @@ using NUnit.Framework; using Umbraco.Core.Cache; using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.Repositories; using Umbraco.Tests.TestHelpers; diff --git a/src/Umbraco.Tests/Persistence/Repositories/NotificationsRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/NotificationsRepositoryTest.cs index d43f49bfc8..ef7f34f62a 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/NotificationsRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/NotificationsRepositoryTest.cs @@ -4,7 +4,7 @@ using System.Linq; using Moq; using NUnit.Framework; using Umbraco.Core; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence.Dtos; using Umbraco.Core.Persistence.Repositories; diff --git a/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs b/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs index b70c67bd68..9cba009f06 100644 --- a/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs +++ b/src/Umbraco.Tests/Scoping/ScopedNuCacheTests.cs @@ -12,6 +12,8 @@ using Umbraco.Core.Configuration.UmbracoSettings; using Umbraco.Core.Events; using Umbraco.Core.Models; using Umbraco.Core.Models.PublishedContent; +using Umbraco.Core.Persistence.Repositories; +using Umbraco.Core.Persistence.Repositories.Implement; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; using Umbraco.Core.Services.Implement; @@ -73,6 +75,9 @@ namespace Umbraco.Tests.Scoping runtimeStateMock.Setup(x => x.Level).Returns(() => RuntimeLevel.Run); var contentTypeFactory = new PublishedContentTypeFactory(Mock.Of(), new PropertyValueConverterCollection(Array.Empty()), Mock.Of()); + var documentRepository = Mock.Of(); + var mediaRepository = Mock.Of(); + var memberRepository = Mock.Of(); return new PublishedSnapshotService( options, @@ -83,7 +88,7 @@ namespace Umbraco.Tests.Scoping publishedSnapshotAccessor, Logger, ScopeProvider, - null, null, null); + documentRepository, mediaRepository, memberRepository); } protected UmbracoContext GetUmbracoContextNu(string url, int templateId = 1234, RouteData routeData = null, bool setSingleton = false, IUmbracoSettingsSection umbracoSettings = null, IEnumerable urlProviders = null) diff --git a/src/Umbraco.Tests/Services/EntityServiceTests.cs b/src/Umbraco.Tests/Services/EntityServiceTests.cs index ec51a8576f..d6e9f605dc 100644 --- a/src/Umbraco.Tests/Services/EntityServiceTests.cs +++ b/src/Umbraco.Tests/Services/EntityServiceTests.cs @@ -4,6 +4,7 @@ using System.Linq; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Models; +using Umbraco.Core.Models.Entities; using Umbraco.Tests.TestHelpers; using Umbraco.Tests.TestHelpers.Entities; using Umbraco.Tests.Testing; @@ -153,7 +154,7 @@ namespace Umbraco.Tests.Services long total; //search at root to see if it returns recycled - var entities = service.GetPagedDescendantsFromRoot(UmbracoObjectTypes.Document, 0, 1000, out total, includeTrashed: false) + var entities = service.GetPagedDescendants(UmbracoObjectTypes.Document, 0, 1000, out total, includeTrashed: false) .Select(x => x.Id) .ToArray(); @@ -333,7 +334,7 @@ namespace Umbraco.Tests.Services long total; //search at root to see if it returns recycled - var entities = service.GetPagedDescendantsFromRoot(UmbracoObjectTypes.Media, 0, 1000, out total, includeTrashed: false) + var entities = service.GetPagedDescendants(UmbracoObjectTypes.Media, 0, 1000, out total, includeTrashed: false) .Select(x => x.Id) .ToArray(); @@ -443,7 +444,7 @@ namespace Umbraco.Tests.Services { var service = ServiceContext.EntityService; - var entities = service.GetDescendents(folderId); + var entities = service.GetDescendants(folderId); Assert.That(entities.Any(), Is.True); Assert.That(entities.Count(), Is.EqualTo(4)); @@ -457,8 +458,8 @@ namespace Umbraco.Tests.Services var objectTypeId = Constants.ObjectTypes.ContentItem; Assert.Throws(() => service.GetAll()); - Assert.Throws(() => service.GetAll(UmbracoObjectTypes.ContentItem)); - Assert.Throws(() => service.GetAll(objectTypeId)); + Assert.Throws(() => service.GetAll(UmbracoObjectTypes.ContentItem)); + Assert.Throws(() => service.GetAll(objectTypeId)); } [Test] @@ -510,12 +511,12 @@ namespace Umbraco.Tests.Services Console.WriteLine(); foreach (var data in entity.AdditionalData) { - Console.WriteLine($"{entity.Id} {data.Key} {data.Value} {(data.Value is UmbracoEntity.EntityProperty p ? p.PropertyEditorAlias : "")}"); + Console.WriteLine($"{entity.Id} {data.Key} {data.Value} {(data.Value is EntitySlim.PropertySlim p ? p.PropertyEditorAlias : "")}"); } } Assert.That(entities.Any(x => - x.AdditionalData.Any(y => y.Value is UmbracoEntity.EntityProperty && ((UmbracoEntity.EntityProperty) y.Value).PropertyEditorAlias == Constants.PropertyEditors.UploadFieldAlias)), Is.True); + x.AdditionalData.Any(y => y.Value is EntitySlim.PropertySlim && ((EntitySlim.PropertySlim) y.Value).PropertyEditorAlias == Constants.PropertyEditors.UploadFieldAlias)), Is.True); } [Test] @@ -532,7 +533,7 @@ namespace Umbraco.Tests.Services public void EntityService_Can_Get_Key_For_Id() { var service = ServiceContext.EntityService; - var result = service.GetKeyForId(1061, UmbracoObjectTypes.DocumentType); + var result = service.GetKey(1061, UmbracoObjectTypes.DocumentType); Assert.IsTrue(result.Success); Assert.AreEqual(Guid.Parse("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522"), result.Result); @@ -542,8 +543,8 @@ namespace Umbraco.Tests.Services public void EntityService_Cannot_Get_Key_For_Id_With_Incorrect_Object_Type() { var service = ServiceContext.EntityService; - var result1 = service.GetKeyForId(1061, UmbracoObjectTypes.DocumentType); - var result2 = service.GetKeyForId(1061, UmbracoObjectTypes.MediaType); + var result1 = service.GetKey(1061, UmbracoObjectTypes.DocumentType); + var result2 = service.GetKey(1061, UmbracoObjectTypes.MediaType); Assert.IsTrue(result1.Success); Assert.IsFalse(result2.Success); @@ -553,7 +554,7 @@ namespace Umbraco.Tests.Services 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); + var result = service.GetId(Guid.Parse("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522"), UmbracoObjectTypes.DocumentType); Assert.IsTrue(result.Success); Assert.AreEqual(1061, result.Result); @@ -563,8 +564,8 @@ namespace Umbraco.Tests.Services public void EntityService_Cannot_Get_Id_For_Key_With_Incorrect_Object_Type() { var service = ServiceContext.EntityService; - var result1 = service.GetIdForKey(Guid.Parse("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522"), UmbracoObjectTypes.DocumentType); - var result2 = service.GetIdForKey(Guid.Parse("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522"), UmbracoObjectTypes.MediaType); + var result1 = service.GetId(Guid.Parse("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522"), UmbracoObjectTypes.DocumentType); + var result2 = service.GetId(Guid.Parse("1D3A8E6E-2EA9-4CC1-B229-1AEE19821522"), UmbracoObjectTypes.MediaType); Assert.IsTrue(result1.Success); Assert.IsFalse(result2.Success); diff --git a/src/Umbraco.Tests/Services/MemberServiceTests.cs b/src/Umbraco.Tests/Services/MemberServiceTests.cs index 07ea9175bf..e0e894294a 100644 --- a/src/Umbraco.Tests/Services/MemberServiceTests.cs +++ b/src/Umbraco.Tests/Services/MemberServiceTests.cs @@ -8,7 +8,7 @@ using Umbraco.Core; using Umbraco.Core.Composing; using Umbraco.Core.Events; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Core.Persistence; using Umbraco.Core.Persistence.DatabaseModelDefinitions; diff --git a/src/Umbraco.Tests/TestHelpers/Entities/MockedEntity.cs b/src/Umbraco.Tests/TestHelpers/Entities/MockedEntity.cs index 7e90d24efe..e78980aa83 100644 --- a/src/Umbraco.Tests/TestHelpers/Entities/MockedEntity.cs +++ b/src/Umbraco.Tests/TestHelpers/Entities/MockedEntity.cs @@ -1,6 +1,6 @@ using System; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Tests.TestHelpers.Entities { diff --git a/src/Umbraco.Tests/TestHelpers/TestHelper.cs b/src/Umbraco.Tests/TestHelpers/TestHelper.cs index 5503f8021a..bcd9f8fb61 100644 --- a/src/Umbraco.Tests/TestHelpers/TestHelper.cs +++ b/src/Umbraco.Tests/TestHelpers/TestHelper.cs @@ -11,7 +11,7 @@ using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.IO; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using File = System.IO.File; namespace Umbraco.Tests.TestHelpers diff --git a/src/Umbraco.Tests/TestHelpers/TestObjects.cs b/src/Umbraco.Tests/TestHelpers/TestObjects.cs index 01066507ce..7f706a425d 100644 --- a/src/Umbraco.Tests/TestHelpers/TestObjects.cs +++ b/src/Umbraco.Tests/TestHelpers/TestObjects.cs @@ -172,8 +172,6 @@ namespace Umbraco.Tests.TestHelpers scopeProvider, logger, eventMessagesFactory, contentService.Value, contentTypeService.Value, mediaService.Value, mediaTypeService.Value, dataTypeService.Value, memberService.Value, memberTypeService.Value, idkMap, - //TODO: Consider making this an isolated cache instead of using the global one - cache.RuntimeCache, GetRepo(c))); var macroService = GetLazyService(container, c => new MacroService(scopeProvider, logger, eventMessagesFactory, GetRepo(c), GetRepo(c))); diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 42e0486901..70b2905297 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -226,6 +226,7 @@ + @@ -357,7 +358,7 @@ - + diff --git a/src/Umbraco.Tests/Web/Controllers/ContentControllerUnitTests.cs b/src/Umbraco.Tests/Web/Controllers/ContentControllerUnitTests.cs index e34ad6771d..21aa739e23 100644 --- a/src/Umbraco.Tests/Web/Controllers/ContentControllerUnitTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/ContentControllerUnitTests.cs @@ -3,7 +3,7 @@ using System.Web.Http; using Moq; using NUnit.Framework; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; using Umbraco.Web.Editors; diff --git a/src/Umbraco.Tests/Web/Controllers/FilterAllowedOutgoingContentAttributeTests.cs b/src/Umbraco.Tests/Web/Controllers/FilterAllowedOutgoingContentAttributeTests.cs index ff191b6fe6..634d58b3fd 100644 --- a/src/Umbraco.Tests/Web/Controllers/FilterAllowedOutgoingContentAttributeTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/FilterAllowedOutgoingContentAttributeTests.cs @@ -7,7 +7,7 @@ using Moq; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; using Umbraco.Web.Models.ContentEditing; diff --git a/src/Umbraco.Tests/Web/Controllers/MediaControllerUnitTests.cs b/src/Umbraco.Tests/Web/Controllers/MediaControllerUnitTests.cs index 6efe348bc8..f409d81a2d 100644 --- a/src/Umbraco.Tests/Web/Controllers/MediaControllerUnitTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/MediaControllerUnitTests.cs @@ -3,7 +3,7 @@ using System.Web.Http; using Moq; using NUnit.Framework; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; using Umbraco.Web.Editors; diff --git a/src/Umbraco.Tests/Web/Controllers/UserEditorAuthorizationHelperTests.cs b/src/Umbraco.Tests/Web/Controllers/UserEditorAuthorizationHelperTests.cs index ed181f00f0..04694b21ee 100644 --- a/src/Umbraco.Tests/Web/Controllers/UserEditorAuthorizationHelperTests.cs +++ b/src/Umbraco.Tests/Web/Controllers/UserEditorAuthorizationHelperTests.cs @@ -7,7 +7,7 @@ using Moq; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; using Umbraco.Web.Editors; diff --git a/src/Umbraco.Tests/Web/TemplateUtilitiesTests.cs b/src/Umbraco.Tests/Web/TemplateUtilitiesTests.cs index d7fef57bab..e2019193f9 100644 --- a/src/Umbraco.Tests/Web/TemplateUtilitiesTests.cs +++ b/src/Umbraco.Tests/Web/TemplateUtilitiesTests.cs @@ -31,7 +31,7 @@ namespace Umbraco.Tests.Web // fixme - now UrlProvider depends on EntityService for GetUrl(guid) - this is bad // should not depend on more than IdkMap maybe - fix this! var entityService = new Mock(); - entityService.Setup(x => x.GetIdForKey(It.IsAny(), It.IsAny())).Returns(Attempt.Fail()); + entityService.Setup(x => x.GetId(It.IsAny(), It.IsAny())).Returns(Attempt.Fail()); var serviceContext = new ServiceContext(entityService: entityService.Object); // fixme - bad in a unit test - but Udi has a static ctor that wants it?! @@ -61,7 +61,7 @@ namespace Umbraco.Tests.Web //setup a mock entity service from the service context to return an integer for a GUID var entityService = Mock.Get(serviceCtxMock.EntityService); - entityService.Setup(x => x.GetIdForKey(It.IsAny(), It.IsAny())) + entityService.Setup(x => x.GetId(It.IsAny(), It.IsAny())) .Returns((Guid id, UmbracoObjectTypes objType) => { return Attempt.Succeed(1234); diff --git a/src/Umbraco.Web/Editors/DataTypeValidateAttribute.cs b/src/Umbraco.Web/Editors/DataTypeValidateAttribute.cs index 632f8cbe2e..30abbf0ca7 100644 --- a/src/Umbraco.Web/Editors/DataTypeValidateAttribute.cs +++ b/src/Umbraco.Web/Editors/DataTypeValidateAttribute.cs @@ -8,7 +8,6 @@ using System.Web.Http.Filters; using AutoMapper; using Umbraco.Core; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.PropertyEditors; using Umbraco.Core.Services; using Umbraco.Web.Composing; diff --git a/src/Umbraco.Web/Editors/EntityController.cs b/src/Umbraco.Web/Editors/EntityController.cs index ce8fd3341f..a558648ffc 100644 --- a/src/Umbraco.Web/Editors/EntityController.cs +++ b/src/Umbraco.Web/Editors/EntityController.cs @@ -10,11 +10,11 @@ using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Mvc; using System.Linq; using System.Net.Http; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models; using Constants = Umbraco.Core.Constants; using Umbraco.Core.Persistence.DatabaseModelDefinitions; using System.Web.Http.Controllers; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Xml; using Umbraco.Web.Search; using Umbraco.Web.Trees; @@ -563,7 +563,7 @@ namespace Umbraco.Web.Editors } entities = aids == null || aids.Contains(Constants.System.Root) - ? Services.EntityService.GetPagedDescendantsFromRoot(objectType.Value, pageNumber - 1, pageSize, out totalRecords, orderBy, orderDirection, filter, includeTrashed: false) + ? Services.EntityService.GetPagedDescendants(objectType.Value, pageNumber - 1, pageSize, out totalRecords, orderBy, orderDirection, filter, includeTrashed: false) : Services.EntityService.GetPagedDescendants(aids, objectType.Value, pageNumber - 1, pageSize, out totalRecords, orderBy, orderDirection, filter); } else @@ -772,7 +772,7 @@ namespace Umbraco.Web.Editors var objectType = ConvertToObjectType(entityType); if (objectType.HasValue) { - var found = Services.EntityService.GetByKey(key, objectType.Value); + var found = Services.EntityService.Get(key, objectType.Value); if (found == null) { throw new HttpResponseException(HttpStatusCode.NotFound); diff --git a/src/Umbraco.Web/Editors/MediaController.cs b/src/Umbraco.Web/Editors/MediaController.cs index a203225318..1543e9298b 100644 --- a/src/Umbraco.Web/Editors/MediaController.cs +++ b/src/Umbraco.Web/Editors/MediaController.cs @@ -329,7 +329,7 @@ namespace Umbraco.Web.Editors bool orderBySystemField = true, string filter = "") { - var entity = Services.EntityService.GetByKey(id); + var entity = Services.EntityService.Get(id); if (entity != null) { return GetChildren(entity.Id, pageNumber, pageSize, orderBy, orderDirection, orderBySystemField, filter); @@ -360,7 +360,7 @@ namespace Umbraco.Web.Editors var guidUdi = id as GuidUdi; if (guidUdi != null) { - var entity = Services.EntityService.GetByKey(guidUdi.Guid); + var entity = Services.EntityService.Get(guidUdi.Guid); if (entity != null) { return GetChildren(entity.Id, pageNumber, pageSize, orderBy, orderDirection, orderBySystemField, filter); @@ -648,7 +648,7 @@ namespace Umbraco.Web.Editors Guid idGuid; if (Guid.TryParse(currentFolderId, out idGuid)) { - var entity = Services.EntityService.GetByKey(idGuid); + var entity = Services.EntityService.Get(idGuid); if (entity != null) { entityFound = true; diff --git a/src/Umbraco.Web/Editors/MediaTypeController.cs b/src/Umbraco.Web/Editors/MediaTypeController.cs index 914524d26f..efc3fa2e4c 100644 --- a/src/Umbraco.Web/Editors/MediaTypeController.cs +++ b/src/Umbraco.Web/Editors/MediaTypeController.cs @@ -11,7 +11,6 @@ using System.Net; using System.Net.Http; using Umbraco.Web.WebApi; using Umbraco.Core.Services; -using Umbraco.Core.Models.EntityBase; using System; using System.ComponentModel; using System.Web.Http.Controllers; @@ -233,7 +232,7 @@ namespace Umbraco.Web.Editors [UmbracoTreeAuthorize(Constants.Trees.MediaTypes, Constants.Trees.Media)] public IEnumerable GetAllowedChildren(Guid contentId) { - var entity = Current.Services.EntityService.GetByKey(contentId); + var entity = Current.Services.EntityService.Get(contentId); if (entity != null) { return GetAllowedChildren(entity.Id); @@ -252,7 +251,7 @@ namespace Umbraco.Web.Editors var guidUdi = contentId as GuidUdi; if (guidUdi != null) { - var entity = Current.Services.EntityService.GetByKey(guidUdi.Guid); + var entity = Current.Services.EntityService.Get(guidUdi.Guid); if (entity != null) { return GetAllowedChildren(entity.Id); diff --git a/src/Umbraco.Web/Migrations/EnsureListViewDataTypeIsCreated.cs b/src/Umbraco.Web/Migrations/EnsureListViewDataTypeIsCreated.cs index b487ef506b..7540e9a955 100644 --- a/src/Umbraco.Web/Migrations/EnsureListViewDataTypeIsCreated.cs +++ b/src/Umbraco.Web/Migrations/EnsureListViewDataTypeIsCreated.cs @@ -54,9 +54,9 @@ namespace Umbraco.Web.Migrations if (syntax.SupportsIdentityInsert()) scope.Database.Execute(new Sql(string.Format("SET IDENTITY_INSERT {0} ON ", syntax.GetQuotedTableName(Constants.DatabaseSchema.Tables.DataType)))); - scope.Database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = -26, DataTypeId = Constants.DataTypes.DefaultContentListView, PropertyEditorAlias = Constants.PropertyEditors.ListViewAlias, DbType = "Nvarchar" }); - scope.Database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = -27, DataTypeId = Constants.DataTypes.DefaultMediaListView, PropertyEditorAlias = Constants.PropertyEditors.ListViewAlias, DbType = "Nvarchar" }); - scope.Database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = -28, DataTypeId = Constants.DataTypes.DefaultMembersListView, PropertyEditorAlias = Constants.PropertyEditors.ListViewAlias, DbType = "Nvarchar" }); + scope.Database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = -26, DataTypeId = Constants.DataTypes.DefaultContentListView, EditorAlias = Constants.PropertyEditors.ListViewAlias, DbType = "Nvarchar" }); + scope.Database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = -27, DataTypeId = Constants.DataTypes.DefaultMediaListView, EditorAlias = Constants.PropertyEditors.ListViewAlias, DbType = "Nvarchar" }); + scope.Database.Insert(Constants.DatabaseSchema.Tables.DataType, "pk", false, new DataTypeDto { PrimaryKey = -28, DataTypeId = Constants.DataTypes.DefaultMembersListView, EditorAlias = Constants.PropertyEditors.ListViewAlias, DbType = "Nvarchar" }); } finally { diff --git a/src/Umbraco.Web/Models/Mapping/EntityMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/EntityMapperProfile.cs index 51d9320605..27116e8cdc 100644 --- a/src/Umbraco.Web/Models/Mapping/EntityMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/EntityMapperProfile.cs @@ -7,6 +7,7 @@ using Examine.LuceneEngine.Providers; using Examine.LuceneEngine; using Umbraco.Core; using Umbraco.Core.Models; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; using Umbraco.Web.Models.ContentEditing; using Umbraco.Examine; @@ -15,14 +16,17 @@ namespace Umbraco.Web.Models.Mapping { internal class EntityMapperProfile : Profile { + private static string GetContentTypeIcon(EntitySlim entity) + => entity is ContentEntitySlim contentEntity ? contentEntity.ContentTypeIcon : null; + public EntityMapperProfile() { // create, capture, cache var contentTypeUdiResolver = new ContentTypeUdiResolver(); - CreateMap() - .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(UmbracoObjectTypesExtensions.GetUdiType(src.NodeObjectType), src.Key))) - .ForMember(dest => dest.Icon, opt => opt.MapFrom(src => src.ContentTypeIcon)) + CreateMap() + .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(ObjectTypes.GetUdiType(src.NodeObjectType), src.Key))) + .ForMember(dest => dest.Icon, opt => opt.MapFrom(src => GetContentTypeIcon(src))) .ForMember(dest => dest.Trashed, opt => opt.Ignore()) .ForMember(dest => dest.Alias, opt => opt.Ignore()) .AfterMap((src, dest) => @@ -79,9 +83,9 @@ namespace Umbraco.Web.Models.Mapping .ForMember(dest => dest.Trashed, opt => opt.Ignore()) .ForMember(dest => dest.AdditionalData, opt => opt.Ignore()); - CreateMap() - .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(UmbracoObjectTypesExtensions.GetUdiType(src.NodeObjectType), src.Key))) - .ForMember(dest => dest.Icon, opt => opt.MapFrom(src=> src.ContentTypeIcon)) + CreateMap() + .ForMember(dest => dest.Udi, opt => opt.MapFrom(src => Udi.Create(ObjectTypes.GetUdiType(src.NodeObjectType), src.Key))) + .ForMember(dest => dest.Icon, opt => opt.MapFrom(src=> GetContentTypeIcon(src))) .ForMember(dest => dest.Trashed, opt => opt.Ignore()) .ForMember(dest => dest.Alias, opt => opt.Ignore()) .ForMember(dest => dest.Score, opt => opt.Ignore()) diff --git a/src/Umbraco.Web/Models/Mapping/EntityProfileExtensions.cs b/src/Umbraco.Web/Models/Mapping/EntityProfileExtensions.cs index 86519d8b39..46d48c2b1a 100644 --- a/src/Umbraco.Web/Models/Mapping/EntityProfileExtensions.cs +++ b/src/Umbraco.Web/Models/Mapping/EntityProfileExtensions.cs @@ -1,5 +1,5 @@ using AutoMapper; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; namespace Umbraco.Web.Models.Mapping { diff --git a/src/Umbraco.Web/Models/Mapping/UserMapperProfile.cs b/src/Umbraco.Web/Models/Mapping/UserMapperProfile.cs index 731aeccc8d..f02defa031 100644 --- a/src/Umbraco.Web/Models/Mapping/UserMapperProfile.cs +++ b/src/Umbraco.Web/Models/Mapping/UserMapperProfile.cs @@ -7,7 +7,7 @@ using Umbraco.Core.Cache; using Umbraco.Core.Models.Membership; using Umbraco.Web.Models.ContentEditing; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Security; using Umbraco.Core.Services; using Umbraco.Web._Legacy.Actions; @@ -16,6 +16,9 @@ namespace Umbraco.Web.Models.Mapping { internal class UserMapperProfile : Profile { + private static string GetContentTypeIcon(EntitySlim entity) + => entity is ContentEntitySlim contentEntity ? contentEntity.ContentTypeIcon : null; + public UserMapperProfile(ILocalizedTextService textService, IUserService userService, IEntityService entityService, ISectionService sectionService, IRuntimeCacheProvider runtimeCache, ActionCollection actions) @@ -156,9 +159,9 @@ namespace Umbraco.Web.Models.Mapping } }); - CreateMap() - .ForMember(x => x.Udi, opt => opt.MapFrom(x => Udi.Create(UmbracoObjectTypesExtensions.GetUdiType(x.NodeObjectType), x.Key))) - .ForMember(basic => basic.Icon, opt => opt.MapFrom(entity => entity.ContentTypeIcon)) + CreateMap() + .ForMember(x => x.Udi, opt => opt.MapFrom(x => Udi.Create(ObjectTypes.GetUdiType(x.NodeObjectType), x.Key))) + .ForMember(basic => basic.Icon, opt => opt.MapFrom(entity => GetContentTypeIcon(entity))) .ForMember(dto => dto.Trashed, opt => opt.Ignore()) .ForMember(x => x.Alias, opt => opt.Ignore()) .ForMember(x => x.AssignedPermissions, opt => opt.Ignore()) @@ -198,7 +201,7 @@ namespace Umbraco.Web.Models.Mapping .ToDictionary(x => x.EntityId, x => x); var contentEntities = allContentPermissions.Keys.Count == 0 - ? new IUmbracoEntity[0] + ? Array.Empty() : entityService.GetAll(UmbracoObjectTypes.Document, allContentPermissions.Keys.ToArray()); var allAssignedPermissions = new List(); diff --git a/src/Umbraco.Web/Models/Trees/MenuItem.cs b/src/Umbraco.Web/Models/Trees/MenuItem.cs index 8be1b21f8f..43da07f11e 100644 --- a/src/Umbraco.Web/Models/Trees/MenuItem.cs +++ b/src/Umbraco.Web/Models/Trees/MenuItem.cs @@ -1,9 +1,9 @@ using System.ComponentModel.DataAnnotations; using System.Runtime.Serialization; -using Umbraco.Core.Models.EntityBase; using Umbraco.Web.Trees; using System.Collections.Generic; using Umbraco.Core; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Services; using Umbraco.Web.Composing; using Umbraco.Web._Legacy.Actions; diff --git a/src/Umbraco.Web/NotificationServiceExtensions.cs b/src/Umbraco.Web/NotificationServiceExtensions.cs index 0da998ac15..aa1fd94202 100644 --- a/src/Umbraco.Web/NotificationServiceExtensions.cs +++ b/src/Umbraco.Web/NotificationServiceExtensions.cs @@ -3,12 +3,12 @@ using System.Globalization; using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.Logging; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Membership; using Umbraco.Core.Services; using Umbraco.Core.Models; using Umbraco.Web._Legacy.Actions; using System.Collections.Generic; +using Umbraco.Core.Models.Entities; using Umbraco.Web.Composing; namespace Umbraco.Web diff --git a/src/Umbraco.Web/Routing/NotFoundHandlerHelper.cs b/src/Umbraco.Web/Routing/NotFoundHandlerHelper.cs index 4dcfc9f1ce..bcf89349ef 100644 --- a/src/Umbraco.Web/Routing/NotFoundHandlerHelper.cs +++ b/src/Umbraco.Web/Routing/NotFoundHandlerHelper.cs @@ -77,7 +77,7 @@ namespace Umbraco.Web.Routing //TODO: When we start storing GUIDs into the IPublishedContent, then we won't have to look this up // but until then we need to look it up in the db. For now we've implemented a cached service for // converting Int -> Guid and vice versa. - var found = entityService.GetIdForKey(errorPage.ContentKey, UmbracoObjectTypes.Document); + var found = entityService.GetId(errorPage.ContentKey, UmbracoObjectTypes.Document); if (found) { return found.Result; diff --git a/src/Umbraco.Web/Routing/UrlProvider.cs b/src/Umbraco.Web/Routing/UrlProvider.cs index ea48a7093a..3375ac1be2 100644 --- a/src/Umbraco.Web/Routing/UrlProvider.cs +++ b/src/Umbraco.Web/Routing/UrlProvider.cs @@ -76,7 +76,7 @@ namespace Umbraco.Web.Routing /// public string GetUrl(Guid id) { - var intId = Current.Services.EntityService.GetIdForKey(id, UmbracoObjectTypes.Document); + var intId = Current.Services.EntityService.GetId(id, UmbracoObjectTypes.Document); return GetUrl(intId.Success ? intId.Result : -1); } @@ -93,7 +93,7 @@ namespace Umbraco.Web.Routing /// public string GetUrl(Guid id, bool absolute) { - var intId = Current.Services.EntityService.GetIdForKey(id, UmbracoObjectTypes.Document); + var intId = Current.Services.EntityService.GetId(id, UmbracoObjectTypes.Document); return GetUrl(intId.Success ? intId.Result : -1, absolute); } @@ -111,7 +111,7 @@ namespace Umbraco.Web.Routing /// public string GetUrl(Guid id, Uri current, bool absolute) { - var intId = Current.Services.EntityService.GetIdForKey(id, UmbracoObjectTypes.Document); + var intId = Current.Services.EntityService.GetId(id, UmbracoObjectTypes.Document); return GetUrl(intId.Success ? intId.Result : -1, current, absolute); } @@ -127,7 +127,7 @@ namespace Umbraco.Web.Routing /// public string GetUrl(Guid id, UrlProviderMode mode) { - var intId = Current.Services.EntityService.GetIdForKey(id, UmbracoObjectTypes.Document); + var intId = Current.Services.EntityService.GetId(id, UmbracoObjectTypes.Document); return GetUrl(intId.Success ? intId.Result : -1, mode); } diff --git a/src/Umbraco.Web/Security/MembershipHelper.cs b/src/Umbraco.Web/Security/MembershipHelper.cs index b5eda20d33..5e9a4efc41 100644 --- a/src/Umbraco.Web/Security/MembershipHelper.cs +++ b/src/Umbraco.Web/Security/MembershipHelper.cs @@ -369,7 +369,7 @@ namespace Umbraco.Web.Security { case UmbracoObjectTypes.Member: // fixme - need to implement Get(guid)! - var memberAttempt = entityService.GetIdForKey(guidUdi.Guid, umbracoType); + var memberAttempt = entityService.GetId(guidUdi.Guid, umbracoType); if (memberAttempt.Success) return GetById(memberAttempt.Result); break; diff --git a/src/Umbraco.Web/Strategies/NotificationsComponent.cs b/src/Umbraco.Web/Strategies/NotificationsComponent.cs index 8dfc6e67dc..b56fb75df0 100644 --- a/src/Umbraco.Web/Strategies/NotificationsComponent.cs +++ b/src/Umbraco.Web/Strategies/NotificationsComponent.cs @@ -1,10 +1,10 @@ using System.Collections.Generic; using Umbraco.Core; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Services; using Umbraco.Core.Components; using Umbraco.Web._Legacy.Actions; using Umbraco.Core.Models; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Services.Implement; namespace Umbraco.Web.Strategies diff --git a/src/Umbraco.Web/Trees/ContentBlueprintTreeController.cs b/src/Umbraco.Web/Trees/ContentBlueprintTreeController.cs index fdd44972db..93d7746f8f 100644 --- a/src/Umbraco.Web/Trees/ContentBlueprintTreeController.cs +++ b/src/Umbraco.Web/Trees/ContentBlueprintTreeController.cs @@ -3,7 +3,7 @@ using System.Net.Http.Formatting; using Umbraco.Core; using Umbraco.Core.Services; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Web.Models.Trees; using Umbraco.Web.Mvc; using Umbraco.Web.WebApi.Filters; @@ -45,7 +45,7 @@ namespace Umbraco.Web.Trees if (id == Constants.System.Root.ToInvariantString()) { //get all blueprint content types - var contentTypeAliases = entities.Select(x => ((UmbracoEntity) x).ContentTypeAlias).Distinct(); + var contentTypeAliases = entities.Select(x => ((ContentEntitySlim) x).ContentTypeAlias).Distinct(); //get the ids var contentTypeIds = Services.ContentTypeService.GetAllContentTypeIds(contentTypeAliases.ToArray()).ToArray(); @@ -73,7 +73,7 @@ namespace Umbraco.Web.Trees var ct = Services.ContentTypeService.Get(intId.Result); if (ct == null) return nodes; - var blueprintsForDocType = entities.Where(x => ct.Alias == ((UmbracoEntity) x).ContentTypeAlias); + var blueprintsForDocType = entities.Where(x => ct.Alias == ((ContentEntitySlim) x).ContentTypeAlias); nodes.AddRange(blueprintsForDocType .Select(entity => { diff --git a/src/Umbraco.Web/Trees/ContentTreeController.cs b/src/Umbraco.Web/Trees/ContentTreeController.cs index 46c6bf224c..60ef3cf529 100644 --- a/src/Umbraco.Web/Trees/ContentTreeController.cs +++ b/src/Umbraco.Web/Trees/ContentTreeController.cs @@ -6,7 +6,7 @@ using System.Net.Http.Formatting; using System.Web.Http; using Umbraco.Core; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Services; using Umbraco.Web.Composing; using Umbraco.Web.Models.Trees; @@ -44,47 +44,40 @@ namespace Umbraco.Web.Trees protected override int[] UserStartNodes => _userStartNodes ?? (_userStartNodes = Security.CurrentUser.CalculateContentStartNodeIds(Services.EntityService)); - /// - /// Creates a tree node for a content item based on an UmbracoEntity - /// - /// - /// - /// - /// - protected override TreeNode GetSingleTreeNode(IUmbracoEntity e, string parentId, FormDataCollection queryStrings) + /// + protected override TreeNode GetSingleTreeNode(IEntitySlim entity, string parentId, FormDataCollection queryStrings) { - var entity = (UmbracoEntity)e; - - var allowedUserOptions = GetAllowedUserMenuItemsForNode(e); - if (CanUserAccessNode(e, allowedUserOptions)) + var allowedUserOptions = GetAllowedUserMenuItemsForNode(entity); + if (CanUserAccessNode(entity, allowedUserOptions)) { //Special check to see if it ia a container, if so then we'll hide children. - var isContainer = e.IsContainer(); // && (queryStrings.Get("isDialog") != "true"); + var isContainer = entity.IsContainer; // && (queryStrings.Get("isDialog") != "true"); var node = CreateTreeNode( entity, Constants.ObjectTypes.Document, parentId, queryStrings, - entity.HasChildren && isContainer == false); - - node.AdditionalData.Add("contentType", entity.ContentTypeAlias); + entity.HasChildren && !isContainer); + // entity is either a container, or a document if (isContainer) { node.AdditionalData.Add("isContainer", true); node.SetContainerStyle(); } + else + { + var documentEntity = (IDocumentEntitySlim) entity; + if (!documentEntity.Published) + node.SetNotPublishedStyle(); + if (documentEntity.Edited) + node.SetHasUnpublishedVersionStyle(); + node.AdditionalData.Add("contentType", documentEntity.ContentTypeAlias); + } - - if (entity.Published == false) - node.SetNotPublishedStyle(); - - if (entity.Edited) - node.SetHasUnpublishedVersionStyle(); - - if (Services.PublicAccessService.IsProtected(e.Path)) + if (Services.PublicAccessService.IsProtected(entity.Path)) node.SetProtectedStyle(); return node; diff --git a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs index 33374e2060..4eac7e803d 100644 --- a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs +++ b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; -using System.ComponentModel; using System.Linq; using System.Net; using System.Net.Http; @@ -11,11 +10,10 @@ using Umbraco.Core; using Umbraco.Core.Services; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; -using Umbraco.Core.Persistence; using Umbraco.Web.Models.Trees; using Umbraco.Web.WebApi.Filters; using System.Globalization; +using Umbraco.Core.Models.Entities; using Umbraco.Web._Legacy.Actions; namespace Umbraco.Web.Trees @@ -71,7 +69,7 @@ namespace Umbraco.Web.Trees return node; } - protected abstract TreeNode GetSingleTreeNode(IUmbracoEntity e, string parentId, FormDataCollection queryStrings); + protected abstract TreeNode GetSingleTreeNode(IEntitySlim entity, string parentId, FormDataCollection queryStrings); /// /// Returns a for the and @@ -81,10 +79,9 @@ namespace Umbraco.Web.Trees /// /// /// - internal TreeNode GetSingleTreeNodeWithAccessCheck(IUmbracoEntity e, string parentId, FormDataCollection queryStrings) + internal TreeNode GetSingleTreeNodeWithAccessCheck(IEntitySlim e, string parentId, FormDataCollection queryStrings) { - bool hasPathAccess; - var entityIsAncestorOfStartNodes = Security.CurrentUser.IsInBranchOfStartNode(e, Services.EntityService, RecycleBinId, out hasPathAccess); + var entityIsAncestorOfStartNodes = Security.CurrentUser.IsInBranchOfStartNode(e, Services.EntityService, RecycleBinId, out var hasPathAccess); if (entityIsAncestorOfStartNodes == false) return null; @@ -188,7 +185,7 @@ namespace Umbraco.Web.Trees protected abstract UmbracoObjectTypes UmbracoObjectType { get; } - protected IEnumerable GetChildEntities(string id) + protected IEnumerable GetChildEntities(string id) { // use helper method to ensure we support both integer and guid lookups @@ -207,7 +204,7 @@ namespace Umbraco.Web.Trees { return UserStartNodes.Length > 0 ? Services.EntityService.GetAll(UmbracoObjectType, UserStartNodes) - : Enumerable.Empty(); + : Enumerable.Empty(); } return Services.EntityService.GetChildren(iid, UmbracoObjectType).ToArray(); @@ -297,7 +294,7 @@ namespace Umbraco.Web.Trees //before we get the children we need to see if this is a container node //test if the parent is a listview / container - if (current != null && current.IsContainer()) + if (current != null && current.IsContainer) { //no children! return new TreeNodeCollection(); @@ -411,34 +408,34 @@ namespace Umbraco.Web.Trees /// /// This object has it's own contextual cache for these lookups /// - internal IUmbracoEntity GetEntityFromId(string id) + internal IEntitySlim GetEntityFromId(string id) { return _entityCache.GetOrAdd(id, s => { - IUmbracoEntity entity; + IEntitySlim entity; - if (Guid.TryParse(s, out Guid idGuid)) + if (Guid.TryParse(s, out var idGuid)) { - entity = Services.EntityService.GetByKey(idGuid, UmbracoObjectType); + entity = Services.EntityService.Get(idGuid, UmbracoObjectType); } - else if (int.TryParse(s, out int idInt)) + else if (int.TryParse(s, out var idInt)) { entity = Services.EntityService.Get(idInt, UmbracoObjectType); } - else if (Udi.TryParse(s, out Udi idUdi)) + else if (Udi.TryParse(s, out var idUdi)) { var guidUdi = idUdi as GuidUdi; - entity = guidUdi != null ? Services.EntityService.GetByKey(guidUdi.Guid, UmbracoObjectType) : null; + entity = guidUdi != null ? Services.EntityService.Get(guidUdi.Guid, UmbracoObjectType) : null; } else { - return null; + entity = null; } return entity; }); } - private readonly ConcurrentDictionary _entityCache = new ConcurrentDictionary(); + private readonly ConcurrentDictionary _entityCache = new ConcurrentDictionary(); } } diff --git a/src/Umbraco.Web/Trees/ContentTypeTreeController.cs b/src/Umbraco.Web/Trees/ContentTypeTreeController.cs index 18a2108dc2..4bdef0246a 100644 --- a/src/Umbraco.Web/Trees/ContentTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/ContentTypeTreeController.cs @@ -6,6 +6,7 @@ using AutoMapper; using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.Models; +using Umbraco.Core.Models.Entities; using Umbraco.Web.Models.Trees; using Umbraco.Web.WebApi.Filters; using Umbraco.Core.Services; @@ -32,7 +33,7 @@ namespace Umbraco.Web.Trees .OrderBy(entity => entity.Name) .Select(dt => { - var node = CreateTreeNode(dt.Id.ToString(), id, queryStrings, dt.Name, "icon-folder", dt.HasChildren(), ""); + var node = CreateTreeNode(dt.Id.ToString(), id, queryStrings, dt.Name, "icon-folder", dt.HasChildren, ""); node.Path = dt.Path; node.NodeType = "container"; //TODO: This isn't the best way to ensure a noop process for clicking a node but it works for now. @@ -50,7 +51,7 @@ namespace Umbraco.Web.Trees { // since 7.4+ child type creation is enabled by a config option. It defaults to on, but can be disabled if we decide to. // need this check to keep supporting sites where childs have already been created. - var hasChildren = dt.HasChildren(); + var hasChildren = dt.HasChildren; var node = CreateTreeNode(dt, Constants.ObjectTypes.DocumentType, id, queryStrings, "icon-item-arrangement", hasChildren); node.Path = dt.Path; @@ -73,7 +74,7 @@ namespace Umbraco.Web.Trees // root actions menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionNew.Instance.Alias))); - menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionImport.Instance.Alias)), true).ConvertLegacyMenuItem(new UmbracoEntity + menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionImport.Instance.Alias)), true).ConvertLegacyMenuItem(new EntitySlim { Id = int.Parse(id), Level = 1, @@ -97,7 +98,7 @@ namespace Umbraco.Web.Trees Icon = "icon icon-edit" }); - if (container.HasChildren() == false) + if (container.HasChildren == false) { //can delete doc type menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionDelete.Instance.Alias)), true); @@ -131,7 +132,7 @@ namespace Umbraco.Web.Trees } } menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionCopy.Instance.Alias))); - menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionExport.Instance.Alias)), true).ConvertLegacyMenuItem(new UmbracoEntity + menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionExport.Instance.Alias)), true).ConvertLegacyMenuItem(new EntitySlim { Id = int.Parse(id), Level = 1, @@ -148,7 +149,7 @@ namespace Umbraco.Web.Trees public IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null) { - var results = Services.EntityService.GetPagedDescendantsFromRoot(UmbracoObjectTypes.DocumentType, pageIndex, pageSize, out totalFound, filter: query); + var results = Services.EntityService.GetPagedDescendants(UmbracoObjectTypes.DocumentType, pageIndex, pageSize, out totalFound, filter: query); return Mapper.Map>(results); } } diff --git a/src/Umbraco.Web/Trees/DataTypeTreeController.cs b/src/Umbraco.Web/Trees/DataTypeTreeController.cs index 9b5370edd8..ce2367191d 100644 --- a/src/Umbraco.Web/Trees/DataTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/DataTypeTreeController.cs @@ -35,7 +35,7 @@ namespace Umbraco.Web.Trees .OrderBy(entity => entity.Name) .Select(dt => { - var node = CreateTreeNode(dt, Constants.ObjectTypes.DataType, id, queryStrings, "icon-folder", dt.HasChildren()); + var node = CreateTreeNode(dt, Constants.ObjectTypes.DataType, id, queryStrings, "icon-folder", dt.HasChildren); node.Path = dt.Path; node.NodeType = "container"; //TODO: This isn't the best way to ensure a noop process for clicking a node but it works for now. @@ -105,7 +105,7 @@ namespace Umbraco.Web.Trees Icon = "icon icon-edit" }); - if (container.HasChildren() == false) + if (container.HasChildren == false) { //can delete data type menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionDelete.Instance.Alias))); @@ -129,7 +129,7 @@ namespace Umbraco.Web.Trees public IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null) { - var results = Services.EntityService.GetPagedDescendantsFromRoot(UmbracoObjectTypes.DataType, pageIndex, pageSize, out totalFound, filter: query); + var results = Services.EntityService.GetPagedDescendants(UmbracoObjectTypes.DataType, pageIndex, pageSize, out totalFound, filter: query); return Mapper.Map>(results); } } diff --git a/src/Umbraco.Web/Trees/DictionaryTreeController.cs b/src/Umbraco.Web/Trees/DictionaryTreeController.cs index b058111ad5..a70eba29e2 100644 --- a/src/Umbraco.Web/Trees/DictionaryTreeController.cs +++ b/src/Umbraco.Web/Trees/DictionaryTreeController.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Net.Http.Formatting; using Umbraco.Core; using Umbraco.Core.Models; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Services; using Umbraco.Web.Models.Trees; using Umbraco.Web.WebApi.Filters; @@ -60,7 +61,7 @@ namespace Umbraco.Web.Trees { var dictionaryItem = Services.LocalizationService.GetDictionaryItemById(intId); - var entity = new UmbracoEntity + var entity = new EntitySlim { Id = dictionaryItem.Id, Level = 1, diff --git a/src/Umbraco.Web/Trees/LanguageTreeController.cs b/src/Umbraco.Web/Trees/LanguageTreeController.cs index 176f7a01b8..1fa8188376 100644 --- a/src/Umbraco.Web/Trees/LanguageTreeController.cs +++ b/src/Umbraco.Web/Trees/LanguageTreeController.cs @@ -4,6 +4,7 @@ using System.Net.Http.Formatting; using Umbraco.Core; using Umbraco.Core.Services; using Umbraco.Core.Models; +using Umbraco.Core.Models.Entities; using Umbraco.Web.Models.Trees; using Umbraco.Web.Mvc; using Umbraco.Web.WebApi.Filters; @@ -81,7 +82,7 @@ namespace Umbraco.Web.Trees menu.Items.Add(Services.TextService.Localize("actions", ActionDelete.Instance.Alias)) //Since we haven't implemented anything for languages in angular, this needs to be converted to //use the legacy format - .ConvertLegacyMenuItem(new UmbracoEntity + .ConvertLegacyMenuItem(new EntitySlim { Id = lang.Id, Level = 1, diff --git a/src/Umbraco.Web/Trees/MacrosTreeController.cs b/src/Umbraco.Web/Trees/MacrosTreeController.cs index 3e80966500..2968408bdb 100644 --- a/src/Umbraco.Web/Trees/MacrosTreeController.cs +++ b/src/Umbraco.Web/Trees/MacrosTreeController.cs @@ -2,6 +2,7 @@ using System.Net.Http.Formatting; using Umbraco.Core; using Umbraco.Core.Models; +using Umbraco.Core.Models.Entities; using Umbraco.Web.Models.Trees; using Umbraco.Web.Mvc; using Umbraco.Web.WebApi.Filters; @@ -67,7 +68,7 @@ namespace Umbraco.Web.Trees menu.Items.Add(Services.TextService.Localize("actions", ActionDelete.Instance.Alias)) //Since we haven't implemented anything for macros in angular, this needs to be converted to //use the legacy format - .ConvertLegacyMenuItem(new UmbracoEntity + .ConvertLegacyMenuItem(new EntitySlim { Id = macro.Id, Level = 1, diff --git a/src/Umbraco.Web/Trees/MediaTreeController.cs b/src/Umbraco.Web/Trees/MediaTreeController.cs index f2c6a93ed0..53185f746b 100644 --- a/src/Umbraco.Web/Trees/MediaTreeController.cs +++ b/src/Umbraco.Web/Trees/MediaTreeController.cs @@ -6,7 +6,7 @@ using System.Net.Http.Formatting; using System.Web.Http; using Umbraco.Core; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Services; using Umbraco.Web.Models.Trees; using Umbraco.Web.Mvc; @@ -49,27 +49,29 @@ namespace Umbraco.Web.Trees /// /// /// - protected override TreeNode GetSingleTreeNode(IUmbracoEntity e, string parentId, FormDataCollection queryStrings) + protected override TreeNode GetSingleTreeNode(IEntitySlim entity, string parentId, FormDataCollection queryStrings) { - var entity = (UmbracoEntity) e; - //Special check to see if it ia a container, if so then we'll hide children. - var isContainer = e.IsContainer(); // && (queryStrings.Get("isDialog") != "true"); + var isContainer = entity.IsContainer; // && (queryStrings.Get("isDialog") != "true"); var node = CreateTreeNode( entity, Constants.ObjectTypes.Media, parentId, queryStrings, - entity.HasChildren && (isContainer == false)); - - node.AdditionalData.Add("contentType", entity.ContentTypeAlias); + entity.HasChildren && !isContainer); + // entity is either a container, or a media if (isContainer) { node.SetContainerStyle(); node.AdditionalData.Add("isContainer", true); } + else + { + var contentEntity = (IContentEntitySlim) entity; + node.AdditionalData.Add("contentType", contentEntity.ContentTypeAlias); + } return node; } diff --git a/src/Umbraco.Web/Trees/MediaTypeTreeController.cs b/src/Umbraco.Web/Trees/MediaTypeTreeController.cs index 99788e093b..f89a405795 100644 --- a/src/Umbraco.Web/Trees/MediaTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/MediaTypeTreeController.cs @@ -33,7 +33,7 @@ namespace Umbraco.Web.Trees .OrderBy(entity => entity.Name) .Select(dt => { - var node = CreateTreeNode(dt.Id.ToString(), id, queryStrings, dt.Name, "icon-folder", dt.HasChildren(), ""); + var node = CreateTreeNode(dt.Id.ToString(), id, queryStrings, dt.Name, "icon-folder", dt.HasChildren, ""); node.Path = dt.Path; node.NodeType = "container"; //TODO: This isn't the best way to ensure a noop process for clicking a node but it works for now. @@ -51,7 +51,7 @@ namespace Umbraco.Web.Trees { // since 7.4+ child type creation is enabled by a config option. It defaults to on, but can be disabled if we decide to. // need this check to keep supporting sites where childs have already been created. - var hasChildren = dt.HasChildren(); + var hasChildren = dt.HasChildren; var node = CreateTreeNode(dt, Constants.ObjectTypes.MediaType, id, queryStrings, "icon-thumbnails", hasChildren); node.Path = dt.Path; @@ -91,7 +91,7 @@ namespace Umbraco.Web.Trees Icon = "icon icon-edit" }); - if (container.HasChildren() == false) + if (container.HasChildren == false) { //can delete doc type menu.Items.Add(Services.TextService.Localize(string.Format("actions/{0}", ActionDelete.Instance.Alias))); @@ -134,7 +134,7 @@ namespace Umbraco.Web.Trees public IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null) { - var results = Services.EntityService.GetPagedDescendantsFromRoot(UmbracoObjectTypes.MediaType, pageIndex, pageSize, out totalFound, filter: query); + var results = Services.EntityService.GetPagedDescendants(UmbracoObjectTypes.MediaType, pageIndex, pageSize, out totalFound, filter: query); return Mapper.Map>(results); } } diff --git a/src/Umbraco.Web/Trees/MemberTreeController.cs b/src/Umbraco.Web/Trees/MemberTreeController.cs index 231e05d59e..cdf9cf8085 100644 --- a/src/Umbraco.Web/Trees/MemberTreeController.cs +++ b/src/Umbraco.Web/Trees/MemberTreeController.cs @@ -82,7 +82,7 @@ namespace Umbraco.Web.Trees "icon-user", false, "", - Udi.Create(UmbracoObjectTypesExtensions.GetUdiType(Constants.ObjectTypes.Member), member.Key)); + Udi.Create(ObjectTypes.GetUdiType(Constants.ObjectTypes.Member), member.Key)); node.AdditionalData.Add("contentType", member.ContentTypeAlias); node.AdditionalData.Add("isContainer", true); diff --git a/src/Umbraco.Web/Trees/RelationTypeTreeController.cs b/src/Umbraco.Web/Trees/RelationTypeTreeController.cs index f0b977e11a..14fd817a7c 100644 --- a/src/Umbraco.Web/Trees/RelationTypeTreeController.cs +++ b/src/Umbraco.Web/Trees/RelationTypeTreeController.cs @@ -7,6 +7,7 @@ using Umbraco.Core; using Umbraco.Web._Legacy.Actions; using Umbraco.Core.Services; using Umbraco.Core.Models; +using Umbraco.Core.Models.Entities; namespace Umbraco.Web.Trees { @@ -40,7 +41,7 @@ namespace Umbraco.Web.Trees menu.Items.Add(Services.TextService.Localize("actions", ActionDelete.Instance.Alias)) //Since we haven't implemented anything for relationtypes in angular, this needs to be converted to //use the legacy format - .ConvertLegacyMenuItem(new UmbracoEntity + .ConvertLegacyMenuItem(new EntitySlim { Id = relationType.Id, Level = 1, diff --git a/src/Umbraco.Web/Trees/TemplatesTreeController.cs b/src/Umbraco.Web/Trees/TemplatesTreeController.cs index 8a0910af0e..d9aa0f21a0 100644 --- a/src/Umbraco.Web/Trees/TemplatesTreeController.cs +++ b/src/Umbraco.Web/Trees/TemplatesTreeController.cs @@ -7,6 +7,7 @@ using AutoMapper; using Umbraco.Core; using Umbraco.Core.Services; using Umbraco.Core.Models; +using Umbraco.Core.Models.Entities; using Umbraco.Web.Models.ContentEditing; using Umbraco.Web.Models.Trees; using Umbraco.Web.Mvc; @@ -51,7 +52,7 @@ namespace Umbraco.Web.Trees template.IsMasterTemplate ? "icon-newspaper" : "icon-newspaper-alt", template.IsMasterTemplate, GetEditorPath(template, queryStrings), - Udi.Create(UmbracoObjectTypesExtensions.GetUdiType(Constants.ObjectTypes.TemplateType), template.Key) + Udi.Create(ObjectTypes.GetUdiType(Constants.ObjectTypes.TemplateType), template.Key) ))); return nodes; @@ -97,9 +98,9 @@ namespace Umbraco.Web.Trees return menu; } - private UmbracoEntity FromTemplate(ITemplate template) + private EntitySlim FromTemplate(ITemplate template) { - return new UmbracoEntity + return new EntitySlim { CreateDate = template.CreateDate, Id = template.Id, @@ -125,7 +126,7 @@ namespace Umbraco.Web.Trees public IEnumerable Search(string query, int pageSize, long pageIndex, out long totalFound, string searchFrom = null) { - var results = Services.EntityService.GetPagedDescendantsFromRoot(UmbracoObjectTypes.Template, pageIndex, pageSize, out totalFound, filter: query); + var results = Services.EntityService.GetPagedDescendants(UmbracoObjectTypes.Template, pageIndex, pageSize, out totalFound, filter: query); return Mapper.Map>(results); } } diff --git a/src/Umbraco.Web/Trees/TreeControllerBase.cs b/src/Umbraco.Web/Trees/TreeControllerBase.cs index 1cc3e32f5e..a860c3770a 100644 --- a/src/Umbraco.Web/Trees/TreeControllerBase.cs +++ b/src/Umbraco.Web/Trees/TreeControllerBase.cs @@ -6,10 +6,10 @@ using System.Web.Http.Routing; using Umbraco.Core; using Umbraco.Core.Events; using Umbraco.Core.Models; +using Umbraco.Core.Models.Entities; using Umbraco.Web.Models.Trees; using Umbraco.Web.WebApi; using Umbraco.Web.WebApi.Filters; -using Umbraco.Core.Models.EntityBase; using Umbraco.Web.Search; namespace Umbraco.Web.Trees @@ -229,10 +229,11 @@ namespace Umbraco.Web.Trees /// /// /// - public TreeNode CreateTreeNode(UmbracoEntity entity, Guid entityObjectType, string parentId, FormDataCollection queryStrings, bool hasChildren) + public TreeNode CreateTreeNode(IEntitySlim entity, Guid entityObjectType, string parentId, FormDataCollection queryStrings, bool hasChildren) { - var treeNode = CreateTreeNode(entity.Id.ToInvariantString(), parentId, queryStrings, entity.Name, entity.ContentTypeIcon); - treeNode.Udi = Udi.Create(UmbracoObjectTypesExtensions.GetUdiType(entityObjectType), entity.Key); + var contentTypeIcon = entity is IContentEntitySlim contentEntity ? contentEntity.ContentTypeIcon : null; + var treeNode = CreateTreeNode(entity.Id.ToInvariantString(), parentId, queryStrings, entity.Name, contentTypeIcon); + treeNode.Udi = Udi.Create(ObjectTypes.GetUdiType(entityObjectType), entity.Key); treeNode.HasChildren = hasChildren; return treeNode; } @@ -250,7 +251,7 @@ namespace Umbraco.Web.Trees public TreeNode CreateTreeNode(IUmbracoEntity entity, Guid entityObjectType, string parentId, FormDataCollection queryStrings, string icon, bool hasChildren) { var treeNode = CreateTreeNode(entity.Id.ToInvariantString(), parentId, queryStrings, entity.Name, icon); - treeNode.Udi = Udi.Create(UmbracoObjectTypesExtensions.GetUdiType(entityObjectType), entity.Key); + treeNode.Udi = Udi.Create(ObjectTypes.GetUdiType(entityObjectType), entity.Key); treeNode.HasChildren = hasChildren; return treeNode; } diff --git a/src/Umbraco.Web/UI/Pages/UmbracoEnsuredPage.cs b/src/Umbraco.Web/UI/Pages/UmbracoEnsuredPage.cs index 5eb26a4644..5fcc730f90 100644 --- a/src/Umbraco.Web/UI/Pages/UmbracoEnsuredPage.cs +++ b/src/Umbraco.Web/UI/Pages/UmbracoEnsuredPage.cs @@ -8,6 +8,7 @@ using Umbraco.Core.Logging; using Umbraco.Core; using Umbraco.Core.Exceptions; using Umbraco.Core.Models; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Security; using Umbraco.Web.Composing; using Umbraco.Web._Legacy.Actions; @@ -48,7 +49,7 @@ namespace Umbraco.Web.UI.Pages //check path access var entity = entityId == Constants.System.Root - ? UmbracoEntity.Root + ? EntitySlim.Root : Services.EntityService.Get(entityId, objectType); var hasAccess = Security.CurrentUser.HasPathAccess(entity, Services.EntityService, objectType == UmbracoObjectTypes.Document ? Constants.System.RecycleBinContent : Constants.System.RecycleBinMedia); if (hasAccess == false) diff --git a/src/Umbraco.Web/UmbracoHelper.cs b/src/Umbraco.Web/UmbracoHelper.cs index 9e950be64d..551589583b 100644 --- a/src/Umbraco.Web/UmbracoHelper.cs +++ b/src/Umbraco.Web/UmbracoHelper.cs @@ -404,13 +404,13 @@ namespace Umbraco.Web return Content(guidUdi.Guid); case UmbracoObjectTypes.Media: // fixme - need to implement Media(guid)! - var mediaAttempt = entityService.GetIdForKey(guidUdi.Guid, umbracoType); + var mediaAttempt = entityService.GetId(guidUdi.Guid, umbracoType); if (mediaAttempt.Success) return Media(mediaAttempt.Result); break; case UmbracoObjectTypes.Member: // fixme - need to implement Member(guid)! - var memberAttempt = entityService.GetIdForKey(guidUdi.Guid, umbracoType); + var memberAttempt = entityService.GetId(guidUdi.Guid, umbracoType); if (memberAttempt.Success) return Member(memberAttempt.Result); break; @@ -711,7 +711,7 @@ namespace Umbraco.Web // currently there won't be any way to add this method correctly to `ITypedPublishedContentQuery` without breaking an interface and adding GUID support for media var entityService = Current.Services.EntityService; // fixme inject - var mediaAttempt = entityService.GetIdForKey(id, UmbracoObjectTypes.Media); + var mediaAttempt = entityService.GetId(id, UmbracoObjectTypes.Media); return mediaAttempt.Success ? ContentQuery.Media(mediaAttempt.Result) : null; } diff --git a/src/Umbraco.Web/WebApi/Filters/EnsureUserPermissionForMediaAttribute.cs b/src/Umbraco.Web/WebApi/Filters/EnsureUserPermissionForMediaAttribute.cs index e0702a71ab..e34a9f9b8a 100644 --- a/src/Umbraco.Web/WebApi/Filters/EnsureUserPermissionForMediaAttribute.cs +++ b/src/Umbraco.Web/WebApi/Filters/EnsureUserPermissionForMediaAttribute.cs @@ -70,7 +70,7 @@ namespace Umbraco.Web.WebApi.Filters if (guidId != Guid.Empty) { - var found = Current.Services.EntityService.GetIdForKey(guidId, UmbracoObjectTypes.Media); + var found = Current.Services.EntityService.GetId(guidId, UmbracoObjectTypes.Media); if (found) return found.Result; } diff --git a/src/Umbraco.Web/_Legacy/BusinessLogic/Task.cs b/src/Umbraco.Web/_Legacy/BusinessLogic/Task.cs index 7ea72815df..3539c225fb 100644 --- a/src/Umbraco.Web/_Legacy/BusinessLogic/Task.cs +++ b/src/Umbraco.Web/_Legacy/BusinessLogic/Task.cs @@ -1,6 +1,6 @@ using System; using Umbraco.Core.Composing; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Core.Models.Membership; namespace Umbraco.Web._Legacy.BusinessLogic diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/BaseTree.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/BaseTree.cs index af14f35592..7c78f7529d 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/BaseTree.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/Trees/BaseTree.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; using System.Text; using Umbraco.Core; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Services; using Umbraco.Web.Composing; using Umbraco.Web._Legacy.Actions; diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/notifications.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/notifications.aspx.cs index 5499a6b406..74fc5af5e0 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/notifications.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/notifications.aspx.cs @@ -5,7 +5,7 @@ using System.Globalization; using System.Linq; using System.Web.UI.WebControls; using Umbraco.Core; -using Umbraco.Core.Models.EntityBase; +using Umbraco.Core.Models.Entities; using Umbraco.Web; using Umbraco.Web.Composing; using Umbraco.Web.UI.Pages; diff --git a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/sendToTranslation.aspx.cs b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/sendToTranslation.aspx.cs index a60ea845e9..090159965e 100644 --- a/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/sendToTranslation.aspx.cs +++ b/src/Umbraco.Web/umbraco.presentation/umbraco/dialogs/sendToTranslation.aspx.cs @@ -9,12 +9,12 @@ using Umbraco.Core.Services; using Umbraco.Core.IO; using Umbraco.Core.Logging; using Umbraco.Core.Models; -using Umbraco.Core.Models.EntityBase; using Umbraco.Core.Models.Membership; using Umbraco.Web; using Umbraco.Web.Composing; using Umbraco.Web.UI.Pages; using Umbraco.Core; +using Umbraco.Core.Models.Entities; namespace umbraco.presentation.dialogs {