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()}`;
}