Skip to content

Commit 96f1408

Browse files
committed
feat: implement GetDatasetVersionDiff use case
1 parent a40c600 commit 96f1408

File tree

12 files changed

+532
-7
lines changed

12 files changed

+532
-7
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// Details API
2+
3+
export interface DatasetVersionDiff {
4+
oldVersion: VersionSummary
5+
newVersion: VersionSummary
6+
metadataChanges?: MetadataBlockDiff[]
7+
filesAdded?: FileSummary[]
8+
filesRemoved?: FileSummary[]
9+
fileChanges?: FileDiff[]
10+
filesReplaced?: FileReplacement[]
11+
termsOfAccess?: FieldDiff[]
12+
}
13+
14+
export interface FileSummary {
15+
fileName: string
16+
MD5: string
17+
type: string
18+
fileId: number
19+
filePath: string
20+
description: string
21+
isRestricted: boolean
22+
tags: string[]
23+
categories: string[]
24+
}
25+
26+
export interface VersionSummary {
27+
versionNumber: string
28+
lastUpdatedDate: string
29+
}
30+
export interface MetadataBlockDiff {
31+
blockName: string
32+
changed: FieldDiff[]
33+
}
34+
35+
export interface FileDiff {
36+
fileName: string
37+
md5: string
38+
fileId: number
39+
changed: FieldDiff[]
40+
}
41+
42+
export interface FileReplacement {
43+
oldFile: FileSummary
44+
newFile: FileSummary
45+
}
46+
export interface FieldDiff {
47+
fieldName: string
48+
oldValue: string
49+
newValue: string
50+
}

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: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
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 Dataset instance, given the search parameters to identify it.
14+
* TODO: should we allow DatasetNotNumberedVersion enum values for newVersionId and oldVersionId?
15+
* @param {number | string} [datasetId] - The dataset identifier, which can be a string (for persistent identifiers), or a number (for numeric identifiers).
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. If this parameter is not set, the default value is: DatasetNotNumberedVersion.LATEST
17+
* @param {string } [oldVersionId] - The dataset version identifier, which can be a version-specific numeric string (for example, 1.0) or a DatasetNotNumberedVersion enum value. If this parameter is not set, the default value is: DatasetNotNumberedVersion.LATEST * @param {boolean} [includeDeaccessioned=false] - Indicates whether to consider deaccessioned versions in the dataset search or not. The default value is false
18+
* @returns {Promise<DatasetVersionDiff>}
19+
*/
20+
async execute(
21+
datasetId: number | string,
22+
newVersionId: string,
23+
oldVersionId: string
24+
): Promise<DatasetVersionDiff> {
25+
return await this.datasetsRepository.getDatasetVersionDiff(
26+
datasetId,
27+
newVersionId,
28+
oldVersionId
29+
)
30+
}
31+
}

src/datasets/index.ts

