Skip to content

Commit 2796c36

Browse files
authored
Merge pull request #366 from IQSS/363-get-datasetTypes
Use Case for Getting Available Dataset Types
2 parents 585c419 + aaf41cc commit 2796c36

File tree

9 files changed

+158
-2
lines changed

9 files changed

+158
-2
lines changed

docs/useCases.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ The different use cases currently available in the package are classified below,
3939
- [Get Dataset Linked Collections](#get-dataset-linked-collections)
4040
- [Get Dataset Available Categories](#get-dataset-available-categories)
4141
- [Get Dataset Templates](#get-dataset-templates)
42+
- [Get Dataset Available Dataset Types](#get-dataset-available-dataset-types)
4243
- [Datasets write use cases](#datasets-write-use-cases)
4344
- [Create a Dataset](#create-a-dataset)
4445
- [Update a Dataset](#update-a-dataset)
@@ -814,6 +815,24 @@ getDatasetLinkedCollections
814815

815816
_See [use case](../src/datasets/domain/useCases/GetDatasetLinkedCollections.ts) implementation_.
816817

818+
#### Get Dataset Available Dataset Types
819+
820+
Returns a list of available dataset types that can be used at dataset creation. By default, only the type "dataset" is returned.
821+
822+
###### Example call:
823+
824+
```typescript
825+
import { getDatasetAvailableDatasetTypes } from '@iqss/dataverse-client-javascript'
826+
827+
/* ... */
828+
829+
getDatasetAvailableDatasetTypes.execute().then((datasetTypes: DatasetType[]) => {
830+
/* ... */
831+
})
832+
```
833+
834+
_See [use case](../src/datasets/domain/useCases/GetDatasetAvailableDatasetTypes.ts) implementation_.
835+
817836
### Datasets Write Use Cases
818837

819838
#### Create a Dataset
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
@@ -13,6 +13,7 @@ import { DatasetLinkedCollection } from '../models/DatasetLinkedCollection'
1313
import { CitationFormat } from '../models/CitationFormat'
1414
import { FormattedCitation } from '../models/FormattedCitation'
1515
import { DatasetTemplate } from '../models/DatasetTemplate'
16+
import { DatasetType } from '../models/DatasetType'
1617

1718
export interface IDatasetsRepository {
1819
getDataset(
@@ -76,4 +77,5 @@ export interface IDatasetsRepository {
7677
includeDeaccessioned?: boolean
7778
): Promise<FormattedCitation>
7879
getDatasetTemplates(collectionIdOrAlias: number | string): Promise<DatasetTemplate[]>
80+
getDatasetAvailableDatasetTypes(): Promise<DatasetType[]>
7981
}
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: 5 additions & 1 deletion
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
import { GetDatasetTemplates } from './domain/useCases/GetDatasetTemplates'
2930

@@ -64,6 +65,7 @@ const linkDataset = new LinkDataset(datasetsRepository)
6465
const unlinkDataset = new UnlinkDataset(datasetsRepository)
6566
const getDatasetLinkedCollections = new GetDatasetLinkedCollections(datasetsRepository)
6667
const getDatasetAvailableCategories = new GetDatasetAvailableCategories(datasetsRepository)
68+
const getDatasetAvailableDatasetTypes = new GetDatasetAvailableDatasetTypes(datasetsRepository)
6769
const getDatasetCitationInOtherFormats = new GetDatasetCitationInOtherFormats(datasetsRepository)
6870
const getDatasetTemplates = new GetDatasetTemplates(datasetsRepository)
6971

@@ -89,7 +91,8 @@ export {
8991
getDatasetLinkedCollections,
9092
getDatasetAvailableCategories,
9193
getDatasetCitationInOtherFormats,
92-
getDatasetTemplates
94+
getDatasetTemplates,
95+
getDatasetAvailableDatasetTypes
9396
}
9497
export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion'
9598
export { DatasetUserPermissions } from './domain/models/DatasetUserPermissions'
@@ -124,3 +127,4 @@ export {
124127
DatasetVersionSummaryStringValues
125128
} from './domain/models/DatasetVersionSummaryInfo'
126129
export { DatasetLinkedCollection } from './domain/models/DatasetLinkedCollection'
130+
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
@@ -28,6 +28,7 @@ import { FormattedCitation } from '../../domain/models/FormattedCitation'
2828
import { DatasetTemplate } from '../../domain/models/DatasetTemplate'
2929
import { DatasetTemplatePayload } from './transformers/DatasetTemplatePayload'
3030
import { transformDatasetTemplatePayloadToDatasetTemplate } from './transformers/datasetTemplateTransformers'
31+
import { DatasetType } from '../../domain/models/DatasetType'
3132

3233
export interface GetAllDatasetPreviewsQueryParams {
3334
per_page?: number
@@ -373,4 +374,12 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi
373374
throw error
374375
})
375376
}
377+
378+
public async getDatasetAvailableDatasetTypes(): Promise<DatasetType[]> {
379+
return this.doGet(this.buildApiEndpoint(this.datasetsResourceName, 'datasetTypes'))
380+
.then((response) => response.data.data)
381+
.catch((error) => {
382+
throw error
383+
})
384+
}
376385
}
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+
})

test/integration/datasets/DatasetsRepository.test.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ import {
2020
CreatedDatasetIdentifiers,
2121
DatasetDTO,
2222
DatasetDeaccessionDTO,
23-
publishDataset
23+
publishDataset,
24+
DatasetType,
25+
getDatasetAvailableDatasetTypes
2426
} from '../../../src/datasets'
2527
import { ApiConfig, WriteError } from '../../../src'
2628
import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'
@@ -1688,4 +1690,20 @@ describe('DatasetsRepository', () => {
16881690
await deleteDatasetTemplateViaApi(actual[0].id)
16891691
})
16901692
})
1693+
1694+
describe('getDatasetAvailableDatasetTypes', () => {
1695+
test('should return available dataset types', async () => {
1696+
const actualDatasetTypes: DatasetType[] = await getDatasetAvailableDatasetTypes.execute()
1697+
const expectedDatasetTypes = [
1698+
{
1699+
id: 1,
1700+
name: 'dataset',
1701+
linkedMetadataBlocks: [],
1702+
availableLicenses: []
1703+
}
1704+
]
1705+
1706+
expect(actualDatasetTypes).toEqual(expectedDatasetTypes)
1707+
})
1708+
})
16911709
})
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)