Skip to content

Commit bf9c617

Browse files
committed
Merge branch 'develop' into 363-get-datasetTypes #363
Conflicts: docs/useCases.md src/datasets/domain/repositories/IDatasetsRepository.ts src/datasets/index.ts src/datasets/infra/repositories/DatasetsRepository.ts test/integration/datasets/DatasetsRepository.test.ts
2 parents a49c004 + 81a431e commit bf9c617

File tree

17 files changed

+339
-35
lines changed

17 files changed

+339
-35
lines changed

docs/useCases.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ The different use cases currently available in the package are classified below,
3838
- [Get Dataset Versions Summaries](#get-dataset-versions-summaries)
3939
- [Get Dataset Linked Collections](#get-dataset-linked-collections)
4040
- [Get Dataset Available Categories](#get-dataset-available-categories)
41+
- [Get Dataset Templates](#get-dataset-templates)
4142
- [Get Dataset Available Dataset Types](#get-dataset-available-dataset-types)
4243
- [Datasets write use cases](#datasets-write-use-cases)
4344
- [Create a Dataset](#create-a-dataset)
@@ -1114,6 +1115,24 @@ _See [use case](../src/datasets/domain/useCases/GetDatasetAvailableCategories.ts
11141115

11151116
The `datasetId` parameter is a number for numeric identifiers or string for persistent identifiers.
11161117

1118+
#### Get Dataset Templates
1119+
1120+
Returns a [DatasetTemplate](../src/datasets/domain/models/DatasetTemplate.ts) array containing the dataset templates of the requested collection, given the collection identifier or alias.
1121+
1122+
##### Example call:
1123+
1124+
```typescript
1125+
import { getDatasetTemplates } from '@iqss/dataverse-client-javascript'
1126+
1127+
const collectionIdOrAlias = 12345
1128+
1129+
getDatasetTemplates.execute(collectionIdOrAlias).then((datasetTemplates: DatasetTemplate[]) => {
1130+
/* ... */
1131+
})
1132+
```
1133+
1134+
_See [use case](../src/datasets/domain/useCases/GetDatasetTemplates.ts)_ definition.
1135+
11171136
#### Get Dataset Available Dataset Types
11181137

11191138
Returns a list of available dataset types that can be used at dataset creation. By default, only the type "dataset" is returned.

src/datasets/domain/models/Dataset.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { DvObjectOwnerNode } from '../../../core/domain/models/DvObjectOwnerNode'
2+
import { License } from '../../../licenses'
23

34
export interface Dataset {
45
id: number
@@ -32,11 +33,7 @@ export enum DatasetVersionState {
3233
DEACCESSIONED = 'DEACCESSIONED'
3334
}
3435

35-
export interface DatasetLicense {
36-
name: string
37-
uri: string
38-
iconUri?: string
39-
}
36+
export type DatasetLicense = Pick<License, 'name' | 'uri' | 'iconUri'>
4037

4138
export interface CustomTerms {
4239
termsOfUse: string
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { DatasetMetadataBlock, TermsOfUse } from './Dataset'
2+
import { License } from '../../../licenses/domain/models/License'
3+
4+
export interface DatasetTemplate {
5+
id: number
6+
name: string
7+
collectionAlias: string
8+
isDefault: boolean
9+
usageCount: number
10+
createTime: string
11+
createDate: string
12+
// 👇 From Edit Template Metadata
13+
datasetMetadataBlocks: DatasetMetadataBlock[]
14+
instructions: DatasetTemplateInstruction[]
15+
// 👇 From Edit Template Terms
16+
termsOfUse: TermsOfUse
17+
license?: License // This license property is going to be present if not custom terms are added in the UI
18+
}
19+
20+
export interface DatasetTemplateInstruction {
21+
instructionField: string
22+
instructionText: string
23+
}

src/datasets/domain/repositories/IDatasetsRepository.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { DatasetVersionSummaryInfo } from '../models/DatasetVersionSummaryInfo'
1212
import { DatasetLinkedCollection } from '../models/DatasetLinkedCollection'
1313
import { CitationFormat } from '../models/CitationFormat'
1414
import { FormattedCitation } from '../models/FormattedCitation'
15+
import { DatasetTemplate } from '../models/DatasetTemplate'
1516
import { DatasetType } from '../models/DatasetType'
1617

1718
export interface IDatasetsRepository {
@@ -75,5 +76,6 @@ export interface IDatasetsRepository {
7576
format: CitationFormat,
7677
includeDeaccessioned?: boolean
7778
): Promise<FormattedCitation>
79+
getDatasetTemplates(collectionIdOrAlias: number | string): Promise<DatasetTemplate[]>
7880
getDatasetAvailableDatasetTypes(): Promise<DatasetType[]>
7981
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { ROOT_COLLECTION_ID } from '../../../collections/domain/models/Collection'
2+
import { UseCase } from '../../../core/domain/useCases/UseCase'
3+
import { DatasetTemplate } from '../models/DatasetTemplate'
4+
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'
5+
6+
export class GetDatasetTemplates implements UseCase<DatasetTemplate[]> {
7+
private datasetsRepository: IDatasetsRepository
8+
9+
constructor(datasetsRepository: IDatasetsRepository) {
10+
this.datasetsRepository = datasetsRepository
11+
}
12+
13+
/**
14+
* Returns a DatasetTemplate array containing the dataset templates of the requested collection, given the collection identifier or alias.
15+
*
16+
* @param {number | string} [collectionIdOrAlias = ':root'] - A generic collection identifier, which can be either a string (for queries by CollectionAlias), or a number (for queries by CollectionId)
17+
* If this parameter is not set, the default value is: ':root'
18+
* @returns {Promise<DatasetTemplate[]>}
19+
*/
20+
async execute(
21+
collectionIdOrAlias: number | string = ROOT_COLLECTION_ID
22+
): Promise<DatasetTemplate[]> {
23+
return await this.datasetsRepository.getDatasetTemplates(collectionIdOrAlias)
24+
}
25+
}

src/datasets/index.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { GetDatasetLinkedCollections } from './domain/useCases/GetDatasetLinkedC
2626
import { GetDatasetAvailableCategories } from './domain/useCases/GetDatasetAvailableCategories'
2727
import { GetDatasetAvailableDatasetTypes } from './domain/useCases/GetDatasetAvailableDatasetTypes'
2828
import { GetDatasetCitationInOtherFormats } from './domain/useCases/GetDatasetCitationInOtherFormats'
29+
import { GetDatasetTemplates } from './domain/useCases/GetDatasetTemplates'
2930

3031
const datasetsRepository = new DatasetsRepository()
3132

@@ -66,6 +67,7 @@ const getDatasetLinkedCollections = new GetDatasetLinkedCollections(datasetsRepo
6667
const getDatasetAvailableCategories = new GetDatasetAvailableCategories(datasetsRepository)
6768
const getDatasetAvailableDatasetTypes = new GetDatasetAvailableDatasetTypes(datasetsRepository)
6869
const getDatasetCitationInOtherFormats = new GetDatasetCitationInOtherFormats(datasetsRepository)
70+
const getDatasetTemplates = new GetDatasetTemplates(datasetsRepository)
6971

7072
export {
7173
getDataset,
@@ -88,8 +90,9 @@ export {
8890
unlinkDataset,
8991
getDatasetLinkedCollections,
9092
getDatasetAvailableCategories,
91-
getDatasetAvailableDatasetTypes,
92-
getDatasetCitationInOtherFormats
93+
getDatasetCitationInOtherFormats,
94+
getDatasetTemplates,
95+
getDatasetAvailableDatasetTypes
9396
}
9497
export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion'
9598
export { DatasetUserPermissions } from './domain/models/DatasetUserPermissions'

src/datasets/infra/repositories/DatasetsRepository.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { AxiosResponse } from 'axios'
12
import { ApiRepository } from '../../../core/infra/repositories/ApiRepository'
23
import { IDatasetsRepository } from '../../domain/repositories/IDatasetsRepository'
34
import { Dataset, VersionUpdateType } from '../../domain/models/Dataset'
@@ -24,6 +25,9 @@ import { DatasetLinkedCollection } from '../../domain/models/DatasetLinkedCollec
2425
import { CitationFormat } from '../../domain/models/CitationFormat'
2526
import { transformDatasetLinkedCollectionsResponseToDatasetLinkedCollection } from './transformers/datasetLinkedCollectionsTransformers'
2627
import { FormattedCitation } from '../../domain/models/FormattedCitation'
28+
import { DatasetTemplate } from '../../domain/models/DatasetTemplate'
29+
import { DatasetTemplatePayload } from './transformers/DatasetTemplatePayload'
30+
import { transformDatasetTemplatePayloadToDatasetTemplate } from './transformers/datasetTemplateTransformers'
2731
import { DatasetType } from '../../domain/models/DatasetType'
2832

2933
export interface GetAllDatasetPreviewsQueryParams {
@@ -359,6 +363,18 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi
359363
})
360364
}
361365

366+
public async getDatasetTemplates(
367+
collectionIdOrAlias: number | string
368+
): Promise<DatasetTemplate[]> {
369+
return this.doGet(`/dataverses/${collectionIdOrAlias}/templates`, true)
370+
.then((response: AxiosResponse<{ data: DatasetTemplatePayload[] }>) =>
371+
transformDatasetTemplatePayloadToDatasetTemplate(response.data.data)
372+
)
373+
.catch((error) => {
374+
throw error
375+
})
376+
}
377+
362378
public async getDatasetAvailableDatasetTypes(): Promise<DatasetType[]> {
363379
return this.doGet(this.buildApiEndpoint(this.datasetsResourceName, 'datasetTypes'))
364380
.then((response) => response.data.data)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export interface DatasetPayload {
1313
lastUpdateTime: string
1414
releaseTime: string
1515
metadataBlocks: MetadataBlocksPayload
16-
license?: LicensePayload
16+
license?: DatasetLicensePayload
1717
alternativePersistentId?: string
1818
publicationDate?: string
1919
citationDate?: string
@@ -38,7 +38,7 @@ export interface DatasetPayload {
3838
deaccessionNote?: string
3939
}
4040

41-
export interface LicensePayload {
41+
export interface DatasetLicensePayload {
4242
name: string
4343
uri: string
4444
iconUri?: string
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { LicensePayload } from '../../../../licenses/domain/repositories/transformers/LicensePayload'
2+
import { MetadataFieldPayload } from './DatasetPayload'
3+
4+
export interface DatasetTemplatePayload {
5+
id: number
6+
name: string
7+
dataverseAlias: string
8+
isDefault: boolean
9+
usageCount: number
10+
createTime: string
11+
createDate: string
12+
// 👇 From Edit Template Metadata
13+
datasetFields: DatasetFieldsPayload
14+
instructions: Instruction[]
15+
// 👇 From Edit Template Terms
16+
termsOfUseAndAccess: {
17+
id: number
18+
fileAccessRequest: boolean
19+
// This license property is going to be present if not custom terms are added in the UI
20+
license?: LicensePayload
21+
// Below fields are going to be present if are added in "Restricted Files + Terms of Access"
22+
termsOfAccess?: string // This is terms of access for restricted files in the JSF UI
23+
dataAccessPlace?: string
24+
originalArchive?: string
25+
availabilityStatus?: string
26+
sizeOfCollection?: string
27+
studyCompletion?: string
28+
contactForAccess?: string
29+
// Below fields are going to be present if custom terms are added in the UI, they will be mapped and grouped under customTerms
30+
termsOfUse?: string
31+
confidentialityDeclaration?: string
32+
specialPermissions?: string
33+
restrictions?: string
34+
citationRequirements?: string
35+
depositorRequirements?: string
36+
conditions?: string
37+
disclaimer?: string
38+
}
39+
}
40+
41+
type DatasetFieldsPayload = Record<string, DatasetFieldInfoPayload>
42+
43+
interface DatasetFieldInfoPayload {
44+
displayName: string
45+
name: string
46+
fields: MetadataFieldPayload[]
47+
}
48+
49+
interface Instruction {
50+
instructionField: string
51+
instructionText: string
52+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { transformPayloadLicenseToLicense } from '../../../../licenses/domain/repositories/transformers/licenseTransformers'
2+
import { DatasetTemplate } from '../../../domain/models/DatasetTemplate'
3+
import { DatasetTemplatePayload } from './DatasetTemplatePayload'
4+
import { transformPayloadToDatasetMetadataBlocks } from './datasetTransformers'
5+
6+
export const transformDatasetTemplatePayloadToDatasetTemplate = (
7+
collectionDatasetTemplatePayload: DatasetTemplatePayload[]
8+
): DatasetTemplate[] => {
9+
return collectionDatasetTemplatePayload.map((payload) => {
10+
const datasetTemplate: DatasetTemplate = {
11+
id: payload.id,
12+
name: payload.name,
13+
collectionAlias: payload.dataverseAlias,
14+
isDefault: payload.isDefault,
15+
usageCount: payload.usageCount,
16+
createTime: payload.createTime,
17+
createDate: payload.createDate,
18+
datasetMetadataBlocks: transformPayloadToDatasetMetadataBlocks(payload.datasetFields, false),
19+
instructions: payload.instructions.map((instruction) => ({
20+
instructionField: instruction.instructionField,
21+
instructionText: instruction.instructionText
22+
})),
23+
termsOfUse: {
24+
termsOfAccess: {
25+
fileAccessRequest: payload.termsOfUseAndAccess.fileAccessRequest,
26+
termsOfAccessForRestrictedFiles: payload.termsOfUseAndAccess.termsOfAccess,
27+
dataAccessPlace: payload.termsOfUseAndAccess.dataAccessPlace,
28+
originalArchive: payload.termsOfUseAndAccess.originalArchive,
29+
availabilityStatus: payload.termsOfUseAndAccess.availabilityStatus,
30+
contactForAccess: payload.termsOfUseAndAccess.contactForAccess,
31+
sizeOfCollection: payload.termsOfUseAndAccess.sizeOfCollection,
32+
studyCompletion: payload.termsOfUseAndAccess.studyCompletion
33+
}
34+
}
35+
}
36+
37+
if (payload.termsOfUseAndAccess.license) {
38+
datasetTemplate.license = transformPayloadLicenseToLicense(
39+
payload.termsOfUseAndAccess.license
40+
)
41+
} else {
42+
datasetTemplate.termsOfUse.customTerms = {
43+
termsOfUse: payload.termsOfUseAndAccess.termsOfUse as string,
44+
confidentialityDeclaration: payload.termsOfUseAndAccess
45+
.confidentialityDeclaration as string,
46+
specialPermissions: payload.termsOfUseAndAccess.specialPermissions as string,
47+
restrictions: payload.termsOfUseAndAccess.restrictions as string,
48+
citationRequirements: payload.termsOfUseAndAccess.citationRequirements as string,
49+
depositorRequirements: payload.termsOfUseAndAccess.depositorRequirements as string,
50+
conditions: payload.termsOfUseAndAccess.conditions as string,
51+
disclaimer: payload.termsOfUseAndAccess.disclaimer as string
52+
}
53+
}
54+
55+
return datasetTemplate
56+
})
57+
}

0 commit comments

Comments
 (0)