Skip to content

Commit 36b189f

Browse files
committed
get storage driver use case
1 parent a937365 commit 36b189f

File tree

9 files changed

+148
-1
lines changed

9 files changed

+148
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel
88

99
### Added
1010

11+
- Datasets: Added `getDatasetStorageDriver` use case and repository method to support Dataverse endpoint `GET /datasets/{identifier}/storageDriver`, for retrieving dataset storage driver configuration with properties: name, type, label, directUpload, directDownload, and uploadOutOfBand.
1112
- Datasets: Added `updateDatasetLicense` use case and repository method to support Dataverse endpoint `PUT /datasets/{id}/license`, for updating dataset license or custom terms
1213
- New Use Case: [Get Collections For Linking Use Case](./docs/useCases.md#get-collections-for-linking).
1314
- New Use Case: [Create a Dataset Template](./docs/useCases.md#create-a-dataset-template) under Collections.

docs/useCases.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ The different use cases currently available in the package are classified below,
4141
- [Get Dataset Linked Collections](#get-dataset-linked-collections)
4242
- [Get Dataset Available Categories](#get-dataset-available-categories)
4343
- [Get Dataset Templates](#get-dataset-templates)
44+
- [Get Dataset Storage Driver](#get-dataset-storage-driver)
4445
- [Get Dataset Available Dataset Types](#get-dataset-available-dataset-types)
4546
- [Get Dataset Available Dataset Type](#get-dataset-available-dataset-type)
4647
- [Datasets write use cases](#datasets-write-use-cases)
@@ -1351,6 +1352,30 @@ getDatasetTemplates.execute(collectionIdOrAlias).then((datasetTemplates: Dataset
13511352

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

1355+
#### Get Dataset Storage Driver
1356+
1357+
Returns a [StorageDriver](../src/datasets/domain/models/StorageDriver.ts) instance with storage driver configuration for a dataset, including properties like name, type, label, and upload/download capabilities.
1358+
1359+
##### Example call:
1360+
1361+
```typescript
1362+
import { getDatasetStorageDriver } from '@iqss/dataverse-client-javascript'
1363+
1364+
/* ... */
1365+
1366+
const datasetId = 'doi:10.77777/FK2/AAAAAA'
1367+
1368+
getDatasetStorageDriver.execute(datasetId).then((storageDriver: StorageDriver) => {
1369+
/* ... */
1370+
})
1371+
1372+
/* ... */
1373+
```
1374+
1375+
_See [use case](../src/datasets/domain/useCases/GetDatasetStorageDriver.ts)_ implementation\_.
1376+
1377+
The `datasetId` parameter can be a string, for persistent identifiers, or a number, for numeric identifiers.
1378+
13541379
#### Add a Dataset Type
13551380

13561381
Adds a dataset types that can be used at dataset creation.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export interface StorageDriver {
2+
name: string
3+
type: string
4+
label: string
5+
directUpload: boolean
6+
directDownload: boolean
7+
uploadOutOfBand: boolean
8+
}

src/datasets/domain/repositories/IDatasetsRepository.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { DatasetType } from '../models/DatasetType'
1717
import { TermsOfAccess } from '../models/Dataset'
1818
import { DatasetLicenseUpdateRequest } from '../dtos/DatasetLicenseUpdateRequest'
1919
import { DatasetTypeDTO } from '../dtos/DatasetTypeDTO'
20+
import { StorageDriver } from '../models/StorageDriver'
2021

2122
export interface IDatasetsRepository {
2223
getDataset(
@@ -102,4 +103,5 @@ export interface IDatasetsRepository {
102103
datasetId: number | string,
103104
payload: DatasetLicenseUpdateRequest
104105
): Promise<void>
106+
getDatasetStorageDriver(datasetId: number | string): Promise<StorageDriver>
105107
}
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+
import { StorageDriver } from '../models/StorageDriver'
4+
5+
export class GetDatasetStorageDriver implements UseCase<StorageDriver> {
6+
private datasetsRepository: IDatasetsRepository
7+
8+
constructor(datasetsRepository: IDatasetsRepository) {
9+
this.datasetsRepository = datasetsRepository
10+
}
11+
12+
/**
13+
* Returns the storage driver information for a given 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<StorageDriver>}
17+
*/
18+
async execute(datasetId: number | string): Promise<StorageDriver> {
19+
return this.datasetsRepository.getDatasetStorageDriver(datasetId)
20+
}
21+
}

src/datasets/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import { GetDatasetCitationInOtherFormats } from './domain/useCases/GetDatasetCi
3434
import { GetDatasetTemplates } from './domain/useCases/GetDatasetTemplates'
3535
import { UpdateTermsOfAccess } from './domain/useCases/UpdateTermsOfAccess'
3636
import { UpdateDatasetLicense } from './domain/useCases/UpdateDatasetLicense'
37+
import { GetDatasetStorageDriver } from './domain/useCases/GetDatasetStorageDriver'
3738

3839
const datasetsRepository = new DatasetsRepository()
3940

@@ -84,6 +85,7 @@ const getDatasetCitationInOtherFormats = new GetDatasetCitationInOtherFormats(da
8485
const getDatasetTemplates = new GetDatasetTemplates(datasetsRepository)
8586
const updateTermsOfAccess = new UpdateTermsOfAccess(datasetsRepository)
8687
const updateDatasetLicense = new UpdateDatasetLicense(datasetsRepository)
88+
const getDatasetStorageDriver = new GetDatasetStorageDriver(datasetsRepository)
8789

8890
export {
8991
getDataset,
@@ -115,7 +117,8 @@ export {
115117
linkDatasetTypeWithMetadataBlocks,
116118
setAvailableLicensesForDatasetType,
117119
deleteDatasetType,
118-
updateDatasetLicense
120+
updateDatasetLicense,
121+
getDatasetStorageDriver
119122
}
120123
export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion'
121124
export { DatasetUserPermissions } from './domain/models/DatasetUserPermissions'

src/datasets/infra/repositories/DatasetsRepository.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import { TermsOfAccess } from '../../domain/models/Dataset'
3333
import { transformTermsOfAccessToUpdatePayload } from './transformers/termsOfAccessTransformers'
3434
import { DatasetLicenseUpdateRequest } from '../../domain/dtos/DatasetLicenseUpdateRequest'
3535
import { DatasetTypeDTO } from '../../domain/dtos/DatasetTypeDTO'
36+
import { StorageDriver } from '../../domain/models/StorageDriver'
3637

3738
export interface GetAllDatasetPreviewsQueryParams {
3839
per_page?: number
@@ -515,4 +516,15 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi
515516
throw error
516517
})
517518
}
519+
520+
public async getDatasetStorageDriver(datasetId: number | string): Promise<StorageDriver> {
521+
return this.doGet(
522+
this.buildApiEndpoint(this.datasetsResourceName, 'storageDriver', datasetId),
523+
true
524+
)
525+
.then((response) => response.data.data as StorageDriver)
526+
.catch((error) => {
527+
throw error
528+
})
529+
}
518530
}

test/integration/datasets/DatasetsRepository.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2244,4 +2244,28 @@ describe('DatasetsRepository', () => {
22442244
await deleteUnpublishedDatasetViaApi(testDatasetIds.numericId)
22452245
})
22462246
})
2247+
2248+
describe('getDatasetStorageDriver', () => {
2249+
let testDatasetIds: CreatedDatasetIdentifiers
2250+
2251+
beforeAll(async () => {
2252+
testDatasetIds = await createDataset.execute(TestConstants.TEST_NEW_DATASET_DTO)
2253+
await publishDatasetViaApi(testDatasetIds.numericId)
2254+
await waitForNoLocks(testDatasetIds.numericId, 10)
2255+
})
2256+
2257+
afterAll(async () => {
2258+
await deletePublishedDatasetViaApi(testDatasetIds.persistentId)
2259+
})
2260+
2261+
test('should return storage driver info for dataset', async () => {
2262+
const storageDriver = await sut.getDatasetStorageDriver(testDatasetIds.numericId)
2263+
expect(storageDriver).toHaveProperty('name')
2264+
expect(storageDriver).toHaveProperty('type')
2265+
expect(storageDriver).toHaveProperty('label')
2266+
expect(typeof storageDriver.directUpload).toBe('boolean')
2267+
expect(typeof storageDriver.directDownload).toBe('boolean')
2268+
expect(typeof storageDriver.uploadOutOfBand).toBe('boolean')
2269+
})
2270+
})
22472271
})
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { GetDatasetStorageDriver } from '../../../src/datasets/domain/useCases/GetDatasetStorageDriver'
2+
import { IDatasetsRepository } from '../../../src/datasets/domain/repositories/IDatasetsRepository'
3+
import { StorageDriver } from '../../../src/datasets/domain/models/StorageDriver'
4+
import { ReadError } from '../../../src/core/domain/repositories/ReadError'
5+
6+
describe('GetDatasetStorageDriver (unit)', () => {
7+
const testStorageDriver: StorageDriver = {
8+
name: 'local',
9+
type: 'filesystem',
10+
label: 'Local Storage',
11+
directUpload: true,
12+
directDownload: true,
13+
uploadOutOfBand: false
14+
}
15+
16+
test('should return storage driver on repository success', async () => {
17+
const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository
18+
datasetsRepositoryStub.getDatasetStorageDriver = jest.fn().mockResolvedValue(testStorageDriver)
19+
const sut = new GetDatasetStorageDriver(datasetsRepositoryStub)
20+
21+
const actual = await sut.execute(1)
22+
23+
expect(actual).toEqual(testStorageDriver)
24+
expect(actual.name).toBe('local')
25+
expect(actual.type).toBe('filesystem')
26+
expect(actual.label).toBe('Local Storage')
27+
expect(actual.directUpload).toBe(true)
28+
expect(actual.directDownload).toBe(true)
29+
expect(actual.uploadOutOfBand).toBe(false)
30+
})
31+
32+
test('should return storage driver when using persistent id', async () => {
33+
const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository
34+
datasetsRepositoryStub.getDatasetStorageDriver = jest.fn().mockResolvedValue(testStorageDriver)
35+
const sut = new GetDatasetStorageDriver(datasetsRepositoryStub)
36+
37+
const actual = await sut.execute('doi:10.77777/FK2/AAAAAA')
38+
39+
expect(actual).toEqual(testStorageDriver)
40+
})
41+
42+
test('should return error result on repository error', async () => {
43+
const datasetsRepositoryStub: IDatasetsRepository = {} as IDatasetsRepository
44+
datasetsRepositoryStub.getDatasetStorageDriver = jest
45+
.fn()
46+
.mockRejectedValue(new ReadError('[404] Dataset not found'))
47+
const sut = new GetDatasetStorageDriver(datasetsRepositoryStub)
48+
49+
await expect(sut.execute(1)).rejects.toThrow(ReadError)
50+
})
51+
})

0 commit comments

Comments
 (0)