Skip to content

Commit fbead26

Browse files
committed
Added: GetAllFacetableDatasetFields use case
1 parent 8e5c736 commit fbead26

File tree

12 files changed

+238
-12
lines changed

12 files changed

+238
-12
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { MetadataFieldInfo } from '../..'
2+
3+
export interface IMetadataFieldInfosRepository {
4+
getAllFacetableMetadataFields(): Promise<MetadataFieldInfo[]>
5+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { MetadataFieldInfo } from '../..'
3+
import { IMetadataFieldInfosRepository } from '../repositories/IMetadataFieldInfosRepository'
4+
5+
export class GetAllFacetableDatasetFields implements UseCase<MetadataFieldInfo[]> {
6+
private metadataFieldInfosRepository: IMetadataFieldInfosRepository
7+
8+
constructor(metadataFieldInfosRepository: IMetadataFieldInfosRepository) {
9+
this.metadataFieldInfosRepository = metadataFieldInfosRepository
10+
}
11+
12+
/**
13+
* Returns a MetadataFieldInfo array containing all facetable dataset fields defined in the installation.
14+
*
15+
* @returns {Promise<MetadataFieldInfo[]>}
16+
*/
17+
async execute(): Promise<MetadataFieldInfo[]> {
18+
return await this.metadataFieldInfosRepository.getAllFacetableMetadataFields()
19+
}
20+
}

src/metadataBlocks/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
import { GetMetadataBlockByName } from './domain/useCases/GetMetadataBlockByName'
22
import { MetadataBlocksRepository } from './infra/repositories/MetadataBlocksRepository'
33
import { GetCollectionMetadataBlocks } from './domain/useCases/GetCollectionMetadataBlocks'
4+
import { GetAllFacetableDatasetFields } from './domain/useCases/GetAllFacetableDatasetFields'
5+
import { MetadataFieldInfosRepository } from './infra/repositories/MetadataFieldInfosRepository'
46

57
const metadataBlocksRepository = new MetadataBlocksRepository()
8+
const metadataFieldInfosRepository = new MetadataFieldInfosRepository()
69

710
const getMetadataBlockByName = new GetMetadataBlockByName(metadataBlocksRepository)
811
const getCollectionMetadataBlocks = new GetCollectionMetadataBlocks(metadataBlocksRepository)
12+
const getAllFacetableDatasetFields = new GetAllFacetableDatasetFields(metadataFieldInfosRepository)
913

10-
export { getMetadataBlockByName, getCollectionMetadataBlocks }
14+
export { getMetadataBlockByName, getCollectionMetadataBlocks, getAllFacetableDatasetFields }
1115
export {
1216
MetadataBlock,
1317
MetadataFieldInfo,
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { ApiRepository } from '../../../core/infra/repositories/ApiRepository'
2+
import { MetadataFieldInfo } from '../..'
3+
import { IMetadataFieldInfosRepository } from '../../domain/repositories/IMetadataFieldInfosRepository'
4+
import { transformMetadataFieldInfosResponseToMetadataFieldInfos } from './transformers/metadataBlockTransformers'
5+
6+
export class MetadataFieldInfosRepository
7+
extends ApiRepository
8+
implements IMetadataFieldInfosRepository
9+
{
10+
private readonly datasetFieldsResourceName: string = 'datasetfields'
11+
12+
public async getAllFacetableMetadataFields(): Promise<MetadataFieldInfo[]> {
13+
return this.doGet(`/${this.datasetFieldsResourceName}/facetables`, false)
14+
.then((response) => transformMetadataFieldInfosResponseToMetadataFieldInfos(response))
15+
.catch((error) => {
16+
throw error
17+
})
18+
}
19+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
export interface MetadataFieldInfoPayload {
2+
name: string
3+
displayName: string
4+
displayOnCreate: boolean
5+
title: string
6+
type: string
7+
typeClass: string
8+
watermark: string
9+
description: string
10+
multiple: boolean
11+
isControlledVocabulary: boolean
12+
displayFormat: string
13+
displayOrder: number
14+
isRequired: boolean
15+
controlledVocabularyValues?: string[]
16+
childMetadataFields?: Record<string, MetadataFieldInfoPayload>
17+
}

src/metadataBlocks/infra/repositories/transformers/metadataBlockTransformers.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
MetadataFieldWatermark
88
} from '../../../domain/models/MetadataBlock'
99
import { MetadataBlockPayload } from './MetadataBlockPayload'
10+
import { MetadataFieldInfoPayload } from './MetadataFieldInfoPayload'
1011

1112
export const transformMetadataBlocksResponseToMetadataBlocks = (
1213
response: AxiosResponse
@@ -26,6 +27,17 @@ export const transformMetadataBlockResponseToMetadataBlock = (
2627
return transformMetadataBlockPayloadToMetadataBlock(metadataBlockPayload)
2728
}
2829

30+
export const transformMetadataFieldInfosResponseToMetadataFieldInfos = (
31+
response: AxiosResponse
32+
): MetadataFieldInfo[] => {
33+
const metadataFieldInfosPayload = response.data.data
34+
const metadataFieldInfos: MetadataFieldInfo[] = []
35+
metadataFieldInfosPayload.forEach(function (metadataBlockPayload: MetadataFieldInfoPayload) {
36+
metadataFieldInfos.push(transformPayloadMetadataFieldInfo(metadataBlockPayload))
37+
})
38+
return metadataFieldInfos
39+
}
40+
2941
const transformMetadataBlockPayloadToMetadataBlock = (
3042
metadataBlockPayload: MetadataBlockPayload
3143
): MetadataBlock => {
@@ -35,7 +47,9 @@ const transformMetadataBlockPayloadToMetadataBlock = (
3547
Object.keys(metadataBlockFieldsPayload).forEach((metadataFieldKey) => {
3648
const metadataFieldIsAlreadyPresentAsChildField = childFieldKeys.has(metadataFieldKey)
3749
if (!metadataFieldIsAlreadyPresentAsChildField) {
38-
const metadataFieldInfoPayload = metadataBlockFieldsPayload[metadataFieldKey]
50+
const metadataFieldInfoPayload = metadataBlockFieldsPayload[
51+
metadataFieldKey
52+
] as MetadataFieldInfoPayload
3953
metadataFields[metadataFieldKey] = transformPayloadMetadataFieldInfo(metadataFieldInfoPayload)
4054
}
4155
})
@@ -63,8 +77,7 @@ const getChildFieldKeys = (metadataBlockFieldsPayload: Record<string, unknown>):
6377
}
6478

6579
const transformPayloadMetadataFieldInfo = (
66-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
67-
metadataFieldInfoPayload: any,
80+
metadataFieldInfoPayload: MetadataFieldInfoPayload,
6881
isChild = false
6982
): MetadataFieldInfo => {
7083
const metadataFieldInfo: MetadataFieldInfo = {
@@ -86,7 +99,10 @@ const transformPayloadMetadataFieldInfo = (
8699
displayOnCreate: metadataFieldInfoPayload.displayOnCreate
87100
}
88101
if (!isChild && 'childFields' in metadataFieldInfoPayload) {
89-
const childMetadataFieldsPayload = metadataFieldInfoPayload.childFields
102+
const childMetadataFieldsPayload = metadataFieldInfoPayload.childFields as Record<
103+
string,
104+
MetadataFieldInfoPayload
105+
>
90106
const childMetadataFields: Record<string, MetadataFieldInfo> = {}
91107
Object.keys(childMetadataFieldsPayload).map((metadataFieldKey) => {
92108
childMetadataFields[metadataFieldKey] = transformPayloadMetadataFieldInfo(

test/environment/.env

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ POSTGRES_VERSION=13
22
DATAVERSE_DB_USER=dataverse
33
SOLR_VERSION=9.3.0
44
DATAVERSE_IMAGE_REGISTRY=ghcr.io
5-
DATAVERSE_IMAGE_TAG=10633-create-collection-api-ext
5+
DATAVERSE_IMAGE_TAG=10726-facets-api-extension
66
DATAVERSE_BOOTSTRAP_TIMEOUT=5m

test/integration/metadataBlocks/MetadataBlocksRepository.test.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ describe('getMetadataBlockByName', () => {
1010
const sut: MetadataBlocksRepository = new MetadataBlocksRepository()
1111
const citationMetadataBlockName = 'citation'
1212

13-
ApiConfig.init(
14-
TestConstants.TEST_API_URL,
15-
DataverseApiAuthMechanism.API_KEY,
16-
process.env.TEST_API_KEY
17-
)
13+
beforeAll(async () => {
14+
ApiConfig.init(
15+
TestConstants.TEST_API_URL,
16+
DataverseApiAuthMechanism.API_KEY,
17+
process.env.TEST_API_KEY
18+
)
19+
})
1820

1921
test('should return error when metadata block does not exist', async () => {
2022
const nonExistentMetadataBlockName = 'nonExistentMetadataBlock'
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { MetadataFieldInfosRepository } from '../../../src/metadataBlocks/infra/repositories/MetadataFieldInfosRepository'
2+
import {
3+
ApiConfig,
4+
DataverseApiAuthMechanism
5+
} from '../../../src/core/infra/repositories/ApiConfig'
6+
import { TestConstants } from '../../testHelpers/TestConstants'
7+
8+
describe('getAllFacetableMetadataFields', () => {
9+
const sut: MetadataFieldInfosRepository = new MetadataFieldInfosRepository()
10+
11+
beforeAll(async () => {
12+
ApiConfig.init(
13+
TestConstants.TEST_API_URL,
14+
DataverseApiAuthMechanism.API_KEY,
15+
process.env.TEST_API_KEY
16+
)
17+
})
18+
19+
test('should return all facetable dataset fields', async () => {
20+
const actual = await sut.getAllFacetableMetadataFields()
21+
22+
expect(actual.length).toBe(59)
23+
expect(actual[0].name).toBe('authorName')
24+
expect(actual[0].displayName).toBe('Author Name')
25+
})
26+
})

test/testHelpers/metadataBlocks/metadataBlockHelper.ts

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ import {
22
MetadataBlock,
33
MetadataFieldType,
44
MetadataFieldWatermark,
5-
MetadataFieldTypeClass
5+
MetadataFieldTypeClass,
6+
MetadataFieldInfo
67
} from '../../../src/metadataBlocks/domain/models/MetadataBlock'
78
import { MetadataBlockPayload } from '../../../src/metadataBlocks/infra/repositories/transformers/MetadataBlockPayload'
9+
import { MetadataFieldInfoPayload } from '../../../src/metadataBlocks/infra/repositories/transformers/MetadataFieldInfoPayload'
810

911
export const createMetadataBlockModel = (): MetadataBlock => {
1012
return {
@@ -151,3 +153,39 @@ export const createMetadataBlockPayload = (): MetadataBlockPayload => {
151153
}
152154
}
153155
}
156+
157+
export const createMetadataFieldInfoModel = (): MetadataFieldInfo => {
158+
return {
159+
name: 'testName1',
160+
displayName: 'testDisplayName1',
161+
title: 'testTitle1',
162+
type: MetadataFieldType.Text,
163+
watermark: MetadataFieldWatermark.Empty,
164+
description: 'testDescription1',
165+
multiple: false,
166+
isControlledVocabulary: false,
167+
displayFormat: '#VALUE',
168+
isRequired: true,
169+
displayOrder: 0,
170+
typeClass: MetadataFieldTypeClass.Primitive,
171+
displayOnCreate: true
172+
}
173+
}
174+
175+
export const createMetadataFieldInfoPayload = (): MetadataFieldInfoPayload => {
176+
return {
177+
name: 'testName1',
178+
displayName: 'testDisplayName1',
179+
title: 'testTitle1',
180+
type: 'TEXT',
181+
watermark: '',
182+
description: 'testDescription1',
183+
multiple: false,
184+
isControlledVocabulary: false,
185+
displayFormat: '#VALUE',
186+
isRequired: true,
187+
displayOrder: 0,
188+
typeClass: 'primitive',
189+
displayOnCreate: true
190+
}
191+
}

0 commit comments

Comments
 (0)