Skip to content

Commit 9d02003

Browse files
authored
Merge pull request #372 from IQSS/370-dataset-types-crud
Use Cases for Adding, Editing, and Deleting Dataset Types
2 parents 574a58d + fd1779c commit 9d02003

20 files changed

+681
-3
lines changed

docs/useCases.md

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ The different use cases currently available in the package are classified below,
4040
- [Get Dataset Available Categories](#get-dataset-available-categories)
4141
- [Get Dataset Templates](#get-dataset-templates)
4242
- [Get Dataset Available Dataset Types](#get-dataset-available-dataset-types)
43+
- [Get Dataset Available Dataset Type](#get-dataset-available-dataset-type)
4344
- [Datasets write use cases](#datasets-write-use-cases)
4445
- [Create a Dataset](#create-a-dataset)
4546
- [Update a Dataset](#update-a-dataset)
@@ -48,6 +49,10 @@ The different use cases currently available in the package are classified below,
4849
- [Delete a Draft Dataset](#delete-a-draft-dataset)
4950
- [Link a Dataset](#link-a-dataset)
5051
- [Unlink a Dataset](#unlink-a-dataset)
52+
- [Add a Dataset Type](#add-a-dataset-type)
53+
- [Link Dataset Type with Metadata Blocks](#link-dataset-type-with-metadata-blocks)
54+
- [Set Available Licenses For Dataset Type](#set-available-licenses-for-dataset-type)
55+
- [Delete a Dataset Type](#delete-a-dataset-type)
5156
- [Files](#Files)
5257
- [Files read use cases](#files-read-use-cases)
5358
- [Get a File](#get-a-file)
@@ -833,6 +838,24 @@ getDatasetAvailableDatasetTypes.execute().then((datasetTypes: DatasetType[]) =>
833838

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

841+
#### Get Dataset Available Dataset Type
842+
843+
Returns an available dataset types that can be used at dataset creation.
844+
845+
###### Example call:
846+
847+
```typescript
848+
import { getDatasetAvailableDatasetType } from '@iqss/dataverse-client-javascript'
849+
850+
/* ... */
851+
852+
getDatasetAvailableDatasetType.execute().then((datasetType: DatasetType) => {
853+
/* ... */
854+
})
855+
```
856+
857+
_See [use case](../src/datasets/domain/useCases/GetDatasetAvailableDatasetType.ts) implementation_.
858+
836859
### Datasets Write Use Cases
837860

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

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

1182+
#### Add a Dataset Type
1183+
1184+
Adds a dataset types that can be used at dataset creation.
1185+
1186+
###### Example call:
1187+
1188+
```typescript
1189+
import { addDatasetType } from '@iqss/dataverse-client-javascript'
1190+
1191+
/* ... */
1192+
1193+
addDatasetType.execute(datasetType).then((datasetType: DatasetType) => {
1194+
/* ... */
1195+
})
1196+
```
1197+
1198+
_See [use case](../src/datasets/domain/useCases/AddDatasetType.ts) implementation_.
1199+
1200+
#### Link Dataset Type with Metadata Blocks
1201+
1202+
Link a dataset type with metadata blocks.
1203+
1204+
###### Example call:
1205+
1206+
```typescript
1207+
import { linkDatasetTypeWithMetadataBlocks } from '@iqss/dataverse-client-javascript'
1208+
1209+
/* ... */
1210+
1211+
linkDatasetTypeWithMetadataBlocks.execute(datasetTypeId, ['geospatial']).then(() => {
1212+
/* ... */
1213+
})
1214+
```
1215+
1216+
_See [use case](../src/datasets/domain/useCases/LinkDatasetTypeWithMetadataBlocks.ts) implementation_.
1217+
1218+
#### Set Available Licenses For Dataset Type
1219+
1220+
Set available licenses for dataset type.
1221+
1222+
###### Example call:
1223+
1224+
```typescript
1225+
import { setAvailableLicensesForDatasetType } from '@iqss/dataverse-client-javascript'
1226+
1227+
/* ... */
1228+
1229+
setAvailableLicensesForDatasetType.execute(datasetTypeId, ['CC BY 4.0']).then(() => {
1230+
/* ... */
1231+
})
1232+
```
1233+
1234+
_See [use case](../src/datasets/domain/useCases/SetAvailableLicensesForDatasetType.ts) implementation_.
1235+
1236+
#### Delete a Dataset Type
1237+
1238+
Delete a dataset type.
1239+
1240+
###### Example call:
1241+
1242+
```typescript
1243+
import { deleteDatasetType } from '@iqss/dataverse-client-javascript'
1244+
1245+
/* ... */
1246+
1247+
deleteDatasetType.execute(datasetTypeId).then(() => {
1248+
/* ... */
1249+
})
1250+
```
1251+
1252+
_See [use case](../src/datasets/domain/useCases/DeleteDatasetType.ts) implementation_.
1253+
11591254
## Files
11601255

11611256
### Files read use cases

src/datasets/domain/models/DatasetType.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export interface DatasetType {
2-
id: number
2+
id?: number
33
name: string
44
linkedMetadataBlocks?: string[]
55
availableLicenses?: string[]

src/datasets/domain/repositories/IDatasetsRepository.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,15 @@ export interface IDatasetsRepository {
7878
): Promise<FormattedCitation>
7979
getDatasetTemplates(collectionIdOrAlias: number | string): Promise<DatasetTemplate[]>
8080
getDatasetAvailableDatasetTypes(): Promise<DatasetType[]>
81+
getDatasetAvailableDatasetType(datasetTypeId: number | string): Promise<DatasetType>
82+
addDatasetType(datasetType: DatasetType): Promise<DatasetType>
83+
linkDatasetTypeWithMetadataBlocks(
84+
datasetTypeId: number | string,
85+
metadataBlocks: string[]
86+
): Promise<void>
87+
setAvailableLicensesForDatasetType(
88+
datasetTypeId: number | string,
89+
licenses: string[]
90+
): Promise<void>
91+
deleteDatasetType(datasetTypeId: number): Promise<void>
8192
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { DatasetType } from '../models/DatasetType'
3+
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'
4+
5+
export class AddDatasetType implements UseCase<DatasetType> {
6+
private datasetsRepository: IDatasetsRepository
7+
8+
constructor(datasetsRepository: IDatasetsRepository) {
9+
this.datasetsRepository = datasetsRepository
10+
}
11+
12+
/**
13+
* Add a dataset type that can be selected when creating a dataset.
14+
*/
15+
async execute(datasetType: DatasetType): Promise<DatasetType> {
16+
return await this.datasetsRepository.addDatasetType(datasetType)
17+
}
18+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'
3+
4+
export class DeleteDatasetType implements UseCase<void> {
5+
private datasetsRepository: IDatasetsRepository
6+
7+
constructor(datasetsRepository: IDatasetsRepository) {
8+
this.datasetsRepository = datasetsRepository
9+
}
10+
11+
/**
12+
* Deletes a dataset type.
13+
*/
14+
async execute(datasetTypeId: number): Promise<void> {
15+
return await this.datasetsRepository.deleteDatasetType(datasetTypeId)
16+
}
17+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { DatasetType } from '../models/DatasetType'
3+
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'
4+
5+
export class GetDatasetAvailableDatasetType implements UseCase<DatasetType> {
6+
private datasetsRepository: IDatasetsRepository
7+
8+
constructor(datasetsRepository: IDatasetsRepository) {
9+
this.datasetsRepository = datasetsRepository
10+
}
11+
12+
/**
13+
* Returns a single available dataset type that can be selected when creating a dataset.
14+
*/
15+
async execute(datasetTypeId: number | string): Promise<DatasetType> {
16+
return await this.datasetsRepository.getDatasetAvailableDatasetType(datasetTypeId)
17+
}
18+
}
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 { IDatasetsRepository } from '../repositories/IDatasetsRepository'
3+
4+
export class LinkDatasetTypeWithMetadataBlocks implements UseCase<void> {
5+
private datasetsRepository: IDatasetsRepository
6+
7+
constructor(datasetsRepository: IDatasetsRepository) {
8+
this.datasetsRepository = datasetsRepository
9+
}
10+
11+
/**
12+
* Links a dataset type with one or more metadata blocks. These metadata blocks will be shown when creating a dataset of this type.
13+
*/
14+
async execute(datasetTypeId: number | string, metadataBlocks: string[]): Promise<void> {
15+
return await this.datasetsRepository.linkDatasetTypeWithMetadataBlocks(
16+
datasetTypeId,
17+
metadataBlocks
18+
)
19+
}
20+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'
3+
4+
export class SetAvailableLicensesForDatasetType implements UseCase<void> {
5+
private datasetsRepository: IDatasetsRepository
6+
7+
constructor(datasetsRepository: IDatasetsRepository) {
8+
this.datasetsRepository = datasetsRepository
9+
}
10+
11+
/**
12+
* Sets the available licenses for a given dataset type. This limits the license options when creating a dataset of this type.
13+
*/
14+
async execute(datasetTypeId: number | string, licenses: string[]): Promise<void> {
15+
return await this.datasetsRepository.setAvailableLicensesForDatasetType(datasetTypeId, licenses)
16+
}
17+
}

src/datasets/index.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ import { UnlinkDataset } from './domain/useCases/UnlinkDataset'
2525
import { GetDatasetLinkedCollections } from './domain/useCases/GetDatasetLinkedCollections'
2626
import { GetDatasetAvailableCategories } from './domain/useCases/GetDatasetAvailableCategories'
2727
import { GetDatasetAvailableDatasetTypes } from './domain/useCases/GetDatasetAvailableDatasetTypes'
28+
import { GetDatasetAvailableDatasetType } from './domain/useCases/GetDatasetAvailableDatasetType'
29+
import { AddDatasetType } from './domain/useCases/AddDatasetType'
30+
import { LinkDatasetTypeWithMetadataBlocks } from './domain/useCases/LinkDatasetTypeWithMetadataBlocks'
31+
import { SetAvailableLicensesForDatasetType } from './domain/useCases/SetAvailableLicensesForDatasetType'
32+
import { DeleteDatasetType } from './domain/useCases/DeleteDatasetType'
2833
import { GetDatasetCitationInOtherFormats } from './domain/useCases/GetDatasetCitationInOtherFormats'
2934
import { GetDatasetTemplates } from './domain/useCases/GetDatasetTemplates'
3035

@@ -66,6 +71,13 @@ const unlinkDataset = new UnlinkDataset(datasetsRepository)
6671
const getDatasetLinkedCollections = new GetDatasetLinkedCollections(datasetsRepository)
6772
const getDatasetAvailableCategories = new GetDatasetAvailableCategories(datasetsRepository)
6873
const getDatasetAvailableDatasetTypes = new GetDatasetAvailableDatasetTypes(datasetsRepository)
74+
const getDatasetAvailableDatasetType = new GetDatasetAvailableDatasetType(datasetsRepository)
75+
const addDatasetType = new AddDatasetType(datasetsRepository)
76+
const linkDatasetTypeWithMetadataBlocks = new LinkDatasetTypeWithMetadataBlocks(datasetsRepository)
77+
const setAvailableLicensesForDatasetType = new SetAvailableLicensesForDatasetType(
78+
datasetsRepository
79+
)
80+
const deleteDatasetType = new DeleteDatasetType(datasetsRepository)
6981
const getDatasetCitationInOtherFormats = new GetDatasetCitationInOtherFormats(datasetsRepository)
7082
const getDatasetTemplates = new GetDatasetTemplates(datasetsRepository)
7183

@@ -92,7 +104,12 @@ export {
92104
getDatasetAvailableCategories,
93105
getDatasetCitationInOtherFormats,
94106
getDatasetTemplates,
95-
getDatasetAvailableDatasetTypes
107+
getDatasetAvailableDatasetTypes,
108+
getDatasetAvailableDatasetType,
109+
addDatasetType,
110+
linkDatasetTypeWithMetadataBlocks,
111+
setAvailableLicensesForDatasetType,
112+
deleteDatasetType
96113
}
97114
export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion'
98115
export { DatasetUserPermissions } from './domain/models/DatasetUserPermissions'

src/datasets/infra/repositories/DatasetsRepository.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,4 +382,70 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi
382382
throw error
383383
})
384384
}
385+
386+
public async getDatasetAvailableDatasetType(
387+
datasetTypeId: number | string
388+
): Promise<DatasetType> {
389+
const endpoint = this.buildApiEndpoint(
390+
this.datasetsResourceName,
391+
'datasetTypes/' + datasetTypeId
392+
)
393+
return this.doGet(endpoint)
394+
.then((response) => response.data.data)
395+
.catch((error) => {
396+
throw error
397+
})
398+
}
399+
400+
public async addDatasetType(datasetType: DatasetType): Promise<DatasetType> {
401+
return this.doPost(
402+
this.buildApiEndpoint(this.datasetsResourceName, 'datasetTypes'),
403+
datasetType
404+
)
405+
.then((response) => response.data.data)
406+
.catch((error) => {
407+
throw error
408+
})
409+
}
410+
411+
public async linkDatasetTypeWithMetadataBlocks(
412+
datasetTypeId: number | string,
413+
metadataBlocks: string[]
414+
): Promise<void> {
415+
return this.doPut(
416+
this.buildApiEndpoint(this.datasetsResourceName, 'datasetTypes/' + datasetTypeId),
417+
metadataBlocks
418+
)
419+
.then((response) => response.data.data)
420+
.catch((error) => {
421+
throw error
422+
})
423+
}
424+
425+
public async setAvailableLicensesForDatasetType(
426+
datasetTypeId: number | string,
427+
licenses: string[]
428+
): Promise<void> {
429+
return this.doPut(
430+
this.buildApiEndpoint(
431+
this.datasetsResourceName,
432+
'datasetTypes/' + datasetTypeId + '/licenses'
433+
),
434+
licenses
435+
)
436+
.then((response) => response.data.data)
437+
.catch((error) => {
438+
throw error
439+
})
440+
}
441+
442+
public async deleteDatasetType(datasetTypeId: number): Promise<void> {
443+
return this.doDelete(
444+
this.buildApiEndpoint(this.datasetsResourceName, 'datasetTypes/' + datasetTypeId)
445+
)
446+
.then((response) => response.data.data)
447+
.catch((error) => {
448+
throw error
449+
})
450+
}
385451
}

0 commit comments

Comments
 (0)