From 4df5b9282c1c0358cfe1da4d217f8e6d3728aac7 Mon Sep 17 00:00:00 2001 From: Michal Kinas <113341662+MichalKinas@users.noreply.github.com> Date: Wed, 11 Feb 2026 13:09:22 +0100 Subject: [PATCH] [MNT-25478] Expose list parents method in nodes api service (#11622) * [MNT-25478] Expose list parents method in nodes api service * [MNT-25478] CR fixes --- docs/core/services/nodes-api.service.md | 5 ++++ .../common/services/nodes-api.service.spec.ts | 7 +++++ .../lib/common/services/nodes-api.service.ts | 26 +++++++++++++++++-- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/docs/core/services/nodes-api.service.md b/docs/core/services/nodes-api.service.md index b9b9d89110..bad26f0fbb 100644 --- a/docs/core/services/nodes-api.service.md +++ b/docs/core/services/nodes-api.service.md @@ -98,6 +98,11 @@ Accesses and manipulates ACS document nodes using their node IDs. - _nodeId:_ `string` - ID of the target node - _jobId:_ `string` - ID of the job started by the `initiateFolderSizeCalculation` request - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SizeDetailsEntry`](../../../lib/js-api/src/api/content-rest-api/docs/NodesApi.md#sizedetailsentry)`>` - Details of the folder +- **listParents**(nodeId: `string`, opts: `{ where?: string; includeSource?: boolean;} & NodesIncludeQuery & ContentPagingQuery`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodeAssociationPaging`](../../../lib/js-api/src/api/content-rest-api/docs/NodesApi.md#NodeAssociationPaging)`>`
+ Lists parents of a node. + - _nodeId:_ `string` - ID of the target node + - _opts:_ `{ where?: string; includeSource?: boolean;} & NodesIncludeQuery & ContentPagingQuery` - additional options that API can take + - **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`NodeAssociationPaging`](../../../lib/js-api/src/api/content-rest-api/docs/NodesApi.md#NodeAssociationPaging)`>` - List of node's parents. ## Details diff --git a/lib/content-services/src/lib/common/services/nodes-api.service.spec.ts b/lib/content-services/src/lib/common/services/nodes-api.service.spec.ts index d553e8df63..e36fc32ad9 100644 --- a/lib/content-services/src/lib/common/services/nodes-api.service.spec.ts +++ b/lib/content-services/src/lib/common/services/nodes-api.service.spec.ts @@ -68,4 +68,11 @@ describe('NodesApiService', () => { expect(nodesApiService.nodesApi.getFolderSizeInfo).toHaveBeenCalledWith('fake-node-id', 'fake-job-id'); }); + + it('should call listParents api with nodeId and optional params', async () => { + spyOn(nodesApiService.nodesApi, 'listParents').and.returnValue(Promise.resolve({ list: { entries: [] } })); + await firstValueFrom(nodesApiService.listParents('fake-node-id', { include: ['path'], where: 'isPrimary=true' })); + + expect(nodesApiService.nodesApi.listParents).toHaveBeenCalledWith('fake-node-id', { include: ['path'], where: 'isPrimary=true' }); + }); }); diff --git a/lib/content-services/src/lib/common/services/nodes-api.service.ts b/lib/content-services/src/lib/common/services/nodes-api.service.ts index 629c5794cf..e02aebad37 100644 --- a/lib/content-services/src/lib/common/services/nodes-api.service.ts +++ b/lib/content-services/src/lib/common/services/nodes-api.service.ts @@ -26,7 +26,8 @@ import { NodesIncludeQuery, TrashcanApi, SizeDetailsEntry, - JobIdBodyEntry + JobIdBodyEntry, + NodeAssociationPaging } from '@alfresco/js-api'; import { Injectable } from '@angular/core'; import { from, Observable, Subject, throwError } from 'rxjs'; @@ -55,7 +56,10 @@ export class NodesApiService { return this._nodesApi; } - constructor(private apiService: AlfrescoApiService, private preferences: UserPreferencesService) {} + constructor( + private readonly apiService: AlfrescoApiService, + private readonly preferences: UserPreferencesService + ) {} private getEntryFromEntity(entity: NodeEntry): Node { return entity.entry; @@ -278,6 +282,24 @@ export class NodesApiService { return from(this.nodesApi.getFolderSizeInfo(nodeId, jobId)); } + /** + * Lists parents of a given node. + * + * @param nodeId Node ID + * @param opts Optional parameters + * @returns List of parent nodes + */ + listParents( + nodeId: string, + opts?: { + where?: string; + includeSource?: boolean; + } & NodesIncludeQuery & + ContentPagingQuery + ): Observable { + return from(this.nodesApi.listParents(nodeId, opts)); + } + private randomNodeName(): string { return `node_${Date.now()}`; }