Skip to content

Commit 0931fa8

Browse files
authored
Merge pull request #379 from IQSS/343-extend-to-use-sourceLastUpdateTime
UpdateDatasetMetadata and UpdateFileMetadata use cases: use sourceLastUpdateTime
2 parents e70cc4c + 0f1fd84 commit 0931fa8

File tree

18 files changed

+124
-46
lines changed

18 files changed

+124
-46
lines changed

src/datasets/domain/models/Dataset.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,12 @@ export interface DatasetVersionInfo {
2222
minorNumber: number
2323
state: DatasetVersionState
2424
createTime: Date
25-
lastUpdateTime: Date
25+
/**
26+
* The timestamp of the last update to this dataset version.
27+
* Format: ISO 8601 string (e.g., "2023-06-01T12:34:56Z").
28+
* Used for optimistic concurrency control to detect concurrent updates.
29+
*/
30+
lastUpdateTime: string
2631
releaseTime?: Date
2732
deaccessionNote?: string
2833
}

src/datasets/domain/repositories/IDatasetsRepository.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ export interface IDatasetsRepository {
5454
datasetId: number | string,
5555
dataset: DatasetDTO,
5656
datasetMetadataBlocks: MetadataBlock[],
57-
internalVersionNumber?: number
57+
sourceLastUpdateTime?: string
5858
): Promise<void>
5959
deaccessionDataset(
6060
datasetId: number | string,

src/datasets/domain/useCases/UpdateDataset.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export class UpdateDataset extends DatasetWriteUseCase<void> {
1818
*
1919
* @param {number | string} [datasetId] - The dataset identifier, which can be a string (for persistent identifiers), or a number (for numeric identifiers).
2020
* @param {DatasetDTO} [updatedDataset] - DatasetDTO object including the updated dataset metadata field values for each metadata block.
21-
* @param {number} [internalVersionNumber] - The internal version number of the dataset. If another user updates the dataset version metadata before you send the update request, data inconsistencies may occur. To prevent this, you can use the optional internalVersionNumber parameter. This parameter must include the internal version number corresponding to the dataset version being updated. Note that internal version numbers increase sequentially with each version update.
21+
* @param {string} [sourceLastUpdateTime] - The lastUpdateTime value from the dataset. If another user updates the dataset version metadata before you send the update request, data inconsistencies may occur. To prevent this, you can use the optional sourceLastUpdateTime parameter. This parameter must include the lastUpdateTime value corresponding to the dataset version being updated.
2222
* @returns {Promise<void>} - This method does not return anything upon successful completion.
2323
* @throws {ResourceValidationError} - If there are validation errors related to the provided information.
2424
* @throws {ReadError} - If there are errors while reading data.
@@ -27,15 +27,15 @@ export class UpdateDataset extends DatasetWriteUseCase<void> {
2727
async execute(
2828
datasetId: number | string,
2929
updatedDataset: DatasetDTO,
30-
internalVersionNumber?: number
30+
sourceLastUpdateTime?: string
3131
): Promise<void> {
3232
const metadataBlocks = await this.getNewDatasetMetadataBlocks(updatedDataset)
3333
this.getNewDatasetValidator().validate(updatedDataset, metadataBlocks)
3434
return this.getDatasetsRepository().updateDataset(
3535
datasetId,
3636
updatedDataset,
3737
metadataBlocks,
38-
internalVersionNumber
38+
sourceLastUpdateTime
3939
)
4040
}
4141
}

src/datasets/infra/repositories/DatasetsRepository.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,16 +252,14 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi
252252
datasetId: string | number,
253253
dataset: DatasetDTO,
254254
datasetMetadataBlocks: MetadataBlock[],
255-
internalVersionNumber?: number
255+
sourceLastUpdateTime?: string
256256
): Promise<void> {
257257
return this.doPut(
258258
this.buildApiEndpoint(this.datasetsResourceName, `editMetadata`, datasetId),
259259
transformDatasetModelToUpdateDatasetRequestPayload(dataset, datasetMetadataBlocks),
260260
{
261261
replace: true,
262-
...(typeof internalVersionNumber === 'number' && {
263-
sourceInternalVersionNumber: internalVersionNumber
264-
})
262+
...(sourceLastUpdateTime && { sourceLastUpdateTime })
265263
}
266264
)
267265
.then(() => undefined)

src/datasets/infra/repositories/transformers/datasetPreviewsTransformers.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export const transformDatasetPreviewPayloadToDatasetPreview = (
3939
minorNumber: datasetPreviewPayload.minorVersion,
4040
state: datasetPreviewPayload.versionState as DatasetVersionState,
4141
createTime: new Date(datasetPreviewPayload.createdAt),
42-
lastUpdateTime: new Date(datasetPreviewPayload.updatedAt),
42+
lastUpdateTime: datasetPreviewPayload.updatedAt,
4343
...(datasetPreviewPayload.published_at && {
4444
releaseTime: new Date(datasetPreviewPayload.published_at)
4545
})
@@ -72,7 +72,7 @@ export const transformMyDataDatasetPreviewPayloadToDatasetPreview = (
7272
minorNumber: datasetPreviewPayload.minorVersion,
7373
state: datasetPreviewPayload.versionState as DatasetVersionState,
7474
createTime: new Date(datasetPreviewPayload.createdAt),
75-
lastUpdateTime: new Date(datasetPreviewPayload.updatedAt),
75+
lastUpdateTime: datasetPreviewPayload.updatedAt,
7676
...(datasetPreviewPayload.published_at && {
7777
releaseTime: new Date(datasetPreviewPayload.published_at)
7878
})

src/datasets/infra/repositories/transformers/datasetTransformers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ export const transformVersionPayloadToDataset = (
235235
minorNumber: versionPayload.versionMinorNumber,
236236
state: versionPayload.versionState as DatasetVersionState,
237237
createTime: new Date(versionPayload.createTime),
238-
lastUpdateTime: new Date(versionPayload.lastUpdateTime),
238+
lastUpdateTime: versionPayload.lastUpdateTime,
239239
releaseTime: new Date(versionPayload.releaseTime),
240240
deaccessionNote: versionPayload.deaccessionNote
241241
},

src/files/domain/models/FileModel.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ export interface FileModel {
3030
tabularTags?: string[]
3131
creationDate?: string
3232
publicationDate?: string
33+
/**
34+
* The timestamp of the last update to this file record.
35+
* Format: ISO 8601 string (e.g., "2023-06-01T12:34:56Z").
36+
* Used for optimistic concurrency control to detect concurrent updates.
37+
*/
38+
lastUpdateTime: string
3339
deleted: boolean
3440
tabularData: boolean
3541
fileAccessRequest?: boolean

src/files/domain/repositories/IFilesRepository.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ export interface IFilesRepository {
7272

7373
updateFileMetadata(
7474
fileId: number | string,
75-
updateFileMetadataDTO: UpdateFileMetadataDTO
75+
updateFileMetadataDTO: UpdateFileMetadataDTO,
76+
sourceLastUpdateTime?: string
7677
): Promise<void>
7778

7879
updateFileTabularTags(

src/files/domain/useCases/UpdateFileMetadata.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,18 @@ export class UpdateFileMetadata implements UseCase<void> {
1515
*
1616
* @param {number | string} [fileId] - The file identifier, which can be a string (for persistent identifiers), or a number (for numeric identifiers).
1717
* @param {UpdateFileMetadataDTO} [updateFileMetadataDTO] - The DTO containing the metadata updates.
18+
* @param {string} [sourceLastUpdateTime] - The lastUpdateTime value from the file. If another user updates the file metadata before you send the update request, data inconsistencies may occur. To prevent this, you can use the optional sourceLastUpdateTime parameter. This parameter must include the lastUpdateTime value corresponding to the file being updated.
1819
* @returns {Promise<void>}
1920
*/
2021
async execute(
2122
fileId: number | string,
22-
updateFileMetadataDTO: UpdateFileMetadataDTO
23+
updateFileMetadataDTO: UpdateFileMetadataDTO,
24+
sourceLastUpdateTime?: string
2325
): Promise<void> {
24-
await this.filesRepository.updateFileMetadata(fileId, updateFileMetadataDTO)
26+
await this.filesRepository.updateFileMetadata(
27+
fileId,
28+
updateFileMetadataDTO,
29+
sourceLastUpdateTime
30+
)
2531
}
2632
}

src/files/infra/repositories/FilesRepository.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -369,15 +369,18 @@ export class FilesRepository extends ApiRepository implements IFilesRepository {
369369

370370
public async updateFileMetadata(
371371
fileId: string | number,
372-
updateFileMetadata: UpdateFileMetadataDTO
372+
updateFileMetadata: UpdateFileMetadataDTO,
373+
sourceLastUpdateTime?: string
373374
): Promise<void> {
374375
const formData = new FormData()
375376
formData.append('jsonData', JSON.stringify(updateFileMetadata))
376377

377378
return this.doPost(
378379
this.buildApiEndpoint(this.filesResourceName, `${fileId}/metadata`),
379380
formData,
380-
{},
381+
{
382+
...(sourceLastUpdateTime && { sourceLastUpdateTime })
383+
},
381384
ApiConstants.CONTENT_TYPE_MULTIPART_FORM_DATA
382385
)
383386
.then(() => undefined)

0 commit comments

Comments
 (0)