Skip to content

Commit 6a025d3

Browse files
authored
Merge pull request #337 from IQSS/feat/324-link-dataset-use-cases
Linking dataset related use cases
2 parents 41d62f0 + 851f269 commit 6a025d3

File tree

14 files changed

+488
-1
lines changed

14 files changed

+488
-1
lines changed

docs/useCases.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,15 @@ The different use cases currently available in the package are classified below,
3636
- [Get Differences between Two Dataset Versions](#get-differences-between-two-dataset-versions)
3737
- [List All Datasets](#list-all-datasets)
3838
- [Get Dataset Versions Summaries](#get-dataset-versions-summaries)
39+
- [Get Dataset Linked Collections](#get-dataset-linked-collections)
3940
- [Datasets write use cases](#datasets-write-use-cases)
4041
- [Create a Dataset](#create-a-dataset)
4142
- [Update a Dataset](#update-a-dataset)
4243
- [Publish a Dataset](#publish-a-dataset)
4344
- [Deaccession a Dataset](#deaccession-a-dataset)
4445
- [Delete a Draft Dataset](#delete-a-draft-dataset)
46+
- [Link a Dataset](#link-a-dataset)
47+
- [Unlink a Dataset](#unlink-a-dataset)
4548
- [Files](#Files)
4649
- [Files read use cases](#files-read-use-cases)
4750
- [Get a File](#get-a-file)
@@ -739,6 +742,30 @@ _See [use case](../src/datasets/domain/useCases/GetDatasetVersionsSummaries.ts)
739742

740743
The `datasetId` parameter can be a string, for persistent identifiers, or a number, for numeric identifiers.
741744

745+
#### Get Dataset Linked Collections
746+
747+
Returns an array of [DatasetLinkedCollection](../src/datasets/domain/models/DatasetLinkedCollection.ts) that contains the collections linked to a dataset.
748+
749+
##### Example call:
750+
751+
```typescript
752+
import { getDatasetLinkedCollections } from '@iqss/dataverse-client-javascript'
753+
754+
/* ... */
755+
756+
const datasetId = 'doi:10.77777/FK2/AAAAAA'
757+
758+
getDatasetLinkedCollections
759+
.execute(datasetId)
760+
.then((datasetLinkedCollections: DatasetLinkedCollection[]) => {
761+
/* ... */
762+
})
763+
764+
/* ... */
765+
```
766+
767+
_See [use case](../src/datasets/domain/useCases/GetDatasetLinkedCollections.ts) implementation_.
768+
742769
### Datasets Write Use Cases
743770

744771
#### Create a Dataset
@@ -948,6 +975,48 @@ The `datasetId` parameter is a number for numeric identifiers or string for pers
948975

949976
If you try to delete a dataset without draft version, you will get a not found error.
950977

978+
#### Link a Dataset
979+
980+
Creates a link between a Dataset and a Collection.
981+
982+
##### Example call:
983+
984+
```typescript
985+
import { linkDataset } from '@iqss/dataverse-client-javascript'
986+
987+
/* ... */
988+
989+
const datasetId = 1
990+
const collectionAlias = 'collection-alias'
991+
992+
linkDataset.execute(datasetId, collectionAlias)
993+
994+
/* ... */
995+
```
996+
997+
_See [use case](../src/datasets/domain/useCases/LinkDataset.ts) implementation_.
998+
999+
#### Unlink a Dataset
1000+
1001+
Removes a link between a Dataset and a Collection.
1002+
1003+
##### Example call:
1004+
1005+
```typescript
1006+
import { unlinkDataset } from '@iqss/dataverse-client-javascript'
1007+
1008+
/* ... */
1009+
1010+
const datasetId = 1
1011+
const collectionAlias = 'collection-alias'
1012+
1013+
unlinkDataset.execute(datasetId, collectionAlias)
1014+
1015+
/* ... */
1016+
```
1017+
1018+
_See [use case](../src/datasets/domain/useCases/UnlinkDataset.ts) implementation_.
1019+
9511020
#### Get Download Count of a Dataset
9521021

9531022
Total number of downloads requested for a dataset, given a dataset numeric identifier,
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export interface DatasetLinkedCollection {
2+
id: number
3+
alias: string
4+
displayName: string
5+
}

src/datasets/domain/repositories/IDatasetsRepository.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { MetadataBlock } from '../../../metadataBlocks'
99
import { DatasetVersionDiff } from '../models/DatasetVersionDiff'
1010
import { DatasetDownloadCount } from '../models/DatasetDownloadCount'
1111
import { DatasetVersionSummaryInfo } from '../models/DatasetVersionSummaryInfo'
12+
import { DatasetLinkedCollection } from '../models/DatasetLinkedCollection'
1213

1314
export interface IDatasetsRepository {
1415
getDataset(
@@ -61,4 +62,7 @@ export interface IDatasetsRepository {
6162
): Promise<DatasetDownloadCount>
6263
getDatasetVersionsSummaries(datasetId: number | string): Promise<DatasetVersionSummaryInfo[]>
6364
deleteDatasetDraft(datasetId: number | string): Promise<void>
65+
linkDataset(datasetId: number, collectionAlias: string): Promise<void>
66+
unlinkDataset(datasetId: number, collectionAlias: string): Promise<void>
67+
getDatasetLinkedCollections(datasetId: number | string): Promise<DatasetLinkedCollection[]>
6468
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { DatasetLinkedCollection } from '../models/DatasetLinkedCollection'
3+
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'
4+
5+
export class GetDatasetLinkedCollections implements UseCase<DatasetLinkedCollection[]> {
6+
private datasetsRepository: IDatasetsRepository
7+
8+
constructor(datasetsRepository: IDatasetsRepository) {
9+
this.datasetsRepository = datasetsRepository
10+
}
11+
12+
/**
13+
* Returns a list of collections linked to a dataset.
14+
*
15+
* @param {number | string} [datasetId] - The dataset identifier, which can be a string (for persistent identifiers), or a number (for numeric identifiers).
16+
* @returns {Promise<DatasetLinkedCollection[]>}
17+
*/
18+
async execute(datasetId: number | string): Promise<DatasetLinkedCollection[]> {
19+
return await this.datasetsRepository.getDatasetLinkedCollections(datasetId)
20+
}
21+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'
3+
4+
export class LinkDataset implements UseCase<void> {
5+
private datasetsRepository: IDatasetsRepository
6+
7+
constructor(datasetsRepository: IDatasetsRepository) {
8+
this.datasetsRepository = datasetsRepository
9+
}
10+
11+
/**
12+
* Creates a link between a Dataset and a Collection.
13+
*
14+
* @param {number} [datasetId] - The dataset id.
15+
* @param {string} [collectionAlias] - The collection alias.
16+
* @returns {Promise<void>} - This method does not return anything upon successful completion.
17+
*/
18+
async execute(datasetId: number, collectionAlias: string): Promise<void> {
19+
return await this.datasetsRepository.linkDataset(datasetId, collectionAlias)
20+
}
21+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'
3+
4+
export class UnlinkDataset implements UseCase<void> {
5+
private datasetsRepository: IDatasetsRepository
6+
7+
constructor(datasetsRepository: IDatasetsRepository) {
8+
this.datasetsRepository = datasetsRepository
9+
}
10+
11+
/**
12+
* Removes a link between a Dataset and a Collection.
13+
*
14+
* @param {number} [datasetId] - The dataset id.
15+
* @param {string} [collectionAlias] - The collection alias.
16+
* @returns {Promise<void>} - This method does not return anything upon successful completion.
17+
*/
18+
async execute(datasetId: number, collectionAlias: string): Promise<void> {
19+
return await this.datasetsRepository.unlinkDataset(datasetId, collectionAlias)
20+
}
21+
}

src/datasets/index.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ import { DeaccessionDataset } from './domain/useCases/DeaccessionDataset'
2020
import { GetDatasetDownloadCount } from './domain/useCases/GetDatasetDownloadCount'
2121
import { GetDatasetVersionsSummaries } from './domain/useCases/GetDatasetVersionsSummaries'
2222
import { DeleteDatasetDraft } from './domain/useCases/DeleteDatasetDraft'
23+
import { LinkDataset } from './domain/useCases/LinkDataset'
24+
import { UnlinkDataset } from './domain/useCases/UnlinkDataset'
25+
import { GetDatasetLinkedCollections } from './domain/useCases/GetDatasetLinkedCollections'
2326

2427
const datasetsRepository = new DatasetsRepository()
2528

@@ -54,6 +57,9 @@ const deaccessionDataset = new DeaccessionDataset(datasetsRepository)
5457
const getDatasetDownloadCount = new GetDatasetDownloadCount(datasetsRepository)
5558
const getDatasetVersionsSummaries = new GetDatasetVersionsSummaries(datasetsRepository)
5659
const deleteDatasetDraft = new DeleteDatasetDraft(datasetsRepository)
60+
const linkDataset = new LinkDataset(datasetsRepository)
61+
const unlinkDataset = new UnlinkDataset(datasetsRepository)
62+
const getDatasetLinkedCollections = new GetDatasetLinkedCollections(datasetsRepository)
5763

5864
export {
5965
getDataset,
@@ -71,7 +77,10 @@ export {
7177
deaccessionDataset,
7278
getDatasetDownloadCount,
7379
getDatasetVersionsSummaries,
74-
deleteDatasetDraft
80+
deleteDatasetDraft,
81+
linkDataset,
82+
unlinkDataset,
83+
getDatasetLinkedCollections
7584
}
7685
export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion'
7786
export { DatasetUserPermissions } from './domain/models/DatasetUserPermissions'
@@ -105,3 +114,4 @@ export {
105114
DatasetVersionSummaryInfo,
106115
DatasetVersionSummaryStringValues
107116
} from './domain/models/DatasetVersionSummaryInfo'
117+
export { DatasetLinkedCollection } from './domain/models/DatasetLinkedCollection'

src/datasets/infra/repositories/DatasetsRepository.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import { DatasetVersionDiff } from '../../domain/models/DatasetVersionDiff'
2020
import { transformDatasetVersionDiffResponseToDatasetVersionDiff } from './transformers/datasetVersionDiffTransformers'
2121
import { DatasetDownloadCount } from '../../domain/models/DatasetDownloadCount'
2222
import { DatasetVersionSummaryInfo } from '../../domain/models/DatasetVersionSummaryInfo'
23+
import { DatasetLinkedCollection } from '../../domain/models/DatasetLinkedCollection'
24+
import { transformDatasetLinkedCollectionsResponseToDatasetLinkedCollection } from './transformers/datasetLinkedCollectionsTransformers'
2325

2426
export interface GetAllDatasetPreviewsQueryParams {
2527
per_page?: number
@@ -287,4 +289,32 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi
287289
throw error
288290
})
289291
}
292+
293+
public async linkDataset(datasetId: number, collectionAlias: string): Promise<void> {
294+
return this.doPut(`/${this.datasetsResourceName}/${datasetId}/link/${collectionAlias}`, {})
295+
.then(() => undefined)
296+
.catch((error) => {
297+
throw error
298+
})
299+
}
300+
301+
public async unlinkDataset(datasetId: number, collectionAlias: string): Promise<void> {
302+
return this.doDelete(`/${this.datasetsResourceName}/${datasetId}/deleteLink/${collectionAlias}`)
303+
.then(() => undefined)
304+
.catch((error) => {
305+
throw error
306+
})
307+
}
308+
309+
public async getDatasetLinkedCollections(
310+
datasetId: number | string
311+
): Promise<DatasetLinkedCollection[]> {
312+
return this.doGet(this.buildApiEndpoint(this.datasetsResourceName, 'links', datasetId), true)
313+
.then((response) =>
314+
transformDatasetLinkedCollectionsResponseToDatasetLinkedCollection(response.data.data)
315+
)
316+
.catch((error) => {
317+
throw error
318+
})
319+
}
290320
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export interface DatasetLinkedCollectionsPayload {
2+
id: number
3+
identifier: string
4+
'linked-dataverses': {
5+
id: number
6+
alias: string
7+
displayName: string
8+
}[]
9+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { DatasetLinkedCollection } from '../../../domain/models/DatasetLinkedCollection'
2+
import { DatasetLinkedCollectionsPayload } from './DatasetLinkedCollectionsPayload'
3+
4+
export const transformDatasetLinkedCollectionsResponseToDatasetLinkedCollection = (
5+
payload: DatasetLinkedCollectionsPayload
6+
): DatasetLinkedCollection[] => {
7+
return payload['linked-dataverses'].map((linkedDataverse) => ({
8+
id: linkedDataverse.id,
9+
alias: linkedDataverse.alias,
10+
displayName: linkedDataverse.displayName
11+
}))
12+
}

0 commit comments

Comments
 (0)