Skip to content

Commit 07e4a4e

Browse files
committed
Added: type filtering to GetCollectionItems
1 parent 4a2001a commit 07e4a4e

File tree

4 files changed

+98
-10
lines changed

4 files changed

+98
-10
lines changed
Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,20 @@
11
export class CollectionSearchCriteria {
2-
constructor(public readonly searchText?: string) {}
2+
constructor(
3+
public readonly searchText?: string,
4+
public readonly itemTypes?: CollectionItemType[]
5+
) {}
36

47
withSearchText(searchText: string | undefined): CollectionSearchCriteria {
5-
return new CollectionSearchCriteria(searchText)
8+
return new CollectionSearchCriteria(searchText, this.itemTypes)
69
}
10+
11+
withItemTypes(itemTypes: CollectionItemType[] | undefined): CollectionSearchCriteria {
12+
return new CollectionSearchCriteria(this.searchText, itemTypes)
13+
}
14+
}
15+
16+
export enum CollectionItemType {
17+
FILE = 'file',
18+
DATASET = 'dataset',
19+
COLLECTION = 'dataverse'
720
}

src/collections/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,7 @@ export { CollectionFacet } from './domain/models/CollectionFacet'
2626
export { CollectionUserPermissions } from './domain/models/CollectionUserPermissions'
2727
export { CollectionDTO, CollectionInputLevelDTO } from './domain/dtos/CollectionDTO'
2828
export { CollectionPreview } from './domain/models/CollectionPreview'
29-
export { CollectionSearchCriteria } from './domain/models/CollectionSearchCriteria'
29+
export {
30+
CollectionSearchCriteria,
31+
CollectionItemType
32+
} from './domain/models/CollectionSearchCriteria'

src/collections/infra/repositories/CollectionsRepository.ts

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ import { CollectionFacet } from '../../domain/models/CollectionFacet'
1111
import { CollectionUserPermissions } from '../../domain/models/CollectionUserPermissions'
1212
import { transformCollectionUserPermissionsResponseToCollectionUserPermissions } from './transformers/collectionUserPermissionsTransformers'
1313
import { CollectionItemSubset } from '../../domain/models/CollectionItemSubset'
14-
import { CollectionSearchCriteria } from '../../domain/models/CollectionSearchCriteria'
14+
import {
15+
CollectionItemType,
16+
CollectionSearchCriteria
17+
} from '../../domain/models/CollectionSearchCriteria'
1518

