Skip to content

Commit 79398c8

Browse files
authored
Merge pull request #275 from IQSS/feat/replce-file-return-info
Return new file id after file replacement
2 parents 52f826c + d6dad4b commit 79398c8

File tree

9 files changed

+29
-16
lines changed

9 files changed

+29
-16
lines changed

docs/useCases.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1359,7 +1359,9 @@ const uploadedFileDTO: UploadedFileDTO = {
13591359
mimeType: 'text/plain'
13601360
}
13611361

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

13641366
/* ... */
13651367
```
@@ -1370,6 +1372,8 @@ The `fileId` parameter can be a string, for persistent identifiers, or a number,
13701372

13711373
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.
13721374

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

13751379
Restrict or unrestrict an existing file.

src/files/domain/repositories/IFilesRepository.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export interface IFilesRepository {
6363

6464
deleteFile(fileId: number | string): Promise<undefined>
6565

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

6868
restrictFile(fileId: number | string, restrict: boolean): Promise<undefined>
6969
updateFileMetadata(

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
}

src/files/infra/repositories/FilesRepository.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 { IFilesRepository } from '../../domain/repositories/IFilesRepository'
34
import { FileModel as FileModel } from '../../domain/models/FileModel'
@@ -60,6 +61,10 @@ export interface ChecksumRequestBody {
6061
'@type': string
6162
}
6263

64+
type ReplaceFileResponseMinimal = {
65+
files: { dataFile: { id: number } }[]
66+
}
67+
6368
export class FilesRepository extends ApiRepository implements IFilesRepository {
6469
private readonly datasetsResourceName: string = 'datasets'
6570
private readonly filesResourceName: string = 'files'
@@ -307,7 +312,7 @@ export class FilesRepository extends ApiRepository implements IFilesRepository {
307312
public async replaceFile(
308313
fileId: number | string,
309314
uploadedFileDTO: UploadedFileDTO
310-
): Promise<undefined> {
315+
): Promise<number> {
311316
const requestBody: UploadedFileRequestBody = {
312317
fileName: uploadedFileDTO.fileName,
313318
checksum: {
@@ -332,7 +337,10 @@ export class FilesRepository extends ApiRepository implements IFilesRepository {
332337
{},
333338
ApiConstants.CONTENT_TYPE_MULTIPART_FORM_DATA
334339
)
335-
.then(() => undefined)
340+
.then((response: AxiosResponse<{ data: ReplaceFileResponseMinimal }>) => {
341+
const fileNumber = response.data.data.files[0].dataFile.id
342+
return fileNumber
343+
})
336344
.catch((error) => {
337345
throw error
338346
})

src/files/infra/repositories/transformers/FilePayload.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ export interface FilePayload {
1010
version: number
1111
description?: string
1212
restricted: boolean
13-
directoryLabel?: string
1413
datasetVersionId?: number
1514
categories?: string[]
1615
contentType: string
@@ -37,6 +36,7 @@ export interface FilePayload {
3736
}
3837
version: number
3938
restricted: boolean
39+
directoryLabel?: string
4040
label: string
4141
datasetVersionId: number
4242
}

src/files/infra/repositories/transformers/fileTransformers.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ const transformFilePayloadToFile = (filePayload: FilePayload): FileModel => {
4444
...(filePayload.dataFile.description && { description: filePayload.dataFile.description }),
4545
restricted: filePayload.restricted,
4646
latestRestricted: filePayload.dataFile.restricted,
47-
...(filePayload.dataFile.directoryLabel && {
48-
directoryLabel: filePayload.dataFile.directoryLabel
47+
...(filePayload.directoryLabel && {
48+
directoryLabel: filePayload.directoryLabel
4949
}),
5050
...(filePayload.dataFile.datasetVersionId && {
5151
datasetVersionId: filePayload.dataFile.datasetVersionId

test/integration/files/DirectUpload.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ describe('Direct Upload', () => {
330330
mimeType: newSinglepartFile.type
331331
}
332332

333-
await filesRepositorySut.replaceFile(currentFileId, newUploadedFileDTO)
333+
const replaceResponse = await filesRepositorySut.replaceFile(currentFileId, newUploadedFileDTO)
334334

335335
// 4 - Verify that the new file is in the dataset and the old file is not
336336
datasetFiles = await filesRepositorySut.getDatasetFiles(
@@ -341,6 +341,7 @@ describe('Direct Upload', () => {
341341
)
342342

343343
expect(datasetFiles.totalFilesCount).toBe(1)
344+
expect(replaceResponse).toBe(currentFileId + 1)
344345
expect(datasetFiles.files[0].name).toBe('new-singlepart-file')
345346
expect(datasetFiles.files[0].sizeBytes).toBe(newSinglepartFile.size)
346347
expect(datasetFiles.files[0].storageIdentifier).toContain('localstack1://mybucket:')

test/testHelpers/files/filesHelper.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ export const createFilePayload = (): FilePayload => {
8181
restricted: false,
8282
version: 1,
8383
datasetVersionId: 2,
84+
directoryLabel: 'directoryLabel',
8485
dataFile: {
8586
id: 1,
8687
version: 1,
@@ -116,7 +117,6 @@ export const createFilePayload = (): FilePayload => {
116117
isPartOf: { type: DvObjectType.DATAVERSE, identifier: 'root', displayName: 'Root' }
117118
},
118119
description: 'description',
119-
directoryLabel: 'directoryLabel',
120120
datasetVersionId: 1,
121121
originalFormat: 'originalFormat',
122122
originalSize: 127426,

test/unit/files/ReplaceFile.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ describe('execute', () => {
1212
mimeType: 'test/type'
1313
}
1414

15-
test('should return undefined on client success', async () => {
15+
test('should return file id on client success', async () => {
1616
const filesRepositoryStub: IFilesRepository = {} as IFilesRepository
17-
filesRepositoryStub.replaceFile = jest.fn().mockResolvedValue(undefined)
17+
filesRepositoryStub.replaceFile = jest.fn().mockResolvedValue(1)
1818

1919
const sut = new ReplaceFile(filesRepositoryStub)
2020

2121
const actual = await sut.execute(1, testUploadedFileDTO)
2222

23-
expect(actual).toEqual(undefined)
23+
expect(actual).toEqual(1)
2424
})
2525

2626
test('should return error on client error', async () => {

0 commit comments

Comments
 (0)