Skip to content

Commit 5c22df8

Browse files
committed
feat: add show_facets as default param and use search params object
1 parent f21affc commit 5c22df8

File tree

5 files changed

+80
-49
lines changed

5 files changed

+80
-49
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export enum GetCollectionItemsQueryParams {
2+
QUERY = 'q',
3+
SHOW_FACETS = 'show_facets',
4+
SORT = 'sort',
5+
ORDER = 'order',
6+
SUBTREE = 'subtree',
7+
PER_PAGE = 'per_page',
8+
START = 'start',
9+
TYPE = 'type'
10+
}

src/collections/infra/repositories/CollectionsRepository.ts

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { transformCollectionUserPermissionsResponseToCollectionUserPermissions }
1313
import { CollectionItemSubset } from '../../domain/models/CollectionItemSubset'
1414
import { CollectionSearchCriteria } from '../../domain/models/CollectionSearchCriteria'
1515
import { CollectionItemType } from '../../domain/models/CollectionItemType'
16+
import { GetCollectionItemsQueryParams } from '../../domain/models/GetCollectionItemsQueryParams'
1617

1718
export interface NewCollectionRequestPayload {
1819
alias: string
@@ -40,14 +41,6 @@ export interface NewCollectionInputLevelRequestPayload {
4041
required: boolean
4142
}
4243

43-
export interface GetCollectionItemsQueryParams {
44-
q: string
45-
subtree?: string
46-
per_page?: number
47-
start?: number
48-
type?: string
49-
}
50-
5144
export class CollectionsRepository extends ApiRepository implements ICollectionsRepository {
5245
private readonly collectionsResourceName: string = 'dataverses'
5346

@@ -119,37 +112,30 @@ export class CollectionsRepository extends ApiRepository implements ICollections
119112
offset?: number,
120113
collectionSearchCriteria?: CollectionSearchCriteria
121114
): Promise<CollectionItemSubset> {
122-
const queryParams: GetCollectionItemsQueryParams = {
123-
q: '*'
124-
}
115+
const queryParams = new URLSearchParams({
116+
[GetCollectionItemsQueryParams.QUERY]: '*',
117+
[GetCollectionItemsQueryParams.SHOW_FACETS]: 'true',
118+
[GetCollectionItemsQueryParams.SORT]: 'date',
119+
[GetCollectionItemsQueryParams.ORDER]: 'desc'
120+
})
121+
125122
if (collectionId) {
126-
queryParams.subtree = collectionId
123+
queryParams.set(GetCollectionItemsQueryParams.SUBTREE, collectionId)
127124
}
125+
128126
if (limit) {
129-
queryParams.per_page = limit
127+
queryParams.set(GetCollectionItemsQueryParams.PER_PAGE, limit.toString())
130128
}
129+
131130
if (offset) {
132-
queryParams.start = offset
131+
queryParams.set(GetCollectionItemsQueryParams.START, offset.toString())
133132
}
133+
134134
if (collectionSearchCriteria) {
135135
this.applyCollectionSearchCriteriaToQueryParams(queryParams, collectionSearchCriteria)
136136
}
137137

138-
let url = '/search?sort=date&order=desc'
139-
140-
if (collectionSearchCriteria?.itemTypes) {
141-
const itemTypesQueryString = collectionSearchCriteria.itemTypes
142-
.map((itemType: CollectionItemType) => {
143-
const mappedItemType =
144-
itemType === CollectionItemType.COLLECTION ? 'dataverse' : itemType.toString()
145-
return `type=${mappedItemType}`
146-
})
147-
.join('&')
148-
149-
url += `&${itemTypesQueryString}`
150-
}
151-
152-
return this.doGet(url, true, queryParams)
138+
return this.doGet('/search', true, queryParams)
153139
.then((response) => transformCollectionItemsResponseToCollectionItemSubset(response))
154140
.catch((error) => {
155141
throw error
@@ -201,11 +187,22 @@ export class CollectionsRepository extends ApiRepository implements ICollections
201187
}
202188

203189
private applyCollectionSearchCriteriaToQueryParams(
204-
queryParams: GetCollectionItemsQueryParams,
190+
queryParams: URLSearchParams,
205191
collectionSearchCriteria: CollectionSearchCriteria
206192
) {
207193
if (collectionSearchCriteria.searchText) {
208-
queryParams.q = encodeURIComponent(collectionSearchCriteria.searchText)
194+
queryParams.set(
195+
GetCollectionItemsQueryParams.QUERY,
196+
encodeURIComponent(collectionSearchCriteria.searchText)
197+
)
198+
}
199+
200+
if (collectionSearchCriteria?.itemTypes) {
201+
collectionSearchCriteria.itemTypes.forEach((itemType) => {
202+
const mappedItemType = itemType === CollectionItemType.COLLECTION ? 'dataverse' : itemType
203+
204+
queryParams.append(GetCollectionItemsQueryParams.TYPE, mappedItemType)
205+
})
209206
}
210207
}
211208
}

src/core/infra/repositories/ApiRepository.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export abstract class ApiRepository {
88
public async doGet(
99
apiEndpoint: string,
1010
authRequired = false,
11-
queryParams: object = {}
11+
queryParams: object | URLSearchParams = {}
1212
): Promise<AxiosResponse> {
1313
return await axios
1414
.get(buildRequestUrl(apiEndpoint), buildRequestConfig(authRequired, queryParams))

src/core/infra/repositories/apiConfigBuilders.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { ApiConstants } from './ApiConstants'
44

55
export const buildRequestConfig = (
66
authRequired: boolean,
7-
queryParams: object,
7+
queryParams: object | URLSearchParams,
88
contentType: string = ApiConstants.CONTENT_TYPE_APPLICATION_JSON,
99
abortSignal?: AbortSignal
1010
): AxiosRequestConfig => {

test/unit/collections/CollectionsRepository.test.ts

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import {
3131
createCollectionPreviewModel,
3232
createCollectionPreviewPayload
3333
} from '../../testHelpers/collections/collectionPreviewHelper'
34+
import { GetCollectionItemsQueryParams } from '../../../src/collections/domain/models/GetCollectionItemsQueryParams'
3435

3536
describe('CollectionsRepository', () => {
3637
const sut: CollectionsRepository = new CollectionsRepository()
@@ -381,17 +382,20 @@ describe('CollectionsRepository', () => {
381382
}
382383
}
383384

384-
const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/search?sort=date&order=desc`
385+
const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/search`
385386

386387
test('should return item previews when response is successful', async () => {
387388
jest.spyOn(axios, 'get').mockResolvedValue(testItemPreviewsResponse)
388389

389390
// API Key auth
390391
let actual = await sut.getCollectionItems()
391392

392-
const expectedRequestParams = {
393-
q: '*'
394-
}
393+
const expectedRequestParams = new URLSearchParams({
394+
[GetCollectionItemsQueryParams.QUERY]: '*',
395+
[GetCollectionItemsQueryParams.SHOW_FACETS]: 'true',
396+
[GetCollectionItemsQueryParams.SORT]: 'date',
397+
[GetCollectionItemsQueryParams.ORDER]: 'desc'
398+
})
395399

396400
const expectedRequestConfigApiKey = {
397401
params: expectedRequestParams,
@@ -430,11 +434,21 @@ describe('CollectionsRepository', () => {
430434
// API Key auth
431435
let actual = await sut.getCollectionItems(undefined, testLimit, testOffset)
432436

433-
const expectedRequestParamsWithPagination = {
434-
q: '*',
435-
per_page: testLimit,
436-
start: testOffset
437-
}
437+
const expectedRequestParamsWithPagination = new URLSearchParams({
438+
[GetCollectionItemsQueryParams.QUERY]: '*',
439+
[GetCollectionItemsQueryParams.SHOW_FACETS]: 'true',
440+
[GetCollectionItemsQueryParams.SORT]: 'date',
441+
[GetCollectionItemsQueryParams.ORDER]: 'desc'
442+
})
443+
444+
expectedRequestParamsWithPagination.set(
445+
GetCollectionItemsQueryParams.PER_PAGE,
446+
testLimit.toString()
447+
)
448+
expectedRequestParamsWithPagination.set(
449+
GetCollectionItemsQueryParams.START,
450+
testOffset.toString()
451+
)
438452

439453
const expectedRequestConfigApiKeyWithPagination = {
440454
params: expectedRequestParamsWithPagination,
@@ -474,10 +488,17 @@ describe('CollectionsRepository', () => {
474488
// API Key auth
475489
let actual = await sut.getCollectionItems(testCollectionId, undefined, undefined)
476490

477-
const expectedRequestParamsWithCollectionId = {
478-
q: '*',
479-
subtree: testCollectionId
480-
}
491+
const expectedRequestParamsWithCollectionId = new URLSearchParams({
492+
[GetCollectionItemsQueryParams.QUERY]: '*',
493+
[GetCollectionItemsQueryParams.SHOW_FACETS]: 'true',
494+
[GetCollectionItemsQueryParams.SORT]: 'date',
495+
[GetCollectionItemsQueryParams.ORDER]: 'desc'
496+
})
497+
498+
expectedRequestParamsWithCollectionId.set(
499+
GetCollectionItemsQueryParams.SUBTREE,
500+
testCollectionId
501+
)
481502

482503
const expectedRequestConfigApiKeyWithCollectionId = {
483504
params: expectedRequestParamsWithCollectionId,
@@ -515,9 +536,12 @@ describe('CollectionsRepository', () => {
515536
let error = undefined as unknown as ReadError
516537
await sut.getCollectionItems().catch((e) => (error = e))
517538

518-
const expectedRequestParams = {
519-
q: '*'
520-
}
539+
const expectedRequestParams = new URLSearchParams({
540+
[GetCollectionItemsQueryParams.QUERY]: '*',
541+
[GetCollectionItemsQueryParams.SHOW_FACETS]: 'true',
542+
[GetCollectionItemsQueryParams.SORT]: 'date',
543+
[GetCollectionItemsQueryParams.ORDER]: 'desc'
544+
})
521545

522546
const expectedRequestConfigApiKey = {
523547
params: expectedRequestParams,

0 commit comments

Comments
 (0)