Skip to content

Commit f5037f7

Browse files
committed
feat: return new file id after replacement
1 parent 52f826c commit f5037f7

File tree

5 files changed

+22
-11
lines changed

5 files changed

+22
-11
lines changed

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
@@ -20,6 +20,7 @@ import { transformUploadDestinationsResponseToUploadDestination } from './transf
2020
import { UploadedFileDTO } from '../../domain/dtos/UploadedFileDTO'
2121
import { UpdateFileMetadataDTO } from '../../domain/dtos/UpdateFileMetadataDTO'
2222
import { ApiConstants } from '../../../core/infra/repositories/ApiConstants'
23+
import { AxiosResponse } from 'axios'
2324

2425
export interface GetFilesQueryParams {
2526
includeDeaccessioned: boolean
@@ -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
})

test/integration/files/DirectUpload.test.ts

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

333-
await filesRepositorySut.replaceFile(currentFileId, newUploadedFileDTO)
333+
const replaceResponse = await filesRepositorySut.replaceFile(currentFileId, newUploadedFileDTO)
334+
335+
console.log({ replaceResponse })
334336

335337
// 4 - Verify that the new file is in the dataset and the old file is not
336338
datasetFiles = await filesRepositorySut.getDatasetFiles(
@@ -341,6 +343,7 @@ describe('Direct Upload', () => {
341343
)
342344

343345
expect(datasetFiles.totalFilesCount).toBe(1)
346+
expect(replaceResponse).toBe(currentFileId + 1)
344347
expect(datasetFiles.files[0].name).toBe('new-singlepart-file')
345348
expect(datasetFiles.files[0].sizeBytes).toBe(newSinglepartFile.size)
346349
expect(datasetFiles.files[0].storageIdentifier).toContain('localstack1://mybucket:')

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)