Skip to content

Commit 9ab1045

Browse files
committed
feat: update Dataset model terms of use
1 parent 19924ed commit 9ab1045

6 files changed

Lines changed: 223 additions & 19 deletions

File tree

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
@@ -47,6 +57,10 @@ export interface TermsOfUse {
4757
studyCompletion?: string
4858
}
4959

60+
export interface TermsOfUse {
61+
termsOfAccess: TermsOfAccess
62+
customTerms?: CustomTerms
63+
}
5064
export type DatasetMetadataBlocks = [CitationMetadataBlock, ...DatasetMetadataBlock[]]
5165

5266
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: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -235,14 +235,19 @@ export const transformVersionPayloadToDataset = (
235235
releaseTime: new Date(versionPayload.releaseTime)
236236
},
237237
termsOfUse: {
238-
fileAccessRequest: versionPayload.fileAccessRequest,
239-
termsOfAccess: versionPayload.termsOfAccess,
240-
dataAccessPlace: versionPayload.dataAccessPlace,
241-
originalArchive: versionPayload.originalArchive,
242-
availabilityStatus: versionPayload.availabilityStatus,
243-
contactForAccess: versionPayload.contactForAccess,
244-
sizeOfCollection: versionPayload.sizeOfCollection,
245-
studyCompletion: versionPayload.studyCompletion
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+
}
246251
},
247252
metadataBlocks: transformPayloadToDatasetMetadataBlocks(
248253
versionPayload.metadataBlocks,
@@ -256,6 +261,26 @@ export const transformVersionPayloadToDataset = (
256261
datasetModel.license = transformPayloadToDatasetLicense(
257262
versionPayload.license as LicensePayload
258263
)
264+
} else {
265+
datasetModel.termsOfUse.customTerms = {
266+
termsOfUse: transformPayloadText(keepRawFields, versionPayload.termsOfUse) as string,
267+
confidentialityDeclaration: transformPayloadText(
268+
keepRawFields,
269+
versionPayload.confidentialityDeclaration
270+
),
271+
specialPermissions: transformPayloadText(keepRawFields, versionPayload.specialPermissions),
272+
restrictions: transformPayloadText(keepRawFields, versionPayload.restrictions),
273+
citationRequirements: transformPayloadText(
274+
keepRawFields,
275+
versionPayload.citationRequirements
276+
),
277+
depositorRequirements: transformPayloadText(
278+
keepRawFields,
279+
versionPayload.depositorRequirements
280+
),
281+
conditions: transformPayloadText(keepRawFields, versionPayload.conditions),
282+
disclaimer: transformPayloadText(keepRawFields, versionPayload.disclaimer)
283+
}
259284
}
260285
if ('alternativePersistentId' in versionPayload) {
261286
datasetModel.alternativePersistentId = versionPayload.alternativePersistentId
@@ -281,6 +306,16 @@ const transformPayloadToDatasetLicense = (licensePayload: LicensePayload): Datas
281306
return datasetLicense
282307
}
283308

309+
const transformPayloadText = (
310+
keepRawFields: boolean,
311+
text: string | undefined
312+
): string | undefined => {
313+
if (!text) {
314+
return undefined
315+
}
316+
return keepRawFields ? text : transformHtmlToMarkdown(text)
317+
}
318+
284319
const transformPayloadToDatasetMetadataBlocks = (
285320
metadataBlocksPayload: MetadataBlocksPayload,
286321
keepRawFields: boolean

test/functional/datasets/GetDataset.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,19 @@ describe('execute', () => {
9090
await deleteUnpublishedDatasetViaApi(createdDatasetIdentifiers.numericId)
9191
})
9292

93+
test('should return terms of use fields in markdown format when keepRawFields is false', async () => {
94+
const versionPayload = createDatasetVersionPayload()
95+
versionPayload.termsOfAccess = 'Hello <b>world</b>'
96+
const dataset = transformVersionPayloadToDataset(versionPayload, false)
97+
expect(dataset.termsOfUse.termsOfAccess.termsOfAccessForRestrictedFiles).toBe('Hello **world**')
98+
})
99+
100+
test('should return terms of use fields in html format when keepRawFields is true', async () => {
101+
const versionPayload = createDatasetVersionPayload()
102+
const dataset = transformVersionPayloadToDataset(versionPayload, true)
103+
expect(dataset.termsOfUse.termsOfAccess.contactForAccess).toBe(versionPayload.contactForAccess)
104+
})
105+
93106
test('should not return metadata fields in markdown format when keepRawFields is true', async () => {
94107
const createdDatasetIdentifiers = await createDataset.execute(testNewDataset)
95108

test/testHelpers/datasets/datasetHelper.ts

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +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'
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+
}
6466
},
6567
publicationDate: DATASET_PUBLICATION_DATE_STR,
6668
metadataBlocks: [
@@ -97,6 +99,17 @@ export const createDatasetModel = (
9799
}
98100
if (license !== undefined) {
99101
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+
}
100113
}
101114
if (addOptionalParameters) {
102115
datasetModel.alternativePersistentId = 'doi:10.5072/FK2/HC6KTB'
@@ -129,6 +142,14 @@ export const createDatasetVersionPayload = (
129142
contactForAccess: 'Contact for access',
130143
sizeOfCollection: 'Size of collection',
131144
studyCompletion: 'Study completion',
145+
termsOfUse: 'Terms of use',
146+
confidentialityDeclaration: 'Confidentiality declaration',
147+
specialPermissions: 'Special permissions',
148+
restrictions: 'Restrictions',
149+
citationRequirements: 'Citation requirements',
150+
depositorRequirements: 'Depositor requirements',
151+
conditions: 'Conditions',
152+
disclaimer: 'Disclaimer',
132153
metadataBlocks: {
133154
citation: {
134155
name: 'citation',

test/unit/datasets/DatasetsRepository.test.ts

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,127 @@ describe('DatasetsRepository', () => {
115115
TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.withCredentials,
116116
headers: TestConstants.TEST_EXPECTED_AUTHENTICATED_REQUEST_CONFIG_SESSION_COOKIE.headers
117117
}
118+
describe('with custom terms of use', () => {
119+
test('should return Dataset with customTerms when license is undefined', async () => {
120+
jest.spyOn(axios, 'get').mockResolvedValue(testDatasetVersionSuccessfulResponse)
121+
const expectedApiEndpoint = `${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}`
122+
123+
// API Key auth
124+
let actual = await sut.getDataset(
125+
testDatasetModel.id,
126+
testVersionId,
127+
testIncludeDeaccessioned,
128+
false
129+
)
130+
131+
expect(axios.get).toHaveBeenCalledWith(expectedApiEndpoint, expectedRequestConfigApiKey)
132+
expect(actual).toStrictEqual(testDatasetModel)
133+
134+
// Session cookie auth
135+
ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.SESSION_COOKIE)
136+
actual = await sut.getDataset(
137+
testDatasetModel.id,
138+
testVersionId,
139+
testIncludeDeaccessioned,
140+
false
141+
)
142+
expect(axios.get).toHaveBeenCalledWith(
143+
expectedApiEndpoint,
144+
expectedRequestConfigSessionCookie
145+
)
146+
expect(actual).toStrictEqual(testDatasetModel)
147+
})
148+
149+
test('should return Dataset when providing id, version id, and response with license is successful', async () => {
150+
const testDatasetLicense = createDatasetLicenseModel()
151+
const testDatasetVersionWithLicenseSuccessfulResponse = {
152+
data: {
153+
status: 'OK',
154+
data: createDatasetVersionPayload(testDatasetLicense)
155+
}
156+
}
157+
jest.spyOn(axios, 'get').mockResolvedValue(testDatasetVersionWithLicenseSuccessfulResponse)
158+
159+
const actual = await sut.getDataset(
160+
testDatasetModel.id,
161+
testVersionId,
162+
testIncludeDeaccessioned,
163+
false
164+
)
165+
166+
expect(axios.get).toHaveBeenCalledWith(
167+
`${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}`,
168+
expectedRequestConfigApiKey
169+
)
170+
expect(actual).toStrictEqual(createDatasetModel(testDatasetLicense))
171+
})
172+
173+
test('should return Dataset when providing id, version id, and response with license without icon URI is successful', async () => {
174+
const testDatasetLicenseWithoutIconUri = createDatasetLicenseModel(false)
175+
const testDatasetVersionWithLicenseSuccessfulResponse = {
176+
data: {
177+
status: 'OK',
178+
data: createDatasetVersionPayload(testDatasetLicenseWithoutIconUri)
179+
}
180+
}
181+
jest.spyOn(axios, 'get').mockResolvedValue(testDatasetVersionWithLicenseSuccessfulResponse)
182+
183+
const actual = await sut.getDataset(
184+
testDatasetModel.id,
185+
testVersionId,
186+
testIncludeDeaccessioned,
187+
false
188+
)
189+
190+
expect(axios.get).toHaveBeenCalledWith(
191+
`${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}`,
192+
expectedRequestConfigApiKey
193+
)
194+
expect(actual).toStrictEqual(createDatasetModel(testDatasetLicenseWithoutIconUri))
195+
})
196+
197+
test('should return dataset with alternative persistent id, publication date and citation date when they are present in the response', async () => {
198+
const testDatasetVersionWithAlternativePersistentIdAndDatesSuccessfulResponse = {
199+
data: {
200+
status: 'OK',
201+
data: createDatasetVersionPayload(undefined, true)
202+
}
203+
}
204+
jest
205+
.spyOn(axios, 'get')
206+
.mockResolvedValue(
207+
testDatasetVersionWithAlternativePersistentIdAndDatesSuccessfulResponse
208+
)
118209

210+
const actual = await sut.getDataset(
211+
testDatasetModel.id,
212+
testVersionId,
213+
testIncludeDeaccessioned,
214+
false
215+
)
216+
217+
expect(axios.get).toHaveBeenCalledWith(
218+
`${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}`,
219+
expectedRequestConfigApiKey
220+
)
221+
expect(actual).toStrictEqual(createDatasetModel(undefined, true))
222+
})
223+
224+
test('should return error on repository read error', async () => {
225+
jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE)
226+
227+
let error = undefined as unknown as ReadError
228+
await sut
229+
.getDataset(testDatasetModel.id, testVersionId, testIncludeDeaccessioned, false)
230+
.catch((e) => (error = e))
231+
232+
expect(axios.get).toHaveBeenCalledWith(
233+
`${TestConstants.TEST_API_URL}/datasets/${testDatasetModel.id}/versions/${testVersionId}`,
234+
expectedRequestConfigApiKey
235+
)
236+
expect(error).toBeInstanceOf(Error)
237+
})
238+
})
119239
describe('by numeric id', () => {
120240
test('should return Dataset when providing id, version id, and response is successful', async () => {
121241
jest.spyOn(axios, 'get').mockResolvedValue(testDatasetVersionSuccessfulResponse)

0 commit comments

Comments
 (0)