From cc77995dddfde4bad65d1a14470938b0ceda90f7 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Mon, 8 Sep 2025 09:33:51 -0400 Subject: [PATCH 1/3] save datasetType supplied in "create dataset" JSON #359 --- .../domain/repositories/IDatasetsRepository.ts | 3 ++- src/datasets/domain/useCases/CreateDataset.ts | 10 ++++++++-- .../infra/repositories/DatasetsRepository.ts | 9 +++++++-- .../transformers/datasetTransformers.ts | 5 ++++- test/functional/datasets/PublishDataset.test.ts | 16 ++++++++++++++-- test/testHelpers/datasets/datasetHelper.ts | 4 +++- test/unit/datasets/CreateDataset.test.ts | 6 ++++-- test/unit/datasets/datasetTransformers.test.ts | 12 +++++++++--- 8 files changed, 51 insertions(+), 14 deletions(-) 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..ac294bbd 100644 --- a/src/datasets/domain/useCases/CreateDataset.ts +++ b/src/datasets/domain/useCases/CreateDataset.ts @@ -27,10 +27,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..7bd2236c 100644 --- a/test/unit/datasets/CreateDataset.test.ts +++ b/test/unit/datasets/CreateDataset.test.ts @@ -51,7 +51,8 @@ describe('execute', () => { expect(datasetsRepositoryStub.createDataset).toHaveBeenCalledWith( testDataset, testMetadataBlocks, - ROOT_COLLECTION_ID + ROOT_COLLECTION_ID, + undefined ) }) @@ -111,7 +112,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) }) From 156963d7811bff060c1a45d9895bb08ecbb3f7ff Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Tue, 9 Sep 2025 14:03:14 -0400 Subject: [PATCH 2/3] add param doc for datasetType #359 --- src/datasets/domain/useCases/CreateDataset.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/datasets/domain/useCases/CreateDataset.ts b/src/datasets/domain/useCases/CreateDataset.ts index ac294bbd..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. From 48cc5dc430e08f63c7a34897afef26238447d492 Mon Sep 17 00:00:00 2001 From: Philip Durbin Date: Tue, 9 Sep 2025 15:22:20 -0400 Subject: [PATCH 3/3] add test for when passing dataset type #359 --- test/unit/datasets/CreateDataset.test.ts | 41 ++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/test/unit/datasets/CreateDataset.test.ts b/test/unit/datasets/CreateDataset.test.ts index 7bd2236c..edc69abb 100644 --- a/test/unit/datasets/CreateDataset.test.ts +++ b/test/unit/datasets/CreateDataset.test.ts @@ -56,6 +56,47 @@ describe('execute', () => { ) }) + 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' + ) + }) + test('should throw ResourceValidationError and not call repository when validation is unsuccessful', async () => { const datasetsRepositoryMock = {} datasetsRepositoryMock.createDataset = jest.fn().mockResolvedValue(undefined)