Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

115 - Create use case to get a file #119

Merged
merged 11 commits into from
Feb 5, 2024
4 changes: 4 additions & 0 deletions src/files/domain/repositories/IFilesRepository.ts
ekraffmiller marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,8 @@ export interface IFilesRepository {
getFileUserPermissions(fileId: number | string): Promise<FileUserPermissions>;

getFileDataTables(fileId: number | string): Promise<FileDataTable[]>;

getFile(fileId: number | string): Promise<File>;

getFileDraft(fileId: number | string): Promise<File>;
}
10 changes: 10 additions & 0 deletions src/files/domain/useCases/GetFile.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { IFilesRepository } from '../repositories/IFilesRepository';
import { File } from '../models/File';

export class GetFile {
constructor(private readonly filesRepository: IFilesRepository) {}

async execute(fileId: number | string): Promise<File> {
return await this.filesRepository.getFile(fileId);
}
}
10 changes: 10 additions & 0 deletions src/files/domain/useCases/GetFileDraft.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { IFilesRepository } from '../repositories/IFilesRepository';
import { File } from '../models/File';

export class GetFileDraft {
constructor(private readonly filesRepository: IFilesRepository) {}

async execute(fileId: number | string): Promise<File> {
return await this.filesRepository.getFileDraft(fileId);
}
}
6 changes: 6 additions & 0 deletions src/files/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import { GetFileDownloadCount } from './domain/useCases/GetFileDownloadCount';
import { GetFileUserPermissions } from './domain/useCases/GetFileUserPermissions';
import { GetFileDataTables } from './domain/useCases/GetFileDataTables';
import { GetDatasetFilesTotalDownloadSize } from './domain/useCases/GetDatasetFilesTotalDownloadSize';
import { GetFile } from './domain/useCases/GetFile';
import { GetFileDraft } from './domain/useCases/GetFileDraft';

const filesRepository = new FilesRepository();

Expand All @@ -14,6 +16,8 @@ const getFileDownloadCount = new GetFileDownloadCount(filesRepository);
const getFileUserPermissions = new GetFileUserPermissions(filesRepository);
const getFileDataTables = new GetFileDataTables(filesRepository);
const getDatasetFilesTotalDownloadSize = new GetDatasetFilesTotalDownloadSize(filesRepository);
const getFile = new GetFile(filesRepository);
const getFileDraft = new GetFileDraft(filesRepository);

export {
getDatasetFiles,
Expand All @@ -22,6 +26,8 @@ export {
getFileDataTables,
getDatasetFileCounts,
getDatasetFilesTotalDownloadSize,
getFile,
getFileDraft,
};

export { File, FileEmbargo, FileChecksum } from './domain/models/File';
Expand Down
18 changes: 17 additions & 1 deletion src/files/infra/repositories/FilesRepository.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { ApiRepository } from '../../../core/infra/repositories/ApiRepository';
import { IFilesRepository } from '../../domain/repositories/IFilesRepository';
import { File } from '../../domain/models/File';
import { transformFilesResponseToFiles } from './transformers/fileTransformers';
import { transformFileResponseToFile, transformFilesResponseToFiles } from './transformers/fileTransformers';
import { FileDataTable } from '../../domain/models/FileDataTable';
import { transformDataTablesResponseToDataTables } from './transformers/fileDataTableTransformers';
import { FileUserPermissions } from '../../domain/models/FileUserPermissions';
Expand Down Expand Up @@ -143,6 +143,22 @@ export class FilesRepository extends ApiRepository implements IFilesRepository {
});
}

public async getFile(fileId: number | string): Promise<File> {
return this.doGet(this.buildApiEndpoint(this.filesResourceName, '', fileId), true)
.then((response) => transformFileResponseToFile(response))
.catch((error) => {
throw error;
});
}

public async getFileDraft(fileId: number | string): Promise<File> {
return this.doGet(this.buildApiEndpoint(this.filesResourceName, 'draft', fileId), true)
.then((response) => transformFileResponseToFile(response))
.catch((error) => {
throw error;
});
}

private applyFileSearchCriteriaToQueryParams(
queryParams: GetFilesQueryParams | GetFilesTotalDownloadSizeQueryParams,
fileSearchCriteria: FileSearchCriteria,
Expand Down
5 changes: 5 additions & 0 deletions src/files/infra/repositories/transformers/fileTransformers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ export const transformFilesResponseToFiles = (response: AxiosResponse): File[] =
return files;
};

export const transformFileResponseToFile = (response: AxiosResponse): File => {
const filePayload = response.data.data;
return transformFilePayloadToFile(filePayload);
};

