Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions docs/useCases.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ The different use cases currently available in the package are classified below,
- [Get Maximum Embargo Duration In Months](#get-maximum-embargo-duration-in-months)
- [Get ZIP Download Limit](#get-zip-download-limit)
- [Get Application Terms of Use](#get-application-terms-of-use)
- [Get Available Dataset Metadata Export Formats](#get-available-dataset-metadata-export-formats)
- [Licenses](#Licenses)
- [Get Available Standard License Terms](#get-available-standard-license-terms)
- [Contact](#Contact)
Expand Down Expand Up @@ -2091,6 +2092,31 @@ getApplicationTermsOfUse.execute().then((termsOfUse: string) => {

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

#### Get Available Dataset Metadata Export Formats

Returns a [DatasetMetadataExportFormats](../src/info/domain/models/DatasetMetadataExportFormats.ts) object containing the available dataset metadata export formats.

##### Example call:

```typescript
import {
getAvailableDatasetMetadataExportFormats,
DatasetMetadataExportFormats
} from '@iqss/dataverse-client-javascript'

/* ... */

getAvailableDatasetMetadataExportFormats
.execute()
.then((datasetMetadataExportFormats: DatasetMetadataExportFormats) => {
/* ... */
})

/* ... */
```

_See [use case](../src/info/domain/useCases/GetAvailableDatasetMetadataExportFormats.ts) implementation_.

## Licenses

### Get Available Standard License Terms
Expand Down
16 changes: 16 additions & 0 deletions src/info/domain/models/DatasetMetadataExportFormats.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
export type DatasetMetadataExportFormats = Record<string, DatasetMetadataExportFormat>

type DatasetMetadataExportFormat = DatasetMetadataExportFormatBase | XmlDatasetMetadataExportFormat

interface DatasetMetadataExportFormatBase {
displayName: string
mediaType: string
isHarvestable: boolean
isVisibleInUserInterface: boolean
}

interface XmlDatasetMetadataExportFormat extends DatasetMetadataExportFormatBase {
XMLNameSpace: string
XMLSchemaLocation: string
XMLSchemaVersion: string
}
2 changes: 2 additions & 0 deletions src/info/domain/repositories/IDataverseInfoRepository.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { DatasetMetadataExportFormats } from '../models/DatasetMetadataExportFormats'
import { DataverseVersion } from '../models/DataverseVersion'

export interface IDataverseInfoRepository {
getDataverseVersion(): Promise<DataverseVersion>
getZipDownloadLimit(): Promise<number>
getMaxEmbargoDurationInMonths(): Promise<number>
getApplicationTermsOfUse(lang?: string): Promise<string>
getAvailableDatasetMetadataExportFormats(): Promise<DatasetMetadataExportFormats>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { UseCase } from '../../../core/domain/useCases/UseCase'
import { DatasetMetadataExportFormats } from '../models/DatasetMetadataExportFormats'
import { IDataverseInfoRepository } from '../repositories/IDataverseInfoRepository'

export class GetAvailableDatasetMetadataExportFormats
implements UseCase<DatasetMetadataExportFormats>
{
private dataverseInfoRepository: IDataverseInfoRepository

constructor(dataverseInfoRepository: IDataverseInfoRepository) {
this.dataverseInfoRepository = dataverseInfoRepository
}

/**
* Returns a DatasetMetadataExportFormats object containing the available dataset metadata export formats.
*
* @returns {Promise<DatasetMetadataExportFormats>}
*/
async execute(): Promise<DatasetMetadataExportFormats> {
return await this.dataverseInfoRepository.getAvailableDatasetMetadataExportFormats()
}
}
9 changes: 8 additions & 1 deletion src/info/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,24 @@ import { GetDataverseVersion } from './domain/useCases/GetDataverseVersion'
import { GetZipDownloadLimit } from './domain/useCases/GetZipDownloadLimit'
import { GetMaxEmbargoDurationInMonths } from './domain/useCases/GetMaxEmbargoDurationInMonths'
import { GetApplicationTermsOfUse } from './domain/useCases/GetApplicationTermsOfUse'
import { GetAvailableDatasetMetadataExportFormats } from './domain/useCases/GetAvailableDatasetMetadataExportFormats'

const dataverseInfoRepository = new DataverseInfoRepository()

const getDataverseVersion = new GetDataverseVersion(dataverseInfoRepository)
const getZipDownloadLimit = new GetZipDownloadLimit(dataverseInfoRepository)
const getMaxEmbargoDurationInMonths = new GetMaxEmbargoDurationInMonths(dataverseInfoRepository)
const getApplicationTermsOfUse = new GetApplicationTermsOfUse(dataverseInfoRepository)
const getAvailableDatasetMetadataExportFormats = new GetAvailableDatasetMetadataExportFormats(
dataverseInfoRepository
)

export {
getDataverseVersion,
getZipDownloadLimit,
getMaxEmbargoDurationInMonths,
getApplicationTermsOfUse
getApplicationTermsOfUse,
getAvailableDatasetMetadataExportFormats
}

export { DatasetMetadataExportFormats } from './domain/models/DatasetMetadataExportFormats'
11 changes: 11 additions & 0 deletions src/info/infra/repositories/DataverseInfoRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { ApiRepository } from '../../../core/infra/repositories/ApiRepository'
import { IDataverseInfoRepository } from '../../domain/repositories/IDataverseInfoRepository'
import { DataverseVersion } from '../../domain/models/DataverseVersion'
import { AxiosResponse } from 'axios'
import { DatasetMetadataExportFormats } from '../../domain/models/DatasetMetadataExportFormats'

export class DataverseInfoRepository extends ApiRepository implements IDataverseInfoRepository {
private readonly infoResourceName: string = 'info'
Expand Down Expand Up @@ -55,4 +56,14 @@ export class DataverseInfoRepository extends ApiRepository implements IDataverse
throw error
})
}

public async getAvailableDatasetMetadataExportFormats(): Promise<DatasetMetadataExportFormats> {
return this.doGet(this.buildApiEndpoint(this.infoResourceName, `exportFormats`))
.then((response: AxiosResponse<{ data: DatasetMetadataExportFormats }>) => {
return response.data.data
})
.catch((error) => {
throw error
})
}
}
8 changes: 8 additions & 0 deletions test/integration/info/DataverseInfoRepository.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,12 @@ describe('DataverseInfoRepository', () => {
await deleteApplicationTermsOfUseViaApi()
})
})

describe('getAvailableDatasetMetadataExportFormats', () => {
test('should return available dataset metadata export formats', async () => {
const actual = await sut.getAvailableDatasetMetadataExportFormats()

expect(actual).toBeDefined()
})
})
})
54 changes: 53 additions & 1 deletion test/unit/info/DataverseInfoRepository.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import axios from 'axios'
import { DataverseInfoRepository } from '../../../src/info/infra/repositories/DataverseInfoRepository'
import { ApiConfig, ReadError } from '../../../src'
import { ApiConfig, DatasetMetadataExportFormats, ReadError } from '../../../src'
import { TestConstants } from '../../testHelpers/TestConstants'
import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'

Expand Down Expand Up @@ -188,4 +188,56 @@ describe('DataverseInfoRepository', () => {
expect(error).toBeInstanceOf(Error)
})
})

describe('getAvailableDatasetMetadataExportFormats', () => {
test('should return available dataset metadata export formats on successful response', async () => {
const formats: DatasetMetadataExportFormats = {
OAI_ORE: {
displayName: 'OAI_ORE',
mediaType: 'application/json',
isHarvestable: false,
isVisibleInUserInterface: true
},
Datacite: {
displayName: 'DataCite',
mediaType: 'application/xml',
isHarvestable: true,
isVisibleInUserInterface: true,
XMLNameSpace: 'http://datacite.org/schema/kernel-4',
XMLSchemaLocation:
'http://datacite.org/schema/kernel-4 http://schema.datacite.org/meta/kernel-4.5/metadata.xsd',
XMLSchemaVersion: '4.5'
}
}

const testSuccessfulResponse = {
data: {
status: 'OK',
data: formats
}
}
jest.spyOn(axios, 'get').mockResolvedValue(testSuccessfulResponse)

const actual = await sut.getAvailableDatasetMetadataExportFormats()

expect(axios.get).toHaveBeenCalledWith(
`${TestConstants.TEST_API_URL}/info/exportFormats`,
TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG
)
expect(actual).toEqual(formats)
})

test('should return error result on error response', async () => {
jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE)

let error: ReadError | undefined
await sut.getAvailableDatasetMetadataExportFormats().catch((e) => (error = e))

expect(axios.get).toHaveBeenCalledWith(
`${TestConstants.TEST_API_URL}/info/exportFormats`,
TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG
)
expect(error).toBeInstanceOf(Error)
})
})
})
Loading