1619
export interface NewCollectionRequestPayload {
1720
alias: string
@@ -44,6 +47,7 @@ export interface GetCollectionItemsQueryParams {
4447
subtree?: string
4548
per_page?: number
4649
start?: number
50+
type?: string
4751
}
4852

4953
export class CollectionsRepository extends ApiRepository implements ICollectionsRepository {
@@ -139,19 +143,29 @@ export class CollectionsRepository extends ApiRepository implements ICollections
139143
const queryParams: GetCollectionItemsQueryParams = {
140144
q: '*'
141145
}
142-
if (collectionId !== undefined) {
146+
if (collectionId) {
143147
queryParams.subtree = collectionId
144148
}
145-
if (limit !== undefined) {
149+
if (limit) {
146150
queryParams.per_page = limit
147151
}
148-
if (offset !== undefined) {
152+
if (offset) {
149153
queryParams.start = offset
150154
}
151-
if (collectionSearchCriteria !== undefined) {
155+
if (collectionSearchCriteria) {
152156
this.applyCollectionSearchCriteriaToQueryParams(queryParams, collectionSearchCriteria)
153157
}
154-
return this.doGet('/search?sort=date&order=desc', true, queryParams)
158+
159+
let url = '/search?sort=date&order=desc'
160+
161+
if (collectionSearchCriteria?.itemTypes) {
162+
const itemTypesQueryString = collectionSearchCriteria.itemTypes
163+
.map((itemType: CollectionItemType) => `type=${itemType.toString()}`)
164+
.join('&')
165+
url += `&${itemTypesQueryString}`
166+
}
167+
168+
return this.doGet(url, true, queryParams)
155169
.then((response) => transformCollectionItemsResponseToCollectionItemSubset(response))
156170
.catch((error) => {
157171
throw error
@@ -162,7 +176,7 @@ export class CollectionsRepository extends ApiRepository implements ICollections
162176
queryParams: GetCollectionItemsQueryParams,
163177
collectionSearchCriteria: CollectionSearchCriteria
164178
) {
165-
if (collectionSearchCriteria.searchText !== undefined) {
179+
if (collectionSearchCriteria.searchText) {
166180
queryParams.q = encodeURIComponent(collectionSearchCriteria.searchText)
167181
}
168182
}

test/integration/collections/CollectionsRepository.test.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { CollectionsRepository } from '../../../src/collections/infra/repositories/CollectionsRepository'
22
import { TestConstants } from '../../testHelpers/TestConstants'
33
import {
4+
CollectionItemType,
45
CollectionPreview,
56
CollectionSearchCriteria,
67
CreatedDatasetIdentifiers,
@@ -367,6 +368,63 @@ describe('CollectionsRepository', () => {
367368
expect(actual.items.length).toBe(1)
368369
expect(actual.totalItemCount).toBe(2)
369370
expect((actual.items[0] as CollectionPreview).name).toBe(expectedCollectionsName)
371+
372+
// Test type collection
373+
const collectionSearchCriteriaForCollectionType =
374+
new CollectionSearchCriteria().withItemTypes([CollectionItemType.COLLECTION])
375+
actual = await sut.getCollectionItems(
376+
testCollectionAlias,
377+
undefined,
378+
undefined,
379+
collectionSearchCriteriaForCollectionType
380+
)
381+
expect(actual.items.length).toBe(1)
382+
expect(actual.totalItemCount).toBe(1)
383+
expect((actual.items[0] as CollectionPreview).name).toBe(expectedCollectionsName)
384+
385+
// Test type dataset
386+
const collectionSearchCriteriaForDatasetType = new CollectionSearchCriteria().withItemTypes([
387+
CollectionItemType.DATASET
388+
])
389+
actual = await sut.getCollectionItems(
390+
testCollectionAlias,
391+
undefined,
392+
undefined,
393+
collectionSearchCriteriaForDatasetType
394+
)
395+
expect(actual.items.length).toBe(1)
396+
expect(actual.totalItemCount).toBe(1)
397+
expect((actual.items[0] as DatasetPreview).title).toBe(expectedDatasetDescription)
398+
399+
// Test type file
400+
const collectionSearchCriteriaForFileType = new CollectionSearchCriteria().withItemTypes([
401+
CollectionItemType.FILE
402+
])
403+
actual = await sut.getCollectionItems(
404+
testCollectionAlias,
405+
undefined,
406+
undefined,
407+
collectionSearchCriteriaForFileType
408+
)
409+
expect(actual.items.length).toBe(1)
410+
expect(actual.totalItemCount).toBe(1)
411+
expect((actual.items[0] as FilePreview).name).toBe(expectedFileName)
412+
413+
// Test multiple types
414+
const collectionSearchCriteriaForMultiTypes = new CollectionSearchCriteria().withItemTypes([
415+
CollectionItemType.FILE,
416+
CollectionItemType.COLLECTION
417+
])
418+
actual = await sut.getCollectionItems(
419+
testCollectionAlias,
420+
undefined,
421+
undefined,
422+
collectionSearchCriteriaForMultiTypes
423+
)
424+
expect(actual.items.length).toBe(2)
425+
expect(actual.totalItemCount).toBe(2)
426+
expect((actual.items[0] as FilePreview).name).toBe(expectedFileName)
427+
expect((actual.items[1] as CollectionPreview).name).toBe(expectedCollectionsName)
370428
})
371429

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

0 commit comments

Comments
 (0)