Skip to content

Commit 62d093a

Browse files
committed
Merge branch 'develop' into edit-metadata-allow-empty-values
2 parents 80f68e7 + 79398c8 commit 62d093a

28 files changed

+832
-30
lines changed

docs/useCases.md

Lines changed: 60 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ The different use cases currently available in the package are classified below,
3333
- [Get User Permissions on a Dataset](#get-user-permissions-on-a-dataset)
3434
- [Get Differences between Two Dataset Versions](#get-differences-between-two-dataset-versions)
3535
- [List All Datasets](#list-all-datasets)
36+
- [Get Dataset Versions Summaries](#get-dataset-versions-summaries)
3637
- [Datasets write use cases](#datasets-write-use-cases)
3738
- [Create a Dataset](#create-a-dataset)
3839
- [Update a Dataset](#update-a-dataset)
@@ -577,7 +578,7 @@ const datasetId = 'doi:10.77777/FK2/AAAAAA'
577578
const oldVersion = '1.0'
578579
const newVersion = '2.0'
579580

580-
lgetDatasetVersionDiff
581+
getDatasetVersionDiff
581582
.execute(datasetId, oldVersion, newVersion)
582583
.then((versionDiff: DatasetVersionDiff) => {
583584
/* ... */
@@ -622,6 +623,32 @@ Note that `collectionId` is an optional parameter to filter datasets by collecti
622623

623624
The `DatasetPreviewSubset`returned instance contains a property called `totalDatasetCount` which is necessary for pagination.
624625

626+
#### Get Dataset Versions Summaries
627+
628+
Returns an array of [DatasetVersionSummaryInfo](../src/datasets/domain/models/DatasetVersionSummaryInfo.ts) that contains information about what changed in every specific version.
629+
630+
##### Example call:
631+
632+
```typescript
633+
import { getDatasetVersionsSummaries } from '@iqss/dataverse-client-javascript'
634+
635+
/* ... */
636+
637+
const datasetId = 'doi:10.77777/FK2/AAAAAA'
638+
639+
getDatasetVersionsSummaries
640+
.execute(datasetId)
641+
.then((datasetVersionsSummaries: DatasetVersionSummaryInfo[]) => {
642+
/* ... */
643+
})
644+
645+
/* ... */
646+
```
647+
648+
_See [use case](../src/datasets/domain/useCases/GetDatasetVersionsSummaries.ts) implementation_.
649+
650+
The `datasetId` parameter can be a string, for persistent identifiers, or a number, for numeric identifiers.
651+
625652
### Datasets Write Use Cases
626653

627654
#### Create a Dataset
@@ -1257,6 +1284,33 @@ The following error might arise from the `AddUploadedFileToDataset` use case:
12571284

12581285
- AddUploadedFileToDatasetError: This error indicates that there was an error while adding the uploaded file to the dataset.
12591286

1287+
#### Update File Metadata
1288+
1289+
Updates Metadata of a File.
1290+
1291+
###### Example call:
1292+
1293+
```typescript
1294+
import { updateFileMetadata } from '@iqss/dataverse-client-javascript'
1295+
1296+
/* ... */
1297+
1298+
const fileId: number | string = 123
1299+
const updateFileMetadataDTO = {
1300+
description: 'My description bbb.',
1301+
categories: ['Data'],
1302+
restrict: false
1303+
}
1304+
1305+
await updateFileMetadata.execute(fileId, updateFileMetadataDTO).then((fileId) => {
1306+
console.log(`File updated successfully with file ID: ${fileId}`)
1307+
})
1308+
```
1309+
1310+
_See [use case](../src/files/domain/useCases/UpdateFileMetadata.ts) implementation_.
1311+
1312+
The `fileId` parameter can be a string, for persistent identifiers, or a number, for numeric identifiers.
1313+
12601314
#### Delete a File
12611315

12621316
Deletes a File.
@@ -1305,7 +1359,9 @@ const uploadedFileDTO: UploadedFileDTO = {
13051359
mimeType: 'text/plain'
13061360
}
13071361

1308-
replaceFile.execute(fileId, uploadedFileDTO)
1362+
replaceFile.execute(fileId, uploadedFileDTO).then((newFileId: number) => {
1363+
/* ... */
1364+
})
13091365

13101366
/* ... */
13111367
```
@@ -1316,6 +1372,8 @@ The `fileId` parameter can be a string, for persistent identifiers, or a number,
13161372

13171373
The `uploadedFileDTO` parameter is a [UploadedFileDTO](../src/files/domain/dtos/UploadedFileDTO.ts) and includes properties related to the uploaded files. Some of these properties should be calculated from the uploaded File Blob objects and the resulting storage identifiers from the Upload File use case.
13181374

1375+
The use case returns a number, which is the identifier of the new file.
1376+
13191377
#### Restrict or Unrestrict a File
13201378

13211379
Restrict or unrestrict an existing file.

jest.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const config: Config = {
99
moduleFileExtensions: ['ts', 'js', 'json', 'node'],
1010
coveragePathIgnorePatterns: ['node_modules', 'testHelpers'],
1111
globalSetup: '<rootDir>/test/environment/setup.ts',
12-
testTimeout: 25000,
12+
testTimeout: 35000,
1313
coverageThreshold: {
1414
global: {
1515
branches: 90,
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
export interface DatasetVersionSummaryInfo {
2+
id: number
3+
versionNumber: string
4+
summary?: DatasetVersionSummary | DatasetVersionSummaryStringValues
5+
contributors: string
6+
publishedOn?: string
7+
}
8+
9+
export type DatasetVersionSummary = {
10+
[key: string]: SummaryUpdates | SummaryUpdatesWithFields | FilesSummaryUpdates | boolean
11+
}
12+
13+
interface SummaryUpdates {
14+
added: number
15+
deleted: number
16+
changed: number
17+
}
18+
19+
interface SummaryUpdatesWithFields {
20+
[key: string]: SummaryUpdates
21+
}
22+
23+
interface FilesSummaryUpdates {
24+
added: number
25+
removed: number
26+
replaced: number
27+
changedFileMetaData: number
28+
changedVariableMetadata: number
29+
}
30+
31+
export enum DatasetVersionSummaryStringValues {
32+
firstPublished = 'firstPublished',
33+
firstDraft = 'firstDraft',
34+
versionDeaccessioned = 'versionDeaccessioned',
35+
previousVersionDeaccessioned = 'previousVersionDeaccessioned'
36+
}

src/datasets/domain/repositories/IDatasetsRepository.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { DatasetDTO } from '../dtos/DatasetDTO'
77
import { DatasetDeaccessionDTO } from '../dtos/DatasetDeaccessionDTO'
88
import { MetadataBlock } from '../../../metadataBlocks'
99
import { DatasetVersionDiff } from '../models/DatasetVersionDiff'
10+
import { DatasetVersionSummaryInfo } from '../models/DatasetVersionSummaryInfo'
1011

1112
export interface IDatasetsRepository {
1213
getDataset(
@@ -51,4 +52,5 @@ export interface IDatasetsRepository {
5152
datasetVersionId: string,
5253
deaccessionDTO: DatasetDeaccessionDTO
5354
): Promise<void>
55+
getDatasetVersionsSummaries(datasetId: number | string): Promise<DatasetVersionSummaryInfo[]>
5456
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { DatasetVersionSummaryInfo } from '../models/DatasetVersionSummaryInfo'
3+
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'
4+
5+
export class GetDatasetVersionsSummaries implements UseCase<DatasetVersionSummaryInfo[]> {
6+
private datasetsRepository: IDatasetsRepository
7+
8+
constructor(datasetsRepository: IDatasetsRepository) {
9+
this.datasetsRepository = datasetsRepository
10+
}
11+
12+
/**
13+
* Returns a list of versions for a given dataset including a summary of differences between consecutive versions where available.
14+
* Draft versions will only be available to users who have permission to view unpublished drafts.
15+
*
16+
* @param {number | string} [datasetId] - The dataset identifier, which can be a string (for persistent identifiers), or a number (for numeric identifiers).
17+
* @returns {Promise<DatasetVersionSummaryInfo[]>} - An array of DatasetVersionSummaryInfo.
18+
*/
19+
async execute(datasetId: number | string): Promise<DatasetVersionSummaryInfo[]> {
20+
return await this.datasetsRepository.getDatasetVersionsSummaries(datasetId)
21+
}
22+
}

src/datasets/index.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { PublishDataset } from './domain/useCases/PublishDataset'
1717
import { UpdateDataset } from './domain/useCases/UpdateDataset'
1818
import { GetDatasetVersionDiff } from './domain/useCases/GetDatasetVersionDiff'
1919
import { DeaccessionDataset } from './domain/useCases/DeaccessionDataset'
20+
import { GetDatasetVersionsSummaries } from './domain/useCases/GetDatasetVersionsSummaries'
2021

2122
const datasetsRepository = new DatasetsRepository()
2223

@@ -48,6 +49,7 @@ const updateDataset = new UpdateDataset(
4849
datasetResourceValidator
4950
)
5051
const deaccessionDataset = new DeaccessionDataset(datasetsRepository)
52+
const getDatasetVersionsSummaries = new GetDatasetVersionsSummaries(datasetsRepository)
5153

5254
export {
5355
getDataset,
@@ -62,7 +64,8 @@ export {
6264
publishDataset,
6365
createDataset,
6466
updateDataset,
65-
deaccessionDataset
67+
deaccessionDataset,
68+
getDatasetVersionsSummaries
6669
}
6770
export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion'
6871
export { DatasetUserPermissions } from './domain/models/DatasetUserPermissions'
@@ -92,3 +95,7 @@ export {
9295
export { DatasetDeaccessionDTO } from './domain/dtos/DatasetDeaccessionDTO'
9396
export { CreatedDatasetIdentifiers } from './domain/models/CreatedDatasetIdentifiers'
9497
export { VersionUpdateType } from './domain/models/Dataset'
98+
export {
99+
DatasetVersionSummaryInfo,
100+
DatasetVersionSummaryStringValues
101+
} from './domain/models/DatasetVersionSummaryInfo'

src/datasets/infra/repositories/DatasetsRepository.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { transformDatasetLocksResponseToDatasetLocks } from './transformers/data
1818
import { transformDatasetPreviewsResponseToDatasetPreviewSubset } from './transformers/datasetPreviewsTransformers'
1919
import { DatasetVersionDiff } from '../../domain/models/DatasetVersionDiff'
2020
import { transformDatasetVersionDiffResponseToDatasetVersionDiff } from './transformers/datasetVersionDiffTransformers'
21+
import { DatasetVersionSummaryInfo } from '../../domain/models/DatasetVersionSummaryInfo'
2122

2223
export interface GetAllDatasetPreviewsQueryParams {
2324
per_page?: number
@@ -235,4 +236,17 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi
235236
throw error
236237
})
237238
}
239+
240+
public async getDatasetVersionsSummaries(
241+
datasetId: string | number
242+
): Promise<DatasetVersionSummaryInfo[]> {
243+
return this.doGet(
244+
this.buildApiEndpoint(this.datasetsResourceName, 'versions/compareSummary', datasetId),
245+
true
246+
)
247+
.then((response) => response.data.data)
248+
.catch((error) => {
249+
throw error
250+
})
251+
}
238252
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export interface UpdateFileMetadataDTO {
2+
description?: string
3+
prevFreeform?: string
4+
categories?: string[]
5+
dataFileTags?: string[]
6+
restrict?: boolean
7+
}

src/files/domain/repositories/IFilesRepository.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { FileModel } from '../models/FileModel'
88
import { Dataset } from '../../../datasets'
99
import { FileUploadDestination } from '../models/FileUploadDestination'
1010
import { UploadedFileDTO } from '../dtos/UploadedFileDTO'
11+
import { UpdateFileMetadataDTO } from '../dtos/UpdateFileMetadataDTO'
1112

1213
export interface IFilesRepository {
1314
getDatasetFiles(
@@ -62,7 +63,11 @@ export interface IFilesRepository {
6263

6364
deleteFile(fileId: number | string): Promise<undefined>
6465

65-
replaceFile(fileId: number | string, uploadedFileDTO: UploadedFileDTO): Promise<undefined>
66+
replaceFile(fileId: number | string, uploadedFileDTO: UploadedFileDTO): Promise<number>
6667

6768
restrictFile(fileId: number | string, restrict: boolean): Promise<undefined>
69+
updateFileMetadata(
70+
fileId: number | string,
71+
updateFileMetadataDTO: UpdateFileMetadataDTO
72+
): Promise<void>
6873
}

src/files/domain/useCases/ReplaceFile.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { UseCase } from '../../../core/domain/useCases/UseCase'
22
import { UploadedFileDTO } from '../dtos/UploadedFileDTO'
33
import { IFilesRepository } from '../repositories/IFilesRepository'
44

5-
export class ReplaceFile implements UseCase<void> {
5+
export class ReplaceFile implements UseCase<number> {
66
private filesRepository: IFilesRepository
77

88
constructor(filesRepository: IFilesRepository) {
@@ -19,10 +19,10 @@ export class ReplaceFile implements UseCase<void> {
1919
*
2020
* @param {number | string} [fileId] - The File identifier, which can be a string (for persistent identifiers), or a number (for numeric identifiers).
2121
* @param {UploadedFileDTO} [uploadedFileDTO] - File DTO associated with the uploaded file.
22-
* @returns {Promise<void>} A promise that resolves when the file has been successfully replaced.
22+
* @returns {Promise<number>} A promise that resolves when the file has been successfully replaced and returns the new file identifier.
2323
* @throws {WriteError} - If there are errors while writing data.
2424
*/
25-
async execute(fileId: number | string, uploadedFileDTO: UploadedFileDTO): Promise<void> {
26-
await this.filesRepository.replaceFile(fileId, uploadedFileDTO)
25+
async execute(fileId: number | string, uploadedFileDTO: UploadedFileDTO): Promise<number> {
26+
return await this.filesRepository.replaceFile(fileId, uploadedFileDTO)
2727
}
2828
}

0 commit comments

Comments
 (0)