From 36bb1c9d78b984cf7b0d14a7970cd4e0848491d4 Mon Sep 17 00:00:00 2001 From: Kenn Jacobsen Date: Wed, 13 Mar 2024 15:01:07 +0100 Subject: [PATCH] Add "is deletable" to relation types + align namespaces for controllers (#15867) Co-authored-by: Elitsa --- .../ByKeyRelationTypeController.cs | 2 +- .../CreateRelationTypeController.cs | 2 +- .../DeleteRelationTypeController.cs | 2 +- .../{Query => }/RelationTypeControllerBase.cs | 2 +- .../Tree/RelationTypeTreeControllerBase.cs | 8 ++- .../Tree/RootRelationTypeTreeController.cs | 6 +- .../UpdateRelationTypeController.cs | 3 +- .../Mapping/Item/ItemTypeMapDefinition.cs | 2 +- .../RelationTypeViewModelsMapDefinition.cs | 2 +- src/Umbraco.Cms.Api.Management/OpenApi.json | 62 +++++++++++++++++-- .../Item/RelationTypeItemResponseModel.cs | 2 +- .../RelationType/RelationTypeResponseModel.cs | 2 +- .../Tree/RelationTypeTreeItemResponseModel.cs | 6 ++ .../Models/RelationTypeExtensions.cs | 3 + 14 files changed, 83 insertions(+), 21 deletions(-) rename src/Umbraco.Cms.Api.Management/Controllers/RelationType/{Query => }/ByKeyRelationTypeController.cs (94%) rename src/Umbraco.Cms.Api.Management/Controllers/RelationType/{Query => }/CreateRelationTypeController.cs (96%) rename src/Umbraco.Cms.Api.Management/Controllers/RelationType/{Query => }/DeleteRelationTypeController.cs (94%) rename src/Umbraco.Cms.Api.Management/Controllers/RelationType/{Query => }/RelationTypeControllerBase.cs (97%) rename src/Umbraco.Cms.Api.Management/Controllers/RelationType/{Query => }/UpdateRelationTypeController.cs (95%) create mode 100644 src/Umbraco.Cms.Api.Management/ViewModels/Tree/RelationTypeTreeItemResponseModel.cs diff --git a/src/Umbraco.Cms.Api.Management/Controllers/RelationType/Query/ByKeyRelationTypeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/RelationType/ByKeyRelationTypeController.cs similarity index 94% rename from src/Umbraco.Cms.Api.Management/Controllers/RelationType/Query/ByKeyRelationTypeController.cs rename to src/Umbraco.Cms.Api.Management/Controllers/RelationType/ByKeyRelationTypeController.cs index 73b6060a71..0a0ecfb310 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/RelationType/Query/ByKeyRelationTypeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/RelationType/ByKeyRelationTypeController.cs @@ -6,7 +6,7 @@ using Umbraco.Cms.Core.Mapping; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Services; -namespace Umbraco.Cms.Api.Management.Controllers.RelationType.Query; +namespace Umbraco.Cms.Api.Management.Controllers.RelationType; [ApiVersion("1.0")] public class ByKeyRelationTypeController : RelationTypeControllerBase diff --git a/src/Umbraco.Cms.Api.Management/Controllers/RelationType/Query/CreateRelationTypeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/RelationType/CreateRelationTypeController.cs similarity index 96% rename from src/Umbraco.Cms.Api.Management/Controllers/RelationType/Query/CreateRelationTypeController.cs rename to src/Umbraco.Cms.Api.Management/Controllers/RelationType/CreateRelationTypeController.cs index 7544af2ffe..8a64d27d70 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/RelationType/Query/CreateRelationTypeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/RelationType/CreateRelationTypeController.cs @@ -9,7 +9,7 @@ using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.OperationStatus; -namespace Umbraco.Cms.Api.Management.Controllers.RelationType.Query; +namespace Umbraco.Cms.Api.Management.Controllers.RelationType; [ApiVersion("1.0")] public class CreateRelationTypeController : RelationTypeControllerBase diff --git a/src/Umbraco.Cms.Api.Management/Controllers/RelationType/Query/DeleteRelationTypeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/RelationType/DeleteRelationTypeController.cs similarity index 94% rename from src/Umbraco.Cms.Api.Management/Controllers/RelationType/Query/DeleteRelationTypeController.cs rename to src/Umbraco.Cms.Api.Management/Controllers/RelationType/DeleteRelationTypeController.cs index 5165fe2fe2..46d3044b48 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/RelationType/Query/DeleteRelationTypeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/RelationType/DeleteRelationTypeController.cs @@ -7,7 +7,7 @@ using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.OperationStatus; -namespace Umbraco.Cms.Api.Management.Controllers.RelationType.Query; +namespace Umbraco.Cms.Api.Management.Controllers.RelationType; [ApiVersion("1.0")] public class DeleteRelationTypeController : RelationTypeControllerBase diff --git a/src/Umbraco.Cms.Api.Management/Controllers/RelationType/Query/RelationTypeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/RelationType/RelationTypeControllerBase.cs similarity index 97% rename from src/Umbraco.Cms.Api.Management/Controllers/RelationType/Query/RelationTypeControllerBase.cs rename to src/Umbraco.Cms.Api.Management/Controllers/RelationType/RelationTypeControllerBase.cs index cda171f7b7..97d5c863bd 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/RelationType/Query/RelationTypeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/RelationType/RelationTypeControllerBase.cs @@ -7,7 +7,7 @@ using Umbraco.Cms.Core; using Umbraco.Cms.Core.Services.OperationStatus; using Umbraco.Cms.Web.Common.Authorization; -namespace Umbraco.Cms.Api.Management.Controllers.RelationType.Query; +namespace Umbraco.Cms.Api.Management.Controllers.RelationType; [VersionedApiBackOfficeRoute($"{Constants.UdiEntityType.RelationType}")] [ApiExplorerSettings(GroupName = "Relation Type")] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/RelationType/Tree/RelationTypeTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/RelationType/Tree/RelationTypeTreeControllerBase.cs index dba61adc60..e902c973dc 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/RelationType/Tree/RelationTypeTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/RelationType/Tree/RelationTypeTreeControllerBase.cs @@ -8,6 +8,7 @@ using Umbraco.Cms.Core; using Umbraco.Cms.Core.Models; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Web.Common.Authorization; +using Umbraco.Extensions; namespace Umbraco.Cms.Api.Management.Controllers.RelationType.Tree; @@ -16,7 +17,7 @@ namespace Umbraco.Cms.Api.Management.Controllers.RelationType.Tree; [Authorize(Policy = AuthorizationPolicies.TreeAccessRelationTypes)] // NOTE: at the moment relation types aren't supported by EntityService, so we have little use of the // tree controller base. We'll keep it though, in the hope that we can mend EntityService. -public class RelationTypeTreeControllerBase : NamedEntityTreeControllerBase +public class RelationTypeTreeControllerBase : NamedEntityTreeControllerBase { public RelationTypeTreeControllerBase(IEntityService entityService) : base(entityService) @@ -25,13 +26,14 @@ public class RelationTypeTreeControllerBase : NamedEntityTreeControllerBase UmbracoObjectTypes.RelationType; - protected IEnumerable MapTreeItemViewModels(Guid? parentKey, IEnumerable relationTypes) - => relationTypes.Select(relationType => new NamedEntityTreeItemResponseModel + protected IEnumerable MapTreeItemViewModels(Guid? parentKey, IEnumerable relationTypes) + => relationTypes.Select(relationType => new RelationTypeTreeItemResponseModel { Name = relationType.Name!, Id = relationType.Key, Type = Constants.UdiEntityType.RelationType, HasChildren = false, + IsDeletable = relationType.IsDeletableRelationType(), Parent = parentKey.HasValue ? new ReferenceByIdModel { diff --git a/src/Umbraco.Cms.Api.Management/Controllers/RelationType/Tree/RootRelationTypeTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/RelationType/Tree/RootRelationTypeTreeController.cs index 0bf7e01316..9e486f1940 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/RelationType/Tree/RootRelationTypeTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/RelationType/Tree/RootRelationTypeTreeController.cs @@ -19,12 +19,12 @@ public class RootRelationTypeTreeController : RelationTypeTreeControllerBase [HttpGet("root")] [MapToApiVersion("1.0")] - [ProducesResponseType(typeof(PagedViewModel), StatusCodes.Status200OK)] - public async Task>> Root(int skip = 0, int take = 100) + [ProducesResponseType(typeof(PagedViewModel), StatusCodes.Status200OK)] + public async Task>> Root(int skip = 0, int take = 100) { PagedModel pagedRelationTypes = await _relationService.GetPagedRelationTypesAsync(skip, take); - PagedViewModel pagedResult = PagedViewModel( + PagedViewModel pagedResult = PagedViewModel( MapTreeItemViewModels(null, pagedRelationTypes.Items), pagedRelationTypes.Total); diff --git a/src/Umbraco.Cms.Api.Management/Controllers/RelationType/Query/UpdateRelationTypeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/RelationType/UpdateRelationTypeController.cs similarity index 95% rename from src/Umbraco.Cms.Api.Management/Controllers/RelationType/Query/UpdateRelationTypeController.cs rename to src/Umbraco.Cms.Api.Management/Controllers/RelationType/UpdateRelationTypeController.cs index 71c60e164a..40258b7199 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/RelationType/Query/UpdateRelationTypeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/RelationType/UpdateRelationTypeController.cs @@ -1,7 +1,6 @@ using Asp.Versioning; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; -using Umbraco.Cms.Api.Common.Builders; using Umbraco.Cms.Api.Management.Factories; using Umbraco.Cms.Api.Management.ViewModels.RelationType; using Umbraco.Cms.Core; @@ -10,7 +9,7 @@ using Umbraco.Cms.Core.Security; using Umbraco.Cms.Core.Services; using Umbraco.Cms.Core.Services.OperationStatus; -namespace Umbraco.Cms.Api.Management.Controllers.RelationType.Query; +namespace Umbraco.Cms.Api.Management.Controllers.RelationType; [ApiVersion("1.0")] public class UpdateRelationTypeController : RelationTypeControllerBase diff --git a/src/Umbraco.Cms.Api.Management/Mapping/Item/ItemTypeMapDefinition.cs b/src/Umbraco.Cms.Api.Management/Mapping/Item/ItemTypeMapDefinition.cs index 670202d9db..db6e8d8e42 100644 --- a/src/Umbraco.Cms.Api.Management/Mapping/Item/ItemTypeMapDefinition.cs +++ b/src/Umbraco.Cms.Api.Management/Mapping/Item/ItemTypeMapDefinition.cs @@ -3,7 +3,6 @@ using Umbraco.Cms.Api.Management.ViewModels.Dictionary.Item; using Umbraco.Cms.Api.Management.ViewModels.DocumentType.Item; using Umbraco.Cms.Api.Management.ViewModels.Language.Item; using Umbraco.Cms.Api.Management.ViewModels.MediaType.Item; -using Umbraco.Cms.Api.Management.ViewModels.Member.Item; using Umbraco.Cms.Api.Management.ViewModels.MemberGroup.Item; using Umbraco.Cms.Api.Management.ViewModels.MemberType.Item; using Umbraco.Cms.Api.Management.ViewModels.RelationType.Item; @@ -105,6 +104,7 @@ public class ItemTypeMapDefinition : IMapDefinition { target.Id = source.Key; target.Name = source.Name ?? string.Empty; + target.IsDeletable = source.IsDeletableRelationType(); } // Umbraco.Code.MapAll diff --git a/src/Umbraco.Cms.Api.Management/Mapping/RelationType/RelationTypeViewModelsMapDefinition.cs b/src/Umbraco.Cms.Api.Management/Mapping/RelationType/RelationTypeViewModelsMapDefinition.cs index 453353d6fc..ec2756e336 100644 --- a/src/Umbraco.Cms.Api.Management/Mapping/RelationType/RelationTypeViewModelsMapDefinition.cs +++ b/src/Umbraco.Cms.Api.Management/Mapping/RelationType/RelationTypeViewModelsMapDefinition.cs @@ -29,7 +29,7 @@ public class RelationTypeViewModelsMapDefinition : IMapDefinition target.ParentObjectType = source.ParentObjectType; target.Path = "-1," + source.Id; - target.IsSystemRelationType = source.IsSystemRelationType(); + target.IsDeletable = source.IsDeletableRelationType(); // Set the "friendly" and entity names for the parent and child object types if (source.ParentObjectType.HasValue) diff --git a/src/Umbraco.Cms.Api.Management/OpenApi.json b/src/Umbraco.Cms.Api.Management/OpenApi.json index 4043d085fc..fe18692f68 100644 --- a/src/Umbraco.Cms.Api.Management/OpenApi.json +++ b/src/Umbraco.Cms.Api.Management/OpenApi.json @@ -21051,17 +21051,17 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/PagedNamedEntityTreeItemResponseModel" + "$ref": "#/components/schemas/PagedRelationTypeTreeItemResponseModel" } }, "text/json": { "schema": { - "$ref": "#/components/schemas/PagedNamedEntityTreeItemResponseModel" + "$ref": "#/components/schemas/PagedRelationTypeTreeItemResponseModel" } }, "text/plain": { "schema": { - "$ref": "#/components/schemas/PagedNamedEntityTreeItemResponseModel" + "$ref": "#/components/schemas/PagedRelationTypeTreeItemResponseModel" } } } @@ -37722,6 +37722,9 @@ }, { "$ref": "#/components/schemas/MediaTypeTreeItemResponseModel" + }, + { + "$ref": "#/components/schemas/RelationTypeTreeItemResponseModel" } ] } @@ -37920,6 +37923,30 @@ }, "additionalProperties": false }, + "PagedRelationTypeTreeItemResponseModel": { + "required": [ + "items", + "total" + ], + "type": "object", + "properties": { + "total": { + "type": "integer", + "format": "int64" + }, + "items": { + "type": "array", + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/RelationTypeTreeItemResponseModel" + } + ] + } + } + }, + "additionalProperties": false + }, "PagedSavedLogSearchResponseModel": { "required": [ "items", @@ -38719,18 +38746,26 @@ "additionalProperties": false }, "RelationTypeItemResponseModel": { + "required": [ + "isDeletable" + ], "type": "object", "allOf": [ { "$ref": "#/components/schemas/NamedItemResponseModelBaseModel" } ], + "properties": { + "isDeletable": { + "type": "boolean" + } + }, "additionalProperties": false }, "RelationTypeResponseModel": { "required": [ "id", - "isSystemRelationType", + "isDeletable", "path" ], "type": "object", @@ -38752,7 +38787,7 @@ "minLength": 1, "type": "string" }, - "isSystemRelationType": { + "isDeletable": { "type": "boolean" }, "parentObjectTypeName": { @@ -38766,6 +38801,23 @@ }, "additionalProperties": false }, + "RelationTypeTreeItemResponseModel": { + "required": [ + "isDeletable" + ], + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/NamedEntityTreeItemResponseModel" + } + ], + "properties": { + "isDeletable": { + "type": "boolean" + } + }, + "additionalProperties": false + }, "RenamePartialViewRequestModel": { "type": "object", "allOf": [ diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/RelationType/Item/RelationTypeItemResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/RelationType/Item/RelationTypeItemResponseModel.cs index 17c6991428..a78d8fb65d 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/RelationType/Item/RelationTypeItemResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/RelationType/Item/RelationTypeItemResponseModel.cs @@ -4,5 +4,5 @@ namespace Umbraco.Cms.Api.Management.ViewModels.RelationType.Item; public class RelationTypeItemResponseModel : NamedItemResponseModelBase { - + public bool IsDeletable { get; set; } } diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/RelationType/RelationTypeResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/RelationType/RelationTypeResponseModel.cs index 94827421e0..f78314f3e4 100644 --- a/src/Umbraco.Cms.Api.Management/ViewModels/RelationType/RelationTypeResponseModel.cs +++ b/src/Umbraco.Cms.Api.Management/ViewModels/RelationType/RelationTypeResponseModel.cs @@ -11,7 +11,7 @@ public class RelationTypeResponseModel : RelationTypeBaseModel [Required] public string Path { get; set; } = string.Empty; - public bool IsSystemRelationType { get; set; } + public bool IsDeletable { get; set; } /// /// Gets or sets the Parent's object type name. diff --git a/src/Umbraco.Cms.Api.Management/ViewModels/Tree/RelationTypeTreeItemResponseModel.cs b/src/Umbraco.Cms.Api.Management/ViewModels/Tree/RelationTypeTreeItemResponseModel.cs new file mode 100644 index 0000000000..efe888ce85 --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/ViewModels/Tree/RelationTypeTreeItemResponseModel.cs @@ -0,0 +1,6 @@ +namespace Umbraco.Cms.Api.Management.ViewModels.Tree; + +public class RelationTypeTreeItemResponseModel : NamedEntityTreeItemResponseModel +{ + public bool IsDeletable { get; set; } +} diff --git a/src/Umbraco.Core/Models/RelationTypeExtensions.cs b/src/Umbraco.Core/Models/RelationTypeExtensions.cs index b5803d3fb3..6a22f607be 100644 --- a/src/Umbraco.Core/Models/RelationTypeExtensions.cs +++ b/src/Umbraco.Core/Models/RelationTypeExtensions.cs @@ -14,4 +14,7 @@ public static class RelationTypeExtensions || relationType.Alias == Constants.Conventions.RelationTypes.RelateDocumentOnCopyAlias || relationType.Alias == Constants.Conventions.RelationTypes.RelateParentDocumentOnDeleteAlias || relationType.Alias == Constants.Conventions.RelationTypes.RelateParentMediaFolderOnDeleteAlias; + + public static bool IsDeletableRelationType(this IRelationType relationType) + => relationType.IsSystemRelationType() is false; }