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
95 changes: 95 additions & 0 deletions docs/useCases.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ The different use cases currently available in the package are classified below,
- [Get Dataset Available Categories](#get-dataset-available-categories)
- [Get Dataset Templates](#get-dataset-templates)
- [Get Dataset Available Dataset Types](#get-dataset-available-dataset-types)
- [Get Dataset Available Dataset Type](#get-dataset-available-dataset-type)
- [Datasets write use cases](#datasets-write-use-cases)
- [Create a Dataset](#create-a-dataset)
- [Update a Dataset](#update-a-dataset)
Expand All @@ -48,6 +49,10 @@ The different use cases currently available in the package are classified below,
- [Delete a Draft Dataset](#delete-a-draft-dataset)
- [Link a Dataset](#link-a-dataset)
- [Unlink a Dataset](#unlink-a-dataset)
- [Add a Dataset Type](#add-a-dataset-type)
- [Link Dataset Type with Metadata Blocks](#link-dataset-type-with-metadata-blocks)
- [Set Available Licenses For Dataset Type](#set-available-licenses-for-dataset-type)
- [Delete a Dataset Type](#delete-a-dataset-type)
- [Files](#Files)
- [Files read use cases](#files-read-use-cases)
- [Get a File](#get-a-file)
Expand Down Expand Up @@ -833,6 +838,24 @@ getDatasetAvailableDatasetTypes.execute().then((datasetTypes: DatasetType[]) =>

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

#### Get Dataset Available Dataset Type

Returns an available dataset types that can be used at dataset creation.

###### Example call:

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

/* ... */

getDatasetAvailableDatasetType.execute().then((datasetType: DatasetType) => {
/* ... */
})
```

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

### Datasets Write Use Cases

#### Create a Dataset
Expand Down Expand Up @@ -1156,6 +1179,78 @@ getDatasetTemplates.execute(collectionIdOrAlias).then((datasetTemplates: Dataset

_See [use case](../src/datasets/domain/useCases/GetDatasetTemplates.ts)_ definition.

#### Add a Dataset Type

Adds a dataset types that can be used at dataset creation.

###### Example call:

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

/* ... */

addDatasetType.execute(datasetType).then((datasetType: DatasetType) => {
/* ... */
})
```

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

#### Link Dataset Type with Metadata Blocks

Link a dataset type with metadata blocks.

###### Example call:

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

/* ... */

linkDatasetTypeWithMetadataBlocks.execute(datasetTypeId, ['geospatial']).then(() => {
/* ... */
})
```

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

#### Set Available Licenses For Dataset Type

Set available licenses for dataset type.

###### Example call:

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

/* ... */

setAvailableLicensesForDatasetType.execute(datasetTypeId, ['CC BY 4.0']).then(() => {
/* ... */
})
```

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

#### Delete a Dataset Type

Delete a dataset type.

###### Example call:

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

/* ... */

deleteDatasetType.execute(datasetTypeId).then(() => {
/* ... */
})
```

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

## Files

### Files read use cases
Expand Down
2 changes: 1 addition & 1 deletion src/datasets/domain/models/DatasetType.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
export interface DatasetType {
id: number
id?: number
name: string
linkedMetadataBlocks?: string[]
availableLicenses?: string[]
Expand Down
11 changes: 11 additions & 0 deletions src/datasets/domain/repositories/IDatasetsRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,15 @@ export interface IDatasetsRepository {
): Promise<FormattedCitation>
getDatasetTemplates(collectionIdOrAlias: number | string): Promise<DatasetTemplate[]>
getDatasetAvailableDatasetTypes(): Promise<DatasetType[]>
getDatasetAvailableDatasetType(datasetTypeId: number | string): Promise<DatasetType>
addDatasetType(datasetType: DatasetType): Promise<DatasetType>
linkDatasetTypeWithMetadataBlocks(
datasetTypeId: number | string,
metadataBlocks: string[]
): Promise<void>
setAvailableLicensesForDatasetType(
datasetTypeId: number | string,
licenses: string[]
): Promise<void>
deleteDatasetType(datasetTypeId: number): Promise<void>
}
18 changes: 18 additions & 0 deletions src/datasets/domain/useCases/AddDatasetType.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { UseCase } from '../../../core/domain/useCases/UseCase'
import { DatasetType } from '../models/DatasetType'
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'

export class AddDatasetType implements UseCase<DatasetType> {
private datasetsRepository: IDatasetsRepository

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

/**
* Add a dataset type that can be selected when creating a dataset.
*/
async execute(datasetType: DatasetType): Promise<DatasetType> {
return await this.datasetsRepository.addDatasetType(datasetType)
}
}
17 changes: 17 additions & 0 deletions src/datasets/domain/useCases/DeleteDatasetType.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { UseCase } from '../../../core/domain/useCases/UseCase'
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'

export class DeleteDatasetType implements UseCase<void> {
private datasetsRepository: IDatasetsRepository

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

/**
* Deletes a dataset type.
*/
async execute(datasetTypeId: number): Promise<void> {
return await this.datasetsRepository.deleteDatasetType(datasetTypeId)
}
}
18 changes: 18 additions & 0 deletions src/datasets/domain/useCases/GetDatasetAvailableDatasetType.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { UseCase } from '../../../core/domain/useCases/UseCase'
import { DatasetType } from '../models/DatasetType'
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'

export class GetDatasetAvailableDatasetType implements UseCase<DatasetType> {
private datasetsRepository: IDatasetsRepository

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

/**
* Returns a single available dataset type that can be selected when creating a dataset.
*/
async execute(datasetTypeId: number | string): Promise<DatasetType> {
return await this.datasetsRepository.getDatasetAvailableDatasetType(datasetTypeId)
}
}
20 changes: 20 additions & 0 deletions src/datasets/domain/useCases/LinkDatasetTypeWithMetadataBlocks.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { UseCase } from '../../../core/domain/useCases/UseCase'
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'

export class LinkDatasetTypeWithMetadataBlocks implements UseCase<void> {
private datasetsRepository: IDatasetsRepository

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

/**
* Links a dataset type with one or more metadata blocks. These metadata blocks will be shown when creating a dataset of this type.
*/
async execute(datasetTypeId: number | string, metadataBlocks: string[]): Promise<void> {
return await this.datasetsRepository.linkDatasetTypeWithMetadataBlocks(
datasetTypeId,
metadataBlocks
)
}
}
17 changes: 17 additions & 0 deletions src/datasets/domain/useCases/SetAvailableLicensesForDatasetType.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { UseCase } from '../../../core/domain/useCases/UseCase'
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'

export class SetAvailableLicensesForDatasetType implements UseCase<void> {
private datasetsRepository: IDatasetsRepository

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

/**
* Sets the available licenses for a given dataset type. This limits the license options when creating a dataset of this type.
*/
async execute(datasetTypeId: number | string, licenses: string[]): Promise<void> {
return await this.datasetsRepository.setAvailableLicensesForDatasetType(datasetTypeId, licenses)
}
}
19 changes: 18 additions & 1 deletion src/datasets/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ 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 { GetDatasetAvailableDatasetType } from './domain/useCases/GetDatasetAvailableDatasetType'
import { AddDatasetType } from './domain/useCases/AddDatasetType'
import { LinkDatasetTypeWithMetadataBlocks } from './domain/useCases/LinkDatasetTypeWithMetadataBlocks'
import { SetAvailableLicensesForDatasetType } from './domain/useCases/SetAvailableLicensesForDatasetType'
import { DeleteDatasetType } from './domain/useCases/DeleteDatasetType'
import { GetDatasetCitationInOtherFormats } from './domain/useCases/GetDatasetCitationInOtherFormats'
import { GetDatasetTemplates } from './domain/useCases/GetDatasetTemplates'

Expand Down Expand Up @@ -66,6 +71,13 @@ const unlinkDataset = new UnlinkDataset(datasetsRepository)
const getDatasetLinkedCollections = new GetDatasetLinkedCollections(datasetsRepository)
const getDatasetAvailableCategories = new GetDatasetAvailableCategories(datasetsRepository)
const getDatasetAvailableDatasetTypes = new GetDatasetAvailableDatasetTypes(datasetsRepository)
const getDatasetAvailableDatasetType = new GetDatasetAvailableDatasetType(datasetsRepository)
const addDatasetType = new AddDatasetType(datasetsRepository)
const linkDatasetTypeWithMetadataBlocks = new LinkDatasetTypeWithMetadataBlocks(datasetsRepository)
const setAvailableLicensesForDatasetType = new SetAvailableLicensesForDatasetType(
datasetsRepository
)
const deleteDatasetType = new DeleteDatasetType(datasetsRepository)
const getDatasetCitationInOtherFormats = new GetDatasetCitationInOtherFormats(datasetsRepository)
const getDatasetTemplates = new GetDatasetTemplates(datasetsRepository)

Expand All @@ -92,7 +104,12 @@ export {
getDatasetAvailableCategories,
getDatasetCitationInOtherFormats,
getDatasetTemplates,
getDatasetAvailableDatasetTypes
getDatasetAvailableDatasetTypes,
getDatasetAvailableDatasetType,
addDatasetType,
linkDatasetTypeWithMetadataBlocks,
setAvailableLicensesForDatasetType,
deleteDatasetType
}
export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion'
export { DatasetUserPermissions } from './domain/models/DatasetUserPermissions'
Expand Down
66 changes: 66 additions & 0 deletions src/datasets/infra/repositories/DatasetsRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -382,4 +382,70 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi
throw error
})
}

public async getDatasetAvailableDatasetType(
datasetTypeId: number | string
): Promise<DatasetType> {
const endpoint = this.buildApiEndpoint(
this.datasetsResourceName,
'datasetTypes/' + datasetTypeId
)
return this.doGet(endpoint)
.then((response) => response.data.data)
.catch((error) => {
throw error
})
}

public async addDatasetType(datasetType: DatasetType): Promise<DatasetType> {
return this.doPost(
this.buildApiEndpoint(this.datasetsResourceName, 'datasetTypes'),
datasetType
)
.then((response) => response.data.data)
.catch((error) => {
throw error
})
}

public async linkDatasetTypeWithMetadataBlocks(
datasetTypeId: number | string,
metadataBlocks: string[]
): Promise<void> {
return this.doPut(
this.buildApiEndpoint(this.datasetsResourceName, 'datasetTypes/' + datasetTypeId),
metadataBlocks
)
.then((response) => response.data.data)
.catch((error) => {
throw error
})
}

public async setAvailableLicensesForDatasetType(
datasetTypeId: number | string,
licenses: string[]
): Promise<void> {
return this.doPut(
this.buildApiEndpoint(
this.datasetsResourceName,
'datasetTypes/' + datasetTypeId + '/licenses'
),
licenses
)
.then((response) => response.data.data)
.catch((error) => {
throw error
})
}

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

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

test('should allow for adding and deleting a dataset type', async () => {
const randomName = `datasetType-${crypto.randomUUID().slice(0, 6)}`
const actual: DatasetType = await addDatasetType.execute({
name: randomName,
linkedMetadataBlocks: [],
availableLicenses: []
})
expect(actual.name).toEqual(randomName)

const deleted: void = await deleteDatasetType.execute(actual.id as number)
expect(deleted).toEqual({ message: 'deleted' })
})
})
})
Loading