Skip to content

Commit

Permalink
feat: add show_facets as default param and use search params object
Browse files Browse the repository at this point in the history
  • Loading branch information
g-saracca committed Dec 5, 2024
1 parent f21affc commit 5c22df8
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 49 deletions.
10 changes: 10 additions & 0 deletions src/collections/domain/models/GetCollectionItemsQueryParams.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
export enum GetCollectionItemsQueryParams {
QUERY = 'q',
SHOW_FACETS = 'show_facets',
SORT = 'sort',
ORDER = 'order',
SUBTREE = 'subtree',
PER_PAGE = 'per_page',
START = 'start',
TYPE = 'type'
}
59 changes: 28 additions & 31 deletions src/collections/infra/repositories/CollectionsRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { transformCollectionUserPermissionsResponseToCollectionUserPermissions }
import { CollectionItemSubset } from '../../domain/models/CollectionItemSubset'
import { CollectionSearchCriteria } from '../../domain/models/CollectionSearchCriteria'
import { CollectionItemType } from '../../domain/models/CollectionItemType'
import { GetCollectionItemsQueryParams } from '../../domain/models/GetCollectionItemsQueryParams'

export interface NewCollectionRequestPayload {
alias: string
Expand Down Expand Up @@ -40,14 +41,6 @@ export interface NewCollectionInputLevelRequestPayload {
required: boolean
}

export interface GetCollectionItemsQueryParams {
q: string
subtree?: string
per_page?: number
start?: number
type?: string
}

export class CollectionsRepository extends ApiRepository implements ICollectionsRepository {
private readonly collectionsResourceName: string = 'dataverses'

Expand Down Expand Up @@ -119,37 +112,30 @@ export class CollectionsRepository extends ApiRepository implements ICollections
offset?: number,
collectionSearchCriteria?: CollectionSearchCriteria
): Promise<CollectionItemSubset> {
const queryParams: GetCollectionItemsQueryParams = {
q: '*'
}
const queryParams = new URLSearchParams({
[GetCollectionItemsQueryParams.QUERY]: '*',
[GetCollectionItemsQueryParams.SHOW_FACETS]: 'true',
[GetCollectionItemsQueryParams.SORT]: 'date',
[GetCollectionItemsQueryParams.ORDER]: 'desc'
})

if (collectionId) {
queryParams.subtree = collectionId
queryParams.set(GetCollectionItemsQueryParams.SUBTREE, collectionId)
}

if (limit) {
queryParams.per_page = limit
queryParams.set(GetCollectionItemsQueryParams.PER_PAGE, limit.toString())
}

if (offset) {
queryParams.start = offset
queryParams.set(GetCollectionItemsQueryParams.START, offset.toString())
}

if (collectionSearchCriteria) {
this.applyCollectionSearchCriteriaToQueryParams(queryParams, collectionSearchCriteria)
}

let url = '/search?sort=date&order=desc'

if (collectionSearchCriteria?.itemTypes) {
const itemTypesQueryString = collectionSearchCriteria.itemTypes
.map((itemType: CollectionItemType) => {
const mappedItemType =
itemType === CollectionItemType.COLLECTION ? 'dataverse' : itemType.toString()
return `type=${mappedItemType}`
})
.join('&')

url += `&${itemTypesQueryString}`
}

return this.doGet(url, true, queryParams)
return this.doGet('/search', true, queryParams)
.then((response) => transformCollectionItemsResponseToCollectionItemSubset(response))
.catch((error) => {
throw error
Expand Down Expand Up @@ -201,11 +187,22 @@ export class CollectionsRepository extends ApiRepository implements ICollections
}

private applyCollectionSearchCriteriaToQueryParams(
queryParams: GetCollectionItemsQueryParams,
queryParams: URLSearchParams,
collectionSearchCriteria: CollectionSearchCriteria
) {
if (collectionSearchCriteria.searchText) {
queryParams.q = encodeURIComponent(collectionSearchCriteria.searchText)
queryParams.set(
GetCollectionItemsQueryParams.QUERY,
encodeURIComponent(collectionSearchCriteria.searchText)
)
}

if (collectionSearchCriteria?.itemTypes) {
collectionSearchCriteria.itemTypes.forEach((itemType) => {
const mappedItemType = itemType === CollectionItemType.COLLECTION ? 'dataverse' : itemType

queryParams.append(GetCollectionItemsQueryParams.TYPE, mappedItemType)
})
}
}
}
2 changes: 1 addition & 1 deletion src/core/infra/repositories/ApiRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export abstract class ApiRepository {
public async doGet(
apiEndpoint: string,
authRequired = false,
queryParams: object = {}
queryParams: object | URLSearchParams = {}
): Promise<AxiosResponse> {
return await axios
.get(buildRequestUrl(apiEndpoint), buildRequestConfig(authRequired, queryParams))
Expand Down
2 changes: 1 addition & 1 deletion src/core/infra/repositories/apiConfigBuilders.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { ApiConstants } from './ApiConstants'

export const buildRequestConfig = (
authRequired: boolean,
queryParams: object,
queryParams: object | URLSearchParams,
contentType: string = ApiConstants.CONTENT_TYPE_APPLICATION_JSON,
abortSignal?: AbortSignal
): AxiosRequestConfig => {
Expand Down
56 changes: 40 additions & 16 deletions test/unit/collections/CollectionsRepository.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import {
createCollectionPreviewModel,
createCollectionPreviewPayload
} from '../../testHelpers/collections/collectionPreviewHelper'
import { GetCollectionItemsQueryParams } from '../../../src/collections/domain/models/GetCollectionItemsQueryParams'

describe('CollectionsRepository', () => {
const sut: CollectionsRepository = new CollectionsRepository()
Expand Down Expand Up @@ -381,17 +382,20 @@ describe('CollectionsRepository', () => {
}
}

const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/search?sort=date&order=desc`
const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/search`

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

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

const expectedRequestParams = {
q: '*'
}
const expectedRequestParams = new URLSearchParams({
[GetCollectionItemsQueryParams.QUERY]: '*',
[GetCollectionItemsQueryParams.SHOW_FACETS]: 'true',
[GetCollectionItemsQueryParams.SORT]: 'date',
[GetCollectionItemsQueryParams.ORDER]: 'desc'
})

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

const expectedRequestParamsWithPagination = {
q: '*',
per_page: testLimit,
start: testOffset
}
const expectedRequestParamsWithPagination = new URLSearchParams({
[GetCollectionItemsQueryParams.QUERY]: '*',
[GetCollectionItemsQueryParams.SHOW_FACETS]: 'true',
[GetCollectionItemsQueryParams.SORT]: 'date',
[GetCollectionItemsQueryParams.ORDER]: 'desc'
})

expectedRequestParamsWithPagination.set(
GetCollectionItemsQueryParams.PER_PAGE,
testLimit.toString()
)
expectedRequestParamsWithPagination.set(
GetCollectionItemsQueryParams.START,
testOffset.toString()
)

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

const expectedRequestParamsWithCollectionId = {
q: '*',
subtree: testCollectionId
}
const expectedRequestParamsWithCollectionId = new URLSearchParams({
[GetCollectionItemsQueryParams.QUERY]: '*',
[GetCollectionItemsQueryParams.SHOW_FACETS]: 'true',
[GetCollectionItemsQueryParams.SORT]: 'date',
[GetCollectionItemsQueryParams.ORDER]: 'desc'
})

expectedRequestParamsWithCollectionId.set(
GetCollectionItemsQueryParams.SUBTREE,
testCollectionId
)

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

const expectedRequestParams = {
q: '*'
}
const expectedRequestParams = new URLSearchParams({
[GetCollectionItemsQueryParams.QUERY]: '*',
[GetCollectionItemsQueryParams.SHOW_FACETS]: 'true',
[GetCollectionItemsQueryParams.SORT]: 'date',
[GetCollectionItemsQueryParams.ORDER]: 'desc'
})

const expectedRequestConfigApiKey = {
params: expectedRequestParams,
Expand Down

0 comments on commit 5c22df8

Please sign in to comment.