Skip to content

Commit 4f3d824

Browse files
authored
Merge pull request #240 from IQSS/feat/233-count-per-object-extension
Get Collection Items extension - Count per object type
2 parents 3ebfc7d + 44b47cc commit 4f3d824

File tree

7 files changed

+102
-8
lines changed

7 files changed

+102
-8
lines changed

src/collections/domain/models/CollectionItemSubset.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export interface CollectionItemSubset {
66
items: (CollectionPreview | DatasetPreview | FilePreview)[]
77
facets: CollectionItemsFacet[]
88
totalItemCount: number
9+
countPerObjectType: CountPerObjectType
910
}
1011

1112
export interface CollectionItemsFacet {
@@ -18,3 +19,9 @@ interface CollectionItemsFacetLabel {
1819
name: string
1920
count: number
2021
}
22+
23+
interface CountPerObjectType {
24+
dataverses: number
25+
datasets: number
26+
files: number
27+
}

src/collections/infra/repositories/CollectionsRepository.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ export enum GetCollectionItemsQueryParams {
5757
PER_PAGE = 'per_page',
5858
START = 'start',
5959
TYPE = 'type',
60-
FILTERQUERY = 'fq'
60+
FILTERQUERY = 'fq',
61+
SHOW_TYPE_COUNTS = 'show_type_counts'
6162
}
6263

6364
export class CollectionsRepository extends ApiRepository implements ICollectionsRepository {
@@ -135,7 +136,8 @@ export class CollectionsRepository extends ApiRepository implements ICollections
135136
[GetCollectionItemsQueryParams.QUERY]: '*',
136137
[GetCollectionItemsQueryParams.SHOW_FACETS]: 'true',
137138
[GetCollectionItemsQueryParams.SORT]: SortType.DATE,
138-
[GetCollectionItemsQueryParams.ORDER]: OrderType.DESC
139+
[GetCollectionItemsQueryParams.ORDER]: OrderType.DESC,
140+
[GetCollectionItemsQueryParams.SHOW_TYPE_COUNTS]: 'true'
139141
})
140142

141143
if (collectionId) {
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export interface CollectionItemsCountPerObjectTypePayload {
2+
Dataverses: number
3+
Datasets: number
4+
Files: number
5+
}

src/collections/infra/repositories/transformers/collectionTransformers.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { CollectionPreview } from '../../../domain/models/CollectionPreview'
2525
import { CollectionContact } from '../../../domain/models/CollectionContact'
2626
import { CollectionType } from '../../../domain/models/CollectionType'
2727
import { CollectionItemsFacetPayload } from './CollectionItemsFacetsPayload'
28+
import { CollectionItemsCountPerObjectTypePayload } from './CollectionItemsCountPerObjectTypePayload'
2829

2930
export const transformCollectionResponseToCollection = (response: AxiosResponse): Collection => {
3031
const collectionPayload = response.data.data
@@ -84,6 +85,9 @@ export const transformCollectionItemsResponseToCollectionItemSubset = (
8485
const responseDataPayload = response.data.data
8586
const itemsPayload = responseDataPayload.items
8687
const facetsPayload = responseDataPayload.facets as CollectionItemsFacetPayload
88+
const countPerObjectTypePayload = responseDataPayload[
89+
'total_count_per_object_type'
90+
] as CollectionItemsCountPerObjectTypePayload
8791

8892
const items: (DatasetPreview | FilePreview | CollectionPreview)[] = []
8993

@@ -116,10 +120,17 @@ export const transformCollectionItemsResponseToCollectionItemSubset = (
116120
})
117121
)
118122

123+
const countPerObjectType = {
124+
dataverses: countPerObjectTypePayload['Dataverses'],
125+
datasets: countPerObjectTypePayload['Datasets'],
126+
files: countPerObjectTypePayload['Files']
127+
}
128+
119129
return {
120130
items,
121131
facets,
122-
totalItemCount: responseDataPayload.total_count
132+
totalItemCount: responseDataPayload.total_count,
133+
countPerObjectType
123134
}
124135
}
125136

