diff --git a/src/datasetTypes/domain/models/DatasetType.ts b/src/datasetTypes/domain/models/DatasetType.ts new file mode 100644 index 00000000..5475cdaf --- /dev/null +++ b/src/datasetTypes/domain/models/DatasetType.ts @@ -0,0 +1,6 @@ +export interface DatasetType { + id: number + name: string + linkedMetadataBlocks?: string[] + availableLicenses?: string[] +} diff --git a/src/datasetTypes/domain/repositories/IDatasetTypesRepository.ts b/src/datasetTypes/domain/repositories/IDatasetTypesRepository.ts new file mode 100644 index 00000000..4b23c96a --- /dev/null +++ b/src/datasetTypes/domain/repositories/IDatasetTypesRepository.ts @@ -0,0 +1,5 @@ +import { DatasetType } from '../models/DatasetType' + +export interface IDatasetTypesRepository { + getAvailableDatasetTypes(): Promise +} diff --git a/src/datasetTypes/domain/repositories/transformers/DatasetTypePayload.ts b/src/datasetTypes/domain/repositories/transformers/DatasetTypePayload.ts new file mode 100644 index 00000000..c9473faa --- /dev/null +++ b/src/datasetTypes/domain/repositories/transformers/DatasetTypePayload.ts @@ -0,0 +1,6 @@ +export interface DatasetTypePayload { + id: number + name: string + linkedMetadataBlocks?: string[] + availableLicenses?: string[] +} diff --git a/src/datasetTypes/domain/repositories/transformers/datasetTypeTransformers.ts b/src/datasetTypes/domain/repositories/transformers/datasetTypeTransformers.ts new file mode 100644 index 00000000..a9505f7b --- /dev/null +++ b/src/datasetTypes/domain/repositories/transformers/datasetTypeTransformers.ts @@ -0,0 +1,14 @@ +import { AxiosResponse } from 'axios' +import { DatasetType } from '../../models/DatasetType' +import { DatasetTypePayload } from './DatasetTypePayload' + +export const transformPayloadToDatasetType = (response: AxiosResponse): DatasetType[] => { + const payload = response.data.data as DatasetTypePayload[] + + return payload.map((datasetType: DatasetTypePayload) => ({ + id: datasetType.id, + name: datasetType.name, + linkedMetadataBlocks: datasetType.linkedMetadataBlocks, + availableLicenses: datasetType.availableLicenses + })) +} diff --git a/src/datasetTypes/domain/useCases/GetAvailableDatasetTypes.ts b/src/datasetTypes/domain/useCases/GetAvailableDatasetTypes.ts new file mode 100644 index 00000000..cbefe687 --- /dev/null +++ b/src/datasetTypes/domain/useCases/GetAvailableDatasetTypes.ts @@ -0,0 +1,20 @@ +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { DatasetType } from '../models/DatasetType' +import { IDatasetTypesRepository } from '../repositories/IDatasetTypesRepository' + +export class GetAvailableDatasetTypes implements UseCase { + private datasetTypesRepository: IDatasetTypesRepository + + constructor(datasetTypesRepository: IDatasetTypesRepository) { + this.datasetTypesRepository = datasetTypesRepository + } + + /** + * Returns the list of available dataset types that can be selected for a dataset. + * + * @returns {Promise} + */ + async execute(): Promise { + return await this.datasetTypesRepository.getAvailableDatasetTypes() + } +} diff --git a/src/datasetTypes/index.ts b/src/datasetTypes/index.ts new file mode 100644 index 00000000..46d8d64b --- /dev/null +++ b/src/datasetTypes/index.ts @@ -0,0 +1,10 @@ +import { DatasetTypesRepository } from './infra/repositories/DatasetTypesRepository' +import { GetAvailableDatasetTypes } from './domain/useCases/GetAvailableDatasetTypes' + +const datasetTypesRepository = new DatasetTypesRepository() + +const getAvailableDatasetTypes = new GetAvailableDatasetTypes(datasetTypesRepository) + +export { getAvailableDatasetTypes } + +export { DatasetType } from './domain/models/DatasetType' diff --git a/src/datasetTypes/infra/repositories/DatasetTypesRepository.ts b/src/datasetTypes/infra/repositories/DatasetTypesRepository.ts new file mode 100644 index 00000000..a1e8e506 --- /dev/null +++ b/src/datasetTypes/infra/repositories/DatasetTypesRepository.ts @@ -0,0 +1,15 @@ +import { ApiRepository } from '../../../core/infra/repositories/ApiRepository' +import { IDatasetTypesRepository } from '../../domain/repositories/IDatasetTypesRepository' +import { DatasetType } from '../../domain/models/DatasetType' + +export class DatasetTypesRepository extends ApiRepository implements IDatasetTypesRepository { + private readonly datasetTypesResourceName: string = 'datasets/datasetTypes' + + public async getAvailableDatasetTypes(): Promise { + return this.doGet(this.buildApiEndpoint(this.datasetTypesResourceName)) + .then((response) => response.data.data) + .catch((error) => { + throw error + }) + } +} diff --git a/src/index.ts b/src/index.ts index 814abb34..6e73cd77 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,3 +10,4 @@ export * from './files' export * from './contactInfo' export * from './notifications' export * from './search' +export * from './datasetTypes' diff --git a/test/functional/datasetTypes/GetAvailableDatasetTypes.test.ts b/test/functional/datasetTypes/GetAvailableDatasetTypes.test.ts new file mode 100644 index 00000000..500c66a7 --- /dev/null +++ b/test/functional/datasetTypes/GetAvailableDatasetTypes.test.ts @@ -0,0 +1,31 @@ +import { ApiConfig } from '../../../src' +import { getAvailableDatasetTypes } from '../../../src/datasetTypes' +import { DatasetType } from '../../../src/datasetTypes/domain/models/DatasetType' +import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig' +import { TestConstants } from '../../testHelpers/TestConstants' + +describe('getAvailableDatasetTypes', () => { + describe('execute', () => { + beforeAll(async () => { + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + process.env.TEST_API_KEY + ) + }) + + test('should return available dataset types', async () => { + const actualDatasetTypes: DatasetType[] = await getAvailableDatasetTypes.execute() + const expectedDatasetTypes = [ + { + id: 1, + name: 'dataset', + linkedMetadataBlocks: [], + availableLicenses: [] + } + ] + + expect(actualDatasetTypes).toEqual(expectedDatasetTypes) + }) + }) +}) diff --git a/test/integration/datasetTypes/DatasetTypesRepository.test.ts b/test/integration/datasetTypes/DatasetTypesRepository.test.ts new file mode 100644 index 00000000..c115d974 --- /dev/null +++ b/test/integration/datasetTypes/DatasetTypesRepository.test.ts @@ -0,0 +1,36 @@ +import { + ApiConfig, + DataverseApiAuthMechanism +} from '../../../src/core/infra/repositories/ApiConfig' +import { TestConstants } from '../../testHelpers/TestConstants' +import { DatasetTypesRepository } from '../../../src/datasetTypes/infra/repositories/DatasetTypesRepository' +// import { LicensesRepository } from '../../../src/licenses/infra/repositories/LicensesRepository' + +describe('DatasetTypesRepository', () => { + const sut: DatasetTypesRepository = new DatasetTypesRepository() + + describe('getAvailableDatasetTypes', () => { + beforeAll(async () => { + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + process.env.TEST_API_KEY + ) + }) + + test('should return list of available dataset types', async () => { + const actual = await sut.getAvailableDatasetTypes() + + const datasetTypes = [ + { + id: 1, + name: 'dataset', + linkedMetadataBlocks: [], + availableLicenses: [] + } + ] + + expect(actual).toEqual(datasetTypes) + }) + }) +}) diff --git a/test/unit/datasetTypes/GetAvailableDatasetTypes.test.ts b/test/unit/datasetTypes/GetAvailableDatasetTypes.test.ts new file mode 100644 index 00000000..d55ee248 --- /dev/null +++ b/test/unit/datasetTypes/GetAvailableDatasetTypes.test.ts @@ -0,0 +1,50 @@ +import { ReadError } from '../../../src' +// import { DatasetType } from '../../../src/datasetTypes/models/DatasetType' +import { DatasetType } from '../../../src/datasetTypes/domain/models/DatasetType' +import { IDatasetTypesRepository } from '../../../src/datasetTypes/domain/repositories/IDatasetTypesRepository' +import { GetAvailableDatasetTypes } from '../../../src/datasetTypes/domain/useCases/GetAvailableDatasetTypes' + +describe('GetAvailableDatasetTypes', () => { + describe('execute', () => { + test('should return datasetTypes array on repository success', async () => { + const datasetTypesRepositoryStub: IDatasetTypesRepository = {} as IDatasetTypesRepository + + const testDatasetTypes: DatasetType[] = [ + { + id: 1, + name: 'dataset', + linkedMetadataBlocks: [], + availableLicenses: [] + }, + { + id: 2, + name: 'software', + linkedMetadataBlocks: ['codeMeta20'], + availableLicenses: ['MIT', 'Apache-2.0'] + } + ] + + datasetTypesRepositoryStub.getAvailableDatasetTypes = jest + .fn() + .mockResolvedValue(testDatasetTypes) + const sut = new GetAvailableDatasetTypes(datasetTypesRepositoryStub) + + const actual = await sut.execute() + + expect(actual).toEqual(testDatasetTypes) + expect(datasetTypesRepositoryStub.getAvailableDatasetTypes).toHaveBeenCalledTimes(1) + }) + + test('should return error result on repository error', async () => { + const datasetTypesRepositoryStub: IDatasetTypesRepository = {} as IDatasetTypesRepository + const expectedError = new ReadError('Failed to fetch dataset types') + datasetTypesRepositoryStub.getAvailableDatasetTypes = jest + .fn() + .mockRejectedValue(expectedError) + const sut = new GetAvailableDatasetTypes(datasetTypesRepositoryStub) + + await expect(sut.execute()).rejects.toThrow(ReadError) + expect(datasetTypesRepositoryStub.getAvailableDatasetTypes).toHaveBeenCalledTimes(1) + }) + }) +})