Skip to content

Commit 6bfc7d6

Browse files
committed
feat: methods and use cases
1 parent ea487a0 commit 6bfc7d6

File tree

8 files changed

+190
-57
lines changed

8 files changed

+190
-57
lines changed

docs/useCases.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ The different use cases currently available in the package are classified below,
1616
- [List All Collection Items](#list-all-collection-items)
1717
- [List My Data Collection Items](#list-my-data-collection-items)
1818
- [Get Collection Featured Items](#get-collection-featured-items)
19+
- [Get Collection Dataset Templates](#get-collection-dataset-templates)
1920
- [Collections write use cases](#collections-write-use-cases)
2021
- [Create a Collection](#create-a-collection)
2122
- [Update a Collection](#update-a-collection)
@@ -321,6 +322,26 @@ The `collectionIdOrAlias` is a generic collection identifier, which can be eithe
321322

322323
If no collection identifier is specified, the default collection identifier; `:root` will be used. If you want to search for a different collection, you must add the collection identifier as a parameter in the use case call.
323324

325+
#### Get Collection Dataset Templates
326+
327+
Returns a [CollectionDatasetTemplate](../src/collections/domain/models/CollectionDatasetTemplate.ts) array containing the dataset templates of the requested collection, given the collection identifier or alias.
328+
329+
##### Example call:
330+
331+
```typescript
332+
import { getCollectionDatasetTemplates } from '@iqss/dataverse-client-javascript'
333+
334+
const collectionIdOrAlias = 12345
335+
336+
getCollectionDatasetTemplates
337+
.execute(collectionIdOrAlias)
338+
.then((datasetTemplates: CollectionDatasetTemplate[]) => {
339+
/* ... */
340+
})
341+
```
342+
343+
_See [use case](../src/collections/domain/useCases/GetCollectionDatasetTemplates.ts)_ definition.
344+
324345
### Collections Write Use Cases
325346

326347
#### Create a Collection
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { DatasetLicense, DatasetMetadataFieldValue, TermsOfUse } from '../../../datasets'
2+
3+
export interface CollectionDatasetTemplate {
4+
id: number
5+
name: string
6+
alias: string
7+
isDefault: boolean
8+
usageCount: number
9+
createTime: string
10+
createDate: string
11+
// 👇 From Edit Template Metadata
12+
datasetFields: DatasetFields
13+
instructions: DatasetTemplateInstruction[]
14+
// 👇 From Edit Template Terms
15+
termsOfUse: TermsOfUse
16+
license?: DatasetLicense // This license property is going to be present if not custom terms are added in the UI
17+
}
18+
19+
type DatasetFields = Record<string, DatasetFieldInfo>
20+
interface DatasetFieldInfo {
21+
displayName: string
22+
name: string
23+
fields: DatasetMetadataFieldValue[]
24+
}
25+
export interface DatasetTemplateInstruction {
26+
instructionField: string
27+
instructionText: string
28+
}

src/collections/domain/repositories/ICollectionsRepository.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { CollectionUserPermissions } from '../models/CollectionUserPermissions'
1010
import { PublicationStatus } from '../../../core/domain/models/PublicationStatus'
1111
import { CollectionItemType } from '../../../collections/domain/models/CollectionItemType'
1212
import { CollectionLinks } from '../models/CollectionLinks'
13+
import { CollectionDatasetTemplate } from '../models/CollectionDatasetTemplate'
1314

1415
export interface ICollectionsRepository {
1516
getCollection(collectionIdOrAlias: number | string): Promise<Collection>
@@ -60,5 +61,7 @@ export interface ICollectionsRepository {
6061
linkingCollectionIdOrAlias: number | string
6162
): Promise<void>
6263
getCollectionLinks(collectionIdOrAlias: number | string): Promise<CollectionLinks>
63-
getDatasetTemplates(collectionIdOrAlias: number | string): Promise<unknown>
64+
getCollectionDatasetTemplates(
65+
collectionIdOrAlias: number | string
66+
): Promise<CollectionDatasetTemplate[]>
6467
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { ICollectionsRepository } from '../repositories/ICollectionsRepository'
3+
import { ROOT_COLLECTION_ID } from '../models/Collection'
4+
import { CollectionDatasetTemplate } from '../models/CollectionDatasetTemplate'
5+
6+
export class GetCollectionDatasetTemplates implements UseCase<CollectionDatasetTemplate[]> {
7+
private collectionsRepository: ICollectionsRepository
8+
9+
constructor(collectionsRepository: ICollectionsRepository) {
10+
this.collectionsRepository = collectionsRepository
11+
}
12+
13+
/**
14+
* Returns a CollectionDatasetTemplate 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<CollectionDatasetTemplate[]>}
19+
*/
20+
async execute(
21+
collectionIdOrAlias: number | string = ROOT_COLLECTION_ID
22+
): Promise<CollectionDatasetTemplate[]> {
23+
return await this.collectionsRepository.getCollectionDatasetTemplates(collectionIdOrAlias)
24+
}
25+
}

src/collections/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { DeleteCollectionFeaturedItem } from './domain/useCases/DeleteCollection
1515
import { LinkCollection } from './domain/useCases/LinkCollection'
1616
import { UnlinkCollection } from './domain/useCases/UnlinkCollection'
1717
import { GetCollectionLinks } from './domain/useCases/GetCollectionLinks'
18+
import { GetCollectionDatasetTemplates } from './domain/useCases/GetCollectionDatasetTemplates'
1819

1920
const collectionsRepository = new CollectionsRepository()
2021

@@ -34,6 +35,7 @@ const deleteCollectionFeaturedItem = new DeleteCollectionFeaturedItem(collection
3435
const linkCollection = new LinkCollection(collectionsRepository)
3536
const unlinkCollection = new UnlinkCollection(collectionsRepository)
3637
const getCollectionLinks = new GetCollectionLinks(collectionsRepository)
38+
const getCollectionDatasetTemplates = new GetCollectionDatasetTemplates(collectionsRepository)
3739

3840
export {
3941
getCollection,
@@ -51,7 +53,8 @@ export {
5153
deleteCollectionFeaturedItem,
5254
linkCollection,
5355
unlinkCollection,
54-
getCollectionLinks
56+
getCollectionLinks,
57+
getCollectionDatasetTemplates
5558
}
5659
export { Collection, CollectionInputLevel } from './domain/models/Collection'
5760
export { CollectionFacet } from './domain/models/CollectionFacet'

src/collections/infra/repositories/CollectionsRepository.ts

Lines changed: 10 additions & 2 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 { ICollectionsRepository } from '../../domain/repositories/ICollectionsRepository'
34
import {
@@ -38,6 +39,9 @@ import { ApiConstants } from '../../../core/infra/repositories/ApiConstants'
3839
import { PublicationStatus } from '../../../core/domain/models/PublicationStatus'
3940
import { ReadError } from '../../../core/domain/repositories/ReadError'
4041
import { CollectionLinks } from '../../domain/models/CollectionLinks'
42+
import { CollectionDatasetTemplatePayload } from './transformers/CollectionDatasetTemplatePayload'
43+
import { transformCollectionDatasetTemplatePayloadToCollectionDatasetTemplate } from './transformers/collectionDatasetTemplateTransformer'
44+
import { CollectionDatasetTemplate } from '../../domain/models/CollectionDatasetTemplate'
4145

4246
export interface NewCollectionRequestPayload {
4347
alias: string
@@ -489,9 +493,13 @@ export class CollectionsRepository extends ApiRepository implements ICollections
489493
})
490494
}
491495

492-
public async getDatasetTemplates(collectionIdOrAlias: number | string): Promise<unknown> {
496+
public async getCollectionDatasetTemplates(
497+
collectionIdOrAlias: number | string
498+
): Promise<CollectionDatasetTemplate[]> {
493499
return this.doGet(`/${this.collectionsResourceName}/${collectionIdOrAlias}/templates`, true)
494-
.then((response) => response.data.data)
500+
.then((response: AxiosResponse<{ data: CollectionDatasetTemplatePayload[] }>) =>
501+
transformCollectionDatasetTemplatePayloadToCollectionDatasetTemplate(response.data.data)
502+
)
495503
.catch((error) => {
496504
throw error
497505
})
Lines changed: 45 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,64 @@
1-
// TODO:ME - Adding custom terms makes the get dataset templates endpoint throw internal server error
1+
import { MetadataFieldPayload } from '../../../../datasets/infra/repositories/transformers/DatasetPayload'
22

33
export interface CollectionDatasetTemplatePayload {
44
id: number
55
name: string
6+
dataverseAlias: string
67
isDefault: boolean
78
usageCount: number
89
createTime: string
910
createDate: string
10-
termsOfUseAndAccess: TermsOfUseAndAccess
11-
datasetFields: DatasetFields
11+
// 👇 From Edit Template Metadata
12+
datasetFields: DatasetFieldsPayload
1213
instructions: Instruction[]
13-
dataverseAlias: string
14+
// 👇 From Edit Template Terms
15+
termsOfUseAndAccess: {
16+
id: number
17+
fileAccessRequest: boolean
18+
// This license property is going to be present if not custom terms are added in the UI
19+
license?: {
20+
id: number
21+
name: string
22+
shortDescription: string
23+
uri: string
24+
iconUrl?: string
25+
active: boolean
26+
isDefault: boolean
27+
sortOrder: number
28+
rightsIdentifier: string
29+
rightsIdentifierScheme?: string
30+
schemeUri: string
31+
languageCode: string
32+
}
33+
// Below fields are going to be present if are added in "Restricted Files + Terms of Access"
34+
termsOfAccess?: string // This is terms of access for restricted files in the JSF UI
35+
dataAccessPlace?: string
36+
originalArchive?: string
37+
availabilityStatus?: string
38+
sizeOfCollection?: string
39+
studyCompletion?: string
40+
contactForAccess?: string
41+
// Below fields are going to be present if custom terms are added in the UI, they will be mapped and grouped under customTerms
42+
termsOfUse?: string
43+
confidentialityDeclaration?: string
44+
specialPermissions?: string
45+
restrictions?: string
46+
citationRequirements?: string
47+
depositorRequirements?: string
48+
conditions?: string
49+
disclaimer?: string
50+
}
1451
}
1552

16-
export interface TermsOfUseAndAccess {
17-
id: number
18-
license: License
19-
// Below fields are going to be present if are added in "Restricted Files + Terms of Access"
20-
termsOfAccess?: string // This is terms of access for restricted files in the JSF UI
21-
dataAccessPlace?: string
22-
originalArchive?: string
23-
availabilityStatus?: string
24-
sizeOfCollection?: string
25-
studyCompletion?: string
26-
// Below fields are going to be present if custom terms are added in the JSF UI
27-
termsOfUse?: string
28-
confidentialityDeclaration?: string
29-
specialPermissions?: string
30-
restrictions?: string
31-
citationRequirements?: string
32-
depositorRequirements?: string
33-
conditions?: string
34-
disclaimer?: string
35-
}
53+
type DatasetFieldsPayload = Record<string, DatasetFieldInfoPayload>
3654

37-
export interface License {
38-
id: number
39-
name: string
40-
shortDescription: string
41-
uri: string
42-
iconUrl: string
43-
active: boolean
44-
isDefault: boolean
45-
sortOrder: number
46-
rightsIdentifier: string
47-
rightsIdentifierScheme: string
48-
schemeUri: string
49-
languageCode: string
50-
}
51-
52-
export interface DatasetFields {
53-
citation: Citation
54-
}
55-
56-
export interface Citation {
55+
interface DatasetFieldInfoPayload {
5756
displayName: string
5857
name: string
59-
fields: Field[]
60-
}
61-
62-
export interface Field {
63-
typeName: string
64-
multiple: boolean
65-
typeClass: string
66-
value: string
58+
fields: MetadataFieldPayload[]
6759
}
6860

69-
export interface Instruction {
61+
interface Instruction {
7062
instructionField: string
7163
instructionText: string
7264
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { CollectionDatasetTemplate } from '../../../domain/models/CollectionDatasetTemplate'
2+
import { CollectionDatasetTemplatePayload } from './CollectionDatasetTemplatePayload'
3+
4+
export const transformCollectionDatasetTemplatePayloadToCollectionDatasetTemplate = (
5+
collectionDatasetTemplatePayload: CollectionDatasetTemplatePayload[]
6+
): CollectionDatasetTemplate[] => {
7+
return collectionDatasetTemplatePayload.map((payload) => {
8+
const collectionDatasetTemplate: CollectionDatasetTemplate = {
9+
id: payload.id,
10+
name: payload.name,
11+
alias: payload.dataverseAlias,
12+
isDefault: payload.isDefault,
13+
usageCount: payload.usageCount,
14+
createTime: payload.createTime,
15+
createDate: payload.createDate,
16+
datasetFields: payload.datasetFields as unknown as CollectionDatasetTemplate['datasetFields'],
17+
instructions: payload.instructions.map((instruction) => ({
18+
instructionField: instruction.instructionField,
19+
instructionText: instruction.instructionText
20+
})),
21+
termsOfUse: {
22+
termsOfAccess: {
23+
fileAccessRequest: payload.termsOfUseAndAccess.fileAccessRequest,
24+
termsOfAccessForRestrictedFiles: payload.termsOfUseAndAccess.termsOfAccess,
25+
dataAccessPlace: payload.termsOfUseAndAccess.dataAccessPlace,
26+
originalArchive: payload.termsOfUseAndAccess.originalArchive,
27+
availabilityStatus: payload.termsOfUseAndAccess.availabilityStatus,
28+
contactForAccess: payload.termsOfUseAndAccess.contactForAccess,
29+
sizeOfCollection: payload.termsOfUseAndAccess.sizeOfCollection,
30+
studyCompletion: payload.termsOfUseAndAccess.studyCompletion
31+
}
32+
}
33+
}
34+
35+
if (payload.termsOfUseAndAccess.license) {
36+
collectionDatasetTemplate.license = payload.termsOfUseAndAccess.license
37+
} else {
38+
collectionDatasetTemplate.termsOfUse.customTerms = {
39+
termsOfUse: payload.termsOfUseAndAccess.termsOfUse as string,
40+
confidentialityDeclaration: payload.termsOfUseAndAccess
41+
.confidentialityDeclaration as string,
42+
specialPermissions: payload.termsOfUseAndAccess.specialPermissions as string,
43+
restrictions: payload.termsOfUseAndAccess.restrictions as string,
44+
citationRequirements: payload.termsOfUseAndAccess.citationRequirements as string,
45+
depositorRequirements: payload.termsOfUseAndAccess.depositorRequirements as string,
46+
conditions: payload.termsOfUseAndAccess.conditions as string,
47+
disclaimer: payload.termsOfUseAndAccess.disclaimer as string
48+
}
49+
}
50+
51+
return collectionDatasetTemplate
52+
})
53+
}

0 commit comments

Comments
 (0)