Skip to content

Commit 355ac27

Browse files
committed
Merge Conflict
2 parents 31ac368 + 2b54d0a commit 355ac27

File tree

9 files changed

+173
-1
lines changed

9 files changed

+173
-1
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel
99
### Added
1010

1111
- Datasets: Added `updateDatasetLicense` use case and repository method to support Dataverse endpoint `PUT /datasets/{id}/license`, for updating dataset license or custom terms.
12+
- 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.
13+
- Datasets: Added `updateDatasetLicense` use case and repository method to support Dataverse endpoint `PUT /datasets/{id}/license`, for updating dataset license or custom terms
1214
- New Use Case: [Get Collections For Linking Use Case](./docs/useCases.md#get-collections-for-linking).
1315
- New Use Case: [Create a Template](./docs/useCases.md#create-a-template) under Templates.
1416
- New Use Case: [Get a Template](./docs/useCases.md#get-a-template) under Templates.

docs/useCases.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ The different use cases currently available in the package are classified below,
4646
- [Get Dataset Versions Summaries](#get-dataset-versions-summaries)
4747
- [Get Dataset Linked Collections](#get-dataset-linked-collections)
4848
- [Get Dataset Available Categories](#get-dataset-available-categories)
49+
- [Get Dataset Templates](#get-dataset-templates)
50+
- [Get Dataset Storage Driver](#get-dataset-storage-driver)
4951
- [Get Dataset Available Dataset Types](#get-dataset-available-dataset-types)
5052
- [Get Dataset Available Dataset Type](#get-dataset-available-dataset-type)
5153
- [Datasets write use cases](#datasets-write-use-cases)
@@ -1396,6 +1398,52 @@ _See [use case](../src/datasets/domain/useCases/GetDatasetAvailableCategories.ts
13961398

13971399
The `datasetId` parameter is a number for numeric identifiers or string for persistent identifiers.
13981400

1401+
# <<<<<<< HEAD
1402+
1403+
#### Get Dataset Templates
1404+
1405+
Returns a [DatasetTemplate](../src/datasets/domain/models/DatasetTemplate.ts) array containing the dataset templates of the requested collection, given the collection identifier or alias.
1406+
1407+
##### Example call:
1408+
1409+
```typescript
1410+
import { getDatasetTemplates } from '@iqss/dataverse-client-javascript'
1411+
1412+
const collectionIdOrAlias = 12345
1413+
1414+
getDatasetTemplates.execute(collectionIdOrAlias).then((datasetTemplates: DatasetTemplate[]) => {
1415+
/* ... */
1416+
})
1417+
```
1418+
1419+
_See [use case](../src/datasets/domain/useCases/GetDatasetTemplates.ts)_ definition.
1420+
1421+
#### Get Dataset Storage Driver
1422+
1423+
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.
1424+
1425+
##### Example call:
1426+
1427+
```typescript
1428+
import { getDatasetStorageDriver } from '@iqss/dataverse-client-javascript'
1429+
1430+
/* ... */
1431+
1432+
const datasetId = 'doi:10.77777/FK2/AAAAAA'
1433+
1434+
getDatasetStorageDriver.execute(datasetId).then((storageDriver: StorageDriver) => {
1435+
/* ... */
1436+
})
1437+
1438+
/* ... */
1439+
```
1440+
1441+
_See [use case](../src/datasets/domain/useCases/GetDatasetStorageDriver.ts) implementation_.
1442+
1443+
The `datasetId` parameter can be a string, for persistent identifiers, or a number, for numeric identifiers.
1444+
1445+
> > > > > > > develop
1446+
13991447
#### Add a Dataset Type
14001448

14011449
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
@@ -16,6 +16,7 @@ import { DatasetType } from '../models/DatasetType'
1616
import { TermsOfAccess } from '../models/Dataset'
1717
import { DatasetLicenseUpdateRequest } from '../dtos/DatasetLicenseUpdateRequest'
1818
import { DatasetTypeDTO } from '../dtos/DatasetTypeDTO'
19+
import { StorageDriver } from '../models/StorageDriver'
1920

2021
export interface IDatasetsRepository {
2122
getDataset(
@@ -100,4 +101,5 @@ export interface IDatasetsRepository {
100101
datasetId: number | string,
101102
payload: DatasetLicenseUpdateRequest
102103
): Promise<void>
104+
getDatasetStorageDriver(datasetId: number | string): Promise<StorageDriver>
103105
}
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: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import { DeleteDatasetType } from './domain/useCases/DeleteDatasetType'
3333
import { GetDatasetCitationInOtherFormats } from './domain/useCases/GetDatasetCitationInOtherFormats'
3434
import { UpdateTermsOfAccess } from './domain/useCases/UpdateTermsOfAccess'
3535
import { UpdateDatasetLicense } from './domain/useCases/UpdateDatasetLicense'
36+
import { GetDatasetStorageDriver } from './domain/useCases/GetDatasetStorageDriver'
3637

3738
const datasetsRepository = new DatasetsRepository()
3839

@@ -82,6 +83,7 @@ const deleteDatasetType = new DeleteDatasetType(datasetsRepository)
8283
const getDatasetCitationInOtherFormats = new GetDatasetCitationInOtherFormats(datasetsRepository)
8384
const updateTermsOfAccess = new UpdateTermsOfAccess(datasetsRepository)
8485
const updateDatasetLicense = new UpdateDatasetLicense(datasetsRepository)
86+
const getDatasetStorageDriver = new GetDatasetStorageDriver(datasetsRepository)
8587

8688
export {
8789
getDataset,
@@ -112,7 +114,8 @@ export {
112114
linkDatasetTypeWithMetadataBlocks,
113115
setAvailableLicensesForDatasetType,
114116
deleteDatasetType,
115-
updateDatasetLicense
117+
updateDatasetLicense,
118+
getDatasetStorageDriver
116119
}
117120
export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion'
118121
export { DatasetUserPermissions } from './domain/models/DatasetUserPermissions'
@@ -151,3 +154,4 @@ export {
151154
export { DatasetLinkedCollection } from './domain/models/DatasetLinkedCollection'
152155
export { DatasetType } from './domain/models/DatasetType'
153156
export { DatasetTypeDTO } from './domain/dtos/DatasetTypeDTO'
157+
export { StorageDriver } from './domain/models/StorageDriver'

src/datasets/infra/repositories/DatasetsRepository.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { TermsOfAccess } from '../../domain/models/Dataset'
2929
import { transformTermsOfAccessToUpdatePayload } from './transformers/termsOfAccessTransformers'
3030
import { DatasetLicenseUpdateRequest } from '../../domain/dtos/DatasetLicenseUpdateRequest'
3131
import { DatasetTypeDTO } from '../../domain/dtos/DatasetTypeDTO'
32+
import { StorageDriver } from '../../domain/models/StorageDriver'
3233

3334
export interface GetAllDatasetPreviewsQueryParams {
3435
per_page?: number
@@ -499,4 +500,15 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi
499500
throw error
500501
})
501502
}
503+
504+
public async getDatasetStorageDriver(datasetId: number | string): Promise<StorageDriver> {
505+
return this.doGet(
506+
this.buildApiEndpoint(this.datasetsResourceName, 'storageDriver', datasetId),
507+
true
508+
)
509+
.then((response) => response.data.data as StorageDriver)
510+
.catch((error) => {
511+
throw error
512+
})
513+
}
502514
}

test/integration/datasets/DatasetsRepository.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2205,4 +2205,28 @@ describe('DatasetsRepository', () => {
22052205
await deleteUnpublishedDatasetViaApi(testDatasetIds.numericId)
22062206
})
22072207
})
2208+
2209+
describe('getDatasetStorageDriver', () => {
2210+
let testDatasetIds: CreatedDatasetIdentifiers
2211+
2212+
beforeAll(async () => {
2213+
testDatasetIds = await createDataset.execute(TestConstants.TEST_NEW_DATASET_DTO)
2214+
await publishDatasetViaApi(testDatasetIds.numericId)
2215+
await waitForNoLocks(testDatasetIds.numericId, 10)
2216+
})
2217+
2218+
afterAll(async () => {
2219+
await deletePublishedDatasetViaApi(testDatasetIds.persistentId)
2220+
})
2221+
2222+
test('should return storage driver info for dataset', async () => {
2223+
const storageDriver = await sut.getDatasetStorageDriver(testDatasetIds.numericId)
2224+
expect(storageDriver).toHaveProperty('name')
2225+
expect(storageDriver).toHaveProperty('type')
2226+
expect(storageDriver).toHaveProperty('label')
2227+
expect(typeof storageDriver.directUpload).toBe('boolean')
2228+
expect(typeof storageDriver.directDownload).toBe('boolean')
2229+
expect(typeof storageDriver.uploadOutOfBand).toBe('boolean')
2230+
})
2231+
})
22082232
})
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)