Skip to content

Adds ancestor identifiers on document tree and collection responses #18909

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged

Conversation

AndyButland
Copy link
Contributor

@AndyButland AndyButland commented Apr 2, 2025

Prerequisites

  • I have added steps to test this contribution in the description below

Relates to the fix necessary for #18517

Description

When evaluating document permissions on the client, there's a need to know the ancestors of the current item. This is because granular permissions can be assigned on an ancestor document, and they should apply to the current one.

From internal discussion:

... I think I have it working correctly for the workspace now. To check the inheritance path, we currently use the /tree/document/ancestors endpoint. It all works fine, but "unfortunately," we have made some updates to the UI which give me some challenges with this endpoint.
We now show the first available "Entity Action" on all tree items and collection items. This means that I would need to check for permissions already when rendering the tree and a collection, and can't wait and ask each individual item when opening the menu.
In the old back office, if I remember correctly, we had the path - a string array of ids available on each tree item: [-1, 12, 25, 48], etc. If we are able to bring something similar back, then I have all the information available that I need.

So this PR brings back this "path", but in the form of an array of GUIDs under a property named ancestors. It's added on the document tree and collection item response models.

To populate I've created a new method in IEntityService that uses the IIdKeyMap to translate the entity's Path property - which is a comma delimited list of integer IDs - to the array of GUIDs.

Testing

To test you can call the following management API endpoints, for documents at various levels in the tree and verify the ancestors property is correctly populated.

GET /umbraco/management/api/v1/collection/document/{id}?orderBy=updateDate&skip=0&take=100
GET /umbraco/management/api/v1/tree/document/children?parentId={id}&skip=0&take=100

E.g. you should get a response like the following:

