Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions docs/useCases.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ The different use cases currently available in the package are classified below,
- [Get Dataset Linked Collections](#get-dataset-linked-collections)
- [Get Dataset Available Categories](#get-dataset-available-categories)
- [Get Dataset Templates](#get-dataset-templates)
- [Get Dataset Available Dataset Types](#get-dataset-available-dataset-types)
- [Datasets write use cases](#datasets-write-use-cases)
- [Create a Dataset](#create-a-dataset)
- [Update a Dataset](#update-a-dataset)
Expand Down Expand Up @@ -809,6 +810,24 @@ getDatasetLinkedCollections

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

#### Get Dataset Available Dataset Types

Returns a list of available dataset types that can be used at dataset creation. By default, only the type "dataset" is returned.

###### Example call:

```typescript
import { getDatasetAvailableDatasetTypes } from '@iqss/dataverse-client-javascript'

/* ... */

getDatasetAvailableDatasetTypes.execute().then((datasetTypes: DatasetType[]) => {
/* ... */
})
```

_See [use case](../src/datasets/domain/useCases/GetDatasetAvailableDatasetTypes.ts) implementation_.

### Datasets Write Use Cases

#### Create a Dataset
Expand Down
6 changes: 6 additions & 0 deletions src/datasets/domain/models/DatasetType.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export interface DatasetType {
id: number
name: string
linkedMetadataBlocks?: string[]
availableLicenses?: string[]
}
2 changes: 2 additions & 0 deletions src/datasets/domain/repositories/IDatasetsRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { DatasetLinkedCollection } from '../models/DatasetLinkedCollection'
import { CitationFormat } from '../models/CitationFormat'
import { FormattedCitation } from '../models/FormattedCitation'
import { DatasetTemplate } from '../models/DatasetTemplate'
import { DatasetType } from '../models/DatasetType'

export interface IDatasetsRepository {
getDataset(
Expand Down Expand Up @@ -76,4 +77,5 @@ export interface IDatasetsRepository {
includeDeaccessioned?: boolean
): Promise<FormattedCitation>
getDatasetTemplates(collectionIdOrAlias: number | string): Promise<DatasetTemplate[]>
getDatasetAvailableDatasetTypes(): Promise<DatasetType[]>
}
20 changes: 20 additions & 0 deletions src/datasets/domain/useCases/GetDatasetAvailableDatasetTypes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { UseCase } from '../../../core/domain/useCases/UseCase'
import { DatasetType } from '../models/DatasetType'
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'

export class GetDatasetAvailableDatasetTypes implements UseCase<DatasetType[]> {
private datasetsRepository: IDatasetsRepository

constructor(datasetsRepository: IDatasetsRepository) {
this.datasetsRepository = datasetsRepository
}

/**
* Returns the list of available dataset types that can be selected when creating a dataset.
*
* @returns {Promise<DatasetType[]>}
*/
async execute(): Promise<DatasetType[]> {
return await this.datasetsRepository.getDatasetAvailableDatasetTypes()
}
}
6 changes: 5 additions & 1 deletion src/datasets/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import { LinkDataset } from './domain/useCases/LinkDataset'
import { UnlinkDataset } from './domain/useCases/UnlinkDataset'
import { GetDatasetLinkedCollections } from './domain/useCases/GetDatasetLinkedCollections'
import { GetDatasetAvailableCategories } from './domain/useCases/GetDatasetAvailableCategories'
import { GetDatasetAvailableDatasetTypes } from './domain/useCases/GetDatasetAvailableDatasetTypes'
import { GetDatasetCitationInOtherFormats } from './domain/useCases/GetDatasetCitationInOtherFormats'
import { GetDatasetTemplates } from './domain/useCases/GetDatasetTemplates'

Expand Down Expand Up @@ -64,6 +65,7 @@ const linkDataset = new LinkDataset(datasetsRepository)
const unlinkDataset = new UnlinkDataset(datasetsRepository)
const getDatasetLinkedCollections = new GetDatasetLinkedCollections(datasetsRepository)
const getDatasetAvailableCategories = new GetDatasetAvailableCategories(datasetsRepository)
const getDatasetAvailableDatasetTypes = new GetDatasetAvailableDatasetTypes(datasetsRepository)
const getDatasetCitationInOtherFormats = new GetDatasetCitationInOtherFormats(datasetsRepository)
const getDatasetTemplates = new GetDatasetTemplates(datasetsRepository)

Expand All @@ -89,7 +91,8 @@ export {
getDatasetLinkedCollections,
getDatasetAvailableCategories,
getDatasetCitationInOtherFormats,
getDatasetTemplates
getDatasetTemplates,
getDatasetAvailableDatasetTypes
}
export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion'
export { DatasetUserPermissions } from './domain/models/DatasetUserPermissions'
Expand Down Expand Up @@ -124,3 +127,4 @@ export {
DatasetVersionSummaryStringValues
} from './domain/models/DatasetVersionSummaryInfo'
export { DatasetLinkedCollection } from './domain/models/DatasetLinkedCollection'
export { DatasetType } from './domain/models/DatasetType'
9 changes: 9 additions & 0 deletions src/datasets/infra/repositories/DatasetsRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import { FormattedCitation } from '../../domain/models/FormattedCitation'
import { DatasetTemplate } from '../../domain/models/DatasetTemplate'
import { DatasetTemplatePayload } from './transformers/DatasetTemplatePayload'
import { transformDatasetTemplatePayloadToDatasetTemplate } from './transformers/datasetTemplateTransformers'
import { DatasetType } from '../../domain/models/DatasetType'

export interface GetAllDatasetPreviewsQueryParams {
per_page?: number
Expand Down Expand Up @@ -373,4 +374,12 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi
throw error
})
}

public async getDatasetAvailableDatasetTypes(): Promise<DatasetType[]> {
return this.doGet(this.buildApiEndpoint(this.datasetsResourceName, 'datasetTypes'))
.then((response) => response.data.data)
.catch((error) => {
throw error
})
}
}
29 changes: 29 additions & 0 deletions test/functional/datasets/GetDatasetAvailableDatasetTypes.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { ApiConfig, DatasetType, getDatasetAvailableDatasetTypes } from '../../../src'
import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'
import { TestConstants } from '../../testHelpers/TestConstants'

describe('getDatasetAvailableDatasetTypes', () => {
describe('execute', () => {
beforeAll(async () => {
ApiConfig.init(
TestConstants.TEST_API_URL,
DataverseApiAuthMechanism.API_KEY,
process.env.TEST_API_KEY
)
})

test('should return available dataset types', async () => {
const actualDatasetTypes: DatasetType[] = await getDatasetAvailableDatasetTypes.execute()
const expectedDatasetTypes = [
{
id: 1,
name: 'dataset',
linkedMetadataBlocks: [],
availableLicenses: []
}
]

expect(actualDatasetTypes).toEqual(expectedDatasetTypes)
})
})
})
20 changes: 19 additions & 1 deletion test/integration/datasets/DatasetsRepository.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@
CreatedDatasetIdentifiers,
DatasetDTO,
DatasetDeaccessionDTO,
publishDataset
publishDataset,
DatasetType,
getDatasetAvailableDatasetTypes
} from '../../../src/datasets'
import { ApiConfig, WriteError } from '../../../src'
import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'
Expand Down Expand Up @@ -1067,7 +1069,7 @@
])
})
// TODO: add this test when https://github.com/IQSS/dataverse-client-javascript/issues/343 is fixed
test.skip('should throw error if trying to update an outdated internal version dataset', async () => {

Check warning on line 1072 in test/integration/datasets/DatasetsRepository.test.ts

View workflow job for this annotation

GitHub Actions / lint

Disabled test
const testDataset = {
metadataBlockValues: [
{
Expand Down Expand Up @@ -1688,4 +1690,20 @@
await deleteDatasetTemplateViaApi(actual[0].id)
})
})

describe('getDatasetAvailableDatasetTypes', () => {
test('should return available dataset types', async () => {
const actualDatasetTypes: DatasetType[] = await getDatasetAvailableDatasetTypes.execute()
const expectedDatasetTypes = [
{
id: 1,
name: 'dataset',
linkedMetadataBlocks: [],
availableLicenses: []
}
]

expect(actualDatasetTypes).toEqual(expectedDatasetTypes)
})
})
})
49 changes: 49 additions & 0 deletions test/unit/datasets/GetDatasetAvailableDatasetTypes.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { ReadError } from '../../../src'
import { DatasetType } from '../../../src'
import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository'
import { GetDatasetAvailableDatasetTypes } from '../../../src/datasets/domain/useCases/GetDatasetAvailableDatasetTypes'

