From: Lucas Di Pentima Date: Tue, 30 Nov 2021 14:02:03 +0000 (-0300) Subject: 18484: Improves CollectionService.get() to support "select". X-Git-Tag: 2.4.0~26^2 X-Git-Url: https://git.arvados.org/arvados-workbench2.git/commitdiff_plain/30ef6aaa179aa1d18e70e2a54b1a997146328147 18484: Improves CollectionService.get() to support "select". Updates related code, also adds the "include_old_versions" param so that it works with snapshots. Adds tests. Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima --- diff --git a/src/services/collection-service/collection-service.test.ts b/src/services/collection-service/collection-service.test.ts index 1b0130c7..b759fd1a 100644 --- a/src/services/collection-service/collection-service.test.ts +++ b/src/services/collection-service/collection-service.test.ts @@ -41,7 +41,24 @@ describe('collection-service', () => { '/collections', { params: { filters: `[["uuid","=","zzzzz-4zz18-0123456789abcde"]]`, - order: undefined + include_old_versions: true, + }, + } + ); + }); + + it('should be able to request specific fields', async () => { + serverApi.get = jest.fn(() => Promise.resolve( + { data: { items: [{}] } } + )); + const uuid = 'zzzzz-4zz18-0123456789abcde' + await collectionService.get(uuid, undefined, ['manifestText']); + expect(serverApi.get).toHaveBeenCalledWith( + '/collections', { + params: { + filters: `[["uuid","=","zzzzz-4zz18-0123456789abcde"]]`, + include_old_versions: true, + select: `["manifest_text"]` }, } ); diff --git a/src/services/collection-service/collection-service.ts b/src/services/collection-service/collection-service.ts index 43041ccd..b6272650 100644 --- a/src/services/collection-service/collection-service.ts +++ b/src/services/collection-service/collection-service.ts @@ -12,6 +12,7 @@ import { TrashableResourceService } from "services/common-service/trashable-reso import { ApiActions } from "services/api/api-actions"; import { customEncodeURI } from "common/url"; import { FilterBuilder } from "services/api/filter-builder"; +import { ListArguments } from "services/common-service/common-service"; export type UploadProgress = (fileId: number, loaded: number, total: number, currentTime: number) => void; @@ -29,11 +30,15 @@ export class CollectionService extends TrashableResourceService { } list(args: ListArguments = {}, showErrors?: boolean): Promise> { - const { filters, order, ...other } = args; + const { filters, select, ...other } = args; const params = { ...CommonService.mapKeys(snakeCase)(other), filters: filters ? `[${filters}]` : undefined, - order: order ? order : undefined + select: select + ? `[${select.map(snakeCase).map(s => `"${s}"`).join(', ')}]` + : undefined }; if (QueryString.stringify(params).length <= 1500) { diff --git a/src/store/advanced-tab/advanced-tab.tsx b/src/store/advanced-tab/advanced-tab.tsx index 0f8bf3cb..25d90195 100644 --- a/src/store/advanced-tab/advanced-tab.tsx +++ b/src/store/advanced-tab/advanced-tab.tsx @@ -411,7 +411,7 @@ const containerRequestApiResponse = (apiResponse: ContainerRequestResource) => { const collectionApiResponse = (apiResponse: CollectionResource) => { const { uuid, ownerUuid, createdAt, modifiedAt, modifiedByClientUuid, modifiedByUserUuid, name, description, properties, portableDataHash, replicationDesired, - replicationConfirmedAt, replicationConfirmed, manifestText, deleteAt, trashAt, isTrashed, storageClassesDesired, + replicationConfirmedAt, replicationConfirmed, deleteAt, trashAt, isTrashed, storageClassesDesired, storageClassesConfirmed, storageClassesConfirmedAt, currentVersionUuid, version, preserveVersion, fileCount, fileSizeTotal } = apiResponse; const response = ` "uuid": "${uuid}", @@ -424,7 +424,6 @@ const collectionApiResponse = (apiResponse: CollectionResource) => { "replication_desired": ${stringify(replicationDesired)}, "replication_confirmed_at": ${stringify(replicationConfirmedAt)}, "replication_confirmed": ${stringify(replicationConfirmed)}, -"manifest_text": ${stringify(manifestText)}, "name": ${stringify(name)}, "description": ${stringify(description)}, "properties": ${stringifyObject(properties)}, diff --git a/src/store/collections/collection-partial-copy-actions.ts b/src/store/collections/collection-partial-copy-actions.ts index 49900f2c..d898c500 100644 --- a/src/store/collections/collection-partial-copy-actions.ts +++ b/src/store/collections/collection-partial-copy-actions.ts @@ -114,7 +114,7 @@ export const copyCollectionPartialToSelectedCollection = ({ collectionUuid }: Co const currentCollection = state.collectionPanel.item; if (currentCollection && !currentCollection.manifestText) { - const fetchedCurrentCollection = await services.collectionService.get(currentCollection.uuid); + const fetchedCurrentCollection = await services.collectionService.get(currentCollection.uuid, undefined, ['manifestText']); currentCollection.manifestText = fetchedCurrentCollection.manifestText; currentCollection.unsignedManifestText = fetchedCurrentCollection.unsignedManifestText; } diff --git a/src/store/collections/collection-version-actions.ts b/src/store/collections/collection-version-actions.ts index c0a58432..7d2511ed 100644 --- a/src/store/collections/collection-version-actions.ts +++ b/src/store/collections/collection-version-actions.ts @@ -9,6 +9,8 @@ import { snackbarActions, SnackbarKind } from "../snackbar/snackbar-actions"; import { resourcesActions } from "../resources/resources-actions"; import { navigateTo } from "../navigation/navigation-action"; import { dialogActions } from "../dialog/dialog-actions"; +import { getResource } from "store/resources/resources"; +import { CollectionResource } from "models/collection"; export const COLLECTION_RESTORE_VERSION_DIALOG = 'collectionRestoreVersionDialog'; @@ -28,9 +30,15 @@ export const openRestoreCollectionVersionDialog = (uuid: string) => export const restoreVersion = (resourceUuid: string) => async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { try { - // Request que entire record because stored old versions usually - // don't include the manifest_text field. - const oldVersion = await services.collectionService.get(resourceUuid); + // Request the manifest text because stored old versions usually + // don't include them. + let oldVersion = getResource(resourceUuid)(getState().resources); + if (!oldVersion) { + oldVersion = await services.collectionService.get(resourceUuid); + } + const oldVersionManifest = await services.collectionService.get(resourceUuid, undefined, ['manifestText']); + oldVersion.manifestText = oldVersionManifest.manifestText; + const { uuid, version, ...rest} = oldVersion; const headVersion = await services.collectionService.update( oldVersion.currentVersionUuid,