Lines changed: 3 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

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+
newVersionId: string,
149+
oldVersionId: 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: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
/*
2+
{
3+
"status": "OK",
4+
"data": {
5+
"oldVersion": {
6+
"versionNumber": "1.0",
7+
"lastUpdatedDate": "2024-10-24T15:17:11Z"
8+
},
9+
"newVersion": {
10+
"versionNumber": "DRAFT",
11+
"lastUpdatedDate": "2024-10-24T15:17:16Z"
12+
},
13+
"metadataChanges": [
14+
{
15+
"blockName": "Citation Metadata",
16+
"changed": [
17+
{
18+
"fieldName": "Author",
19+
"oldValue": "Finch, Fiona; (Birds Inc.)",
20+
"newValue": "Finch, Fiona; (Birds Inc.); Poe, Edgar Allen; (Baltimore Poets); Mulligan, Hercules; (Sons of Liberty)"
21+
},
22+
{
23+
"fieldName": "Subject",
24+
"oldValue": "Medicine, Health and Life Sciences",
25+
"newValue": "Medicine, Health and Life Sciences; Astronomy and Astrophysics; Other"
26+
},
27+
{
28+
"fieldName": "Producer",
29+
"oldValue": "",
30+
"newValue": "Allen, Irwin; (MGM); Spielberg, Stephen; (ILM)"
31+
}
32+
]
33+
},
34+
{
35+
"blockName": "Life Sciences Metadata",
36+
"changed": [
37+
{
38+
"fieldName": "Design Type",
39+
"oldValue": "",
40+
"newValue": "Parallel Group Design; Nested Case Control Design"
41+
}
42+
]
43+
}
44+
],
45+
"filesAdded": [
46+
{
47+
"fileName": "test.tab",
48+
"filePath": "data/subdir1",
49+
"MD5": "77c7f03a7d7772907b43f0b322cef723",
50+
"type": "text/tab-separated-values",
51+
"fileId": 42,
52+
"description": "my description",
53+
"isRestricted": false,
54+
"categories": [
55+
"Data"
56+
],
57+
"tags": [
58+
"Survey"
59+
]
60+
}
61+
],
62+
"filesRemoved": [
63+
{
64+
"fileName": "dataverseproject_logo.jpg",
65+
"filePath": "data/subdir1",
66+
"MD5": "c1edbefa86a55c5037873370ae7fd7b6",
67+
"type": "image/jpeg",
68+
"fileId": 40,
69+
"description": "my description",
70+
"isRestricted": false,
71+
"categories": [
72+
"Data"
73+
]
74+
}
75+
],
76+
"filesReplaced": [
77+
{
78+
"oldFile": {
79+
"fileName": "favicon-16x16.png",
80+
"filePath": "data/subdir1",
81+
"MD5": "d3c852e7ecb92fd105ba4018116a9be8",
82+
"type": "image/png",
83+
"fileId": 41,
84+
"description": "my description",
85+
"isRestricted": false,
86+
"categories": [
87+
"Data"
88+
]
89+
},
90+
"newFile": {
91+
"fileName": "favicon-32x32.png",
92+
"filePath": "data/subdir1",
93+
"MD5": "c931f7add8b6a1f9a691046b77c231fa",
94+
"type": "image/png",
95+
"fileId": 43,
96+
"description": "my description",
97+
"isRestricted": false,
98+
"categories": [
99+
"Data"
100+
]
101+
}
102+
}
103+
],
104+
"fileChanges": [
105+
{
106+
"fileName": "dataverse-icon-1200.png",
107+
"MD5": "a23eb44803d9127bc6e055f77b869816",
108+
"fileId": 39,
109+
"changed": [
110+
{
111+
"fieldName": "isRestricted",
112+
"oldValue": "false",
113+
"newValue": "true"
114+
}
115+
]
116+
}
117+
],
118+
"TermsOfAccess": {
119+
"changed": [
120+
{
121+
"fieldName": "Data Access Place",
122+
"oldValue": "",
123+
"newValue": "Somewhere"
124+
}
125+
]
126+
}
127+
}
128+
}
129+
*/
130+
131+
export interface DatasetVersionDiffPayload {
132+
oldVersion: VersionSummaryPayload
133+
newVersion: VersionSummaryPayload
134+
metadataChanges: MetadataBlockDiffPayload[]
135+
filesAdded: FileSummaryPayload[]
136+
filesRemoved: FileSummaryPayload[]
137+
fileChanges: FileDiffPayload[]
138+
filesReplaced: FileReplacementPayload[]
139+
TermsOfAccess: FieldDiffPayload[]
140+
}
141+
142+
export interface FileSummaryPayload {
143+
fileName: string
144+
MD5: string
145+
type: string
146+
fileId: number
147+
filePath: string
148+
description: string
149+
isRestricted: boolean
150+
tags: string[]
151+
categories: string[]
152+
}
153+
154+
export interface VersionSummaryPayload {
155+
versionNumber: string
156+
lastUpdatedDate: string
157+
}
158+
export interface MetadataBlockDiffPayload {
159+
blockName: string
160+
changed: FieldDiffPayload[]
161+
}
162+
163+
export interface FileDiffPayload {
164+
fileName: string
165+
md5: string
166+
fileId: number
167+
changed: FieldDiffPayload[]
168+
}
169+
export interface FieldDiffPayload {
170+
fieldName: string
171+
oldValue: string
172+
newValue: string
173+
}
174+
175+
export interface FileReplacementPayload {
176+
oldFile: FileSummaryPayload
177+
newFile: FileSummaryPayload
178+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { AxiosResponse } from 'axios'
2+
import { DatasetVersionDiff } from '../../../domain/models/DatasetVersionDiff'
3+
4+
/*
5+
oldVersion: VersionSummaryPayload
6+
newVersion: VersionSummaryPayload
7+
metadataChanges: MetadataBlockDiffPayload[]
8+
filesAdded: FileSummaryPayload[]
9+
filesRemoved: FileSummaryPayload[]
10+
fileChanges: FileDiffPayload[]
11+
filesReplaced: FileReplacementPayload[]
12+
TermsOfAccess: FieldDiffPayload[]
13+
*/
14+
export const transformDatasetVersionDiffResponseToDatasetVersionDiff = (
15+
response: AxiosResponse
16+
): DatasetVersionDiff => {
17+
const datasetVersionDiffPayload = response.data.data
18+
const retValue = {
19+
oldVersion: datasetVersionDiffPayload.oldVersion,
20+
newVersion: datasetVersionDiffPayload.newVersion,
21+
metadataChanges: datasetVersionDiffPayload.metadataChanges,
22+
filesAdded: datasetVersionDiffPayload.filesAdded,
23+
filesRemoved: datasetVersionDiffPayload.filesRemoved,
24+
fileChanges: datasetVersionDiffPayload.fileChanges,
25+
filesReplaced: datasetVersionDiffPayload.filesReplaced,
26+
termsOfAccess: datasetVersionDiffPayload.TermsOfAccess
27+
}
28+
return retValue
29+
}

0 commit comments

Comments
 (0)