test/integration/collections/CollectionsRepository.test.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,9 @@ describe('CollectionsRepository', () => {
425425
expect(actualCollectionPreview.type).toBe(CollectionItemType.COLLECTION)
426426

427427
expect(actual.totalItemCount).toBe(3)
428+
expect(actual.countPerObjectType.dataverses).toBe(1)
429+
expect(actual.countPerObjectType.datasets).toBe(1)
430+
expect(actual.countPerObjectType.files).toBe(1)
428431

429432
expect(actual.facets).toEqual(expectedFacetsAll)
430433

@@ -446,6 +449,9 @@ describe('CollectionsRepository', () => {
446449
)
447450
expect(actual.totalItemCount).toBe(1)
448451
expect((actual.items[0] as FilePreview).name).toBe(expectedFileName)
452+
expect(actual.countPerObjectType.dataverses).toBe(0)
453+
expect(actual.countPerObjectType.datasets).toBe(0)
454+
expect(actual.countPerObjectType.files).toBe(1)
449455

450456
const collectionSearchCriteriaForDataset = new CollectionSearchCriteria().withSearchText(
451457
'This is the description'
@@ -458,6 +464,9 @@ describe('CollectionsRepository', () => {
458464
)
459465
expect(actual.totalItemCount).toBe(1)
460466
expect((actual.items[0] as DatasetPreview).title).toBe(expectedDatasetDescription)
467+
expect(actual.countPerObjectType.dataverses).toBe(0)
468+
expect(actual.countPerObjectType.datasets).toBe(1)
469+
expect(actual.countPerObjectType.files).toBe(0)
461470

462471
const collectionSearchCriteriaForDatasetAndCollection =
463472
new CollectionSearchCriteria().withSearchText('the')
@@ -470,6 +479,9 @@ describe('CollectionsRepository', () => {
470479
expect(actual.totalItemCount).toBe(2)
471480
expect((actual.items[0] as DatasetPreview).title).toBe(expectedDatasetDescription)
472481
expect((actual.items[1] as CollectionPreview).name).toBe(expectedCollectionsName)
482+
expect(actual.countPerObjectType.dataverses).toBe(1)
483+
expect(actual.countPerObjectType.datasets).toBe(1)
484+
expect(actual.countPerObjectType.files).toBe(0)
473485

474486
// Test search text, limit and offset
475487
actual = await sut.getCollectionItems(
@@ -481,6 +493,9 @@ describe('CollectionsRepository', () => {
481493
expect(actual.items.length).toBe(1)
482494
expect(actual.totalItemCount).toBe(2)
483495
expect((actual.items[0] as CollectionPreview).name).toBe(expectedCollectionsName)
496+
expect(actual.countPerObjectType.dataverses).toBe(1)
497+
expect(actual.countPerObjectType.datasets).toBe(1)
498+
expect(actual.countPerObjectType.files).toBe(0)
484499

485500
// Test type collection
486501
const collectionSearchCriteriaForCollectionType =
@@ -495,6 +510,9 @@ describe('CollectionsRepository', () => {
495510
expect(actual.totalItemCount).toBe(1)
496511
expect((actual.items[0] as CollectionPreview).name).toBe(expectedCollectionsName)
497512
expect(actual.facets).toEqual(expectedFacetsFromCollectionOnly)
513+
expect(actual.countPerObjectType.dataverses).toBe(1)
514+
expect(actual.countPerObjectType.datasets).toBe(0)
515+
expect(actual.countPerObjectType.files).toBe(0)
498516

499517
// Test type dataset
500518
const collectionSearchCriteriaForDatasetType = new CollectionSearchCriteria().withItemTypes([
@@ -510,6 +528,9 @@ describe('CollectionsRepository', () => {
510528
expect(actual.totalItemCount).toBe(1)
511529
expect((actual.items[0] as DatasetPreview).title).toBe(expectedDatasetDescription)
512530
expect(actual.facets).toEqual(expectedFacetsFromDatasetOnly)
531+
expect(actual.countPerObjectType.dataverses).toBe(0)
532+
expect(actual.countPerObjectType.datasets).toBe(1)
533+
expect(actual.countPerObjectType.files).toBe(0)
513534

514535
// Test type file
515536
const collectionSearchCriteriaForFileType = new CollectionSearchCriteria().withItemTypes([
@@ -525,6 +546,9 @@ describe('CollectionsRepository', () => {
525546
expect(actual.totalItemCount).toBe(1)
526547
expect((actual.items[0] as FilePreview).name).toBe(expectedFileName)
527548
expect(actual.facets).toEqual(expectedFacetsFromFileOnly)
549+
expect(actual.countPerObjectType.dataverses).toBe(0)
550+
expect(actual.countPerObjectType.datasets).toBe(0)
551+
expect(actual.countPerObjectType.files).toBe(1)
528552

529553
// Test multiple types
530554
const collectionSearchCriteriaForMultiTypes = new CollectionSearchCriteria().withItemTypes([
@@ -542,6 +566,9 @@ describe('CollectionsRepository', () => {
542566
expect((actual.items[0] as FilePreview).name).toBe(expectedFileName)
543567
expect((actual.items[1] as CollectionPreview).name).toBe(expectedCollectionsName)
544568
expect(actual.facets).toEqual(expectedFacetsFromCollectionAndFile)
569+
expect(actual.countPerObjectType.dataverses).toBe(1)
570+
expect(actual.countPerObjectType.datasets).toBe(0)
571+
expect(actual.countPerObjectType.files).toBe(1)
545572

546573
// Test Sort by name ascending
547574
const collectionSearchCriteriaNameAscending = new CollectionSearchCriteria()
@@ -559,6 +586,9 @@ describe('CollectionsRepository', () => {
559586
expect((actual.items[0] as DatasetPreview).type).toBe(CollectionItemType.DATASET)
560587
expect((actual.items[1] as CollectionPreview).type).toBe(CollectionItemType.COLLECTION)
561588
expect((actual.items[2] as FilePreview).type).toBe(CollectionItemType.FILE)
589+
expect(actual.countPerObjectType.dataverses).toBe(1)
590+
expect(actual.countPerObjectType.datasets).toBe(1)
591+
expect(actual.countPerObjectType.files).toBe(1)
562592

563593
// Test Sort by name descending
564594
const collectionSearchCriteriaNameDescending = new CollectionSearchCriteria()
@@ -576,6 +606,9 @@ describe('CollectionsRepository', () => {
576606
expect((actual.items[0] as FilePreview).type).toBe(CollectionItemType.FILE)
577607
expect((actual.items[1] as CollectionPreview).type).toBe(CollectionItemType.COLLECTION)
578608
expect((actual.items[2] as DatasetPreview).type).toBe(CollectionItemType.DATASET)
609+
expect(actual.countPerObjectType.dataverses).toBe(1)
610+
expect(actual.countPerObjectType.datasets).toBe(1)
611+
expect(actual.countPerObjectType.files).toBe(1)
579612

580613
// Test Sort by date ascending
581614
const collectionSearchCriteriaDateAscending = new CollectionSearchCriteria()
@@ -593,6 +626,9 @@ describe('CollectionsRepository', () => {
593626
expect((actual.items[0] as CollectionPreview).type).toBe(CollectionItemType.COLLECTION)
594627
expect((actual.items[1] as DatasetPreview).type).toBe(CollectionItemType.DATASET)
595628
expect((actual.items[2] as FilePreview).type).toBe(CollectionItemType.FILE)
629+
expect(actual.countPerObjectType.dataverses).toBe(1)
630+
expect(actual.countPerObjectType.datasets).toBe(1)
631+
expect(actual.countPerObjectType.files).toBe(1)
596632

597633
// Test Sort by date descending
598634
const collectionSearchCriteriaDateDescending = new CollectionSearchCriteria()
@@ -610,6 +646,9 @@ describe('CollectionsRepository', () => {
610646
expect((actual.items[0] as FilePreview).type).toBe(CollectionItemType.FILE)
611647
expect((actual.items[1] as DatasetPreview).type).toBe(CollectionItemType.DATASET)
612648
expect((actual.items[2] as CollectionPreview).type).toBe(CollectionItemType.COLLECTION)
649+
expect(actual.countPerObjectType.dataverses).toBe(1)
650+
expect(actual.countPerObjectType.datasets).toBe(1)
651+
expect(actual.countPerObjectType.files).toBe(1)
613652

614653
// Test with Filter query related to the collection
615654
const collectionSearchCriteriaFilterQueryCollection =
@@ -625,6 +664,9 @@ describe('CollectionsRepository', () => {
625664
expect(actual.totalItemCount).toBe(1)
626665
expect((actual.items[0] as CollectionPreview).name).toBe(expectedCollectionsName)
627666
expect(actual.facets).toEqual(expectedFacetsFromCollectionOnly)
667+
expect(actual.countPerObjectType.dataverses).toBe(1)
668+
expect(actual.countPerObjectType.datasets).toBe(0)
669+
expect(actual.countPerObjectType.files).toBe(0)
628670

629671
// Test with Filter query related to the dataset
630672
const collectionSearchCriteriaFilterQueryDataset =
@@ -642,6 +684,9 @@ describe('CollectionsRepository', () => {
642684
expect(actual.totalItemCount).toBe(1)
643685
expect((actual.items[0] as DatasetPreview).title).toBe(expectedDatasetDescription)
644686
expect(actual.facets).toEqual(expectedFacetsFromDatasetOnly)
687+
expect(actual.countPerObjectType.dataverses).toBe(0)
688+
expect(actual.countPerObjectType.datasets).toBe(1)
689+
expect(actual.countPerObjectType.files).toBe(0)
645690

646691
// Test with Filter query related to the file
647692
const collectionSearchCriteriaFilterQuerieCollAndFile =
@@ -658,6 +703,9 @@ describe('CollectionsRepository', () => {
658703
expect(actual.totalItemCount).toBe(1)
659704
expect((actual.items[0] as FilePreview).name).toBe(expectedFileName)
660705
expect(actual.facets).toEqual(expectedFacetsFromFileOnly)
706+
expect(actual.countPerObjectType.dataverses).toBe(0)
707+
expect(actual.countPerObjectType.datasets).toBe(0)
708+
expect(actual.countPerObjectType.files).toBe(1)
661709
})
662710

663711
test('should return error when collection does not exist', async () => {

test/unit/collections/CollectionsRepository.test.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -373,11 +373,17 @@ describe('CollectionsRepository', () => {
373373
]
374374
const testTotalCount = 2
375375
const testFacets = createCollectionItemsFacetsModel()
376+
const testCountPerObjectType = {
377+
dataverses: 0,
378+
datasets: 1,
379+
files: 1
380+
}
376381

377382
const testItemSubset: CollectionItemSubset = {
378383
items: testItems,
379384
facets: testFacets,
380-
totalItemCount: testTotalCount
385+
totalItemCount: testTotalCount,
386+
countPerObjectType: testCountPerObjectType
381387
}
382388

383389
const testItemPreviewsResponse = {
@@ -390,7 +396,12 @@ describe('CollectionsRepository', () => {
390396
createFilePreviewPayload(),
391397
createCollectionPreviewPayload()
392398
],
393-
facets: createCollectionItemsFacetsPayload()
399+
facets: createCollectionItemsFacetsPayload(),
400+
total_count_per_object_type: {
401+
Dataverses: 0,
402+
Datasets: 1,
403+
Files: 1
404+
}
394405
}
395406
}
396407
}
@@ -407,7 +418,8 @@ describe('CollectionsRepository', () => {
407418
[GetCollectionItemsQueryParams.QUERY]: '*',
408419
[GetCollectionItemsQueryParams.SHOW_FACETS]: 'true',
409420
[GetCollectionItemsQueryParams.SORT]: SortType.DATE,
410-
[GetCollectionItemsQueryParams.ORDER]: OrderType.DESC
421+
[GetCollectionItemsQueryParams.ORDER]: OrderType.DESC,
422+
[GetCollectionItemsQueryParams.SHOW_TYPE_COUNTS]: 'true'
411423
})
412424

413425
const expectedRequestConfigApiKey = {
@@ -452,6 +464,7 @@ describe('CollectionsRepository', () => {
452464
[GetCollectionItemsQueryParams.SHOW_FACETS]: 'true',
453465
[GetCollectionItemsQueryParams.SORT]: SortType.DATE,
454466
[GetCollectionItemsQueryParams.ORDER]: OrderType.DESC,
467+
[GetCollectionItemsQueryParams.SHOW_TYPE_COUNTS]: 'true',
455468
[GetCollectionItemsQueryParams.PER_PAGE]: testLimit.toString(),
456469
[GetCollectionItemsQueryParams.START]: testOffset.toString()
457470
})
@@ -499,6 +512,7 @@ describe('CollectionsRepository', () => {
499512
[GetCollectionItemsQueryParams.SHOW_FACETS]: 'true',
500513
[GetCollectionItemsQueryParams.SORT]: SortType.DATE,
501514
[GetCollectionItemsQueryParams.ORDER]: OrderType.DESC,
515+
[GetCollectionItemsQueryParams.SHOW_TYPE_COUNTS]: 'true',
502516
[GetCollectionItemsQueryParams.SUBTREE]: testCollectionId
503517
})
504518

@@ -542,7 +556,8 @@ describe('CollectionsRepository', () => {
542556
[GetCollectionItemsQueryParams.QUERY]: '*',
543557
[GetCollectionItemsQueryParams.SHOW_FACETS]: 'true',
544558
[GetCollectionItemsQueryParams.SORT]: SortType.DATE,
545-
[GetCollectionItemsQueryParams.ORDER]: OrderType.DESC
559+
[GetCollectionItemsQueryParams.ORDER]: OrderType.DESC,
560+
[GetCollectionItemsQueryParams.SHOW_TYPE_COUNTS]: 'true'
546561
})
547562

548563
const expectedRequestConfigApiKey = {

test/unit/collections/GetCollectionItems.test.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,17 @@ describe('execute', () => {
1818
]
1919
const testTotalCount = 3
2020
const testFacets = createCollectionItemsFacetsModel()
21+
const testCountPerObjectType = {
22+
dataverses: 1,
23+
datasets: 1,
24+
files: 1
25+
}
2126

2227
const testItemSubset: CollectionItemSubset = {
2328
items: testItems,
2429
facets: testFacets,
25-
totalItemCount: testTotalCount
30+
totalItemCount: testTotalCount,
31+
countPerObjectType: testCountPerObjectType
2632
}
2733

2834
beforeEach(() => {

0 commit comments

Comments
 (0)