Skip to content

Commit 39aa3da

Browse files
authored
Merge pull request #362 from IQSS/feat/361-get-available-dataset-metadata-export-formats
Get Available Dataset Metadata Export Formats Use Case
2 parents 57c98de + 4a6055a commit 39aa3da

File tree

8 files changed

+146
-2
lines changed

8 files changed

+146
-2
lines changed

docs/useCases.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ The different use cases currently available in the package are classified below,
8989
- [Get Maximum Embargo Duration In Months](#get-maximum-embargo-duration-in-months)
9090
- [Get ZIP Download Limit](#get-zip-download-limit)
9191
- [Get Application Terms of Use](#get-application-terms-of-use)
92+
- [Get Available Dataset Metadata Export Formats](#get-available-dataset-metadata-export-formats)
9293
- [Licenses](#Licenses)
9394
- [Get Available Standard License Terms](#get-available-standard-license-terms)
9495
- [Contact](#Contact)
@@ -2091,6 +2092,31 @@ getApplicationTermsOfUse.execute().then((termsOfUse: string) => {
20912092

20922093
_See [use case](../src/info/domain/useCases/GetApplicationTermsOfUse.ts) implementation_.
20932094

2095+
#### Get Available Dataset Metadata Export Formats
2096+
2097+
Returns a [DatasetMetadataExportFormats](../src/info/domain/models/DatasetMetadataExportFormats.ts) object containing the available dataset metadata export formats.
2098+
2099+
##### Example call:
2100+
2101+
```typescript
2102+
import {
2103+
getAvailableDatasetMetadataExportFormats,
2104+
DatasetMetadataExportFormats
2105+
} from '@iqss/dataverse-client-javascript'
2106+
2107+
/* ... */
2108+
2109+
getAvailableDatasetMetadataExportFormats
2110+
.execute()
2111+
.then((datasetMetadataExportFormats: DatasetMetadataExportFormats) => {
2112+
/* ... */
2113+
})
2114+
2115+
/* ... */
2116+
```
2117+
2118+
_See [use case](../src/info/domain/useCases/GetAvailableDatasetMetadataExportFormats.ts) implementation_.
2119+
20942120
## Licenses
20952121

20962122
### Get Available Standard License Terms
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
export type DatasetMetadataExportFormats = Record<string, DatasetMetadataExportFormat>
2+
3+
type DatasetMetadataExportFormat = DatasetMetadataExportFormatBase | XmlDatasetMetadataExportFormat
4+
5+
interface DatasetMetadataExportFormatBase {
6+
displayName: string
7+
mediaType: string
8+
isHarvestable: boolean
9+
isVisibleInUserInterface: boolean
10+
}
11+
12+
interface XmlDatasetMetadataExportFormat extends DatasetMetadataExportFormatBase {
13+
XMLNameSpace: string
14+
XMLSchemaLocation: string
15+
XMLSchemaVersion: string
16+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1+
import { DatasetMetadataExportFormats } from '../models/DatasetMetadataExportFormats'
12
import { DataverseVersion } from '../models/DataverseVersion'
23

34
export interface IDataverseInfoRepository {
45
getDataverseVersion(): Promise<DataverseVersion>
56
getZipDownloadLimit(): Promise<number>
67
getMaxEmbargoDurationInMonths(): Promise<number>
78
getApplicationTermsOfUse(lang?: string): Promise<string>
9+
getAvailableDatasetMetadataExportFormats(): Promise<DatasetMetadataExportFormats>
810
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { DatasetMetadataExportFormats } from '../models/DatasetMetadataExportFormats'
3+
import { IDataverseInfoRepository } from '../repositories/IDataverseInfoRepository'
4+
5+
export class GetAvailableDatasetMetadataExportFormats
6+
implements UseCase<DatasetMetadataExportFormats>
7+
{
8+
private dataverseInfoRepository: IDataverseInfoRepository
9+
10+
constructor(dataverseInfoRepository: IDataverseInfoRepository) {
11+
this.dataverseInfoRepository = dataverseInfoRepository
12+
}
13+
14+
/**
15+
* Returns a DatasetMetadataExportFormats object containing the available dataset metadata export formats.
16+
*
17+
* @returns {Promise<DatasetMetadataExportFormats>}
18+
*/
19+
async execute(): Promise<DatasetMetadataExportFormats> {
20+
return await this.dataverseInfoRepository.getAvailableDatasetMetadataExportFormats()
21+
}
22+
}

src/info/index.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,24 @@ import { GetDataverseVersion } from './domain/useCases/GetDataverseVersion'
33
import { GetZipDownloadLimit } from './domain/useCases/GetZipDownloadLimit'
44
import { GetMaxEmbargoDurationInMonths } from './domain/useCases/GetMaxEmbargoDurationInMonths'
55
import { GetApplicationTermsOfUse } from './domain/useCases/GetApplicationTermsOfUse'
6+
import { GetAvailableDatasetMetadataExportFormats } from './domain/useCases/GetAvailableDatasetMetadataExportFormats'
67

78
const dataverseInfoRepository = new DataverseInfoRepository()
89

910
const getDataverseVersion = new GetDataverseVersion(dataverseInfoRepository)
1011
const getZipDownloadLimit = new GetZipDownloadLimit(dataverseInfoRepository)
1112
const getMaxEmbargoDurationInMonths = new GetMaxEmbargoDurationInMonths(dataverseInfoRepository)
1213
const getApplicationTermsOfUse = new GetApplicationTermsOfUse(dataverseInfoRepository)
14+
const getAvailableDatasetMetadataExportFormats = new GetAvailableDatasetMetadataExportFormats(
15+
dataverseInfoRepository
16+
)
1317

1418
export {
1519
getDataverseVersion,
1620
getZipDownloadLimit,
1721
getMaxEmbargoDurationInMonths,
18-
getApplicationTermsOfUse
22+
getApplicationTermsOfUse,
23+
getAvailableDatasetMetadataExportFormats
1924
}
25+
26+
export { DatasetMetadataExportFormats } from './domain/models/DatasetMetadataExportFormats'

src/info/infra/repositories/DataverseInfoRepository.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { ApiRepository } from '../../../core/infra/repositories/ApiRepository'
22
import { IDataverseInfoRepository } from '../../domain/repositories/IDataverseInfoRepository'
33
import { DataverseVersion } from '../../domain/models/DataverseVersion'
44
import { AxiosResponse } from 'axios'
5+
import { DatasetMetadataExportFormats } from '../../domain/models/DatasetMetadataExportFormats'
56

67
export class DataverseInfoRepository extends ApiRepository implements IDataverseInfoRepository {
78
private readonly infoResourceName: string = 'info'
@@ -55,4 +56,14 @@ export class DataverseInfoRepository extends ApiRepository implements IDataverse
5556
throw error
5657
})
5758
}
59+
60+
public async getAvailableDatasetMetadataExportFormats(): Promise<DatasetMetadataExportFormats> {
61+
return this.doGet(this.buildApiEndpoint(this.infoResourceName, `exportFormats`))
62+
.then((response: AxiosResponse<{ data: DatasetMetadataExportFormats }>) => {
63+
return response.data.data
64+
})
65+
.catch((error) => {
66+
throw error
67+
})
68+
}
5869
}

test/integration/info/DataverseInfoRepository.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,12 @@ describe('DataverseInfoRepository', () => {
7373
await deleteApplicationTermsOfUseViaApi()
7474
})
7575
})
76+
77+
describe('getAvailableDatasetMetadataExportFormats', () => {
78+
test('should return available dataset metadata export formats', async () => {
79+
const actual = await sut.getAvailableDatasetMetadataExportFormats()
80+
81+
expect(actual).toBeDefined()
82+
})
83+
})
7684
})

test/unit/info/DataverseInfoRepository.test.ts

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import axios from 'axios'
22
import { DataverseInfoRepository } from '../../../src/info/infra/repositories/DataverseInfoRepository'
3-
import { ApiConfig, ReadError } from '../../../src'
3+
import { ApiConfig, DatasetMetadataExportFormats, ReadError } from '../../../src'
44
import { TestConstants } from '../../testHelpers/TestConstants'
55
import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'
66

@@ -188,4 +188,56 @@ describe('DataverseInfoRepository', () => {
188188
expect(error).toBeInstanceOf(Error)
189189
})
190190
})
191+
192+
describe('getAvailableDatasetMetadataExportFormats', () => {
193+
test('should return available dataset metadata export formats on successful response', async () => {
194+
const formats: DatasetMetadataExportFormats = {
195+
OAI_ORE: {
196+
displayName: 'OAI_ORE',
197+
mediaType: 'application/json',
198+
isHarvestable: false,
199+
isVisibleInUserInterface: true
200+
},
201+
Datacite: {
202+
displayName: 'DataCite',
203+
mediaType: 'application/xml',
204+
isHarvestable: true,
205+
isVisibleInUserInterface: true,
206+
XMLNameSpace: 'http://datacite.org/schema/kernel-4',
207+
XMLSchemaLocation:
208+
'http://datacite.org/schema/kernel-4 http://schema.datacite.org/meta/kernel-4.5/metadata.xsd',
209+
XMLSchemaVersion: '4.5'
210+
}
211+
}
212+
213+
const testSuccessfulResponse = {
214+
data: {
215+
status: 'OK',
216+
data: formats
217+
}
218+
}
219+
jest.spyOn(axios, 'get').mockResolvedValue(testSuccessfulResponse)
220+
221+
const actual = await sut.getAvailableDatasetMetadataExportFormats()
222+
223+
expect(axios.get).toHaveBeenCalledWith(
224+
`${TestConstants.TEST_API_URL}/info/exportFormats`,
225+
TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG
226+
)
227+
expect(actual).toEqual(formats)
228+
})
229+
230+
test('should return error result on error response', async () => {
231+
jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE)
232+
233+
let error: ReadError | undefined
234+
await sut.getAvailableDatasetMetadataExportFormats().catch((e) => (error = e))
235+
236+
expect(axios.get).toHaveBeenCalledWith(
237+
`${TestConstants.TEST_API_URL}/info/exportFormats`,
238+
TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG
239+
)
240+
expect(error).toBeInstanceOf(Error)
241+
})
242+
})
191243
})

0 commit comments

Comments
 (0)