Skip to content

Commit 49b2f23

Browse files
authored
Merge pull request #169 from IQSS/167-get-all-facets
Adds use case for getting all facetable fields defined in the installation
2 parents 75c2f56 + aa49f06 commit 49b2f23

26 files changed

+415
-52
lines changed

docs/useCases.md

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ The different use cases currently available in the package are classified below,
4444
- [File Uploading Use Cases](#file-uploading-use-cases)
4545
- [Metadata Blocks](#metadata-blocks)
4646
- [Metadata Blocks read use cases](#metadata-blocks-read-use-cases)
47+
- [Get All Facetable Metadata Fields](#get-all-facetable-metadata-fields)
4748
- [Get All Metadata Blocks](#get-all-metadata-blocks)
4849
- [Get Metadata Block By Name](#get-metadata-block-by-name)
4950
- [Get Collection Metadata Blocks](#get-collection-metadata-blocks)
@@ -105,7 +106,7 @@ If no collection identifier is specified, the default collection identifier; `ro
105106

106107
#### Get Collection Facets
107108

108-
Returns the names of the configured collection facets, given a collection identifier or alias.
109+
Returns a [CollectionFacet](../src/collections/domain/models/CollectionFacet.ts) array containing the facets of the requested collection, given the collection identifier or alias.
109110

110111
##### Example call:
111112

@@ -116,7 +117,7 @@ const collectionIdOrAlias = 12345
116117

117118
getCollectionFacets
118119
.execute(collectionId)
119-
.then((facets: string[]) => {
120+
.then((facets: CollectionFacet[]) => {
120121
/* ... */
121122
})
122123
.catch((error: Error) => {
@@ -1001,6 +1002,26 @@ The following error might arise from the `AddUploadedFileToDataset` use case:
10011002

10021003
### Metadata Blocks read use cases
10031004

1005+
#### Get All Facetable Metadata Fields
1006+
1007+
Returns a [MetadataFieldInfo](../src/metadataBlocks/domain/models/MetadataBlock.ts) array containing all facetable metadata fields defined in the installation.
1008+
1009+
##### Example call:
1010+
1011+
```typescript
1012+
import { getAllFacetableMetadataFields } from '@iqss/dataverse-client-javascript'
1013+
1014+
/* ... */
1015+
1016+
getAllFacetableMetadataFields.execute().then((metadataFieldInfos: MetadataFieldInfo[]) => {
1017+
/* ... */
1018+
})
1019+
1020+
/* ... */
1021+
```
1022+
1023+
_See [use case](../src/metadataBlocks/domain/useCases/GetAllFacetableMetadataFields.ts) implementation_.
1024+
10041025
#### Get All Metadata Blocks
10051026

10061027
Returns a [MetadataBlock](../src/metadataBlocks/domain/models/MetadataBlock.ts) array containing the metadata blocks defined in the installation.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export interface CollectionFacet {
2+
id: number
3+
name: string
4+
displayName: string
5+
}

src/collections/domain/repositories/ICollectionsRepository.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { CollectionDTO } from '../dtos/CollectionDTO'
22
import { Collection } from '../models/Collection'
3+
import { CollectionFacet } from '../models/CollectionFacet'
34
import { CollectionUserPermissions } from '../models/CollectionUserPermissions'
45

56
export interface ICollectionsRepository {
@@ -8,7 +9,7 @@ export interface ICollectionsRepository {
89
collectionDTO: CollectionDTO,
910
parentCollectionId: number | string
1011
): Promise<number>
11-
getCollectionFacets(collectionIdOrAlias: number | string): Promise<string[]>
12+
getCollectionFacets(collectionIdOrAlias: number | string): Promise<CollectionFacet[]>
1213
getCollectionUserPermissions(
1314
collectionIdOrAlias: number | string
1415
): Promise<CollectionUserPermissions>
Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
11
import { UseCase } from '../../../core/domain/useCases/UseCase'
22
import { ICollectionsRepository } from '../repositories/ICollectionsRepository'
33
import { ROOT_COLLECTION_ALIAS } from '../models/Collection'
4+
import { CollectionFacet } from '../models/CollectionFacet'
45

5-
export class GetCollectionFacets implements UseCase<string[]> {
6+
export class GetCollectionFacets implements UseCase<CollectionFacet[]> {
67
private collectionsRepository: ICollectionsRepository
78

89
constructor(collectionsRepository: ICollectionsRepository) {
910
this.collectionsRepository = collectionsRepository
1011
}
1112

1213
/**
13-
* Returns the names of the configured collection facets, given a collection identifier or alias.
14+
* Returns a CollectionFacet array containing the facets of the requested collection, given the collection identifier or alias.
1415
*
1516
* @param {number | string} [collectionIdOrAlias = 'root'] - A generic collection identifier, which can be either a string (for queries by CollectionAlias), or a number (for queries by CollectionId)
1617
* If this parameter is not set, the default value is: 'root'
1718
* @returns {Promise<string[]>}
1819
*/
19-
async execute(collectionIdOrAlias: number | string = ROOT_COLLECTION_ALIAS): Promise<string[]> {
20+
async execute(
21+
collectionIdOrAlias: number | string = ROOT_COLLECTION_ALIAS
22+
): Promise<CollectionFacet[]> {
2023
return await this.collectionsRepository.getCollectionFacets(collectionIdOrAlias)
2124
}
2225
}

src/collections/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@ const getCollectionUserPermissions = new GetCollectionUserPermissions(collection
1414

1515
export { getCollection, createCollection, getCollectionFacets, getCollectionUserPermissions }
1616
export { Collection, CollectionInputLevel } from './domain/models/Collection'
17+
export { CollectionFacet } from './domain/models/CollectionFacet'
1718
export { CollectionUserPermissions } from './domain/models/CollectionUserPermissions'
1819
export { CollectionDTO, CollectionInputLevelDTO } from './domain/dtos/CollectionDTO'

src/collections/infra/repositories/CollectionsRepository.ts

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import { ApiRepository } from '../../../core/infra/repositories/ApiRepository'
22
import { ICollectionsRepository } from '../../domain/repositories/ICollectionsRepository'
3-
import { transformCollectionResponseToCollection } from './transformers/collectionTransformers'
3+
import {
4+
transformCollectionFacetsResponseToCollectionFacets,
5+
transformCollectionResponseToCollection
6+
} from './transformers/collectionTransformers'
47
import { Collection, ROOT_COLLECTION_ALIAS } from '../../domain/models/Collection'
58
import { CollectionDTO } from '../../domain/dtos/CollectionDTO'
9+
import { CollectionFacet } from '../../domain/models/CollectionFacet'
610
import { CollectionUserPermissions } from '../../domain/models/CollectionUserPermissions'
711
import { transformCollectionUserPermissionsResponseToCollectionUserPermissions } from './transformers/collectionUserPermissionsTransformers'
812

@@ -11,6 +15,8 @@ export interface NewCollectionRequestPayload {
1115
name: string
1216
dataverseContacts: NewCollectionContactRequestPayload[]
1317
dataverseType: string
18+
description?: string
19+
affiliation?: string
1420
metadataBlocks: NewCollectionMetadataBlocksRequestPayload
1521
}
1622

@@ -56,7 +62,7 @@ export class CollectionsRepository extends ApiRepository implements ICollections
5662
)
5763

5864
const inputLevelsRequestBody: NewCollectionInputLevelRequestPayload[] =
59-
collectionDTO.inputLevels.map((inputLevel) => ({
65+
collectionDTO.inputLevels?.map((inputLevel) => ({
6066
datasetFieldTypeName: inputLevel.datasetFieldName,
6167
include: inputLevel.include,
6268
required: inputLevel.required
@@ -67,6 +73,12 @@ export class CollectionsRepository extends ApiRepository implements ICollections
6773
name: collectionDTO.name,
6874
dataverseContacts: dataverseContacts,
6975
dataverseType: collectionDTO.type,
76+
...(collectionDTO.description && {
77+
description: collectionDTO.description
78+
}),
79+
...(collectionDTO.affiliation && {
80+
affiliation: collectionDTO.affiliation
81+
}),
7082
metadataBlocks: {
7183
metadataBlockNames: collectionDTO.metadataBlockNames,
7284
facetIds: collectionDTO.facetIds,
@@ -81,9 +93,13 @@ export class CollectionsRepository extends ApiRepository implements ICollections
8193
})
8294
}
8395

84-
public async getCollectionFacets(collectionIdOrAlias: string | number): Promise<string[]> {
85-
return this.doGet(`/${this.collectionsResourceName}/${collectionIdOrAlias}/facets`, true)
86-
.then((response) => response.data.data)
96+
public async getCollectionFacets(
97+
collectionIdOrAlias: string | number
98+
): Promise<CollectionFacet[]> {
99+
return this.doGet(`/${this.collectionsResourceName}/${collectionIdOrAlias}/facets`, true, {
100+
returnDetails: true
101+
})
102+
.then((response) => transformCollectionFacetsResponseToCollectionFacets(response))
87103
.catch((error) => {
88104
throw error
89105
})
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export interface CollectionFacetPayload {
2+
id: string
3+
name: string
4+
displayName: string
5+
}

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,25 @@ import { AxiosResponse } from 'axios'
33
import { CollectionInputLevelPayload, CollectionPayload } from './CollectionPayload'
44
import { transformPayloadToOwnerNode } from '../../../../core/infra/repositories/transformers/dvObjectOwnerNodeTransformer'
55
import { transformHtmlToMarkdown } from '../../../../datasets/infra/repositories/transformers/datasetTransformers'
6+
import { CollectionFacet } from '../../../domain/models/CollectionFacet'
7+
import { CollectionFacetPayload } from './CollectionFacetPayload'
68

79
export const transformCollectionResponseToCollection = (response: AxiosResponse): Collection => {
810
const collectionPayload = response.data.data
911
return transformPayloadToCollection(collectionPayload)
1012
}
1113

14+
export const transformCollectionFacetsResponseToCollectionFacets = (
15+
response: AxiosResponse
16+
): CollectionFacet[] => {
17+
const facetsPayloads = response.data.data
18+
return facetsPayloads.map((facetsPayload: CollectionFacetPayload) => ({
19+
id: Number(facetsPayload.id),
20+
name: facetsPayload.name,
21+
displayName: facetsPayload.displayName
22+
}))
23+
}
24+
1225
const transformPayloadToCollection = (collectionPayload: CollectionPayload): Collection => {
1326
const collectionModel: Collection = {
1427
id: collectionPayload.id,
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 GetAllFacetableMetadataFields 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 metadata fields defined in the installation.
14+
*
15+
* @returns {Promise<MetadataFieldInfo[]>}
16+
*/
17+
async execute(): Promise<MetadataFieldInfo[]> {
18+
return await this.metadataFieldInfosRepository.getAllFacetableMetadataFields()
19+
}
20+
}

0 commit comments

Comments
 (0)