{
  "total": 5,
  "items": [
    {
      "documentType": {
        "id": "752230cd-fc00-441e-85e5-a8efbcccdc84",
        "alias": "blogpost",
        "icon": "icon-calendar color-black"
      },
      "isTrashed": false,
      "isProtected": false,
      "ancestors": [
        {
          "id": "ca4249ed-2b23-4337-b522-63cabe5587d1"
        },
        {
          "id": "e8ad9b65-cff6-4952-ac5b-efe56a60db62"
        }
      ],
     ...

@Copilot Copilot AI review requested due to automatic review settings April 2, 2025 10:01
Copy link
Contributor

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR adds ancestor ID details (as an array of GUIDs) to document tree and collection responses to support granular permission inheritance. Key changes include:

  • Adding a new method GetPathKeys to convert an entity’s comma‐separated path into GUIDs.
  • Updating response models and mapping to include the new AncestorIds property.
  • Extending user start node entity services and tests to validate access based on ancestor paths.

Reviewed Changes

Copilot reviewed 14 out of 15 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/EntityServiceTests.cs Added tests for the new GetPathKeys functionality.
tests/Umbraco.Tests.Integration/ManagementApi/Services/UserStartNodeEntitiesServiceTests.cs Introduced tests to validate start node entities with the new ancestor information.
tests/Umbraco.Tests.Integration/ManagementApi/Services/UserStartNodeEntitiesServiceTests.RootUserAccessEntities.cs Added tests for root user access entities.
tests/Umbraco.Tests.Integration/ManagementApi/Services/UserStartNodeEntitiesServiceTests.ChildUserAccessEntities.cs Added tests for child user access entities and pagination behavior.
src/Umbraco.Core/Services/IEntityService.cs Added default interface definition for GetPathKeys.
src/Umbraco.Core/Services/EntityService.cs Implemented GetPathKeys to parse and convert entity paths.
src/Umbraco.Cms.Api.Management/ViewModels/Tree/DocumentTreeItemResponseModel.cs Added AncestorIds property to include ancestor GUID details on tree items.
src/Umbraco.Cms.Api.Management/ViewModels/Document/Collection/DocumentCollectionResponseModel.cs Added AncestorIds property on document collections.
src/Umbraco.Cms.Api.Management/Services/Entities/UserStartNodeEntitiesService.cs Updated user start node services to support the new ancestor logic.
src/Umbraco.Cms.Api.Management/Mapping/Document/DocumentMapDefinition.cs Updated mapping to exclude IsProtected and include AncestorIds.
src/Umbraco.Cms.Api.Management/Factories/DocumentCollectionPresentationFactory.cs Set AncestorIds on collection items using the new GetPathKeys call.
src/Umbraco.Cms.Api.Management/Controllers/Tree/UserStartNodeTreeControllerBase.cs Adjusted child entity retrieval to use updated access logic.
src/Umbraco.Cms.Api.Management/Controllers/Document/Tree/DocumentTreeControllerBase.cs Mapped AncestorIds when generating document tree item responses.
Files not reviewed (1)
  • tests/Umbraco.Tests.Integration/Umbraco.Tests.Integration.csproj: Language not supported
Comments suppressed due to low confidence (1)

tests/Umbraco.Tests.Integration/ManagementApi/Services/UserStartNodeEntitiesServiceTests.cs:56

  • The array initializer syntax using square brackets may be invalid in C#; consider using a proper array initializer such as "new[] { new AllowedContentType { Alias = contentType.Alias, Key = contentType.Key } }".
contentType.AllowedContentTypes = [new() { Alias = contentType.Alias, Key = contentType.Key }];

@AndyButland AndyButland force-pushed the v15/task/add-path-to-tree-and-collection-responses branch from 7631495 to 8609ce8 Compare April 2, 2025 10:10
Copy link
Contributor

@madsrasmussen madsrasmussen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewing as a consumer.

The updates work as expected. I get the ancestors for both document tree items and document collection items. We probably want to expand this to all silos with a tree at some point, but this is great for now!

One detail about the naming. We currently have the convention that all referenced data should be objects. I think this should follow the same convention. The data will then be something like:

"ancestors": [
  {
    "id": "1234"
  },
  {
    "id": "4567"
   }
]

@AndyButland
Copy link
Contributor Author

One detail about the naming. We currently have the convention that all referenced data should be objects. I think this should follow the same convention.

I've updated to reflect this @madsrasmussen.

Copy link
Contributor

@nikolajlauridsen nikolajlauridsen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BE looks beautiful 👍

@AndyButland AndyButland merged commit 6247f54 into v15/dev Apr 4, 2025
21 checks passed
@AndyButland AndyButland deleted the v15/task/add-path-to-tree-and-collection-responses branch April 4, 2025 04:51
@AndyButland AndyButland changed the title Adds ancestor ID details on document tree and collection responses Adds ancestor details on document tree and collection responses Apr 4, 2025
@AndyButland AndyButland changed the title Adds ancestor details on document tree and collection responses Adds ancestor identifiers on document tree and collection responses Apr 4, 2025
kjac added a commit that referenced this pull request Apr 9, 2025
* Only prevent the unpublish or delete of a related item when configured to do so if it is related as a child, not as a parent (#18886)

* Only prevent the unpubkish or delete of a related item when configured to do so if it is related as a child, not as a parent.

* Fixed incorect parameter names.

* Fixed failing integration tests.

* Use using variable instead to reduce nesting

* Applied suggestions from code review.

* Used simple using statement throughout RelationService for consistency.

* Applied XML header comments consistently.

---------

Co-authored-by: mole <[email protected]>

* Feature: highlight invariant doc with variant blocks is unsupported (#18806)

* mark variant blocks in invariant docs as invalid

* implement RTE Blocks

* Fix pagination for users restricted by start nodes (#18907)

* Fix pagination for users restricted by start nodes

* Default implementation to avoid breakage

* Review comments

* Fix failing test

* Add media start node tests

* Fix issue preventing blueprint derived values from being scaffolded (#18917)

* Fix issue preventing blueprint derived values from being scaffolded.

* fix manipulating frooen array

* compare with variantId as well

---------

Co-authored-by: Niels Lyngsø <[email protected]>

* ci: add Azure Static Web Apps workflow file
on-behalf-of: @Azure [email protected]

* ci: add Azure Static Web Apps workflow file
on-behalf-of: @Azure [email protected]

* ci: add Azure Static Web Apps workflow file
on-behalf-of: @Azure [email protected]

* Remove admin permission on user configuration, allowing users with user section access only to manaage users and groups. (#18848)

* Tiptap RTE: Style Menu extension kind (#18918)

* Adds 'styleMenu' Tiptap toolbar extension kind

* Adds icons for `<h4>` and `<p>` tags

* Adds commands to HTML Global Attributes extension

for setting the `class` and `id` attributes.

* Renamed "default-tiptap-toolbar-element.api.ts" file

The "element" part was confusing.

* Toolbar Menu: uses correct `item` value

* Cascading Menu: adds localization for the label

* Adds `label` attribute to UUI components

for accessibility.

* Toolbar Menu: uses correct `appearance` value

* Removed unrequired `api` from Style Select

* Destructs the `item.data` object

* Ensure has children reflects only items with folder children when folders only are queried. (#18790)

* Ensure has children reflects only items with folder children when folders only are queried.

* Added supression for change to integration test public code.

---------

Co-authored-by: Migaroez <[email protected]>

* Only apply validation on content update to variant cultures where the editor has permission for the culture (#18778)

* Only apply validation on content update to variant cultures where the editor has permission for the culture.

* Remove inadvertent comment updates.

* Fixed failing integration test.

* Adds ancestor ID details on document tree and collection responses (#18909)

* Populate ancestor keys on document tree response items.

* Populate ancestor keys on document collection response items.

* Update OpenApi.json

* Use array of objects rather than Ids for the ancestor collection.

* Update OpenApi.json.

* Move publish with descendants to a background task with polling (#18497)

* Use background queue for database cache rebuild and track rebuilding status.

* Updated OpenApi.json and client-side types.

* Updated client to poll for completion of database rebuild.

* Move IBackgroundTaskQueue to core and prepare publish branch to run as background task.

* Endpoints for retrieval of status and result from branch publish operations.

* Poll and retrieve result for publish with descendants.

* Handled issues from testing.

* Rework to single controller for status and result.

* Updated client side sdk.

* OpenApi post dev merge gen

---------

Co-authored-by: Migaroez <[email protected]>

* Clear roots before rebuilding navigation dictionary (#18766)

* Clear roots before rebuilding navigation dictionary.

* Added tests to verify fix.

* Correct test implementation.

* Convert integration tests with method overloads into test cases.

* Integration test compatibility supressions.

* Fixes save of empty, invariant block list on variant content. (#18932)

* remove unnecessary code (#18927)

* V15/bugfix/fix route issue from 18859 (#18931)

* unique check

* unique for workspace empty path

* more unique routes

* Bump vite from 6.2.3 to 6.2.4 in /src/Umbraco.Web.UI.Client

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.2.3 to 6.2.4.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v6.2.4/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.2.4/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 6.2.4
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <[email protected]>

* removes autogenerated workflows

* make getHasUnpersistedChanges public (#18929)

* Added management API endpoint, service and repository for retrieval of references from the recycle bin (#18882)

* Added management API endpoint, service and repository for retrieval of references from the recycle bin.

* Update src/Umbraco.Cms.Api.Management/Controllers/Document/RecycleBin/ReferencedByDocumentRecycleBinController.cs

Co-authored-by: Copilot <[email protected]>

* Removed unused code.

---------

Co-authored-by: Copilot <[email protected]>

* Updated management API endpoint and model for data type references to align with that used for documents, media etc. (#18905)

* Updated management API endpoint and model for data type references to align with that used for documents, media etc.

* Refactoring.

* Update src/Umbraco.Core/Constants-ReferenceTypes.cs

Co-authored-by: Copilot <[email protected]>

* Fixed typos.

* Added id to tracked reference content type response.

* Updated OpenApi.json.

* Added missing updates.

* Renamed model and constants from code review feedback.

* Fix typo

* Fix multiple enumeration

---------

Co-authored-by: Copilot <[email protected]>
Co-authored-by: mole <[email protected]>

* Skip lock tests

* Look-up redirect in content finder for multi-lingual sites using path and legacy route prefixed with the integer ID of the node with domains defined (#18763)

* Look-up redirect in content finder for multi-lingual sites using path and legacy route prefixed with the integer ID of the node with domains defined.

* Added tests to verify functionality.

* Added reference to previous PR.

* Referenced second PR.

* Assemble URLs for all cultures, not just the default.

* Revert previous update.

* Display an original URL if we have one.

* Bump vite from 6.2.4 to 6.2.5 in /src/Umbraco.Web.UI.Client

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.2.4 to 6.2.5.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v6.2.5/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v6.2.5/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 6.2.5
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <[email protected]>

* Add raw value validation to multiple text strings property editor (#18936)

* Add raw value validation to multiple text strings property editor

* Added additional assert on unit test and comment on validation logic.

* Don't remove items to obtain a valid value

---------

Co-authored-by: Andy Butland <[email protected]>

* Integration tests for content publishing with ancestor unpublished (#18941)

* Resolved warnings in test class.

* Refactor regions into partial classes.

* Aligned test names.

* Variable name refactoring.

* Added tests for unpublished paths.

* Adjust tests to verify current behaviour.

* Cleaned up project file.

* fix circular icon import (#18952)

* remove segment toggle for elements (#18949)

* Fix modal route registration circular import (#18953)

* fix modal route registration circular import

* Update modal-route-registration.controller.ts

* V15/fix/18595 (#18925)

* fix for #18595

* updates the en.ts

* Avoid unneeded Dictionary operations (#18890)

* Avoid some heap allocations

* Remove unneeded double seek

* Avoid allocating new empty arrays, reuse existing empty array

* Avoid allocating strings for parsing comma separated int values (#18199)

* Data type References UI: Workspace + Delete (#18914)

* Updated management API endpoint and model for data type references to align with that used for documents, media etc.

* Refactoring.

* Update src/Umbraco.Core/Constants-ReferenceTypes.cs

Co-authored-by: Copilot <[email protected]>

* Fixed typos.

* generate server models

* add extension slot

* register data type reference info app

* add reference data mappers

* Added id to tracked reference content type response.

* Updated OpenApi.json.

* Added missing updates.

* generate new models

* update models

* register ref item

* remove debugger

* render types

* register member type property type ref

* register media type property type ref

* Renamed model and constants from code review feedback.

* register reference workspace info app kind

* use kind for document references

* use kind for media references

* use kind for member references

* use deleteWithRelation kind when deleting data types

* fix manifest types

* fix types

* Update types.gen.ts

* update code to fit new server models

---------

Co-authored-by: Andy Butland <[email protected]>
Co-authored-by: Copilot <[email protected]>

* Feature: discard changes for block workspace (#18930)

* make getHasUnpersistedChanges public

* Discard changes impl for Block Workspace

* fix 18367 (#18956)

* Merge commit from fork

* Prevent path traveral vulnerability with upload of temporary files.

* Used BadRequest instead of NotFound for invalid file name response.

* V15 QA Fixing the failing media acceptance tests (#18881)

* Fixed the function name due to test helper changes

* Updated assertion steps due to UI changes

* Added more waits

* Bumped version

* Increase timeout

* Reverted

---------

Co-authored-by: Andreas Zerbst <[email protected]>

* V15 QA added clipboard test for not being able to copy to root when block is not allowed at root (#18937)

* Added clipboard test

* Bumped version

* Updated to use the name

* Run all tests on the pipeline

* Reverted command

* build: adjusts circular ref number to 4

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: Andy Butland <[email protected]>
Co-authored-by: mole <[email protected]>
Co-authored-by: Niels Lyngsø <[email protected]>
Co-authored-by: Niels Lyngsø <[email protected]>
Co-authored-by: Jacob Overgaard <[email protected]>
Co-authored-by: Lee Kelleher <[email protected]>
Co-authored-by: Migaroez <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Copilot <[email protected]>
Co-authored-by: Nikolaj Geisle <[email protected]>
Co-authored-by: Mads Rasmussen <[email protected]>
Co-authored-by: Jacob Welander Jensen <[email protected]>
Co-authored-by: Henrik <[email protected]>
Co-authored-by: Sebastiaan Janssen <[email protected]>
Co-authored-by: Nhu Dinh <[email protected]>
Co-authored-by: Andreas Zerbst <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants