From 1c8399af717e3d502b41082b4de9229b974d6197 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Thu, 27 Aug 2026 16:29:15 -0400 Subject: [PATCH] feat: update template ID to get and create dataset --- CHANGELOG.md | 1 + docs/useCases.md | 4 +++- src/datasets/domain/dtos/DatasetDTO.ts | 1 + src/datasets/domain/models/Dataset.ts | 1 + src/datasets/domain/useCases/CreateDataset.ts | 2 +- .../infra/repositories/transformers/DatasetPayload.ts | 1 + .../repositories/transformers/datasetTransformers.ts | 5 +++++ test/functional/datasets/GetDataset.test.ts | 8 ++++++++ test/unit/datasets/datasetTransformers.test.ts | 9 +++++++++ 9 files changed, 30 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 650ee39b..5f0bb8e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel ### Added +- Datasets: Added optional `templateId` support to `createDataset` requests and `getDataset` responses. - Guestbooks: Added `editGuestbook` use case. - Guestbooks: Added `getGuestbookResponsesByGuestbookId` use case and repository support for retrieving paginated guestbook responses with total count as structured JSON. - Guestbooks: Added `downloadGuestbookResponsesByCollectionId` and `downloadGuestbookResponsesOfAGuestbook` use cases and repository support for exporting guestbook responses as raw CSV content. diff --git a/docs/useCases.md b/docs/useCases.md index 79b7e853..b6281275 100644 --- a/docs/useCases.md +++ b/docs/useCases.md @@ -997,6 +997,8 @@ There is an optional third parameter called `includeDeaccessioned`, which indica There is an optional fourth parameter called `keepRawFields`, which indicates whether or not to keep the metadata fields as they are and avoid the transformation to Markdown. The default value is `false`. +When the dataset is associated with a template, the returned `Dataset` includes the optional `templateId` field containing that template's numeric identifier. + #### Get Dataset By Private URL Token Returns a [Dataset](../src/datasets/domain/models/Dataset.ts) instance, given an associated Private URL Token. @@ -1449,7 +1451,7 @@ createDataset.execute(datasetDTO).then((newDatasetIds: CreatedDatasetIdentifiers _See [use case](../src/datasets/domain/useCases/CreateDataset.ts) implementation_. -The above example creates the new dataset in the root collection since no collection identifier is specified. If you want to create the dataset in a different collection, you must add the collection identifier as a second parameter in the use case call. If you want the dataset type to be anything other than dataset, first [check available dataset types](#get-dataset-available-dataset-types) and then add the name of the dataset type as the third parameter. +The above example creates the new dataset in the root collection since no collection identifier is specified. If you want to create the dataset in a different collection, you must add the collection identifier as a second parameter in the use case call. If you want the dataset type to be anything other than dataset, first [check available dataset types](#get-dataset-available-dataset-types) and then add the name of the dataset type as the third parameter. To create from an applicable metadata template, set its numeric identifier as `datasetDTO.templateId`; the SDK sends it as the top-level `templateId` field in the request body. The use case returns a [CreatedDatasetIdentifiers](../src/datasets/domain/models/CreatedDatasetIdentifiers.ts) object, which includes the persistent and numeric identifiers of the created dataset. diff --git a/src/datasets/domain/dtos/DatasetDTO.ts b/src/datasets/domain/dtos/DatasetDTO.ts index 23d668c9..bb77a6d1 100644 --- a/src/datasets/domain/dtos/DatasetDTO.ts +++ b/src/datasets/domain/dtos/DatasetDTO.ts @@ -2,6 +2,7 @@ import { DatasetLicense } from '../models/Dataset' export interface DatasetDTO { license?: DatasetLicense + templateId?: number metadataBlockValues: DatasetMetadataBlockValuesDTO[] } diff --git a/src/datasets/domain/models/Dataset.ts b/src/datasets/domain/models/Dataset.ts index ebd302f1..22527aaa 100644 --- a/src/datasets/domain/models/Dataset.ts +++ b/src/datasets/domain/models/Dataset.ts @@ -13,6 +13,7 @@ export interface Dataset { publicationDate?: string citationDate?: string guestbookId?: number + templateId?: number metadataBlocks: DatasetMetadataBlocks isPartOf: DvObjectOwnerNode datasetType?: string diff --git a/src/datasets/domain/useCases/CreateDataset.ts b/src/datasets/domain/useCases/CreateDataset.ts index 090c0721..a7912694 100644 --- a/src/datasets/domain/useCases/CreateDataset.ts +++ b/src/datasets/domain/useCases/CreateDataset.ts @@ -18,7 +18,7 @@ export class CreateDataset extends DatasetWriteUseCase} diff --git a/src/datasets/infra/repositories/transformers/DatasetPayload.ts b/src/datasets/infra/repositories/transformers/DatasetPayload.ts index 347bc5d1..5b2df9ff 100644 --- a/src/datasets/infra/repositories/transformers/DatasetPayload.ts +++ b/src/datasets/infra/repositories/transformers/DatasetPayload.ts @@ -18,6 +18,7 @@ export interface DatasetPayload { publicationDate?: string citationDate?: string guestbookId?: number + templateId?: number fileAccessRequest: boolean termsOfAccess?: string dataAccessPlace?: string diff --git a/src/datasets/infra/repositories/transformers/datasetTransformers.ts b/src/datasets/infra/repositories/transformers/datasetTransformers.ts index 1c1e31d8..f185bf72 100644 --- a/src/datasets/infra/repositories/transformers/datasetTransformers.ts +++ b/src/datasets/infra/repositories/transformers/datasetTransformers.ts @@ -32,6 +32,7 @@ const turndownService = new TurndownService() export interface NewDatasetRequestPayload { datasetType?: string + templateId?: number datasetVersion: { license?: DatasetLicense metadataBlocks: Record @@ -102,6 +103,7 @@ export const transformDatasetModelToNewDatasetRequestPayload = ( ): NewDatasetRequestPayload => { return { datasetType, + ...(dataset.templateId !== undefined && { templateId: dataset.templateId }), datasetVersion: { ...(dataset.license && { license: dataset.license }), metadataBlocks: transformMetadataBlockModelsToRequestPayload( @@ -299,6 +301,9 @@ export const transformVersionPayloadToDataset = ( if ('guestbookId' in versionPayload) { datasetModel.guestbookId = versionPayload.guestbookId } + if ('templateId' in versionPayload) { + datasetModel.templateId = versionPayload.templateId + } if ('datasetType' in versionPayload) { datasetModel.datasetType = versionPayload.datasetType } diff --git a/test/functional/datasets/GetDataset.test.ts b/test/functional/datasets/GetDataset.test.ts index 771e432d..527b4286 100644 --- a/test/functional/datasets/GetDataset.test.ts +++ b/test/functional/datasets/GetDataset.test.ts @@ -93,6 +93,14 @@ describe('execute', () => { expect(dataset.termsOfUse.termsOfAccess.termsOfAccessForRestrictedFiles).toBe('Terms of access') expect(dataset.termsOfUse.customTerms?.termsOfUse).toBe('Terms of use') }) + test('should return the template id when present', () => { + const versionPayload = createDatasetVersionPayload() + versionPayload.templateId = 3 + + const dataset = transformVersionPayloadToDataset(versionPayload, false) + + expect(dataset.templateId).toBe(3) + }) test('should return metadata fields in markdown format when keepRawFields is false', async () => { const createdDatasetIdentifiers = await createDataset.execute(testNewDataset) diff --git a/test/unit/datasets/datasetTransformers.test.ts b/test/unit/datasets/datasetTransformers.test.ts index 7e4185c7..31b7bf5d 100644 --- a/test/unit/datasets/datasetTransformers.test.ts +++ b/test/unit/datasets/datasetTransformers.test.ts @@ -57,4 +57,13 @@ describe('transformNewDatasetModelToRequestPayload', () => { expect(actual).toEqual(expectedNewDatasetRequestPayload) }) + + it('should include the template id at the top level of a new dataset request payload', () => { + const testDataset = { ...createDatasetDTO(), templateId: 3 } + const testMetadataBlocks = [createDatasetMetadataBlockModel()] + + const actual = transformDatasetModelToNewDatasetRequestPayload(testDataset, testMetadataBlocks) + + expect(actual).toEqual({ ...createNewDatasetRequestPayload(), templateId: 3 }) + }) })