Skip to content

Commit 5190e6a

Browse files
committed
Merge branch 'develop' into feat/345-get-collection-for-linking
2 parents 8387b4e + 81a431e commit 5190e6a

File tree

17 files changed

+338
-34
lines changed

17 files changed

+338
-34
lines changed

docs/useCases.md

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

11651166
The `datasetId` parameter is a number for numeric identifiers or string for persistent identifiers.
11661167

1168+
#### Get Dataset Templates
1169+
1170+
Returns a [DatasetTemplate](../src/datasets/domain/models/DatasetTemplate.ts) array containing the dataset templates of the requested collection, given the collection identifier or alias.
1171+
1172+
##### Example call:
1173+
1174+
```typescript
1175+
import { getDatasetTemplates } from '@iqss/dataverse-client-javascript'
1176+
1177+
const collectionIdOrAlias = 12345
1178+
1179+
getDatasetTemplates.execute(collectionIdOrAlias).then((datasetTemplates: DatasetTemplate[]) => {
1180+
/* ... */
1181+
})
1182+
```
1183+
1184+
_See [use case](../src/datasets/domain/useCases/GetDatasetTemplates.ts)_ definition.
1185+
11671186
## Files
11681187

11691188
### Files read use cases

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

1617
export interface IDatasetsRepository {
1718
getDataset(
@@ -74,4 +75,5 @@ export interface IDatasetsRepository {
7475
format: CitationFormat,
7576
includeDeaccessioned?: boolean
7677
): Promise<FormattedCitation>
78+
getDatasetTemplates(collectionIdOrAlias: number | string): Promise<DatasetTemplate[]>
7779
}
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: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { UnlinkDataset } from './domain/useCases/UnlinkDataset'
2525
import { GetDatasetLinkedCollections } from './domain/useCases/GetDatasetLinkedCollections'
2626
import { GetDatasetAvailableCategories } from './domain/useCases/GetDatasetAvailableCategories'
2727
import { GetDatasetCitationInOtherFormats } from './domain/useCases/GetDatasetCitationInOtherFormats'
28+
import { GetDatasetTemplates } from './domain/useCases/GetDatasetTemplates'
2829

2930
const datasetsRepository = new DatasetsRepository()
3031

@@ -64,6 +65,7 @@ const unlinkDataset = new UnlinkDataset(datasetsRepository)
6465
const getDatasetLinkedCollections = new GetDatasetLinkedCollections(datasetsRepository)
6566
const getDatasetAvailableCategories = new GetDatasetAvailableCategories(datasetsRepository)
6667
const getDatasetCitationInOtherFormats = new GetDatasetCitationInOtherFormats(datasetsRepository)
68+
const getDatasetTemplates = new GetDatasetTemplates(datasetsRepository)
6769

6870
export {
6971
getDataset,
@@ -86,7 +88,8 @@ export {
8688
unlinkDataset,
8789
getDatasetLinkedCollections,
8890
getDatasetAvailableCategories,
89-
getDatasetCitationInOtherFormats
91+
getDatasetCitationInOtherFormats,
92+
getDatasetTemplates
9093
}
9194
export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion'
9295
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

2832
export interface GetAllDatasetPreviewsQueryParams {
2933
per_page?: number
@@ -357,4 +361,16 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi
357361
throw error
358362
})
359363
}
364+
365+
public async getDatasetTemplates(
366+
collectionIdOrAlias: number | string
367+
): Promise<DatasetTemplate[]> {
368+
return this.doGet(`/dataverses/${collectionIdOrAlias}/templates`, true)
369+
.then((response: AxiosResponse<{ data: DatasetTemplatePayload[] }>) =>
370+
transformDatasetTemplatePayloadToDatasetTemplate(response.data.data)
371+
)
372+
.catch((error) => {
373+
throw error
374+
})
375+
}
360376
}

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)