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
22 changes: 22 additions & 0 deletions docs/useCases.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ 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)
- [Licenses](#Licenses)
- [Get Available Standard License Terms](#get-available-standard-license-terms)
- [Contact](#Contact)
- [Send Feedback to Object Contacts](#send-feedback-to-object-contacts)
- [Search](#Search)
Expand Down Expand Up @@ -2084,6 +2086,26 @@ getApplicationTermsOfUse.execute().then((termsOfUse: string) => {

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

## Licenses

### Get Available Standard License Terms

Returns a list of available standard licenses that can be selected for a dataset.

##### Example call:

```typescript
import { getAvailableStandardLicenses, License } from '@iqss/dataverse-client-javascript'

/* ... */

getAvailableStandardLicenses.execute().then((licenses: License[]) => {
/* ... */
})
```

_See [use case](../src/licenses/domain/useCases/GetAvailableStandardLicenses.ts) implementation_.

## Contact

#### Send Feedback to Object Contacts
Expand Down
1 change: 1 addition & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ export * from './metadataBlocks'
export * from './files'
export * from './contactInfo'
export * from './search'
export * from './licenses'
14 changes: 14 additions & 0 deletions src/licenses/domain/models/License.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
export interface License {
id: number
name: string
shortDescription?: string
uri: string
iconUri?: string
active: boolean
isDefault: boolean
sortOrder: number
rightsIdentifier?: string
rightsIdentifierScheme?: string
schemeUri?: string
languageCode?: string
}
5 changes: 5 additions & 0 deletions src/licenses/domain/repositories/ILicensesRepository.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { License } from '../models/License'

export interface ILicensesRepository {
getAvailableStandardLicenses(): Promise<License[]>
}
14 changes: 14 additions & 0 deletions src/licenses/domain/repositories/transformers/LicensePayload.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
export interface LicensePayload {
id: number
name: string
shortDescription?: string
uri: string
iconUrl?: string
active: boolean
isDefault: boolean
sortOrder: number
rightsIdentifier?: string
rightsIdentifierScheme?: string
schemeUri?: string
languageCode?: string
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { AxiosResponse } from 'axios'
import { License } from '../../models/License'
import { LicensePayload } from './LicensePayload'

export const transformPayloadToLicense = (response: AxiosResponse): License[] => {
const payload = response.data.data as LicensePayload[]

return payload.map((license: LicensePayload) => ({
id: license.id,
name: license.name,
shortDescription: license.shortDescription,
uri: license.uri,
iconUri: license.iconUrl, // in payload, it is called iconUrl, but iconUri is the name matching everywhere else
active: license.active,
isDefault: license.isDefault,
sortOrder: license.sortOrder,
rightsIdentifier: license.rightsIdentifier,
rightsIdentifierScheme: license.rightsIdentifierScheme,
schemeUri: license.schemeUri,
languageCode: license.languageCode
}))
}
20 changes: 20 additions & 0 deletions src/licenses/domain/useCases/GetAvailableStandardLicenses.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { UseCase } from '../../../core/domain/useCases/UseCase'
import { License } from '../models/License'
import { ILicensesRepository } from '../repositories/ILicensesRepository'

export class GetAvailableStandardLicenses implements UseCase<License[]> {
private licensesRepository: ILicensesRepository

constructor(licensesRepository: ILicensesRepository) {
this.licensesRepository = licensesRepository
}

/**
* Returns the list of available standard license terms that can be selected for a dataset.
*
* @returns {Promise<License[]>}
*/
async execute(): Promise<License[]> {
return await this.licensesRepository.getAvailableStandardLicenses()
}
}
10 changes: 10 additions & 0 deletions src/licenses/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { LicensesRepository } from './infra/repositories/LicensesRepository'
import { GetAvailableStandardLicenses } from './domain/useCases/GetAvailableStandardLicenses'

const licensesRepository = new LicensesRepository()

const getAvailableStandardLicenses = new GetAvailableStandardLicenses(licensesRepository)

export { getAvailableStandardLicenses }

export { License } from './domain/models/License'
15 changes: 15 additions & 0 deletions src/licenses/infra/repositories/LicensesRepository.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ApiRepository } from '../../../core/infra/repositories/ApiRepository'
import { ILicensesRepository } from '../../domain/repositories/ILicensesRepository'
import { License } from '../../domain/models/License'

export class LicensesRepository extends ApiRepository implements ILicensesRepository {
private readonly licensesResourceName: string = 'licenses'

public async getAvailableStandardLicenses(): Promise<License[]> {
return this.doGet(this.buildApiEndpoint(this.licensesResourceName))
.then((response) => response.data.data)
.catch((error) => {
throw error
})
}
}
51 changes: 51 additions & 0 deletions test/functional/licenses/GetAvailableStandardLicenses.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import { ApiConfig, getAvailableStandardLicenses, License } from '../../../src'
import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'
import { TestConstants } from '../../testHelpers/TestConstants'

describe('getAvailableStandardLicenses', () => {
describe('execute', () => {
beforeAll(async () => {
ApiConfig.init(
TestConstants.TEST_API_URL,
DataverseApiAuthMechanism.API_KEY,
process.env.TEST_API_KEY
)
})

test('should return available standard license terms', async () => {
const actualLicenses: License[] = await getAvailableStandardLicenses.execute()
const expectedLicenses = [
{
id: 1,
name: 'CC0 1.0',
shortDescription: 'Creative Commons CC0 1.0 Universal Public Domain Dedication.',
uri: 'http://creativecommons.org/publicdomain/zero/1.0',
iconUrl: 'https://licensebuttons.net/p/zero/1.0/88x31.png',
active: true,
isDefault: true,
sortOrder: 0,
rightsIdentifier: 'CC0-1.0',
rightsIdentifierScheme: 'SPDX',
schemeUri: 'https://spdx.org/licenses/',
languageCode: 'en'
},
{
id: 2,
name: 'CC BY 4.0',
shortDescription: 'Creative Commons Attribution 4.0 International License.',
uri: 'http://creativecommons.org/licenses/by/4.0',
iconUrl: 'https://licensebuttons.net/l/by/4.0/88x31.png',
active: true,
isDefault: false,
sortOrder: 2,
rightsIdentifier: 'CC-BY-4.0',
rightsIdentifierScheme: 'SPDX',
schemeUri: 'https://spdx.org/licenses/',
languageCode: 'en'
}
]

expect(actualLicenses).toEqual(expectedLicenses)
})
})
})
57 changes: 57 additions & 0 deletions test/integration/licenses/LicensesRepository.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import {
ApiConfig,
DataverseApiAuthMechanism
} from '../../../src/core/infra/repositories/ApiConfig'
import { TestConstants } from '../../testHelpers/TestConstants'
import { LicensesRepository } from '../../../src/licenses/infra/repositories/LicensesRepository'

describe('LicensesRepository', () => {
const sut: LicensesRepository = new LicensesRepository()

describe('getAvailableStandardLicenses', () => {
beforeAll(async () => {
ApiConfig.init(
TestConstants.TEST_API_URL,
DataverseApiAuthMechanism.API_KEY,
process.env.TEST_API_KEY
)
})

test('should return list of available standard license terms', async () => {
const actual = await sut.getAvailableStandardLicenses()

const licenses = [
{
id: 1,
name: 'CC0 1.0',
shortDescription: 'Creative Commons CC0 1.0 Universal Public Domain Dedication.',
uri: 'http://creativecommons.org/publicdomain/zero/1.0',
iconUrl: 'https://licensebuttons.net/p/zero/1.0/88x31.png',
active: true,
isDefault: true,
sortOrder: 0,
rightsIdentifier: 'CC0-1.0',
rightsIdentifierScheme: 'SPDX',
schemeUri: 'https://spdx.org/licenses/',
languageCode: 'en'
},
{
id: 2,
name: 'CC BY 4.0',
shortDescription: 'Creative Commons Attribution 4.0 International License.',
uri: 'http://creativecommons.org/licenses/by/4.0',
iconUrl: 'https://licensebuttons.net/l/by/4.0/88x31.png',
active: true,
isDefault: false,
sortOrder: 2,
rightsIdentifier: 'CC-BY-4.0',
rightsIdentifierScheme: 'SPDX',
schemeUri: 'https://spdx.org/licenses/',
languageCode: 'en'
}
]

expect(actual).toEqual(licenses)
})
})
})
62 changes: 62 additions & 0 deletions test/unit/licenses/GetAvailableStandardLicenses.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { License, ReadError } from '../../../src'
import { ILicensesRepository } from '../../../src/licenses/domain/repositories/ILicensesRepository'
import { GetAvailableStandardLicenses } from '../../../src/licenses/domain/useCases/GetAvailableStandardLicenses'

describe('GetAvailableStandardLicenses', () => {
describe('execute', () => {
test('should return licenses array on repository success', async () => {
const licensesRepositoryStub: ILicensesRepository = {} as ILicensesRepository

const testLicenses: License[] = [
{
id: 1,
name: 'CC0 1.0',
uri: 'http://creativecommons.org/publicdomain/zero/1.0',
iconUri: 'https://licensebuttons.net/p/zero/1.0/88x31.png',
active: true,
isDefault: true,
sortOrder: 0,
rightsIdentifier: 'CC0-1.0',
rightsIdentifierScheme: 'SPDX',
schemeUri: 'https://spdx.org/licenses/',
languageCode: 'en'
},
{
id: 2,
name: 'CC BY 4.0',
uri: 'http://creativecommons.org/licenses/by/4.0',
iconUri: 'https://licensebuttons.net/l/by/4.0/88x31.png',
active: true,
isDefault: false,
sortOrder: 2,
rightsIdentifier: 'CC-BY-4.0',
rightsIdentifierScheme: 'SPDX',
schemeUri: 'https://spdx.org/licenses/',
languageCode: 'en'
}
]

licensesRepositoryStub.getAvailableStandardLicenses = jest
.fn()
.mockResolvedValue(testLicenses)
const sut = new GetAvailableStandardLicenses(licensesRepositoryStub)

const actual = await sut.execute()

expect(actual).toEqual(testLicenses)
expect(licensesRepositoryStub.getAvailableStandardLicenses).toHaveBeenCalledTimes(1)
})

test('should return error result on repository error', async () => {
const licensesRepositoryStub: ILicensesRepository = {} as ILicensesRepository
const expectedError = new ReadError('Failed to fetch licenses')
licensesRepositoryStub.getAvailableStandardLicenses = jest
.fn()
.mockRejectedValue(expectedError)
const sut = new GetAvailableStandardLicenses(licensesRepositoryStub)

await expect(sut.execute()).rejects.toThrow(ReadError)
expect(licensesRepositoryStub.getAvailableStandardLicenses).toHaveBeenCalledTimes(1)
})
})
})
Loading