Skip to content
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

[MNT-24575] Added APIS and models folder information dialog #10460

Merged
merged 15 commits into from
Jan 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions docs/core/services/nodes-api.service.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,15 @@ Accesses and manipulates ACS document nodes using their node IDs.
- _nodeId:_ `string` - ID of the target node
- _options:_ `{ includeSource?: boolean; } & NodesIncludeQuery & ContentPagingQuery` - Optional parameters supported by JS-API
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`Hold[]`](../../../lib/js-api/src/api/gs-core-rest-api/docs/Hold.md)`>` - List of assigned holds
- **initiateFolderSizeCalculation**(nodeId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`JobIdBodyEntry`](../../../lib/js-api/src/api/content-rest-api/docs/NodesApi.md#jobidbodyentry)`>`<br/>
Initiate a new request to calculate folder size.
- _nodeId:_ `string` - ID of the target node
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`JobIdBodyEntry`](../../../lib/js-api/src/api/content-rest-api/docs/NodesApi.md#jobidbodyentry)`>` - Job id which can be used to track request status
- **getFolderSizeInfo**(nodeId: `string`, jobId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<`[`SizeDetailsEntry`](../../../lib/js-api/src/api/content-rest-api/docs/NodesApi.md#sizedetailsentry)`>`<br/>
Gets the size of a folder.
- _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

## Details

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import { TestBed } from '@angular/core/testing';
import { HttpClientTestingModule } from '@angular/common/http/testing';
import { CoreTestingModule, RedirectAuthService } from '@alfresco/adf-core';
import { EMPTY, firstValueFrom, of } from 'rxjs';
import { JobIdBodyEntry, SizeDetails, SizeDetailsEntry } from '@alfresco/js-api';
import { NodesApiService } from './nodes-api.service';
import { AlfrescoApiService } from '../../services/alfresco-api.service';
import { AlfrescoApiServiceMock } from '../../mock/alfresco-api.service.mock';

const fakeInitiateFolderSizeResponse: JobIdBodyEntry = {
entry: {
jobId: 'fake-job-id'
}
};

const fakeFolderSizeResponse: SizeDetailsEntry = {
entry: {
jobId: 'fake-job-id',
calculatedAt: new Date().toString(),
sizeInBytes: '1234',
numberOfFiles: 1,
status: SizeDetails.StatusEnum.COMPLETE,
id: 'fake-id'
}
};

describe('NodesApiService', () => {
let nodesApiService: NodesApiService;

beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule, CoreTestingModule],
providers: [
NodesApiService,
{ provide: AlfrescoApiService, useClass: AlfrescoApiServiceMock },
{ provide: RedirectAuthService, useValue: { onLogin: EMPTY, onTokenReceived: of(), init: () => {} } }
]
});

nodesApiService = TestBed.inject(NodesApiService);
});

it('should call initiateFolderSizeCalculation api with nodeId parameter', async () => {
spyOn(nodesApiService.nodesApi, 'initiateFolderSizeCalculation').and.returnValue(Promise.resolve(fakeInitiateFolderSizeResponse));
await firstValueFrom(nodesApiService.initiateFolderSizeCalculation('fake-node-id'));

expect(nodesApiService.nodesApi.initiateFolderSizeCalculation).toHaveBeenCalledWith('fake-node-id');
});

it('should call getFolderSizeInfo api with nodeId and jobId parameter', async () => {
spyOn(nodesApiService.nodesApi, 'getFolderSizeInfo').and.returnValue(Promise.resolve(fakeFolderSizeResponse));
await firstValueFrom(nodesApiService.getFolderSizeInfo('fake-node-id', 'fake-job-id'));

expect(nodesApiService.nodesApi.getFolderSizeInfo).toHaveBeenCalledWith('fake-node-id', 'fake-job-id');
});
});
AleksanderSklorz marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,18 @@
*/

import { UserPreferencesService } from '@alfresco/adf-core';
import { ContentPagingQuery, Node, NodeAssignedHold, NodeEntry, NodePaging, NodesApi, NodesIncludeQuery, TrashcanApi } from '@alfresco/js-api';
import {
ContentPagingQuery,
Node,
NodeAssignedHold,
NodeEntry,
NodePaging,
NodesApi,
NodesIncludeQuery,
TrashcanApi,
SizeDetailsEntry,
JobIdBodyEntry
} from '@alfresco/js-api';
import { Injectable } from '@angular/core';
import { from, Observable, Subject, throwError } from 'rxjs';
import { catchError, map } from 'rxjs/operators';
Expand Down Expand Up @@ -246,6 +257,27 @@ export class NodesApiService {
return this.createNodeInsideRoot(name || this.randomNodeName(), nodeType, properties, path);
}

/**
* Initiate a new request to calculate folder size.
AleksanderSklorz marked this conversation as resolved.
Show resolved Hide resolved
*
* @param nodeId Node Id
* @returns The job id which can be used to track request status
*/
initiateFolderSizeCalculation(nodeId: string): Observable<JobIdBodyEntry> {
swapnil-verma-gl marked this conversation as resolved.
Show resolved Hide resolved
return from(this.nodesApi.initiateFolderSizeCalculation(nodeId));
}

/**
* Gets the size of a folder.
AleksanderSklorz marked this conversation as resolved.
Show resolved Hide resolved
*
* @param nodeId Node Id
* @param jobId Job Id
* @returns Folder details
*/
getFolderSizeInfo(nodeId: string, jobId: string): Observable<SizeDetailsEntry> {
swapnil-verma-gl marked this conversation as resolved.
Show resolved Hide resolved
return from(this.nodesApi.getFolderSizeInfo(nodeId, jobId));
MichalKinas marked this conversation as resolved.
Show resolved Hide resolved
}

private randomNodeName(): string {
return `node_${Date.now()}`;
}
Expand Down
1 change: 1 addition & 0 deletions lib/core/src/lib/dialogs/dialog/dialog.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ <h2 class="adf-dialog-title">{{ data.title | translate }}</h2>
*ngIf="!isCloseButtonHidden"
mat-icon-button
mat-dialog-close
title="{{'CLOSE' | translate }}"
data-automation-id="adf-dialog-close-button"
>
<mat-icon>close</mat-icon>
Expand Down
50 changes: 49 additions & 1 deletion lib/js-api/src/api/content-rest-api/api/nodes.api.ts
MichalKinas marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ import {
NodeBodyMove,
NodeBodyUpdate,
NodeChildAssociationPaging,
NodeEntry
NodeEntry,
SizeDetailsEntry,
JobIdBodyEntry
} from '../model';
import { BaseApi } from './base.api';
import { throwIfNotDefined } from '../../../assert';
Expand Down Expand Up @@ -960,4 +962,50 @@ export class NodesApi extends BaseApi {
returnType: DirectAccessUrlEntry
});
}

/**
* Initiate a new request to calculate folder size.
*
* **Note:** this endpoint is available in Alfresco 25.1.0 and newer versions.
* @param nodeId Node Id
* @returns The job id which can be used to track request status
*/
initiateFolderSizeCalculation(nodeId: string): Promise<JobIdBodyEntry> {
throwIfNotDefined(nodeId, 'nodeId');

const pathParams = {
nodeId
};

return this.post({
path: '/nodes/{nodeId}/size-details',
pathParams,
returnType: JobIdBodyEntry
});
}

/**
* Gets the size of a folder.
*
* **Note:** this endpoint is available in Alfresco 25.1.0 and newer versions.
* @param nodeId Node Id
* @param jobId Job Id
* @returns Folder details
*/

getFolderSizeInfo(nodeId: string, jobId: string): Promise<SizeDetailsEntry> {
swapnil-verma-gl marked this conversation as resolved.
Show resolved Hide resolved
throwIfNotDefined(nodeId, 'nodeId');
throwIfNotDefined(jobId, 'jobId');

const pathParams = {
nodeId,
jobId
};

return this.get({
path: 'nodes/{nodeId}/size-details/{jobId}',
pathParams,
returnType: SizeDetailsEntry
});
}
}
96 changes: 96 additions & 0 deletions lib/js-api/src/api/content-rest-api/docs/NodesApi.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ All URIs are relative to *https://localhost/alfresco/api/-default-/public/alfres
| [unlockNode](#unlockNode) | **POST** /nodes/{nodeId}/unlock | Unlock a node |
| [updateNode](#updateNode) | **PUT** /nodes/{nodeId} | Update a node |
| [updateNodeContent](#updateNodeContent) | **PUT** /nodes/{nodeId}/content | Update node content |
| [initiateFolderSizeCalculation](#initiateFolderSizeCalculation) | **POST** /nodes/{nodeId}/size-details | Initiate a new request to calculate folder size |
| [getFolderSizeInfo](#getFolderSizeInfo) | **GET** /nodes/{nodeId}/size-details/{jobId} | Gets the details of a folder |

## copyNode

Expand Down Expand Up @@ -1196,6 +1198,67 @@ nodesApi.updateNodeContent(`<nodeId>`, contentBodyUpdate, opts).then((data) => {
console.log('API called successfully. Returned data: ' + data);
});
```
## initiateFolderSizeCalculation

Initiates a new request to calculate folder size.

> this endpoint is available in **Alfresco 25.1.0** and newer versions.

Initiates a request to calculate the size of the node with identifier **nodeId**.

**Parameters**

| Name | Type | Description |
|-----------------------|----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| **nodeId** | string | The identifier of a node. |

**Return type**: [JobIdBodyEntry](#JobIdBodyEntry)

**Example**

```javascript
import {AlfrescoApi, NodesApi} from '@alfresco/js-api';

const alfrescoApi = new AlfrescoApi(/*..*/);
const nodesApi = new NodesApi(alfrescoApi);
const contentBodyUpdate = {};
const opts = {};

nodesApi.initiateFolderSizeCalculation(`<nodeId>`).then((data) => {
console.log('API called successfully. Returned data: ' + data);
});
```
## getFolderSizeInfo

Gets the size details of a folder

> this endpoint is available in **Alfresco 25.1.0** and newer versions.

Fetches the size details of folder with the identifier **nodeId**

**Parameters**

| Name | Type | Description |
|------------|----------|------------------------------------------------------------------------------------|
| **nodeId** | string | The identifier of a node. |
| **jobId** | string | The identifier for the job which is calculating the currently selected node's size |

**Return type**: [SizeDetailsEntry](#SizeDetailsEntry)

**Example**

```javascript
import {AlfrescoApi, NodesApi} from '@alfresco/js-api';

const alfrescoApi = new AlfrescoApi(/*..*/);
const nodesApi = new NodesApi(alfrescoApi);
const contentBodyUpdate = {};
const opts = {};

nodesApi.getFolderSizeInfo(`<nodeId>`, `<jobId>`).then((data) => {
console.log('API called successfully. Returned data: ' + data);
});
```

# Models

Expand Down Expand Up @@ -1409,6 +1472,39 @@ nodesApi.updateNodeContent(`<nodeId>`, contentBodyUpdate, opts).then((data) => {
| isInheritanceEnabled | boolean |
| locallySet | [PermissionElement[]](PermissionElement.md) |

# JobIdBodyEntry

**Properties**

| Name | Type |
|-----------|-------------------------|
| **entry** | [JobIdBody](#JobIdBody) |

# JobIdBody

**Properties**

| Name | Type | Description | Notes |
|-----------|--------|---------------------------------------------------------------------------------------|-------------------|
| **jobId** | string | Id of the job that can be used to track the status of folder size calculation request | [default to null] |

# SizeDetailsEntry

**Properties**

| Name | Type |
|-----------|-----------------------------|
| **entry** | [SizeDetails](#SizeDetails) |

# SizeDetails

**Properties**

| Name | Type | Description | Notes |
|-------------------|--------|-----------------------------------------------------------------------------|------------------|
| **id** | string | Unique alphanumeric id unique to this response request | [default to null]|
| **sizeInBytes** | string | Size of the folder in bytes | [default to null]|
| **calculatedAt** | string | Timestamp of when the folder size was calculated | [default to null]|
| **numberOfFiles** | number | Number of files present within the folder | [default to null]|
| **status** | string | Status of the request. Can be 'NOT-INITIATED', 'IN-PROGRESS' or 'COMPLETED' | [default to null]|
| **jobId** | string | The job ID which was used to track down the folder details | [default to null]|
4 changes: 4 additions & 0 deletions lib/js-api/src/api/content-rest-api/model/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -211,3 +211,7 @@ export * from './versionPagingList';
export * from './deletedNode';
export * from './nodeAssociation';
export * from './nodeChildAssociation';
export * from './sizeDetails';
export * from './sizeDetailsEntry';
export * from './jobIdBody';
export * from './jobIdBodyEntry';
24 changes: 24 additions & 0 deletions lib/js-api/src/api/content-rest-api/model/jobIdBody.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

export class JobIdBody {
jobId: string;

constructor(jobIdBody: JobIdBody) {
this.jobId = jobIdBody.jobId;
}
}
29 changes: 29 additions & 0 deletions lib/js-api/src/api/content-rest-api/model/jobIdBodyEntry.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*!
* @license
* Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import { JobIdBody } from './jobIdBody';

export class JobIdBodyEntry {
entry: JobIdBody;

constructor(input?: Partial<JobIdBodyEntry>) {
if (input) {
Object.assign(this, input);
this.entry = input.entry ? new JobIdBody(input.entry) : undefined;
}
}
}
Loading
Loading