Skip to content

Commit f21affc

Browse files
authored
Merge pull request #220 from IQSS/197-compare-dataset-versions
197 compare dataset versions
2 parents d48324a + 2faf06b commit f21affc

File tree

13 files changed

+464
-7
lines changed

13 files changed

+464
-7
lines changed

docs/useCases.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ The different use cases currently available in the package are classified below,
2727
- [Get Dataset Locks](#get-dataset-locks)
2828
- [Get Dataset Summary Field Names](#get-dataset-summary-field-names)
2929
- [Get User Permissions on a Dataset](#get-user-permissions-on-a-dataset)
30+
- [Get Differences between Two Dataset Versions](#get-differences-between-two-dataset-versions)
3031
- [List All Datasets](#list-all-datasets)
3132
- [Datasets write use cases](#datasets-write-use-cases)
3233
- [Create a Dataset](#create-a-dataset)
@@ -457,6 +458,36 @@ _See [use case](../src/datasets/domain/useCases/GetDatasetUserPermissions.ts) im
457458

458459
The `datasetId` parameter can be a string, for persistent identifiers, or a number, for numeric identifiers.
459460

461+
#### Get Differences between Two Dataset Versions
462+
463+
Returns an instance of [DatasetVersionDiff](../src/datasets/domain/models/DatasetVersionDiff.ts) that contains the differences between two Dataset Versions.
464+
465+
##### Example call:
466+
467+
```typescript
468+
import { getDatasetVersionDiff } from '@iqss/dataverse-client-javascript'
469+
470+
/* ... */
471+
472+
const datasetId = 'doi:10.77777/FK2/AAAAAA'
473+
const oldVersion = '1.0'
474+
const newVersion = '2.0'
475+
476+
lgetDatasetVersionDiff
477+
.execute(datasetId, oldVersion, newVersion)
478+
.then((versionDiff: DatasetVersionDiff) => {
479+
/* ... */
480+
})
481+
482+
/* ... */
483+
```
484+
485+
_See [use case](../src/datasets/domain/useCases/GetDatasetVersionDiff.ts) implementation_.
486+
487+
The `datasetId` parameter can be a string, for persistent identifiers, or a number, for numeric identifiers.
488+
489+
The `oldVersion` and `newVersion` parameters specify the versions of the dataset to compare.
490+
460491
#### List All Datasets
461492

462493
Returns an instance of [DatasetPreviewSubset](../src/datasets/domain/models/DatasetPreviewSubset.ts) that contains reduced information for each dataset that the calling user can access in the installation.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
export interface DatasetVersionDiff {
2+
oldVersion: VersionSummary
3+
newVersion: VersionSummary
4+
metadataChanges?: MetadataBlockDiff[]
5+
filesAdded?: FileSummary[]
6+
filesRemoved?: FileSummary[]
7+
fileChanges?: FileDiff[]
8+
filesReplaced?: FileReplacement[]
9+
termsOfAccess?: FieldDiff[]
10+
}
11+
12+
export interface FileSummary {
13+
fileName: string
14+
MD5: string
15+
type: string
16+
fileId: number
17+
filePath: string
18+
description: string
19+
isRestricted: boolean
20+
tags: string[]
21+
categories: string[]
22+
}
23+
24+
export interface VersionSummary {
25+
versionNumber: string
26+
lastUpdatedDate: string
27+
}
28+
export interface MetadataBlockDiff {
29+
blockName: string
30+
changed: FieldDiff[]
31+
}
32+
33+
export interface FileDiff {
34+
fileName: string
35+
md5: string
36+
fileId: number
37+
changed: FieldDiff[]
38+
}
39+
40+
export interface FileReplacement {
41+
oldFile: FileSummary
42+
newFile: FileSummary
43+
}
44+
export interface FieldDiff {
45+
fieldName: string
46+
oldValue: string
47+
newValue: string
48+
}

src/datasets/domain/repositories/IDatasetsRepository.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { DatasetUserPermissions } from '../models/DatasetUserPermissions'
55
import { CreatedDatasetIdentifiers } from '../models/CreatedDatasetIdentifiers'
66
import { DatasetDTO } from '../dtos/DatasetDTO'
77
import { MetadataBlock } from '../../../metadataBlocks'
8+
import { DatasetVersionDiff } from '../models/DatasetVersionDiff'
89

910
export interface IDatasetsRepository {
1011
getDataset(
@@ -28,6 +29,11 @@ export interface IDatasetsRepository {
2829
getDatasetSummaryFieldNames(): Promise<string[]>
2930
getPrivateUrlDatasetCitation(token: string): Promise<string>
3031
getDatasetUserPermissions(datasetId: number | string): Promise<DatasetUserPermissions>
32+
getDatasetVersionDiff(
33+
datasetId: number | string,
34+
newVersionId: string,
35+
oldVersionId: string
36+
): Promise<DatasetVersionDiff>
3137
createDataset(
3238
newDataset: DatasetDTO,
3339
datasetMetadataBlocks: MetadataBlock[],
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'
3+
import { DatasetVersionDiff } from '../models/DatasetVersionDiff'
4+
5+
export class GetDatasetVersionDiff implements UseCase<DatasetVersionDiff> {
6+
private datasetsRepository: IDatasetsRepository
7+
8+
constructor(datasetsRepository: IDatasetsRepository) {
9+
this.datasetsRepository = datasetsRepository
10+
}
11+
12+
/**
13+
* Returns a DatasetVersionDiff instance, which contains the differences between the two given versions.
14+
* @param {number | string} [datasetId] - The dataset identifier, which can be a string (for persistent identifiers), or a number (for numeric identifiers).
15+
* @param {string } [oldVersionId] - The dataset version identifier, which can be a version-specific numeric string (for example, 1.0) or a DatasetNotNumberedVersion enum value.
16+
* @param {string } [newVersionId] - The dataset version identifier, which can be a version-specific numeric string (for example, 1.0) or a DatasetNotNumberedVersion enum value.
17+
*/
18+
async execute(
19+
datasetId: number | string,
20+
oldVersionId: string,
21+
newVersionId: string
22+
): Promise<DatasetVersionDiff> {
23+
return await this.datasetsRepository.getDatasetVersionDiff(
24+
datasetId,
25+
oldVersionId,
26+
newVersionId
27+
)
28+
}
29+
}

src/datasets/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { SingleMetadataFieldValidator } from './domain/useCases/validators/Singl
1515
import { MultipleMetadataFieldValidator } from './domain/useCases/validators/MultipleMetadataFieldValidator'
1616
import { PublishDataset } from './domain/useCases/PublishDataset'
1717
import { UpdateDataset } from './domain/useCases/UpdateDataset'
18+
import { GetDatasetVersionDiff } from './domain/useCases/GetDatasetVersionDiff'
1819

1920
const datasetsRepository = new DatasetsRepository()
2021

@@ -26,6 +27,7 @@ const getAllDatasetPreviews = new GetAllDatasetPreviews(datasetsRepository)
2627
const getDatasetUserPermissions = new GetDatasetUserPermissions(datasetsRepository)
2728
const getDatasetSummaryFieldNames = new GetDatasetSummaryFieldNames(datasetsRepository)
2829
const getPrivateUrlDatasetCitation = new GetPrivateUrlDatasetCitation(datasetsRepository)
30+
const getDatasetVersionDiff = new GetDatasetVersionDiff(datasetsRepository)
2931
const singleMetadataFieldValidator = new SingleMetadataFieldValidator()
3032
const metadataFieldValidator = new MetadataFieldValidator(
3133
new SingleMetadataFieldValidator(),
@@ -54,6 +56,7 @@ export {
5456
getDatasetUserPermissions,
5557
getDatasetSummaryFieldNames,
5658
getPrivateUrlDatasetCitation,
59+
getDatasetVersionDiff,
5760
publishDataset,
5861
createDataset,
5962
updateDataset
@@ -73,6 +76,7 @@ export {
7376
DatasetMetadataFieldValue
7477
} from './domain/models/Dataset'
7578
export { DatasetPreview } from './domain/models/DatasetPreview'
79+
export { DatasetVersionDiff } from './domain/models/DatasetVersionDiff'
7680
export { DatasetPreviewSubset } from './domain/models/DatasetPreviewSubset'
7781
export {
7882
DatasetDTO,

src/datasets/infra/repositories/DatasetsRepository.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import { MetadataBlock } from '../../../metadataBlocks'
1515
import { transformDatasetModelToNewDatasetRequestPayload } from './transformers/datasetTransformers'
1616
import { transformDatasetLocksResponseToDatasetLocks } from './transformers/datasetLocksTransformers'
1717
import { transformDatasetPreviewsResponseToDatasetPreviewSubset } from './transformers/datasetPreviewsTransformers'
18+
import { DatasetVersionDiff } from '../../domain/models/DatasetVersionDiff'
19+
import { transformDatasetVersionDiffResponseToDatasetVersionDiff } from './transformers/datasetVersionDiffTransformers'
1820

1921
export interface GetAllDatasetPreviewsQueryParams {
2022
per_page?: number
@@ -141,6 +143,24 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi
141143
})
142144
}
143145

146+
public async getDatasetVersionDiff(
147+
datasetId: string | number,
148+
oldVersionId: string,
149+
newVersionId: string
150+
): Promise<DatasetVersionDiff> {
151+
return this.doGet(
152+
this.buildApiEndpoint(
153+
this.datasetsResourceName,
154+
`versions/${oldVersionId}/compare/${newVersionId}`,
155+
datasetId
156+
),
157+
true
158+
)
159+
.then((response) => transformDatasetVersionDiffResponseToDatasetVersionDiff(response))
160+
.catch((error) => {
161+
throw error
162+
})
163+
}
144164
public async createDataset(
145165
newDataset: DatasetDTO,
146166
datasetMetadataBlocks: MetadataBlock[],
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
export interface DatasetVersionDiffPayload {
2+
oldVersion: VersionSummaryPayload
3+
newVersion: VersionSummaryPayload
4+
metadataChanges: MetadataBlockDiffPayload[]
5+
filesAdded: FileSummaryPayload[]
6+
filesRemoved: FileSummaryPayload[]
7+
fileChanges: FileDiffPayload[]
8+
filesReplaced: FileReplacementPayload[]
9+
TermsOfAccess: FieldDiffPayload[]
10+
}
11+
12+
export interface FileSummaryPayload {
13+
fileName: string
14+
MD5: string
15+
type: string
16+
fileId: number
17+
filePath: string
18+
description: string
19+
isRestricted: boolean
20+
tags: string[]
21+
categories: string[]
22+
}
23+
24+
export interface VersionSummaryPayload {
25+
versionNumber: string
26+
lastUpdatedDate: string
27+
}
28+
export interface MetadataBlockDiffPayload {
29+
blockName: string
30+
changed: FieldDiffPayload[]
31+
}
32+
33+
export interface FileDiffPayload {
34+
fileName: string
35+
md5: string
36+
fileId: number
37+
changed: FieldDiffPayload[]
38+
}
39+
export interface FieldDiffPayload {
40+
fieldName: string
41+
oldValue: string
42+
newValue: string
43+
}
44+
45+
export interface FileReplacementPayload {
46+
oldFile: FileSummaryPayload
47+
newFile: FileSummaryPayload
48+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { AxiosResponse } from 'axios'
2+
import { DatasetVersionDiff } from '../../../domain/models/DatasetVersionDiff'
3+
4+
export const transformDatasetVersionDiffResponseToDatasetVersionDiff = (
5+
response: AxiosResponse
6+
): DatasetVersionDiff => {
7+
const datasetVersionDiffPayload = response.data.data
8+
const retValue = {
9+
oldVersion: datasetVersionDiffPayload.oldVersion,
10+
newVersion: datasetVersionDiffPayload.newVersion,
11+
metadataChanges: datasetVersionDiffPayload.metadataChanges,
12+
filesAdded: datasetVersionDiffPayload.filesAdded,
13+
filesRemoved: datasetVersionDiffPayload.filesRemoved,
14+
fileChanges: datasetVersionDiffPayload.fileChanges,
15+
filesReplaced: datasetVersionDiffPayload.filesReplaced,
16+
termsOfAccess: datasetVersionDiffPayload.TermsOfAccess
17+
}
18+
return retValue
19+
}

0 commit comments

Comments
 (0)