Skip to content

Commit 5cad35d

Browse files
committed
feat: new use case for getting dataset types #363
1 parent 39aa3da commit 5cad35d

File tree

8 files changed

+138
-0
lines changed

8 files changed

+138
-0
lines changed

docs/useCases.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ The different use cases currently available in the package are classified below,
3838
- [Get Dataset Versions Summaries](#get-dataset-versions-summaries)
3939
- [Get Dataset Linked Collections](#get-dataset-linked-collections)
4040
- [Get Dataset Available Categories](#get-dataset-available-categories)
41+
- [Get Dataset Available Dataset Types](#get-dataset-available-dataset-types)
4142
- [Datasets write use cases](#datasets-write-use-cases)
4243
- [Create a Dataset](#create-a-dataset)
4344
- [Update a Dataset](#update-a-dataset)
@@ -1113,6 +1114,24 @@ _See [use case](../src/datasets/domain/useCases/GetDatasetAvailableCategories.ts
11131114

11141115
The `datasetId` parameter is a number for numeric identifiers or string for persistent identifiers.
11151116

1117+
#### Get Dataset Available Dataset Types
1118+
1119+
Returns a list of available dataset types that can be used at dataset creation. By default, only the type "dataset" is returned.
1120+
1121+
###### Example call:
1122+
1123+
```typescript
1124+
import { getDatasetAvailableDatasetTypes } from '@iqss/dataverse-client-javascript'
1125+
1126+
/* ... */
1127+
1128+
getDatasetAvailableDatasetTypes.execute().then((categories: String[]) => {
1129+
/* ... */
1130+
})
1131+
```
1132+
1133+
_See [use case](../src/datasets/domain/useCases/GetDatasetAvailableDatasetTypes.ts) implementation_.
1134+
11161135
## Files
11171136

11181137
### Files read use cases
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
export interface DatasetType {
2+
id: number
3+
name: string
4+
linkedMetadataBlocks?: string[]
5+
availableLicenses?: string[]
6+
}

src/datasets/domain/repositories/IDatasetsRepository.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { DatasetVersionSummaryInfo } from '../models/DatasetVersionSummaryInfo'
1212
import { DatasetLinkedCollection } from '../models/DatasetLinkedCollection'
1313
import { CitationFormat } from '../models/CitationFormat'
1414
import { FormattedCitation } from '../models/FormattedCitation'
15+
import { DatasetType } from '../models/DatasetType'
1516

1617
export interface IDatasetsRepository {
1718
getDataset(
@@ -74,4 +75,5 @@ export interface IDatasetsRepository {
7475
format: CitationFormat,
7576
includeDeaccessioned?: boolean
7677
): Promise<FormattedCitation>
78+
getDatasetAvailableDatasetTypes(): Promise<DatasetType[]>
7779
}
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 { DatasetType } from '../models/DatasetType'
3+
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'
4+
5+
export class GetDatasetAvailableDatasetTypes implements UseCase<DatasetType[]> {
6+
private datasetsRepository: IDatasetsRepository
7+
8+
constructor(datasetsRepository: IDatasetsRepository) {
9+
this.datasetsRepository = datasetsRepository
10+
}
11+
12+
/**
13+
* Returns the list of available dataset types that can be selected when creating a dataset.
14+
*
15+
* @returns {Promise<DatasetType[]>}
16+
*/
17+
async execute(): Promise<DatasetType[]> {
18+
return await this.datasetsRepository.getDatasetAvailableDatasetTypes()
19+
}
20+
}

src/datasets/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { LinkDataset } from './domain/useCases/LinkDataset'
2424
import { UnlinkDataset } from './domain/useCases/UnlinkDataset'
2525
import { GetDatasetLinkedCollections } from './domain/useCases/GetDatasetLinkedCollections'
2626
import { GetDatasetAvailableCategories } from './domain/useCases/GetDatasetAvailableCategories'
27+
import { GetDatasetAvailableDatasetTypes } from './domain/useCases/GetDatasetAvailableDatasetTypes'
2728
import { GetDatasetCitationInOtherFormats } from './domain/useCases/GetDatasetCitationInOtherFormats'
2829

2930
const datasetsRepository = new DatasetsRepository()
@@ -63,6 +64,7 @@ const linkDataset = new LinkDataset(datasetsRepository)
6364
const unlinkDataset = new UnlinkDataset(datasetsRepository)
6465
const getDatasetLinkedCollections = new GetDatasetLinkedCollections(datasetsRepository)
6566
const getDatasetAvailableCategories = new GetDatasetAvailableCategories(datasetsRepository)
67+
const getDatasetAvailableDatasetTypes = new GetDatasetAvailableDatasetTypes(datasetsRepository)
6668
const getDatasetCitationInOtherFormats = new GetDatasetCitationInOtherFormats(datasetsRepository)
6769

6870
export {
@@ -86,6 +88,7 @@ export {
8688
unlinkDataset,
8789
getDatasetLinkedCollections,
8890
getDatasetAvailableCategories,
91+
getDatasetAvailableDatasetTypes,
8992
getDatasetCitationInOtherFormats
9093
}
9194
export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion'
@@ -121,3 +124,4 @@ export {
121124
DatasetVersionSummaryStringValues
122125
} from './domain/models/DatasetVersionSummaryInfo'
123126
export { DatasetLinkedCollection } from './domain/models/DatasetLinkedCollection'
127+
export { DatasetType } from './domain/models/DatasetType'

src/datasets/infra/repositories/DatasetsRepository.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { DatasetLinkedCollection } from '../../domain/models/DatasetLinkedCollec
2424
import { CitationFormat } from '../../domain/models/CitationFormat'
2525
import { transformDatasetLinkedCollectionsResponseToDatasetLinkedCollection } from './transformers/datasetLinkedCollectionsTransformers'
2626
import { FormattedCitation } from '../../domain/models/FormattedCitation'
27+
import { DatasetType } from '../../domain/models/DatasetType'
2728

2829
export interface GetAllDatasetPreviewsQueryParams {
2930
per_page?: number
@@ -357,4 +358,12 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi
357358
throw error
358359
})
359360
}
361+
362+
public async getDatasetAvailableDatasetTypes(): Promise<DatasetType[]> {
363+
return this.doGet(this.buildApiEndpoint(this.datasetsResourceName, 'datasetTypes'))
364+
.then((response) => response.data.data)
365+
.catch((error) => {
366+
throw error
367+
})
368+
}
360369
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { ApiConfig, DatasetType, getDatasetAvailableDatasetTypes } from '../../../src'
2+
import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'
3+
import { TestConstants } from '../../testHelpers/TestConstants'
4+
5+
describe('getDatasetAvailableDatasetTypes', () => {
6+
describe('execute', () => {
7+
beforeAll(async () => {
8+
ApiConfig.init(
9+
TestConstants.TEST_API_URL,
10+
DataverseApiAuthMechanism.API_KEY,
11+
process.env.TEST_API_KEY
12+
)
13+
})
14+
15+
test('should return available dataset types', async () => {
16+
const actualDatasetTypes: DatasetType[] = await getDatasetAvailableDatasetTypes.execute()
17+
const expectedDatasetTypes = [
18+
{
19+
id: 1,
20+
name: 'dataset',
21+
linkedMetadataBlocks: [],
22+
availableLicenses: []
23+
}
24+
]
25+
26+
expect(actualDatasetTypes).toEqual(expectedDatasetTypes)
27+
})
28+
})
29+
})
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { ReadError } from '../../../src'
2+
import { DatasetType } from '../../../src'
3+
import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository'
4+
import { GetDatasetAvailableDatasetTypes } from '../../../src/datasets/domain/useCases/GetDatasetAvailableDatasetTypes'
5+
6+
describe('GetDatasetAvailableDatasetTypes', () => {
7+
describe('execute', () => {
8+
test('should return datasetTypes array on repository success', async () => {
9+
const datasetTypesRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository
10+
11+
const testDatasetTypes: DatasetType[] = [
12+
{
13+
id: 1,
14+
name: 'dataset',
15+
linkedMetadataBlocks: [],
16+
availableLicenses: []
17+
},
18+
{
19+
id: 2,
20+
name: 'software',
21+
linkedMetadataBlocks: ['codeMeta20'],
22+
availableLicenses: ['MIT', 'Apache-2.0']
23+
}
24+
]
25+
26+
datasetTypesRepositoryStub.getDatasetAvailableDatasetTypes = jest
27+
.fn()
28+
.mockResolvedValue(testDatasetTypes)
29+
const sut = new GetDatasetAvailableDatasetTypes(datasetTypesRepositoryStub)
30+
31+
const actual = await sut.execute()
32+
33+
expect(actual).toEqual(testDatasetTypes)
34+
expect(datasetTypesRepositoryStub.getDatasetAvailableDatasetTypes).toHaveBeenCalledTimes(1)
35+
})
36+
37+
test('should return error result on repository error', async () => {
38+
const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository
39+
const expectedError = new ReadError('Failed to fetch dataset types')
40+
datasetsRepositoryStub.getDatasetAvailableDatasetTypes = jest
41+
.fn()
42+
.mockRejectedValue(expectedError)
43+
const sut = new GetDatasetAvailableDatasetTypes(datasetsRepositoryStub)
44+
45+
await expect(sut.execute()).rejects.toThrow(ReadError)
46+
expect(datasetsRepositoryStub.getDatasetAvailableDatasetTypes).toHaveBeenCalledTimes(1)
47+
})
48+
})
49+
})

0 commit comments

Comments
 (0)