describe('GetDatasetAvailableDatasetTypes', () => {
describe('execute', () => {
test('should return datasetTypes array on repository success', async () => {
const datasetTypesRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository

const testDatasetTypes: DatasetType[] = [
{
id: 1,
name: 'dataset',
linkedMetadataBlocks: [],
availableLicenses: []
},
{
id: 2,
name: 'software',
linkedMetadataBlocks: ['codeMeta20'],
availableLicenses: ['MIT', 'Apache-2.0']
}
]

datasetTypesRepositoryStub.getDatasetAvailableDatasetTypes = jest
.fn()
.mockResolvedValue(testDatasetTypes)
const sut = new GetDatasetAvailableDatasetTypes(datasetTypesRepositoryStub)

const actual = await sut.execute()

expect(actual).toEqual(testDatasetTypes)
expect(datasetTypesRepositoryStub.getDatasetAvailableDatasetTypes).toHaveBeenCalledTimes(1)
})

test('should return error result on repository error', async () => {
const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository
const expectedError = new ReadError('Failed to fetch dataset types')
datasetsRepositoryStub.getDatasetAvailableDatasetTypes = jest
.fn()
.mockRejectedValue(expectedError)
const sut = new GetDatasetAvailableDatasetTypes(datasetsRepositoryStub)

await expect(sut.execute()).rejects.toThrow(ReadError)
expect(datasetsRepositoryStub.getDatasetAvailableDatasetTypes).toHaveBeenCalledTimes(1)
})
})
})