diff --git a/src/collections/domain/models/CollectionItemSubset.ts b/src/collections/domain/models/CollectionItemSubset.ts index aecd038f..279b2e98 100644 --- a/src/collections/domain/models/CollectionItemSubset.ts +++ b/src/collections/domain/models/CollectionItemSubset.ts @@ -6,6 +6,7 @@ export interface CollectionItemSubset { items: (CollectionPreview | DatasetPreview | FilePreview)[] facets: CollectionItemsFacet[] totalItemCount: number + countPerObjectType: CountPerObjectType } export interface CollectionItemsFacet { @@ -18,3 +19,9 @@ interface CollectionItemsFacetLabel { name: string count: number } + +interface CountPerObjectType { + dataverses: number + datasets: number + files: number +} diff --git a/src/collections/infra/repositories/CollectionsRepository.ts b/src/collections/infra/repositories/CollectionsRepository.ts index dbfb587c..112956ab 100644 --- a/src/collections/infra/repositories/CollectionsRepository.ts +++ b/src/collections/infra/repositories/CollectionsRepository.ts @@ -57,7 +57,8 @@ export enum GetCollectionItemsQueryParams { PER_PAGE = 'per_page', START = 'start', TYPE = 'type', - FILTERQUERY = 'fq' + FILTERQUERY = 'fq', + SHOW_TYPE_COUNTS = 'show_type_counts' } export class CollectionsRepository extends ApiRepository implements ICollectionsRepository { @@ -135,7 +136,8 @@ export class CollectionsRepository extends ApiRepository implements ICollections [GetCollectionItemsQueryParams.QUERY]: '*', [GetCollectionItemsQueryParams.SHOW_FACETS]: 'true', [GetCollectionItemsQueryParams.SORT]: SortType.DATE, - [GetCollectionItemsQueryParams.ORDER]: OrderType.DESC + [GetCollectionItemsQueryParams.ORDER]: OrderType.DESC, + [GetCollectionItemsQueryParams.SHOW_TYPE_COUNTS]: 'true' }) if (collectionId) { diff --git a/src/collections/infra/repositories/transformers/CollectionItemsCountPerObjectTypePayload.ts b/src/collections/infra/repositories/transformers/CollectionItemsCountPerObjectTypePayload.ts new file mode 100644 index 00000000..b740d447 --- /dev/null +++ b/src/collections/infra/repositories/transformers/CollectionItemsCountPerObjectTypePayload.ts @@ -0,0 +1,5 @@ +export interface CollectionItemsCountPerObjectTypePayload { + Dataverses: number + Datasets: number + Files: number +} diff --git a/src/collections/infra/repositories/transformers/collectionTransformers.ts b/src/collections/infra/repositories/transformers/collectionTransformers.ts index d4b4ca82..a1888c75 100644 --- a/src/collections/infra/repositories/transformers/collectionTransformers.ts +++ b/src/collections/infra/repositories/transformers/collectionTransformers.ts @@ -25,6 +25,7 @@ import { CollectionPreview } from '../../../domain/models/CollectionPreview' import { CollectionContact } from '../../../domain/models/CollectionContact' import { CollectionType } from '../../../domain/models/CollectionType' import { CollectionItemsFacetPayload } from './CollectionItemsFacetsPayload' +import { CollectionItemsCountPerObjectTypePayload } from './CollectionItemsCountPerObjectTypePayload' export const transformCollectionResponseToCollection = (response: AxiosResponse): Collection => { const collectionPayload = response.data.data @@ -84,6 +85,9 @@ export const transformCollectionItemsResponseToCollectionItemSubset = ( const responseDataPayload = response.data.data const itemsPayload = responseDataPayload.items const facetsPayload = responseDataPayload.facets as CollectionItemsFacetPayload + const countPerObjectTypePayload = responseDataPayload[ + 'total_count_per_object_type' + ] as CollectionItemsCountPerObjectTypePayload const items: (DatasetPreview | FilePreview | CollectionPreview)[] = [] @@ -116,10 +120,17 @@ export const transformCollectionItemsResponseToCollectionItemSubset = ( }) ) + const countPerObjectType = { + dataverses: countPerObjectTypePayload['Dataverses'], + datasets: countPerObjectTypePayload['Datasets'], + files: countPerObjectTypePayload['Files'] + } + return { items, facets, - totalItemCount: responseDataPayload.total_count + totalItemCount: responseDataPayload.total_count, + countPerObjectType } } diff --git a/test/functional/metadataBlocks/GetAllFacetableMetadataFields.test.ts b/test/functional/metadataBlocks/GetAllFacetableMetadataFields.test.ts index 3678cee7..44dc67f9 100644 --- a/test/functional/metadataBlocks/GetAllFacetableMetadataFields.test.ts +++ b/test/functional/metadataBlocks/GetAllFacetableMetadataFields.test.ts @@ -18,7 +18,7 @@ describe('execute', () => { } catch (error) { throw new Error('Should not raise an error') } finally { - expect(metadataFieldInfos?.length).toBe(59) + expect(metadataFieldInfos?.length).toBe(64) expect(metadataFieldInfos?.[0].name).toBe('authorName') expect(metadataFieldInfos?.[0].displayName).toBe('Author Name') } diff --git a/test/functional/metadataBlocks/GetAllMetadataBlocks.test.ts b/test/functional/metadataBlocks/GetAllMetadataBlocks.test.ts index a8bfab2c..8b72a9d3 100644 --- a/test/functional/metadataBlocks/GetAllMetadataBlocks.test.ts +++ b/test/functional/metadataBlocks/GetAllMetadataBlocks.test.ts @@ -19,7 +19,7 @@ describe('execute', () => { throw new Error('Should not raise an error') } finally { expect(metadataBlocks).not.toBeNull() - expect(metadataBlocks?.length).toBe(6) + expect(metadataBlocks?.length).toBe(7) expect(metadataBlocks?.[0].metadataFields.title.name).toBe('title') } }) diff --git a/test/integration/collections/CollectionsRepository.test.ts b/test/integration/collections/CollectionsRepository.test.ts index 2a7c9c9d..038cd950 100644 --- a/test/integration/collections/CollectionsRepository.test.ts +++ b/test/integration/collections/CollectionsRepository.test.ts @@ -425,6 +425,9 @@ describe('CollectionsRepository', () => { expect(actualCollectionPreview.type).toBe(CollectionItemType.COLLECTION) expect(actual.totalItemCount).toBe(3) + expect(actual.countPerObjectType.dataverses).toBe(1) + expect(actual.countPerObjectType.datasets).toBe(1) + expect(actual.countPerObjectType.files).toBe(1) expect(actual.facets).toEqual(expectedFacetsAll) @@ -446,6 +449,9 @@ describe('CollectionsRepository', () => { ) expect(actual.totalItemCount).toBe(1) expect((actual.items[0] as FilePreview).name).toBe(expectedFileName) + expect(actual.countPerObjectType.dataverses).toBe(0) + expect(actual.countPerObjectType.datasets).toBe(0) + expect(actual.countPerObjectType.files).toBe(1) const collectionSearchCriteriaForDataset = new CollectionSearchCriteria().withSearchText( 'This is the description' @@ -458,6 +464,9 @@ describe('CollectionsRepository', () => { ) expect(actual.totalItemCount).toBe(1) expect((actual.items[0] as DatasetPreview).title).toBe(expectedDatasetDescription) + expect(actual.countPerObjectType.dataverses).toBe(0) + expect(actual.countPerObjectType.datasets).toBe(1) + expect(actual.countPerObjectType.files).toBe(0) const collectionSearchCriteriaForDatasetAndCollection = new CollectionSearchCriteria().withSearchText('the') @@ -470,6 +479,9 @@ describe('CollectionsRepository', () => { expect(actual.totalItemCount).toBe(2) expect((actual.items[0] as DatasetPreview).title).toBe(expectedDatasetDescription) expect((actual.items[1] as CollectionPreview).name).toBe(expectedCollectionsName) + expect(actual.countPerObjectType.dataverses).toBe(1) + expect(actual.countPerObjectType.datasets).toBe(1) + expect(actual.countPerObjectType.files).toBe(0) // Test search text, limit and offset actual = await sut.getCollectionItems( @@ -481,6 +493,9 @@ describe('CollectionsRepository', () => { expect(actual.items.length).toBe(1) expect(actual.totalItemCount).toBe(2) expect((actual.items[0] as CollectionPreview).name).toBe(expectedCollectionsName) + expect(actual.countPerObjectType.dataverses).toBe(1) + expect(actual.countPerObjectType.datasets).toBe(1) + expect(actual.countPerObjectType.files).toBe(0) // Test type collection const collectionSearchCriteriaForCollectionType = @@ -495,6 +510,9 @@ describe('CollectionsRepository', () => { expect(actual.totalItemCount).toBe(1) expect((actual.items[0] as CollectionPreview).name).toBe(expectedCollectionsName) expect(actual.facets).toEqual(expectedFacetsFromCollectionOnly) + expect(actual.countPerObjectType.dataverses).toBe(1) + expect(actual.countPerObjectType.datasets).toBe(0) + expect(actual.countPerObjectType.files).toBe(0) // Test type dataset const collectionSearchCriteriaForDatasetType = new CollectionSearchCriteria().withItemTypes([ @@ -510,6 +528,9 @@ describe('CollectionsRepository', () => { expect(actual.totalItemCount).toBe(1) expect((actual.items[0] as DatasetPreview).title).toBe(expectedDatasetDescription) expect(actual.facets).toEqual(expectedFacetsFromDatasetOnly) + expect(actual.countPerObjectType.dataverses).toBe(0) + expect(actual.countPerObjectType.datasets).toBe(1) + expect(actual.countPerObjectType.files).toBe(0) // Test type file const collectionSearchCriteriaForFileType = new CollectionSearchCriteria().withItemTypes([ @@ -525,6 +546,9 @@ describe('CollectionsRepository', () => { expect(actual.totalItemCount).toBe(1) expect((actual.items[0] as FilePreview).name).toBe(expectedFileName) expect(actual.facets).toEqual(expectedFacetsFromFileOnly) + expect(actual.countPerObjectType.dataverses).toBe(0) + expect(actual.countPerObjectType.datasets).toBe(0) + expect(actual.countPerObjectType.files).toBe(1) // Test multiple types const collectionSearchCriteriaForMultiTypes = new CollectionSearchCriteria().withItemTypes([ @@ -542,6 +566,9 @@ describe('CollectionsRepository', () => { expect((actual.items[0] as FilePreview).name).toBe(expectedFileName) expect((actual.items[1] as CollectionPreview).name).toBe(expectedCollectionsName) expect(actual.facets).toEqual(expectedFacetsFromCollectionAndFile) + expect(actual.countPerObjectType.dataverses).toBe(1) + expect(actual.countPerObjectType.datasets).toBe(0) + expect(actual.countPerObjectType.files).toBe(1) // Test Sort by name ascending const collectionSearchCriteriaNameAscending = new CollectionSearchCriteria() @@ -559,6 +586,9 @@ describe('CollectionsRepository', () => { expect((actual.items[0] as DatasetPreview).type).toBe(CollectionItemType.DATASET) expect((actual.items[1] as CollectionPreview).type).toBe(CollectionItemType.COLLECTION) expect((actual.items[2] as FilePreview).type).toBe(CollectionItemType.FILE) + expect(actual.countPerObjectType.dataverses).toBe(1) + expect(actual.countPerObjectType.datasets).toBe(1) + expect(actual.countPerObjectType.files).toBe(1) // Test Sort by name descending const collectionSearchCriteriaNameDescending = new CollectionSearchCriteria() @@ -576,6 +606,9 @@ describe('CollectionsRepository', () => { expect((actual.items[0] as FilePreview).type).toBe(CollectionItemType.FILE) expect((actual.items[1] as CollectionPreview).type).toBe(CollectionItemType.COLLECTION) expect((actual.items[2] as DatasetPreview).type).toBe(CollectionItemType.DATASET) + expect(actual.countPerObjectType.dataverses).toBe(1) + expect(actual.countPerObjectType.datasets).toBe(1) + expect(actual.countPerObjectType.files).toBe(1) // Test Sort by date ascending const collectionSearchCriteriaDateAscending = new CollectionSearchCriteria() @@ -593,6 +626,9 @@ describe('CollectionsRepository', () => { expect((actual.items[0] as CollectionPreview).type).toBe(CollectionItemType.COLLECTION) expect((actual.items[1] as DatasetPreview).type).toBe(CollectionItemType.DATASET) expect((actual.items[2] as FilePreview).type).toBe(CollectionItemType.FILE) + expect(actual.countPerObjectType.dataverses).toBe(1) + expect(actual.countPerObjectType.datasets).toBe(1) + expect(actual.countPerObjectType.files).toBe(1) // Test Sort by date descending const collectionSearchCriteriaDateDescending = new CollectionSearchCriteria() @@ -610,6 +646,9 @@ describe('CollectionsRepository', () => { expect((actual.items[0] as FilePreview).type).toBe(CollectionItemType.FILE) expect((actual.items[1] as DatasetPreview).type).toBe(CollectionItemType.DATASET) expect((actual.items[2] as CollectionPreview).type).toBe(CollectionItemType.COLLECTION) + expect(actual.countPerObjectType.dataverses).toBe(1) + expect(actual.countPerObjectType.datasets).toBe(1) + expect(actual.countPerObjectType.files).toBe(1) // Test with Filter query related to the collection const collectionSearchCriteriaFilterQueryCollection = @@ -625,6 +664,9 @@ describe('CollectionsRepository', () => { expect(actual.totalItemCount).toBe(1) expect((actual.items[0] as CollectionPreview).name).toBe(expectedCollectionsName) expect(actual.facets).toEqual(expectedFacetsFromCollectionOnly) + expect(actual.countPerObjectType.dataverses).toBe(1) + expect(actual.countPerObjectType.datasets).toBe(0) + expect(actual.countPerObjectType.files).toBe(0) // Test with Filter query related to the dataset const collectionSearchCriteriaFilterQueryDataset = @@ -642,6 +684,9 @@ describe('CollectionsRepository', () => { expect(actual.totalItemCount).toBe(1) expect((actual.items[0] as DatasetPreview).title).toBe(expectedDatasetDescription) expect(actual.facets).toEqual(expectedFacetsFromDatasetOnly) + expect(actual.countPerObjectType.dataverses).toBe(0) + expect(actual.countPerObjectType.datasets).toBe(1) + expect(actual.countPerObjectType.files).toBe(0) // Test with Filter query related to the file const collectionSearchCriteriaFilterQuerieCollAndFile = @@ -658,6 +703,9 @@ describe('CollectionsRepository', () => { expect(actual.totalItemCount).toBe(1) expect((actual.items[0] as FilePreview).name).toBe(expectedFileName) expect(actual.facets).toEqual(expectedFacetsFromFileOnly) + expect(actual.countPerObjectType.dataverses).toBe(0) + expect(actual.countPerObjectType.datasets).toBe(0) + expect(actual.countPerObjectType.files).toBe(1) }) test('should return error when collection does not exist', async () => { diff --git a/test/integration/metadataBlocks/MetadataBlocksRepository.test.ts b/test/integration/metadataBlocks/MetadataBlocksRepository.test.ts index 3cf9a002..0adab583 100644 --- a/test/integration/metadataBlocks/MetadataBlocksRepository.test.ts +++ b/test/integration/metadataBlocks/MetadataBlocksRepository.test.ts @@ -59,7 +59,7 @@ describe('MetadataBlocksRepository', () => { describe('getAllMetadataBlocks', () => { test('should return all metadata blocks', async () => { const actual = await sut.getAllMetadataBlocks() - expect(actual.length).toBe(6) + expect(actual.length).toBe(7) expect(actual[0].name).toBe(citationMetadataBlockName) expect(actual[0].metadataFields.title.name).toBe('title') }) diff --git a/test/integration/metadataBlocks/MetadataFieldsInfoRepository.test.ts b/test/integration/metadataBlocks/MetadataFieldsInfoRepository.test.ts index ffd2e394..de94eb7c 100644 --- a/test/integration/metadataBlocks/MetadataFieldsInfoRepository.test.ts +++ b/test/integration/metadataBlocks/MetadataFieldsInfoRepository.test.ts @@ -19,7 +19,7 @@ describe('getAllFacetableMetadataFields', () => { test('should return all facetable metadata fields', async () => { const actual = await sut.getAllFacetableMetadataFields() - expect(actual.length).toBe(59) + expect(actual.length).toBe(64) expect(actual[0].name).toBe('authorName') expect(actual[0].displayName).toBe('Author Name') }) diff --git a/test/unit/collections/CollectionsRepository.test.ts b/test/unit/collections/CollectionsRepository.test.ts index d7a0af31..0c4bfb94 100644 --- a/test/unit/collections/CollectionsRepository.test.ts +++ b/test/unit/collections/CollectionsRepository.test.ts @@ -373,11 +373,17 @@ describe('CollectionsRepository', () => { ] const testTotalCount = 2 const testFacets = createCollectionItemsFacetsModel() + const testCountPerObjectType = { + dataverses: 0, + datasets: 1, + files: 1 + } const testItemSubset: CollectionItemSubset = { items: testItems, facets: testFacets, - totalItemCount: testTotalCount + totalItemCount: testTotalCount, + countPerObjectType: testCountPerObjectType } const testItemPreviewsResponse = { @@ -390,7 +396,12 @@ describe('CollectionsRepository', () => { createFilePreviewPayload(), createCollectionPreviewPayload() ], - facets: createCollectionItemsFacetsPayload() + facets: createCollectionItemsFacetsPayload(), + total_count_per_object_type: { + Dataverses: 0, + Datasets: 1, + Files: 1 + } } } } @@ -407,7 +418,8 @@ describe('CollectionsRepository', () => { [GetCollectionItemsQueryParams.QUERY]: '*', [GetCollectionItemsQueryParams.SHOW_FACETS]: 'true', [GetCollectionItemsQueryParams.SORT]: SortType.DATE, - [GetCollectionItemsQueryParams.ORDER]: OrderType.DESC + [GetCollectionItemsQueryParams.ORDER]: OrderType.DESC, + [GetCollectionItemsQueryParams.SHOW_TYPE_COUNTS]: 'true' }) const expectedRequestConfigApiKey = { @@ -452,6 +464,7 @@ describe('CollectionsRepository', () => { [GetCollectionItemsQueryParams.SHOW_FACETS]: 'true', [GetCollectionItemsQueryParams.SORT]: SortType.DATE, [GetCollectionItemsQueryParams.ORDER]: OrderType.DESC, + [GetCollectionItemsQueryParams.SHOW_TYPE_COUNTS]: 'true', [GetCollectionItemsQueryParams.PER_PAGE]: testLimit.toString(), [GetCollectionItemsQueryParams.START]: testOffset.toString() }) @@ -499,6 +512,7 @@ describe('CollectionsRepository', () => { [GetCollectionItemsQueryParams.SHOW_FACETS]: 'true', [GetCollectionItemsQueryParams.SORT]: SortType.DATE, [GetCollectionItemsQueryParams.ORDER]: OrderType.DESC, + [GetCollectionItemsQueryParams.SHOW_TYPE_COUNTS]: 'true', [GetCollectionItemsQueryParams.SUBTREE]: testCollectionId }) @@ -542,7 +556,8 @@ describe('CollectionsRepository', () => { [GetCollectionItemsQueryParams.QUERY]: '*', [GetCollectionItemsQueryParams.SHOW_FACETS]: 'true', [GetCollectionItemsQueryParams.SORT]: SortType.DATE, - [GetCollectionItemsQueryParams.ORDER]: OrderType.DESC + [GetCollectionItemsQueryParams.ORDER]: OrderType.DESC, + [GetCollectionItemsQueryParams.SHOW_TYPE_COUNTS]: 'true' }) const expectedRequestConfigApiKey = { diff --git a/test/unit/collections/GetCollectionItems.test.ts b/test/unit/collections/GetCollectionItems.test.ts index 8c83ae95..a1eb9936 100644 --- a/test/unit/collections/GetCollectionItems.test.ts +++ b/test/unit/collections/GetCollectionItems.test.ts @@ -18,11 +18,17 @@ describe('execute', () => { ] const testTotalCount = 3 const testFacets = createCollectionItemsFacetsModel() + const testCountPerObjectType = { + dataverses: 1, + datasets: 1, + files: 1 + } const testItemSubset: CollectionItemSubset = { items: testItems, facets: testFacets, - totalItemCount: testTotalCount + totalItemCount: testTotalCount, + countPerObjectType: testCountPerObjectType } beforeEach(() => {