Skip to content

Commit a67b55b

Browse files
committed
feat: finish return formatted facets and tests
1 parent 5c22df8 commit a67b55b

File tree

7 files changed

+162
-2
lines changed

7 files changed

+162
-2
lines changed

src/collections/domain/models/CollectionItemSubset.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,20 @@ import { CollectionPreview } from './CollectionPreview'
44

55
export interface CollectionItemSubset {
66
items: (CollectionPreview | DatasetPreview | FilePreview)[]
7+
facets: CollectionItemsFacet[]
78
totalItemCount: number
89
}
10+
11+
export interface CollectionItemsFacet {
12+
[key: string]: CollectionItemsFacetValue
13+
}
14+
15+
interface CollectionItemsFacetValue {
16+
friendly: string
17+
labels: CollectionItemsFacetLabel[]
18+
}
19+
20+
interface CollectionItemsFacetLabel {
21+
name: string
22+
count: number
23+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export type CollectionItemsFacetPayload = [Record<string, CollectionItemsFacetPayloadValue>]
2+
3+
export interface CollectionItemsFacetPayloadValue {
4+
friendly: string
5+
labels: Record<string, number>[]
6+
}

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

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import { transformPayloadToOwnerNode } from '../../../../core/infra/repositories
99
import { transformHtmlToMarkdown } from '../../../../datasets/infra/repositories/transformers/datasetTransformers'
1010
import { CollectionFacet } from '../../../domain/models/CollectionFacet'
1111
import { CollectionFacetPayload } from './CollectionFacetPayload'
12-
import { CollectionItemSubset } from '../../../domain/models/CollectionItemSubset'
12+
import {
13+
CollectionItemsFacet,
14+
CollectionItemSubset
15+
} from '../../../domain/models/CollectionItemSubset'
1316
import { DatasetPreview } from '../../../../datasets'
1417
import { FilePreview } from '../../../../files'
1518
import { DatasetPreviewPayload } from '../../../../datasets/infra/repositories/transformers/DatasetPreviewPayload'
@@ -21,6 +24,7 @@ import { CollectionPreviewPayload } from './CollectionPreviewPayload'
2124
import { CollectionPreview } from '../../../domain/models/CollectionPreview'
2225
import { CollectionContact } from '../../../domain/models/CollectionContact'
2326
import { CollectionType } from '../../../domain/models/CollectionType'
27+
import { CollectionItemsFacetPayload } from './CollectionItemsFacetsPayload'
2428

2529
export const transformCollectionResponseToCollection = (response: AxiosResponse): Collection => {
2630
const collectionPayload = response.data.data
@@ -79,7 +83,10 @@ export const transformCollectionItemsResponseToCollectionItemSubset = (
7983
): CollectionItemSubset => {
8084
const responseDataPayload = response.data.data
8185
const itemsPayload = responseDataPayload.items
86+
const facets = responseDataPayload.facets as CollectionItemsFacetPayload
87+
8288
const items: (DatasetPreview | FilePreview | CollectionPreview)[] = []
89+
8390
itemsPayload.forEach(function (
8491
itemPayload: CollectionPreviewPayload | DatasetPreviewPayload | FilePreviewPayload
8592
) {
@@ -97,8 +104,22 @@ export const transformCollectionItemsResponseToCollectionItemSubset = (
97104
)
98105
}
99106
})
107+
108+
const transformedFacets: CollectionItemsFacet[] = Object.entries(facets[0]).map(
109+
([key, facetData]) => ({
110+
[key]: {
111+
friendly: facetData.friendly,
112+
labels: facetData.labels.map((label: Record<string, number>) => {
113+
const [name, count] = Object.entries(label)[0]
114+
return { name, count }
115+
})
116+
}
117+
})
118+
)
119+
100120
return {
101121
items: items,
122+
facets: transformedFacets,
102123
totalItemCount: responseDataPayload.total_count
103124
}
104125
}

test/integration/collections/CollectionsRepository.test.ts

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,68 @@ describe('CollectionsRepository', () => {
294294
const expectedFileName = 'test-file-1.txt'
295295
const expectedCollectionsName = 'Scientific Research'
296296

297+
//prettier-ignore
298+
const expectedFacetsAll = [
299+
{
300+
dvCategory: { friendly: 'Dataverse Category', labels: [{ name: 'Laboratory', count: 1 }] }
301+
},
302+
{
303+
publicationStatus: { friendly: 'Publication Status', labels: [{ name: 'Unpublished', count: 3 },{ name: 'Draft', count: 2 }] }
304+
},
305+
{
306+
authorName_ss: { friendly: 'Author Name', labels: [{ name: 'Admin, Dataverse', count: 1 },{ name: 'Owner, Dataverse', count: 1 }]}
307+
},
308+
{
309+
subject_ss: { friendly: 'Subject', labels: [{ name: 'Medicine, Health and Life Sciences', count: 1 }]}
310+
},
311+
{
312+
fileTypeGroupFacet: { friendly: 'File Type', labels: [{ name: 'Text', count: 1 }] }
313+
},
314+
{
315+
fileAccess: { friendly: 'Access', labels: [{ name: 'Public', count: 1 }] }
316+
}
317+
]
318+
//prettier-ignore
319+
const expectedFacetsFromCollectionOnly = [
320+
{
321+
dvCategory: { friendly: 'Dataverse Category', labels: [{ name: 'Laboratory', count: 1 }] }
322+
},
323+
{
324+
publicationStatus: { friendly: 'Publication Status', labels: [{ name: 'Unpublished', count: 1 }]}
325+
}
326+
]
327+
//prettier-ignore
328+
const expectedFacetsFromDatasetOnly = [
329+
{
330+
publicationStatus: { friendly: 'Publication Status', labels: [{ name: 'Draft', count: 1 },{ name: 'Unpublished', count: 1 }] }
331+
},
332+
{
333+
authorName_ss: { friendly: 'Author Name', labels: [{ name: 'Admin, Dataverse', count: 1 },{ name: 'Owner, Dataverse', count: 1 }] }
334+
},
335+
{
336+
subject_ss: { friendly: 'Subject', labels: [{ name: 'Medicine, Health and Life Sciences', count: 1 }] }
337+
}
338+
]
339+
//prettier-ignore
340+
const expectedFacetsFromFileOnly = [
341+
{
342+
publicationStatus: { friendly: 'Publication Status', labels: [{ name: 'Draft', count: 1 },{ name: 'Unpublished', count: 1 }] }
343+
},
344+
{ fileTypeGroupFacet: { friendly: 'File Type', labels: [{ name: 'Text', count: 1 }] } },
345+
{ fileAccess: { friendly: 'Access', labels: [{ name: 'Public', count: 1 }] } }
346+
]
347+
//prettier-ignore
348+
const expectedFacetsFromCollectionAndFile = [
349+
{
350+
dvCategory: { friendly: 'Dataverse Category', labels: [{ name: 'Laboratory', count: 1 }] }
351+
},
352+
{
353+
publicationStatus: { friendly: 'Publication Status', labels: [{ name: 'Unpublished', count: 2 },{ name: 'Draft', count: 1 }] }
354+
},
355+
{ fileTypeGroupFacet: { friendly: 'File Type', labels: [{ name: 'Text', count: 1 }] } },
356+
{ fileAccess: { friendly: 'Access', labels: [{ name: 'Public', count: 1 }] } }
357+
]
358+
297359
expect(actualFilePreview.checksum?.type).toBe('MD5')
298360
expect(actualFilePreview.checksum?.value).toBe(expectedFileMd5)
299361
expect(actualFilePreview.datasetCitation).toContain(expectedDatasetCitationFragment)
@@ -347,6 +409,8 @@ describe('CollectionsRepository', () => {
347409

348410
expect(actual.totalItemCount).toBe(3)
349411

412+
expect(actual.facets).toEqual(expectedFacetsAll)
413+
350414
// Test limit and offset
351415
actual = await sut.getCollectionItems(testCollectionAlias, 1, 1)
352416
expect((actual.items[0] as DatasetPreview).persistentId).toBe(testDatasetIds.persistentId)
@@ -413,6 +477,7 @@ describe('CollectionsRepository', () => {
413477
expect(actual.items.length).toBe(1)
414478
expect(actual.totalItemCount).toBe(1)
415479
expect((actual.items[0] as CollectionPreview).name).toBe(expectedCollectionsName)
480+
expect(actual.facets).toEqual(expectedFacetsFromCollectionOnly)
416481

417482
// Test type dataset
418483
const collectionSearchCriteriaForDatasetType = new CollectionSearchCriteria().withItemTypes([
@@ -427,6 +492,7 @@ describe('CollectionsRepository', () => {
427492
expect(actual.items.length).toBe(1)
428493
expect(actual.totalItemCount).toBe(1)
429494
expect((actual.items[0] as DatasetPreview).title).toBe(expectedDatasetDescription)
495+
expect(actual.facets).toEqual(expectedFacetsFromDatasetOnly)
430496

431497
// Test type file
432498
const collectionSearchCriteriaForFileType = new CollectionSearchCriteria().withItemTypes([
@@ -441,6 +507,7 @@ describe('CollectionsRepository', () => {
441507
expect(actual.items.length).toBe(1)
442508
expect(actual.totalItemCount).toBe(1)
443509
expect((actual.items[0] as FilePreview).name).toBe(expectedFileName)
510+
expect(actual.facets).toEqual(expectedFacetsFromFileOnly)
444511

445512
// Test multiple types
446513
const collectionSearchCriteriaForMultiTypes = new CollectionSearchCriteria().withItemTypes([
@@ -457,6 +524,7 @@ describe('CollectionsRepository', () => {
457524
expect(actual.totalItemCount).toBe(2)
458525
expect((actual.items[0] as FilePreview).name).toBe(expectedFileName)
459526
expect((actual.items[1] as CollectionPreview).name).toBe(expectedCollectionsName)
527+
expect(actual.facets).toEqual(expectedFacetsFromCollectionAndFile)
460528
})
461529

462530
test('should return error when collection does not exist', async () => {
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { CollectionItemsFacet } from '../../../src/collections/domain/models/CollectionItemSubset'
2+
import { CollectionItemsFacetPayload } from '../../../src/collections/infra/repositories/transformers/CollectionItemsFacetsPayload'
3+
4+
export const createCollectionItemsFacetsModel = (): CollectionItemsFacet[] => {
5+
return [
6+
{
7+
facet1: {
8+
friendly: 'Facet 1',
9+
labels: [
10+
{ name: 'Label 1', count: 5 },
11+
{ name: 'Label 2', count: 4 }
12+
]
13+
}
14+
},
15+
{
16+
facet2: {
17+
friendly: 'Facet 2',
18+
labels: [
19+
{ name: 'Label 3', count: 8 },
20+
{ name: 'Label 4', count: 9 }
21+
]
22+
}
23+
}
24+
]
25+
}
26+
27+
export const createCollectionItemsFacetsPayload = (): CollectionItemsFacetPayload => {
28+
return [
29+
{
30+
facet1: {
31+
friendly: 'Facet 1',
32+
labels: [{ 'Label 1': 5 }, { 'Label 2': 4 }]
33+
},
34+
facet2: {
35+
friendly: 'Facet 2',
36+
labels: [{ 'Label 3': 8 }, { 'Label 4': 9 }]
37+
}
38+
}
39+
]
40+
}

test/unit/collections/CollectionsRepository.test.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ import {
3232
createCollectionPreviewPayload
3333
} from '../../testHelpers/collections/collectionPreviewHelper'
3434
import { GetCollectionItemsQueryParams } from '../../../src/collections/domain/models/GetCollectionItemsQueryParams'
35+
import {
36+
createCollectionItemsFacetsModel,
37+
createCollectionItemsFacetsPayload
38+
} from '../../testHelpers/collections/collectionItemsFacetsHelper'
3539

3640
describe('CollectionsRepository', () => {
3741
const sut: CollectionsRepository = new CollectionsRepository()
@@ -362,9 +366,11 @@ describe('CollectionsRepository', () => {
362366
createCollectionPreviewModel()
363367
]
364368
const testTotalCount = 2
369+
const testFacets = createCollectionItemsFacetsModel()
365370

366371
const testItemSubset: CollectionItemSubset = {
367372
items: testItems,
373+
facets: testFacets,
368374
totalItemCount: testTotalCount
369375
}
370376

@@ -377,7 +383,8 @@ describe('CollectionsRepository', () => {
377383
createDatasetPreviewPayload(),
378384
createFilePreviewPayload(),
379385
createCollectionPreviewPayload()
380-
]
386+
],
387+
facets: createCollectionItemsFacetsPayload()
381388
}
382389
}
383390
}

test/unit/collections/GetCollectionItems.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { createDatasetPreviewModel } from '../../testHelpers/datasets/datasetPre
55
import { createFilePreviewModel } from '../../testHelpers/files/filePreviewHelper'
66
import { CollectionItemSubset } from '../../../src/collections/domain/models/CollectionItemSubset'
77
import { createCollectionPreviewModel } from '../../testHelpers/collections/collectionPreviewHelper'
8+
import { createCollectionItemsFacetsModel } from '../../testHelpers/collections/collectionItemsFacetsHelper'
89

910
describe('execute', () => {
1011
let collectionRepositoryStub: ICollectionsRepository
@@ -16,9 +17,11 @@ describe('execute', () => {
1617
createCollectionPreviewModel()
1718
]
1819
const testTotalCount = 3
20+
const testFacets = createCollectionItemsFacetsModel()
1921

2022
const testItemSubset: CollectionItemSubset = {
2123
items: testItems,
24+
facets: testFacets,
2225
totalItemCount: testTotalCount
2326
}
2427

0 commit comments

Comments
 (0)