Skip to content

Commit 15cdfa3

Browse files
authored
Merge pull request #252 from IQSS/feat/251-refactor-terms-of-use
Get Dataset: refactor terms of use
2 parents fef6bbc + 9d25433 commit 15cdfa3

File tree

6 files changed

+165
-53
lines changed

6 files changed

+165
-53
lines changed

src/datasets/domain/models/Dataset.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,19 @@ export interface DatasetLicense {
3636
iconUri?: string
3737
}
3838

39-
export interface TermsOfUse {
39+
export interface CustomTerms {
40+
termsOfUse: string
41+
confidentialityDeclaration?: string
42+
specialPermissions?: string
43+
restrictions?: string
44+
citationRequirements?: string
45+
depositorRequirements?: string
46+
conditions?: string
47+
disclaimer?: string
48+
}
49+
export interface TermsOfAccess {
4050
fileAccessRequest: boolean
41-
termsOfAccess?: string
51+
termsOfAccessForRestrictedFiles?: string
4252
dataAccessPlace?: string
4353
originalArchive?: string
4454
availabilityStatus?: string
@@ -55,6 +65,10 @@ export interface TermsOfUse {
5565
disclaimer?: string
5666
}
5767

68+
export interface TermsOfUse {
69+
termsOfAccess: TermsOfAccess
70+
customTerms?: CustomTerms
71+
}
5872
export type DatasetMetadataBlocks = [CitationMetadataBlock, ...DatasetMetadataBlock[]]
5973

6074
export interface DatasetMetadataBlock {

src/datasets/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ export {
7373
DatasetMetadataBlocks,
7474
DatasetMetadataFields,
7575
DatasetMetadataSubField,
76-
DatasetMetadataFieldValue
76+
DatasetMetadataFieldValue,
77+
TermsOfUse
7778
} from './domain/models/Dataset'
7879
export { DatasetPreview } from './domain/models/DatasetPreview'
7980
export { DatasetVersionDiff } from './domain/models/DatasetVersionDiff'

src/datasets/infra/repositories/transformers/datasetTransformers.ts

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -235,15 +235,35 @@ export const transformVersionPayloadToDataset = (
235235
releaseTime: new Date(versionPayload.releaseTime)
236236
},
237237
termsOfUse: {
238-
fileAccessRequest: versionPayload.fileAccessRequest,
239-
termsOfAccess: transformPayloadText(keepRawFields, versionPayload.termsOfAccess),
240-
dataAccessPlace: transformPayloadText(keepRawFields, versionPayload.dataAccessPlace),
241-
originalArchive: transformPayloadText(keepRawFields, versionPayload.originalArchive),
242-
availabilityStatus: transformPayloadText(keepRawFields, versionPayload.availabilityStatus),
243-
contactForAccess: transformPayloadText(keepRawFields, versionPayload.contactForAccess),
244-
sizeOfCollection: transformPayloadText(keepRawFields, versionPayload.sizeOfCollection),
245-
studyCompletion: transformPayloadText(keepRawFields, versionPayload.studyCompletion),
246-
termsOfUse: transformPayloadText(keepRawFields, versionPayload.termsOfUse),
238+
termsOfAccess: {
239+
fileAccessRequest: versionPayload.fileAccessRequest,
240+
termsOfAccessForRestrictedFiles: transformPayloadText(
241+
keepRawFields,
242+
versionPayload.termsOfAccess
243+
),
244+
dataAccessPlace: transformPayloadText(keepRawFields, versionPayload.dataAccessPlace),
245+
originalArchive: transformPayloadText(keepRawFields, versionPayload.originalArchive),
246+
availabilityStatus: transformPayloadText(keepRawFields, versionPayload.availabilityStatus),
247+
contactForAccess: transformPayloadText(keepRawFields, versionPayload.contactForAccess),
248+
sizeOfCollection: transformPayloadText(keepRawFields, versionPayload.sizeOfCollection),
249+
studyCompletion: transformPayloadText(keepRawFields, versionPayload.studyCompletion)
250+
}
251+
},
252+
metadataBlocks: transformPayloadToDatasetMetadataBlocks(
253+
versionPayload.metadataBlocks,
254+
keepRawFields
255+
),
256+
...(versionPayload.isPartOf && {
257+
isPartOf: transformPayloadToOwnerNode(versionPayload.isPartOf)
258+
})
259+
}
260+
if ('license' in versionPayload) {
261+
datasetModel.license = transformPayloadToDatasetLicense(
262+
versionPayload.license as LicensePayload
263+
)
264+
} else {
265+
datasetModel.termsOfUse.customTerms = {
266+
termsOfUse: transformPayloadText(keepRawFields, versionPayload.termsOfUse) as string,
247267
confidentialityDeclaration: transformPayloadText(
248268
keepRawFields,
249269
versionPayload.confidentialityDeclaration
@@ -260,19 +280,7 @@ export const transformVersionPayloadToDataset = (
260280
),
261281
conditions: transformPayloadText(keepRawFields, versionPayload.conditions),
262282
disclaimer: transformPayloadText(keepRawFields, versionPayload.disclaimer)
263-
},
264-
metadataBlocks: transformPayloadToDatasetMetadataBlocks(
265-
versionPayload.metadataBlocks,
266-
keepRawFields
267-
),
268-
...(versionPayload.isPartOf && {
269-
isPartOf: transformPayloadToOwnerNode(versionPayload.isPartOf)
270-
})
271-
}
272-
if ('license' in versionPayload) {
273-
datasetModel.license = transformPayloadToDatasetLicense(
274-
versionPayload.license as LicensePayload
275-
)
283+
}
276284
}
277285
if ('alternativePersistentId' in versionPayload) {
278286
datasetModel.alternativePersistentId = versionPayload.alternativePersistentId
@@ -286,7 +294,13 @@ export const transformVersionPayloadToDataset = (
286294
return datasetModel
287295
}
288296

289-
const transformPayloadToDatasetLicense = (licensePayload: LicensePayload): DatasetLicense => {
297+
const transformPayloadToDatasetLicense = (
298+
licensePayload: LicensePayload
299+
): DatasetLicense | undefined => {
300+
if (!licensePayload) {
301+
return undefined
302+
}
303+
290304
const datasetLicense: DatasetLicense = {
291305
name: licensePayload.name,
292306
uri: licensePayload.uri
@@ -295,6 +309,7 @@ const transformPayloadToDatasetLicense = (licensePayload: LicensePayload): Datas
295309
if ('iconUri' in licensePayload) {
296310
datasetLicense.iconUri = licensePayload.iconUri
297311
}
312+
298313
return datasetLicense
299314
}
300315

test/functional/datasets/GetDataset.test.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,23 @@ describe('execute', () => {
7676

7777
await expect(getDataset.execute(nonExistentTestDatasetId)).rejects.toThrow(expectedError)
7878
})
79-
79+
test('should not return custom terms if license is set', async () => {
80+
const versionPayload = createDatasetVersionPayload()
81+
versionPayload.license = {
82+
name: 'CC0',
83+
uri: 'https://creativecommons.org/publicdomain/zero/1.0/',
84+
iconUri: 'https://creativecommons.org/publicdomain/zero/1.0/'
85+
}
86+
const dataset = transformVersionPayloadToDataset(versionPayload, false)
87+
expect(dataset.termsOfUse.termsOfAccess.termsOfAccessForRestrictedFiles).toBe('Terms of access')
88+
expect(dataset.termsOfUse.customTerms).toBe(undefined)
89+
})
90+
test('should return custom terms if license is undefined', async () => {
91+
const versionPayload = createDatasetVersionPayload()
92+
const dataset = transformVersionPayloadToDataset(versionPayload, false)
93+
expect(dataset.termsOfUse.termsOfAccess.termsOfAccessForRestrictedFiles).toBe('Terms of access')
94+
expect(dataset.termsOfUse.customTerms?.termsOfUse).toBe('Terms of use')
95+
})
8096
test('should return metadata fields in markdown format when keepRawFields is false', async () => {
8197
const createdDatasetIdentifiers = await createDataset.execute(testNewDataset)
8298

@@ -98,13 +114,15 @@ describe('execute', () => {
98114
const versionPayload = createDatasetVersionPayload()
99115
versionPayload.termsOfAccess = 'Hello <b>world</b>'
100116
const dataset = transformVersionPayloadToDataset(versionPayload, false)
101-
expect(dataset.termsOfUse.termsOfAccess).toBe('Hello **world**')
117+
expect(dataset.termsOfUse.termsOfAccess.termsOfAccessForRestrictedFiles).toBe('Hello **world**')
102118
})
103119

104120
test('should return terms of use fields in html format when keepRawFields is true', async () => {
105121
const versionPayload = createDatasetVersionPayload()
106122
const dataset = transformVersionPayloadToDataset(versionPayload, true)
107-
expect(dataset.termsOfUse.termsOfAccess).toBe(versionPayload.termsOfAccess)
123+
expect(dataset.termsOfUse.termsOfAccess.termsOfAccessForRestrictedFiles).toBe(
124+
versionPayload.termsOfAccess
125+
)
108126
})
109127

110128
test('should not return metadata fields in markdown format when keepRawFields is true', async () => {

test/testHelpers/datasets/datasetHelper.ts

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -53,22 +53,16 @@ export const createDatasetModel = (
5353
releaseTime: new Date(DATASET_RELEASE_TIME_STR)
5454
},
5555
termsOfUse: {
56-
fileAccessRequest: true,
57-
termsOfAccess: 'Terms of access',
58-
dataAccessPlace: 'Data access place',
59-
originalArchive: 'Original archive',
60-
availabilityStatus: 'Availability status',
61-
contactForAccess: 'Contact for access',
62-
sizeOfCollection: 'Size of collection',
63-
studyCompletion: 'Study completion',
64-
termsOfUse: 'Terms of use',
65-
confidentialityDeclaration: 'Confidentiality declaration',
66-
specialPermissions: 'Special permissions',
67-
restrictions: 'Restrictions',
68-
citationRequirements: 'Citation requirements',
69-
depositorRequirements: 'Depositor requirements',
70-
conditions: 'Conditions',
71-
disclaimer: 'Disclaimer'
56+
termsOfAccess: {
57+
fileAccessRequest: true,
58+
termsOfAccessForRestrictedFiles: 'Terms of access',
59+
dataAccessPlace: 'Data access place',
60+
originalArchive: 'Original archive',
61+
availabilityStatus: 'Availability status',
62+
contactForAccess: 'Contact for access',
63+
sizeOfCollection: 'Size of collection',
64+
studyCompletion: 'Study completion'
65+
}
7266
},
7367
publicationDate: DATASET_PUBLICATION_DATE_STR,
7468
metadataBlocks: [
@@ -105,6 +99,17 @@ export const createDatasetModel = (
10599
}
106100
if (license !== undefined) {
107101
datasetModel.license = license
102+
} else {
103+
datasetModel.termsOfUse.customTerms = {
104+
termsOfUse: 'Terms of use',
105+
confidentialityDeclaration: 'Confidentiality declaration',
106+
specialPermissions: 'Special permissions',
107+
restrictions: 'Restrictions',
108+
citationRequirements: 'Citation requirements',
109+
depositorRequirements: 'Depositor requirements',
110+
conditions: 'Conditions',
111+
disclaimer: 'Disclaimer'
112+
}
108113
}
109114
if (addOptionalParameters) {
110115
datasetModel.alternativePersistentId = 'doi:10.5072/FK2/HC6KTB'
@@ -137,14 +142,6 @@ export const createDatasetVersionPayload = (
137142
contactForAccess: 'Contact for access',
138143
sizeOfCollection: 'Size of collection',
139144
studyCompletion: 'Study completion',
140-
termsOfUse: 'Terms of use',
141-
confidentialityDeclaration: 'Confidentiality declaration',
142-
specialPermissions: 'Special permissions',
143-
restrictions: 'Restrictions',
144-
citationRequirements: 'Citation requirements',
145-
depositorRequirements: 'Depositor requirements',
146-
conditions: 'Conditions',
147-
disclaimer: 'Disclaimer',
148145
metadataBlocks: {
149146
citation: {
150147
name: 'citation',
@@ -240,6 +237,15 @@ export const createDatasetVersionPayload = (
240237
}
241238
if (license !== undefined) {
242239
datasetPayload.license = license
240+
} else {
241+
datasetPayload.termsOfUse = 'Terms of use'
242+
datasetPayload.confidentialityDeclaration = 'Confidentiality declaration'
243+
datasetPayload.specialPermissions = 'Special permissions'
244+
datasetPayload.restrictions = 'Restrictions'
245+
datasetPayload.citationRequirements = 'Citation requirements'
246+
datasetPayload.depositorRequirements = 'Depositor requirements'
247+
datasetPayload.conditions = 'Conditions'
248+
datasetPayload.disclaimer = 'Disclaimer'
243249
}
244250
if (addOptionalProperties) {
245251
datasetPayload.alternativePersistentId = 'doi:10.5072/FK2/HC6KTB'

test/unit/datasets/DatasetsRepository.test.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,64 @@ describe('DatasetsRepository', () => {
221221
)
222222
expect(actual).toStrictEqual(createDatasetModel(undefined, true))
223223
})
224+
test('should return Dataset with customTerms when license is undefined', async () => {
225+
jest.spyOn(axios, 'get').mockResolvedValue(testDatasetVersionSuccessfulResponse)
226+
const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}`
227+
228+
// API Key auth
229+
let actual = await sut.getDataset(
230+
testDatasetModel.id,
231+
testVersionId,
232+
testIncludeDeaccessioned,
233+
false
234+
)
235+
236+
expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey)
237+
expect(actual).toStrictEqual(testDatasetModel)
238+
239+
// Session cookie auth
240+
ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE)
241+
actual = await sut.getDataset(
242+
testDatasetModel.id,
243+
testVersionId,
244+
testIncludeDeaccessioned,
245+
false
246+
)
247+
expect(axios.get).toHaveBeenCalledWith(
248+
expectedApiEndpoint,
249+
expectedRequestConfigSessionCookie
250+
)
251+
expect(actual).toStrictEqual(testDatasetModel)
252+
})
253+
test('should return Dataset without customTerms when license is defined', async () => {
254+
jest.spyOn(axios, 'get').mockResolvedValue(testDatasetVersionSuccessfulResponse)
255+
const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}`
256+
257+
// API Key auth
258+
let actual = await sut.getDataset(
259+
testDatasetModel.id,
260+
testVersionId,
261+
testIncludeDeaccessioned,
262+
false
263+
)
264+
265+
expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey)
266+
expect(actual).toStrictEqual(testDatasetModel)
267+
268+
// Session cookie auth
269+
ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE)
270+
actual = await sut.getDataset(
271+
testDatasetModel.id,
272+
testVersionId,
273+
testIncludeDeaccessioned,
274+
false
275+
)
276+
expect(axios.get).toHaveBeenCalledWith(
277+
expectedApiEndpoint,
278+
expectedRequestConfigSessionCookie
279+
)
280+
expect(actual).toStrictEqual(testDatasetModel)
281+
})
224282

225283
test('should return error on repository read error', async () => {
226284
jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE)

0 commit comments

Comments
 (0)