diff --git a/src/datasets/domain/repositories/IDatasetsRepository.ts b/src/datasets/domain/repositories/IDatasetsRepository.ts index 1b33eb14..49c9ab92 100644 --- a/src/datasets/domain/repositories/IDatasetsRepository.ts +++ b/src/datasets/domain/repositories/IDatasetsRepository.ts @@ -44,7 +44,8 @@ export interface IDatasetsRepository { createDataset( newDataset: DatasetDTO, datasetMetadataBlocks: MetadataBlock[], - collectionId: string + collectionId: string, + datasetType?: string ): Promise publishDataset(datasetId: number | string, versionUpdateType: VersionUpdateType): Promise updateDataset( diff --git a/src/datasets/domain/useCases/CreateDataset.ts b/src/datasets/domain/useCases/CreateDataset.ts index 65bffae4..090c0721 100644 --- a/src/datasets/domain/useCases/CreateDataset.ts +++ b/src/datasets/domain/useCases/CreateDataset.ts @@ -20,6 +20,7 @@ export class CreateDataset extends DatasetWriteUseCase} * @throws {ResourceValidationError} - If there are validation errors related to the provided information. * @throws {ReadError} - If there are errors while reading data. @@ -27,10 +28,16 @@ export class CreateDataset extends DatasetWriteUseCase { const metadataBlocks = await this.getNewDatasetMetadataBlocks(newDataset) this.getNewDatasetValidator().validate(newDataset, metadataBlocks) - return this.getDatasetsRepository().createDataset(newDataset, metadataBlocks, collectionId) + return this.getDatasetsRepository().createDataset( + newDataset, + metadataBlocks, + collectionId, + datasetType + ) } } diff --git a/src/datasets/infra/repositories/DatasetsRepository.ts b/src/datasets/infra/repositories/DatasetsRepository.ts index 2040f763..86d659f0 100644 --- a/src/datasets/infra/repositories/DatasetsRepository.ts +++ b/src/datasets/infra/repositories/DatasetsRepository.ts @@ -203,11 +203,16 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi public async createDataset( newDataset: DatasetDTO, datasetMetadataBlocks: MetadataBlock[], - collectionId: string + collectionId: string, + datasetType?: string ): Promise { return this.doPost( `/dataverses/${collectionId}/datasets`, - transformDatasetModelToNewDatasetRequestPayload(newDataset, datasetMetadataBlocks) + transformDatasetModelToNewDatasetRequestPayload( + newDataset, + datasetMetadataBlocks, + datasetType + ) ) .then((response) => { const responseData = response.data.data diff --git a/src/datasets/infra/repositories/transformers/datasetTransformers.ts b/src/datasets/infra/repositories/transformers/datasetTransformers.ts index e5e88ebd..cfa54d42 100644 --- a/src/datasets/infra/repositories/transformers/datasetTransformers.ts +++ b/src/datasets/infra/repositories/transformers/datasetTransformers.ts @@ -35,6 +35,7 @@ export interface NewDatasetRequestPayload { license?: DatasetLicense metadataBlocks: Record } + datasetType?: string } export interface MetadataBlockRequestPayload { @@ -96,9 +97,11 @@ export const transformDatasetModelToUpdateDatasetRequestPayload = ( export const transformDatasetModelToNewDatasetRequestPayload = ( dataset: DatasetDTO, - metadataBlocks: MetadataBlock[] + metadataBlocks: MetadataBlock[], + datasetType?: string ): NewDatasetRequestPayload => { return { + datasetType: datasetType, datasetVersion: { ...(dataset.license && { license: dataset.license }), metadataBlocks: transformMetadataBlockModelsToRequestPayload( diff --git a/test/functional/datasets/PublishDataset.test.ts b/test/functional/datasets/PublishDataset.test.ts index 9bdbfdb6..092fac5f 100644 --- a/test/functional/datasets/PublishDataset.test.ts +++ b/test/functional/datasets/PublishDataset.test.ts @@ -12,6 +12,10 @@ import { waitForNoLocks, deletePublishedDatasetViaApi } from '../../testHelpers/datasets/datasetHelper' +import { ROOT_COLLECTION_ID } from '../../../src/collections/domain/models/Collection' + +// "dataset" is the default so this is equivalent to not passing a datasetType +const datasetType = 'dataset' const testNewDataset = { license: { @@ -61,7 +65,11 @@ describe('execute', () => { }) test('should successfully publish a dataset', async () => { - const createdDatasetIdentifiers = await createDataset.execute(testNewDataset) + const createdDatasetIdentifiers = await createDataset.execute( + testNewDataset, + ROOT_COLLECTION_ID, + datasetType + ) const response = await publishDataset.execute( createdDatasetIdentifiers.persistentId, @@ -74,7 +82,11 @@ describe('execute', () => { }) test('should successfully publish a dataset with update current version', async () => { - const createdDatasetIdentifiers = await createDataset.execute(testNewDataset) + const createdDatasetIdentifiers = await createDataset.execute( + testNewDataset, + ROOT_COLLECTION_ID, + datasetType + ) const firstPublishResponse = await publishDataset.execute( createdDatasetIdentifiers.persistentId, diff --git a/test/testHelpers/datasets/datasetHelper.ts b/test/testHelpers/datasets/datasetHelper.ts index 65575bdc..02edebaf 100644 --- a/test/testHelpers/datasets/datasetHelper.ts +++ b/test/testHelpers/datasets/datasetHelper.ts @@ -694,9 +694,11 @@ export const createDatasetMetadataBlockModel = (): MetadataBlock => { } export const createNewDatasetRequestPayload = ( - license?: DatasetLicense + license?: DatasetLicense, + datasetType?: string ): NewDatasetRequestPayload => { return { + datasetType: datasetType, datasetVersion: { ...(license && { license }), metadataBlocks: { diff --git a/test/unit/datasets/CreateDataset.test.ts b/test/unit/datasets/CreateDataset.test.ts index 92c73d78..edc69abb 100644 --- a/test/unit/datasets/CreateDataset.test.ts +++ b/test/unit/datasets/CreateDataset.test.ts @@ -51,7 +51,49 @@ describe('execute', () => { expect(datasetsRepositoryStub.createDataset).toHaveBeenCalledWith( testDataset, testMetadataBlocks, - ROOT_COLLECTION_ID + ROOT_COLLECTION_ID, + undefined + ) + }) + + test('should return a dataset type', async () => { + const testCreatedDatasetIdentifiers: CreatedDatasetIdentifiers = { + persistentId: 'test', + numericId: 1 + } + + const datasetsRepositoryStub = {} + datasetsRepositoryStub.createDataset = jest + .fn() + .mockResolvedValue(testCreatedDatasetIdentifiers) + + const datasetValidatorStub = {} + datasetValidatorStub.validate = jest.fn().mockResolvedValue(undefined) + + const metadataBlocksRepositoryStub = {} + metadataBlocksRepositoryStub.getMetadataBlockByName = jest + .fn() + .mockResolvedValue(testMetadataBlocks[0]) + + const sut = new CreateDataset( + datasetsRepositoryStub, + metadataBlocksRepositoryStub, + datasetValidatorStub + ) + + const actual = await sut.execute(testDataset, ROOT_COLLECTION_ID, 'software') + + expect(actual).toEqual(testCreatedDatasetIdentifiers) + + expect(metadataBlocksRepositoryStub.getMetadataBlockByName).toHaveBeenCalledWith( + testMetadataBlocks[0].name + ) + expect(datasetValidatorStub.validate).toHaveBeenCalledWith(testDataset, testMetadataBlocks) + expect(datasetsRepositoryStub.createDataset).toHaveBeenCalledWith( + testDataset, + testMetadataBlocks, + ROOT_COLLECTION_ID, + 'software' ) }) @@ -111,7 +153,8 @@ describe('execute', () => { expect(datasetsRepositoryStub.createDataset).toHaveBeenCalledWith( testDataset, testMetadataBlocks, - ROOT_COLLECTION_ID + ROOT_COLLECTION_ID, + undefined ) }) diff --git a/test/unit/datasets/datasetTransformers.test.ts b/test/unit/datasets/datasetTransformers.test.ts index e659f533..c65557af 100644 --- a/test/unit/datasets/datasetTransformers.test.ts +++ b/test/unit/datasets/datasetTransformers.test.ts @@ -16,7 +16,7 @@ describe('transformNewDatasetModelToRequestPayload', () => { expect(actual).toEqual(expectedNewDatasetRequestPayload) }) - it('should correctly transform a new dataset model to a new dataset request payload when it contains a license', () => { + it('should correctly transform a new dataset model to a new dataset request payload when it contains a license and a datasetType', () => { const testDataset = createDatasetDTO( undefined, undefined, @@ -26,10 +26,16 @@ describe('transformNewDatasetModelToRequestPayload', () => { createDatasetLicenseModel() ) const testMetadataBlocks = [createDatasetMetadataBlockModel()] + const datasetType = 'software' const expectedNewDatasetRequestPayload = createNewDatasetRequestPayload( - createDatasetLicenseModel() + createDatasetLicenseModel(), + datasetType + ) + const actual = transformDatasetModelToNewDatasetRequestPayload( + testDataset, + testMetadataBlocks, + datasetType ) - const actual = transformDatasetModelToNewDatasetRequestPayload(testDataset, testMetadataBlocks) expect(actual).toEqual(expectedNewDatasetRequestPayload) })