// eslint-disable-next-line @typescript-eslint/no-explicit-any
const transformFilePayloadToFile = (filePayload: any): File => {
return {
Expand Down
94 changes: 92 additions & 2 deletions test/integration/files/FilesRepository.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { ApiConfig, DataverseApiAuthMechanism } from '../../../src/core/infra/re
import { assert } from 'sinon';
import { expect } from 'chai';
import { TestConstants } from '../../testHelpers/TestConstants';
import { uploadFileViaApi } from '../../testHelpers/files/filesHelper';
import {registerFileViaApi, uploadFileViaApi} from '../../testHelpers/files/filesHelper';
import { DatasetsRepository } from '../../../src/datasets/infra/repositories/DatasetsRepository';
import { ReadError } from '../../../src/core/domain/repositories/ReadError';
import { FileSearchCriteria, FileAccessStatus, FileOrderCriteria } from '../../../src/files/domain/models/FileCriteria';
Expand All @@ -27,10 +27,12 @@ describe('FilesRepository', () => {

const datasetRepository = new DatasetsRepository();

let testFileId: number;
let testFilePersistentId: string;
beforeAll(async () => {
ApiConfig.init(TestConstants.TEST_API_URL, DataverseApiAuthMechanism.API_KEY, process.env.TEST_API_KEY);
// Uploading test file 1 with some categories
await uploadFileViaApi(TestConstants.TEST_CREATED_DATASET_1_ID, testTextFile1Name, { categories: [testCategoryName] })
const uploadFileResponse = await uploadFileViaApi(TestConstants.TEST_CREATED_DATASET_1_ID, testTextFile1Name, { categories: [testCategoryName] })
.then()
.catch((e) => {
console.log(e);
Expand All @@ -57,6 +59,16 @@ describe('FilesRepository', () => {
console.log(e);
fail(`Tests beforeAll(): Error while uploading file ${testTabFile4Name}`);
});
// Registering test file 1
await registerFileViaApi(uploadFileResponse.data.data.files[0].dataFile.id);
const files = await sut.getDatasetFiles(
TestConstants.TEST_CREATED_DATASET_1_ID,
latestDatasetVersionId,
false,
FileOrderCriteria.NAME_AZ,
)
testFileId = files[0].id;
testFilePersistentId = files[0].persistentId;
});

describe('getDatasetFiles', () => {
Expand Down Expand Up @@ -425,4 +437,82 @@ describe('FilesRepository', () => {
);
});
});

describe('getFile', () => {
describe('by numeric id', () => {
test('should return file when providing a valid id', async () => {
const actual = await sut.getFile(testFileId);

assert.match(actual.name, testTextFile1Name);
});

test('should return error when file does not exist', async () => {
let error: ReadError = undefined;

await sut.getFile(nonExistentFiledId).catch((e) => (error = e));

assert.match(
error.message,
`There was an error when reading the resource. Reason was: [400] Error attempting get the requested data file.`,
);
});
});
describe('by persistent id', () => {
test('should return file when providing a valid persistentId', async () => {
const actual = await sut.getFile(testFilePersistentId);

assert.match(actual.name, testTextFile1Name);
});

test('should return error when file does not exist', async () => {
let error: ReadError = undefined;
const nonExistentFiledPersistentId = 'nonExistentFiledPersistentId';
await sut.getFile(nonExistentFiledPersistentId).catch((e) => (error = e));

assert.match(
error.message,
`There was an error when reading the resource. Reason was: [400] Error attempting get the requested data file.`,
);
});
});
});

describe('getFileDraft', () => {
describe('by numeric id', () => {
test('should return file draft when providing a valid id', async () => {
const actual = await sut.getFileDraft(testFileId);

assert.match(actual.name, testTextFile1Name);
});

test('should return error when file draft does not exist', async () => {
let error: ReadError = undefined;

await sut.getFileDraft(nonExistentFiledId).catch((e) => (error = e));

assert.match(
error.message,
`There was an error when reading the resource. Reason was: [400] Error attempting get the requested data file.`,
);
});
});
describe('by persistent id', () => {
test('should return file draft when providing a valid persistentId', async () => {
const actual = await sut.getFileDraft(testFilePersistentId);

assert.match(actual.name, testTextFile1Name);
});

test('should return error when file draft does not exist', async () => {
let error: ReadError = undefined;
const nonExistentFiledPersistentId = 'nonExistentFiledPersistentId';
await sut.getFileDraft(nonExistentFiledPersistentId).catch((e) => (error = e));

assert.match(
error.message,
`There was an error when reading the resource. Reason was: [400] Error attempting get the requested data file.`,
);
});
});
});
});
20 changes: 20 additions & 0 deletions test/testHelpers/files/filesHelper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,3 +91,23 @@ export const uploadFileViaApi = async (datasetId: number, fileName: string, file
},
});
};

export const registerFileViaApi = async (fileId: number): Promise<AxiosResponse> => {
return await enableFilePIDs().then(() => axios.get(`${TestConstants.TEST_API_URL}/admin/${fileId}/registerDataFile`, {
headers: {
'X-Dataverse-Key': process.env.TEST_API_KEY,
}
}));
}

const enableFilePIDs = async (): Promise<AxiosResponse> => {
return await axios.put(`${TestConstants.TEST_API_URL}/admin/settings/:AllowEnablingFilePIDsPerCollection`, "true", {
headers: {
'X-Dataverse-Key': process.env.TEST_API_KEY,
},
}).then(() => axios.put(`${TestConstants.TEST_API_URL}/dataverses/root/attribute/filePIDsEnabled?value=true`, {}, {
headers: {
'X-Dataverse-Key': process.env.TEST_API_KEY,
},
}));
};
Loading
Loading