From 243eda11a403ca1bed5374c478949a33f5e2a3f0 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Wed, 7 Jan 2026 15:40:27 -0500 Subject: [PATCH 1/5] feat: restructure template --- docs/useCases.md | 53 ++++---- .../repositories/ICollectionsRepository.ts | 5 - src/collections/index.ts | 5 +- .../repositories/CollectionsRepository.ts | 15 --- .../repositories/IDatasetsRepository.ts | 2 - src/datasets/index.ts | 3 - .../infra/repositories/DatasetsRepository.ts | 16 --- src/index.ts | 1 + .../domain/dtos/CreateDatasetTemplateDTO.ts | 0 .../domain/models/DatasetTemplate.ts | 2 +- .../repositories/ITemplatesRepository.ts | 10 ++ .../domain/useCases/CreateDatasetTemplate.ts | 12 +- .../domain/useCases/GetDatasetTemplates.ts | 10 +- src/template/index.ts | 20 ++++ .../infra/repositories/TemplatesRepository.ts | 37 ++++++ .../transformers/DatasetTemplatePayload.ts | 2 +- .../datasetTemplateTransformers.ts | 2 +- .../createDatasetTemplate.test.ts | 5 +- .../collections/CollectionsRepository.test.ts | 62 +--------- .../datasets/DatasetsRepository.test.ts | 39 ------ .../template/TemplateRepository.test.ts | 113 ++++++++++++++++++ .../datasets/datasetTemplatesHelper.ts | 2 +- .../unit/collections/createDatasetTemplate.ts | 46 ------- .../template/createDatasetTemplate.test.ts | 44 +++++++ 24 files changed, 275 insertions(+), 231 deletions(-) rename src/{collections => template}/domain/dtos/CreateDatasetTemplateDTO.ts (100%) rename src/{datasets => template}/domain/models/DatasetTemplate.ts (87%) create mode 100644 src/template/domain/repositories/ITemplatesRepository.ts rename src/{collections => template}/domain/useCases/CreateDatasetTemplate.ts (66%) rename src/{datasets => template}/domain/useCases/GetDatasetTemplates.ts (73%) create mode 100644 src/template/index.ts create mode 100644 src/template/infra/repositories/TemplatesRepository.ts rename src/{datasets => template}/infra/repositories/transformers/DatasetTemplatePayload.ts (93%) rename src/{datasets => template}/infra/repositories/transformers/datasetTemplateTransformers.ts (95%) rename test/functional/{collections => template}/createDatasetTemplate.test.ts (89%) create mode 100644 test/integration/template/TemplateRepository.test.ts delete mode 100644 test/unit/collections/createDatasetTemplate.ts create mode 100644 test/unit/template/createDatasetTemplate.test.ts diff --git a/docs/useCases.md b/docs/useCases.md index 3254e4a5..6bf629db 100644 --- a/docs/useCases.md +++ b/docs/useCases.md @@ -25,6 +25,10 @@ The different use cases currently available in the package are classified below, - [Update Collection Featured Items](#update-collection-featured-items) - [Delete Collection Featured Items](#delete-collection-featured-items) - [Delete a Collection Featured Item](#delete-a-collection-featured-item) +- [Templates](#Templates) + - [Templates read use cases](#templates-read-use-cases) + - [Get Dataset Templates](#get-dataset-templates) + - [Templates write use cases](#templates-write-use-cases) - [Create a Dataset Template](#create-a-dataset-template) - [Datasets](#Datasets) - [Datasets read use cases](#datasets-read-use-cases) @@ -40,7 +44,6 @@ The different use cases currently available in the package are classified below, - [Get Dataset Versions Summaries](#get-dataset-versions-summaries) - [Get Dataset Linked Collections](#get-dataset-linked-collections) - [Get Dataset Available Categories](#get-dataset-available-categories) - - [Get Dataset Templates](#get-dataset-templates) - [Get Dataset Available Dataset Types](#get-dataset-available-dataset-types) - [Get Dataset Available Dataset Type](#get-dataset-available-dataset-type) - [Datasets write use cases](#datasets-write-use-cases) @@ -569,6 +572,30 @@ deleteCollectionFeaturedItem.execute(featuredItemId) _See [use case](../src/collections/domain/useCases/DeleteCollectionFeaturedItem.ts)_ definition. +## Templates + +### Templates Read Use Cases + +#### Get Dataset Templates + +Returns a [DatasetTemplate](../src/template/domain/models/DatasetTemplate.ts) array containing the dataset templates of the requested collection, given the collection identifier or alias. + +##### Example call: + +```typescript +import { getDatasetTemplates } from '@iqss/dataverse-client-javascript' + +const collectionIdOrAlias = 12345 + +getDatasetTemplates.execute(collectionIdOrAlias).then((datasetTemplates: DatasetTemplate[]) => { + /* ... */ +}) +``` + +_See [use case](../src/template/domain/useCases/GetDatasetTemplates.ts)_ definition. + +### Templates Write Use Cases + #### Create a Dataset Template Creates a dataset template for a given Dataverse collection id or alias. @@ -577,10 +604,10 @@ Creates a dataset template for a given Dataverse collection id or alias. ```typescript import { createDatasetTemplate } from '@iqss/dataverse-client-javascript' -import { TemplateCreateDTO } from '@iqss/dataverse-client-javascript' +import { CreateDatasetTemplateDTO } from '@iqss/dataverse-client-javascript' const collectionAlias = ':root' -const template: TemplateCreateDTO = { +const template: CreateDatasetTemplateDTO = { name: 'Dataverse template', isDefault: true, fields: [ @@ -602,7 +629,7 @@ const template: TemplateCreateDTO = { await createDatasetTemplate.execute(template, collectionAlias) ``` -_See [use case](../src/collections/domain/useCases/CreateDatasetTemplate.ts) implementation_. +_See [use case](../src/template/domain/useCases/CreateDatasetTemplate.ts) implementation_. ## Datasets @@ -1333,24 +1360,6 @@ _See [use case](../src/datasets/domain/useCases/GetDatasetAvailableCategories.ts The `datasetId` parameter is a number for numeric identifiers or string for persistent identifiers. -#### Get Dataset Templates - -Returns a [DatasetTemplate](../src/datasets/domain/models/DatasetTemplate.ts) array containing the dataset templates of the requested collection, given the collection identifier or alias. - -##### Example call: - -```typescript -import { getDatasetTemplates } from '@iqss/dataverse-client-javascript' - -const collectionIdOrAlias = 12345 - -getDatasetTemplates.execute(collectionIdOrAlias).then((datasetTemplates: DatasetTemplate[]) => { - /* ... */ -}) -``` - -_See [use case](../src/datasets/domain/useCases/GetDatasetTemplates.ts)_ definition. - #### Add a Dataset Type Adds a dataset types that can be used at dataset creation. diff --git a/src/collections/domain/repositories/ICollectionsRepository.ts b/src/collections/domain/repositories/ICollectionsRepository.ts index cae28415..bc8960c8 100644 --- a/src/collections/domain/repositories/ICollectionsRepository.ts +++ b/src/collections/domain/repositories/ICollectionsRepository.ts @@ -12,7 +12,6 @@ import { CollectionItemType } from '../../../collections/domain/models/Collectio import { CollectionLinks } from '../models/CollectionLinks' import { CollectionSummary } from '../models/CollectionSummary' import { LinkingObjectType } from '../useCases/GetCollectionsForLinking' -import { CreateDatasetTemplateDTO } from '../dtos/CreateDatasetTemplateDTO' export interface ICollectionsRepository { getCollection(collectionIdOrAlias: number | string): Promise @@ -69,8 +68,4 @@ export interface ICollectionsRepository { searchTerm: string, alreadyLinked: boolean ): Promise - createDatasetTemplate( - collectionIdOrAlias: number | string, - template: CreateDatasetTemplateDTO - ): Promise } diff --git a/src/collections/index.ts b/src/collections/index.ts index df7b6af5..59e2e50b 100644 --- a/src/collections/index.ts +++ b/src/collections/index.ts @@ -16,7 +16,6 @@ import { LinkCollection } from './domain/useCases/LinkCollection' import { UnlinkCollection } from './domain/useCases/UnlinkCollection' import { GetCollectionLinks } from './domain/useCases/GetCollectionLinks' import { GetCollectionsForLinking } from './domain/useCases/GetCollectionsForLinking' -import { CreateDatasetTemplate } from './domain/useCases/CreateDatasetTemplate' const collectionsRepository = new CollectionsRepository() @@ -37,7 +36,6 @@ const linkCollection = new LinkCollection(collectionsRepository) const unlinkCollection = new UnlinkCollection(collectionsRepository) const getCollectionLinks = new GetCollectionLinks(collectionsRepository) const getCollectionsForLinking = new GetCollectionsForLinking(collectionsRepository) -const createDatasetTemplate = new CreateDatasetTemplate(collectionsRepository) export { getCollection, @@ -56,8 +54,7 @@ export { linkCollection, unlinkCollection, getCollectionLinks, - getCollectionsForLinking, - createDatasetTemplate + getCollectionsForLinking } export { Collection, CollectionInputLevel } from './domain/models/Collection' export { CollectionFacet } from './domain/models/CollectionFacet' diff --git a/src/collections/infra/repositories/CollectionsRepository.ts b/src/collections/infra/repositories/CollectionsRepository.ts index 53ebfff3..e0e459b0 100644 --- a/src/collections/infra/repositories/CollectionsRepository.ts +++ b/src/collections/infra/repositories/CollectionsRepository.ts @@ -40,7 +40,6 @@ import { ReadError } from '../../../core/domain/repositories/ReadError' import { CollectionLinks } from '../../domain/models/CollectionLinks' import { CollectionSummary } from '../../domain/models/CollectionSummary' import { LinkingObjectType } from '../../domain/useCases/GetCollectionsForLinking' -import { CreateDatasetTemplateDTO } from '../../domain/dtos/CreateDatasetTemplateDTO' export interface NewCollectionRequestPayload { alias: string @@ -529,18 +528,4 @@ export class CollectionsRepository extends ApiRepository implements ICollections throw error }) } - - public async createDatasetTemplate( - collectionIdOrAlias: number | string, - template: CreateDatasetTemplateDTO - ): Promise { - return this.doPost( - `/${this.collectionsResourceName}/${collectionIdOrAlias}/templates`, - template - ) - .then(() => undefined) - .catch((error) => { - throw error - }) - } } diff --git a/src/datasets/domain/repositories/IDatasetsRepository.ts b/src/datasets/domain/repositories/IDatasetsRepository.ts index 8a52f8f9..c0b0e670 100644 --- a/src/datasets/domain/repositories/IDatasetsRepository.ts +++ b/src/datasets/domain/repositories/IDatasetsRepository.ts @@ -12,7 +12,6 @@ import { DatasetVersionSummarySubset } from '../models/DatasetVersionSummaryInfo import { DatasetLinkedCollection } from '../models/DatasetLinkedCollection' import { CitationFormat } from '../models/CitationFormat' import { FormattedCitation } from '../models/FormattedCitation' -import { DatasetTemplate } from '../models/DatasetTemplate' import { DatasetType } from '../models/DatasetType' import { TermsOfAccess } from '../models/Dataset' import { DatasetLicenseUpdateRequest } from '../dtos/DatasetLicenseUpdateRequest' @@ -84,7 +83,6 @@ export interface IDatasetsRepository { format: CitationFormat, includeDeaccessioned?: boolean ): Promise - getDatasetTemplates(collectionIdOrAlias: number | string): Promise getDatasetAvailableDatasetTypes(): Promise getDatasetAvailableDatasetType(datasetTypeId: number | string): Promise addDatasetType(datasetType: DatasetTypeDTO): Promise diff --git a/src/datasets/index.ts b/src/datasets/index.ts index b8edb5b3..fd267057 100644 --- a/src/datasets/index.ts +++ b/src/datasets/index.ts @@ -31,7 +31,6 @@ import { LinkDatasetTypeWithMetadataBlocks } from './domain/useCases/LinkDataset import { SetAvailableLicensesForDatasetType } from './domain/useCases/SetAvailableLicensesForDatasetType' import { DeleteDatasetType } from './domain/useCases/DeleteDatasetType' import { GetDatasetCitationInOtherFormats } from './domain/useCases/GetDatasetCitationInOtherFormats' -import { GetDatasetTemplates } from './domain/useCases/GetDatasetTemplates' import { UpdateTermsOfAccess } from './domain/useCases/UpdateTermsOfAccess' import { UpdateDatasetLicense } from './domain/useCases/UpdateDatasetLicense' @@ -81,7 +80,6 @@ const setAvailableLicensesForDatasetType = new SetAvailableLicensesForDatasetTyp ) const deleteDatasetType = new DeleteDatasetType(datasetsRepository) const getDatasetCitationInOtherFormats = new GetDatasetCitationInOtherFormats(datasetsRepository) -const getDatasetTemplates = new GetDatasetTemplates(datasetsRepository) const updateTermsOfAccess = new UpdateTermsOfAccess(datasetsRepository) const updateDatasetLicense = new UpdateDatasetLicense(datasetsRepository) @@ -107,7 +105,6 @@ export { getDatasetLinkedCollections, getDatasetAvailableCategories, getDatasetCitationInOtherFormats, - getDatasetTemplates, updateTermsOfAccess, getDatasetAvailableDatasetTypes, getDatasetAvailableDatasetType, diff --git a/src/datasets/infra/repositories/DatasetsRepository.ts b/src/datasets/infra/repositories/DatasetsRepository.ts index 849cf658..c3b05c88 100644 --- a/src/datasets/infra/repositories/DatasetsRepository.ts +++ b/src/datasets/infra/repositories/DatasetsRepository.ts @@ -1,4 +1,3 @@ -import { AxiosResponse } from 'axios' import { ApiRepository } from '../../../core/infra/repositories/ApiRepository' import { IDatasetsRepository } from '../../domain/repositories/IDatasetsRepository' import { Dataset, VersionUpdateType } from '../../domain/models/Dataset' @@ -25,9 +24,6 @@ import { DatasetLinkedCollection } from '../../domain/models/DatasetLinkedCollec import { CitationFormat } from '../../domain/models/CitationFormat' import { transformDatasetLinkedCollectionsResponseToDatasetLinkedCollection } from './transformers/datasetLinkedCollectionsTransformers' import { FormattedCitation } from '../../domain/models/FormattedCitation' -import { DatasetTemplate } from '../../domain/models/DatasetTemplate' -import { DatasetTemplatePayload } from './transformers/DatasetTemplatePayload' -import { transformDatasetTemplatePayloadToDatasetTemplate } from './transformers/datasetTemplateTransformers' import { DatasetType } from '../../domain/models/DatasetType' import { TermsOfAccess } from '../../domain/models/Dataset' import { transformTermsOfAccessToUpdatePayload } from './transformers/termsOfAccessTransformers' @@ -402,18 +398,6 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi }) } - public async getDatasetTemplates( - collectionIdOrAlias: number | string - ): Promise { - return this.doGet(`/dataverses/${collectionIdOrAlias}/templates`, true) - .then((response: AxiosResponse<{ data: DatasetTemplatePayload[] }>) => - transformDatasetTemplatePayloadToDatasetTemplate(response.data.data) - ) - .catch((error) => { - throw error - }) - } - public async getDatasetAvailableDatasetTypes(): Promise { return this.doGet(this.buildApiEndpoint(this.datasetsResourceName, 'datasetTypes')) .then((response) => response.data.data) diff --git a/src/index.ts b/src/index.ts index 9e64baa6..e7f4475a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,3 +12,4 @@ export * from './notifications' export * from './search' export * from './licenses' export * from './externalTools' +export * from './template' diff --git a/src/collections/domain/dtos/CreateDatasetTemplateDTO.ts b/src/template/domain/dtos/CreateDatasetTemplateDTO.ts similarity index 100% rename from src/collections/domain/dtos/CreateDatasetTemplateDTO.ts rename to src/template/domain/dtos/CreateDatasetTemplateDTO.ts diff --git a/src/datasets/domain/models/DatasetTemplate.ts b/src/template/domain/models/DatasetTemplate.ts similarity index 87% rename from src/datasets/domain/models/DatasetTemplate.ts rename to src/template/domain/models/DatasetTemplate.ts index 9be71f23..afe5d8d3 100644 --- a/src/datasets/domain/models/DatasetTemplate.ts +++ b/src/template/domain/models/DatasetTemplate.ts @@ -1,4 +1,4 @@ -import { DatasetMetadataBlock, TermsOfUse } from './Dataset' +import { DatasetMetadataBlock, TermsOfUse } from '../../../datasets/domain/models/Dataset' import { License } from '../../../licenses/domain/models/License' export interface DatasetTemplate { diff --git a/src/template/domain/repositories/ITemplatesRepository.ts b/src/template/domain/repositories/ITemplatesRepository.ts new file mode 100644 index 00000000..b05e9893 --- /dev/null +++ b/src/template/domain/repositories/ITemplatesRepository.ts @@ -0,0 +1,10 @@ +import { CreateDatasetTemplateDTO } from '../dtos/CreateDatasetTemplateDTO' +import { DatasetTemplate } from '../models/DatasetTemplate' + +export interface ITemplatesRepository { + createDatasetTemplate( + collectionIdOrAlias: number | string, + template: CreateDatasetTemplateDTO + ): Promise + getDatasetTemplates(collectionIdOrAlias: number | string): Promise +} diff --git a/src/collections/domain/useCases/CreateDatasetTemplate.ts b/src/template/domain/useCases/CreateDatasetTemplate.ts similarity index 66% rename from src/collections/domain/useCases/CreateDatasetTemplate.ts rename to src/template/domain/useCases/CreateDatasetTemplate.ts index ffb443f6..9d9b1f77 100644 --- a/src/collections/domain/useCases/CreateDatasetTemplate.ts +++ b/src/template/domain/useCases/CreateDatasetTemplate.ts @@ -1,13 +1,13 @@ -import { ROOT_COLLECTION_ID } from '../models/Collection' +import { ROOT_COLLECTION_ID } from '../../../collections/domain/models/Collection' import { UseCase } from '../../../core/domain/useCases/UseCase' -import { ICollectionsRepository } from '../repositories/ICollectionsRepository' import { CreateDatasetTemplateDTO } from '../dtos/CreateDatasetTemplateDTO' +import { ITemplatesRepository } from '../repositories/ITemplatesRepository' export class CreateDatasetTemplate implements UseCase { - private collectionsRepository: ICollectionsRepository + private templatesRepository: ITemplatesRepository - constructor(collectionsRepository: ICollectionsRepository) { - this.collectionsRepository = collectionsRepository + constructor(templatesRepository: ITemplatesRepository) { + this.templatesRepository = templatesRepository } /** @@ -22,6 +22,6 @@ export class CreateDatasetTemplate implements UseCase { template: CreateDatasetTemplateDTO, collectionIdOrAlias: number | string = ROOT_COLLECTION_ID ): Promise { - return await this.collectionsRepository.createDatasetTemplate(collectionIdOrAlias, template) + return await this.templatesRepository.createDatasetTemplate(collectionIdOrAlias, template) } } diff --git a/src/datasets/domain/useCases/GetDatasetTemplates.ts b/src/template/domain/useCases/GetDatasetTemplates.ts similarity index 73% rename from src/datasets/domain/useCases/GetDatasetTemplates.ts rename to src/template/domain/useCases/GetDatasetTemplates.ts index 6878e625..f73bf342 100644 --- a/src/datasets/domain/useCases/GetDatasetTemplates.ts +++ b/src/template/domain/useCases/GetDatasetTemplates.ts @@ -1,13 +1,13 @@ import { ROOT_COLLECTION_ID } from '../../../collections/domain/models/Collection' import { UseCase } from '../../../core/domain/useCases/UseCase' import { DatasetTemplate } from '../models/DatasetTemplate' -import { IDatasetsRepository } from '../repositories/IDatasetsRepository' +import { ITemplatesRepository } from '../repositories/ITemplatesRepository' export class GetDatasetTemplates implements UseCase { - private datasetsRepository: IDatasetsRepository + private templatesRepository: ITemplatesRepository - constructor(datasetsRepository: IDatasetsRepository) { - this.datasetsRepository = datasetsRepository + constructor(templatesRepository: ITemplatesRepository) { + this.templatesRepository = templatesRepository } /** @@ -20,6 +20,6 @@ export class GetDatasetTemplates implements UseCase { async execute( collectionIdOrAlias: number | string = ROOT_COLLECTION_ID ): Promise { - return await this.datasetsRepository.getDatasetTemplates(collectionIdOrAlias) + return await this.templatesRepository.getDatasetTemplates(collectionIdOrAlias) } } diff --git a/src/template/index.ts b/src/template/index.ts new file mode 100644 index 00000000..1bebaeef --- /dev/null +++ b/src/template/index.ts @@ -0,0 +1,20 @@ +import { TemplatesRepository } from './infra/repositories/TemplatesRepository' +import { CreateDatasetTemplate } from './domain/useCases/CreateDatasetTemplate' +import { GetDatasetTemplates } from './domain/useCases/GetDatasetTemplates' + +const templatesRepository = new TemplatesRepository() + +const createDatasetTemplate = new CreateDatasetTemplate(templatesRepository) +const getDatasetTemplates = new GetDatasetTemplates(templatesRepository) + +export { createDatasetTemplate, getDatasetTemplates } +export { + CreateDatasetTemplateDTO, + TemplateFieldDTO, + TemplateFieldValueDTO, + TemplateFieldValuePrimitiveDTO, + TemplateFieldValueCompoundDTO, + TemplateFieldValueControlledVocabularyDTO, + TemplateInstructionDTO +} from './domain/dtos/CreateDatasetTemplateDTO' +export { DatasetTemplate, DatasetTemplateInstruction } from './domain/models/DatasetTemplate' diff --git a/src/template/infra/repositories/TemplatesRepository.ts b/src/template/infra/repositories/TemplatesRepository.ts new file mode 100644 index 00000000..dc613e4c --- /dev/null +++ b/src/template/infra/repositories/TemplatesRepository.ts @@ -0,0 +1,37 @@ +import { AxiosResponse } from 'axios' +import { ApiRepository } from '../../../core/infra/repositories/ApiRepository' +import { CreateDatasetTemplateDTO } from '../../domain/dtos/CreateDatasetTemplateDTO' +import { DatasetTemplate } from '../../domain/models/DatasetTemplate' +import { ITemplatesRepository } from '../../domain/repositories/ITemplatesRepository' +import { DatasetTemplatePayload } from './transformers/DatasetTemplatePayload' +import { transformDatasetTemplatePayloadToDatasetTemplate } from './transformers/datasetTemplateTransformers' + +export class TemplatesRepository extends ApiRepository implements ITemplatesRepository { + private readonly collectionsResourceName: string = 'dataverses' + + public async createDatasetTemplate( + collectionIdOrAlias: number | string, + template: CreateDatasetTemplateDTO + ): Promise { + return this.doPost( + `/${this.collectionsResourceName}/${collectionIdOrAlias}/templates`, + template + ) + .then(() => undefined) + .catch((error) => { + throw error + }) + } + + public async getDatasetTemplates( + collectionIdOrAlias: number | string + ): Promise { + return this.doGet(`/${this.collectionsResourceName}/${collectionIdOrAlias}/templates`, true) + .then((response: AxiosResponse<{ data: DatasetTemplatePayload[] }>) => + transformDatasetTemplatePayloadToDatasetTemplate(response.data.data) + ) + .catch((error) => { + throw error + }) + } +} diff --git a/src/datasets/infra/repositories/transformers/DatasetTemplatePayload.ts b/src/template/infra/repositories/transformers/DatasetTemplatePayload.ts similarity index 93% rename from src/datasets/infra/repositories/transformers/DatasetTemplatePayload.ts rename to src/template/infra/repositories/transformers/DatasetTemplatePayload.ts index e43e96eb..9cd9792f 100644 --- a/src/datasets/infra/repositories/transformers/DatasetTemplatePayload.ts +++ b/src/template/infra/repositories/transformers/DatasetTemplatePayload.ts @@ -1,5 +1,5 @@ import { LicensePayload } from '../../../../licenses/domain/repositories/transformers/LicensePayload' -import { MetadataFieldPayload } from './DatasetPayload' +import { MetadataFieldPayload } from '../../../../datasets/infra/repositories/transformers/DatasetPayload' export interface DatasetTemplatePayload { id: number diff --git a/src/datasets/infra/repositories/transformers/datasetTemplateTransformers.ts b/src/template/infra/repositories/transformers/datasetTemplateTransformers.ts similarity index 95% rename from src/datasets/infra/repositories/transformers/datasetTemplateTransformers.ts rename to src/template/infra/repositories/transformers/datasetTemplateTransformers.ts index 32486199..d48496f8 100644 --- a/src/datasets/infra/repositories/transformers/datasetTemplateTransformers.ts +++ b/src/template/infra/repositories/transformers/datasetTemplateTransformers.ts @@ -1,7 +1,7 @@ import { transformPayloadLicenseToLicense } from '../../../../licenses/domain/repositories/transformers/licenseTransformers' import { DatasetTemplate } from '../../../domain/models/DatasetTemplate' import { DatasetTemplatePayload } from './DatasetTemplatePayload' -import { transformPayloadToDatasetMetadataBlocks } from './datasetTransformers' +import { transformPayloadToDatasetMetadataBlocks } from '../../../../datasets/infra/repositories/transformers/datasetTransformers' export const transformDatasetTemplatePayloadToDatasetTemplate = ( collectionDatasetTemplatePayload: DatasetTemplatePayload[] diff --git a/test/functional/collections/createDatasetTemplate.test.ts b/test/functional/template/createDatasetTemplate.test.ts similarity index 89% rename from test/functional/collections/createDatasetTemplate.test.ts rename to test/functional/template/createDatasetTemplate.test.ts index 84309e52..86fb373b 100644 --- a/test/functional/collections/createDatasetTemplate.test.ts +++ b/test/functional/template/createDatasetTemplate.test.ts @@ -1,9 +1,8 @@ import { ApiConfig } from '../../../src' import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig' import { TestConstants } from '../../testHelpers/TestConstants' -import { getDatasetTemplates } from '../../../src/datasets' -import { CreateDatasetTemplateDTO } from '../../../src/collections/domain/dtos/CreateDatasetTemplateDTO' -import { createDatasetTemplate } from '../../../src/collections' +import { createDatasetTemplate, getDatasetTemplates } from '../../../src/template' +import { CreateDatasetTemplateDTO } from '../../../src/template/domain/dtos/CreateDatasetTemplateDTO' import { MetadataFieldTypeClass } from '../../../src/metadataBlocks/domain/models/MetadataBlock' import { deleteDatasetTemplateViaApi } from '../../testHelpers/datasets/datasetTemplatesHelper' diff --git a/test/integration/collections/CollectionsRepository.test.ts b/test/integration/collections/CollectionsRepository.test.ts index f42906d1..94b62311 100644 --- a/test/integration/collections/CollectionsRepository.test.ts +++ b/test/integration/collections/CollectionsRepository.test.ts @@ -16,9 +16,7 @@ import { getDatasetFiles, restrictFile, deleteFile, - linkDataset, - createDatasetTemplate, - MetadataFieldTypeClass + linkDataset } from '../../../src' import { ApiConfig } from '../../../src' import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig' @@ -60,9 +58,6 @@ import { DvObjectFeaturedItemDTO, FeaturedItemsDTO } from '../../../src/collections/domain/dtos/FeaturedItemsDTO' -import { CreateDatasetTemplateDTO } from '../../../src/collections/domain/dtos/CreateDatasetTemplateDTO' -import { getDatasetTemplates } from '../../../src/datasets' -import { deleteDatasetTemplateViaApi } from '../../testHelpers/datasets/datasetTemplatesHelper' describe('CollectionsRepository', () => { const testCollectionAlias = 'collectionsRepositoryTestCollection' @@ -2163,59 +2158,4 @@ describe('CollectionsRepository', () => { await expect(sut.getCollectionLinks(invalidCollectionId)).rejects.toThrow(expectedError) }) }) - - describe('createDatasetTemplate', () => { - const templateDto: CreateDatasetTemplateDTO = { - name: 'CollectionsRepository template', - isDefault: true, - fields: [ - { - typeName: 'author', - typeClass: MetadataFieldTypeClass.Compound, - multiple: true, - value: [ - { - authorName: { - typeName: 'authorName', - typeClass: MetadataFieldTypeClass.Primitive, - value: 'Belicheck, Bill' - }, - authorAffiliation: { - typeName: 'authorIdentifierScheme', - typeClass: MetadataFieldTypeClass.Primitive, - value: 'ORCID' - } - } - ] - } - ], - instructions: [ - { - instructionField: 'author', - instructionText: 'The author data' - } - ] - } - test('should create a template in :root with provided JSON', async () => { - await createDatasetTemplate.execute(templateDto) - const templates = await getDatasetTemplates.execute(':root') - - expect(templates[templates.length - 1].name).toBe(templateDto.name) - expect(templates[templates.length - 1].isDefault).toBe(templateDto.isDefault) - expect(templates[templates.length - 1].instructions.length).toBe( - templateDto.instructions?.length ?? 0 - ) - - deleteDatasetTemplateViaApi(templates[templates.length - 1].id) - }) - - test('should return error when creating a template with invalidCollectionAlias', async () => { - const expectedError = new WriteError( - `[404] Can't find dataverse with identifier='invalidCollectionAlias'` - ) - await expect( - createDatasetTemplate.execute(templateDto, 'invalidCollectionAlias') - ).rejects.toThrow(expectedError) - }) - }) }) diff --git a/test/integration/datasets/DatasetsRepository.test.ts b/test/integration/datasets/DatasetsRepository.test.ts index 5e3fa4b1..0ffd48bb 100644 --- a/test/integration/datasets/DatasetsRepository.test.ts +++ b/test/integration/datasets/DatasetsRepository.test.ts @@ -62,10 +62,6 @@ import { FilesRepository } from '../../../src/files/infra/repositories/FilesRepo import { DirectUploadClient } from '../../../src/files/infra/clients/DirectUploadClient' import { createTestFileUploadDestination } from '../../testHelpers/files/fileUploadDestinationHelper' import { CitationFormat } from '../../../src/datasets/domain/models/CitationFormat' -import { - createDatasetTemplateViaApi, - deleteDatasetTemplateViaApi -} from '../../testHelpers/datasets/datasetTemplatesHelper' const TEST_DIFF_DATASET_DTO: DatasetDTO = { license: { @@ -1818,41 +1814,6 @@ describe('DatasetsRepository', () => { }) }) - describe('getDatasetTemplates', () => { - const testCollectionAlias = 'testGetDatasetTemplates' - - beforeAll(async () => { - await createCollectionViaApi(testCollectionAlias) - }) - - afterAll(async () => { - await deleteCollectionViaApi(testCollectionAlias) - }) - - test('should return empty dataset templates', async () => { - const actual = await sut.getDatasetTemplates(testCollectionAlias) - - expect(actual.length).toBe(0) - }) - - test('should return dataset templates for a collection', async () => { - const templateCreated = await createDatasetTemplateViaApi(testCollectionAlias) - - const actual = await sut.getDatasetTemplates(testCollectionAlias) - - expect(actual.length).toBe(1) - - expect(actual[0].name).toBe(templateCreated.name) - expect(actual[0].isDefault).toBe(templateCreated.isDefault) - expect(actual[0].datasetMetadataBlocks.length).toBe(1) - expect(actual[0].datasetMetadataBlocks[0].name).toBe('citation') - expect(actual[0].datasetMetadataBlocks[0].fields.author.length).toBe(1) - expect(actual[0].instructions.length).toBe(templateCreated.instructions.length) - - await deleteDatasetTemplateViaApi(actual[0].id) - }) - }) - describe('getDatasetAvailableDatasetTypes', () => { test('should return available dataset types', async () => { const actualDatasetTypes: DatasetType[] = await getDatasetAvailableDatasetTypes.execute() diff --git a/test/integration/template/TemplateRepository.test.ts b/test/integration/template/TemplateRepository.test.ts new file mode 100644 index 00000000..83432eb8 --- /dev/null +++ b/test/integration/template/TemplateRepository.test.ts @@ -0,0 +1,113 @@ +import { ApiConfig, MetadataFieldTypeClass, WriteError } from '../../../src' +import { createDatasetTemplate, getDatasetTemplates } from '../../../src/template' +import { CreateDatasetTemplateDTO } from '../../../src/template/domain/dtos/CreateDatasetTemplateDTO' +import { TemplatesRepository } from '../../../src/template/infra/repositories/TemplatesRepository' +import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig' +import { TestConstants } from '../../testHelpers/TestConstants' +import { + createCollectionViaApi, + deleteCollectionViaApi +} from '../../testHelpers/collections/collectionHelper' +import { + createDatasetTemplateViaApi, + deleteDatasetTemplateViaApi +} from '../../testHelpers/datasets/datasetTemplatesHelper' + +describe('TemplatesRepository', () => { + const sut: TemplatesRepository = new TemplatesRepository() + const testCollectionAlias = 'testGetDatasetTemplates' + + beforeAll(async () => { + ApiConfig.init( + TestConstants.TEST_API_URL, + DataverseApiAuthMechanism.API_KEY, + process.env.TEST_API_KEY + ) + await createCollectionViaApi(testCollectionAlias) + }) + + afterAll(async () => { + await deleteCollectionViaApi(testCollectionAlias) + }) + + describe('createDatasetTemplate', () => { + const templateDto: CreateDatasetTemplateDTO = { + name: 'CollectionsRepository template', + isDefault: true, + fields: [ + { + typeName: 'author', + typeClass: MetadataFieldTypeClass.Compound, + multiple: true, + value: [ + { + authorName: { + typeName: 'authorName', + typeClass: MetadataFieldTypeClass.Primitive, + value: 'Belicheck, Bill' + }, + authorAffiliation: { + typeName: 'authorIdentifierScheme', + typeClass: MetadataFieldTypeClass.Primitive, + value: 'ORCID' + } + } + ] + } + ], + instructions: [ + { + instructionField: 'author', + instructionText: 'The author data' + } + ] + } + + test('should create a template in :root with provided JSON', async () => { + await createDatasetTemplate.execute(templateDto) + const templates = await getDatasetTemplates.execute(':root') + + expect(templates[templates.length - 1].name).toBe(templateDto.name) + expect(templates[templates.length - 1].isDefault).toBe(templateDto.isDefault) + expect(templates[templates.length - 1].instructions.length).toBe( + templateDto.instructions?.length ?? 0 + ) + + deleteDatasetTemplateViaApi(templates[templates.length - 1].id) + }) + + test('should return error when creating a template with invalidCollectionAlias', async () => { + const expectedError = new WriteError( + `[404] Can't find dataverse with identifier='invalidCollectionAlias'` + ) + await expect( + createDatasetTemplate.execute(templateDto, 'invalidCollectionAlias') + ).rejects.toThrow(expectedError) + }) + }) + + describe('getDatasetTemplates', () => { + test('should return the right number of dataset templates', async () => { + const actual = await sut.getDatasetTemplates(testCollectionAlias) + + expect(actual.length).toBe(1) + }) + + test('should return dataset templates for a collection', async () => { + const templateCreated = await createDatasetTemplateViaApi(testCollectionAlias) + + const actual = await sut.getDatasetTemplates(testCollectionAlias) + + expect(actual.length).toBe(1) + + expect(actual[0].name).toBe(templateCreated.name) + expect(actual[0].isDefault).toBe(templateCreated.isDefault) + expect(actual[0].datasetMetadataBlocks.length).toBe(1) + expect(actual[0].datasetMetadataBlocks[0].name).toBe('citation') + expect(actual[0].datasetMetadataBlocks[0].fields.author.length).toBe(1) + expect(actual[0].instructions.length).toBe(templateCreated.instructions.length) + + await deleteDatasetTemplateViaApi(actual[0].id) + }) + }) +}) diff --git a/test/testHelpers/datasets/datasetTemplatesHelper.ts b/test/testHelpers/datasets/datasetTemplatesHelper.ts index 1cc87300..0ec2e22b 100644 --- a/test/testHelpers/datasets/datasetTemplatesHelper.ts +++ b/test/testHelpers/datasets/datasetTemplatesHelper.ts @@ -1,6 +1,6 @@ import axios from 'axios' import { TestConstants } from '../TestConstants' -import { DatasetTemplatePayload } from '../../../src/datasets/infra/repositories/transformers/DatasetTemplatePayload' +import { DatasetTemplatePayload } from '../../../src/template/infra/repositories/transformers/DatasetTemplatePayload' const DATASET_TEMPLATE_DTO = { name: 'Dataset Template', diff --git a/test/unit/collections/createDatasetTemplate.ts b/test/unit/collections/createDatasetTemplate.ts deleted file mode 100644 index 0004b7a7..00000000 --- a/test/unit/collections/createDatasetTemplate.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { CreateDatasetTemplate } from '../../../src/collections/domain/useCases/CreateDatasetTemplate' -import { ICollectionsRepository } from '../../../src/collections/domain/repositories/ICollectionsRepository' -import { CreateDatasetTemplateDTO } from '../../../src/collections/domain/dtos/CreateDatasetTemplateDTO' -import { WriteError } from '../../../src' - -describe('execute', () => { - const testTemplateDTO = { name: 't' } as CreateDatasetTemplateDTO - const testCollectionId = 1 - - test('should return undefined when repository call is successful', async () => { - const collectionRepositoryStub: ICollectionsRepository = {} as ICollectionsRepository - collectionRepositoryStub.createDatasetTemplate = jest.fn().mockResolvedValue(testCollectionId) - const sut = new CreateDatasetTemplate(collectionRepositoryStub) - - const actual = await sut.execute(testTemplateDTO) - - expect(collectionRepositoryStub.createDatasetTemplate).toHaveBeenCalledWith( - ':root', - testTemplateDTO - ) - expect(actual).toEqual(testCollectionId) - }) - - test('should call repository with provided collection id/alias', async () => { - const collectionRepositoryStub: ICollectionsRepository = {} as ICollectionsRepository - collectionRepositoryStub.createDatasetTemplate = jest.fn().mockResolvedValue(testCollectionId) - - const sut = new CreateDatasetTemplate(collectionRepositoryStub) - const actual = await sut.execute(testTemplateDTO, 'alias123') - - expect(collectionRepositoryStub.createDatasetTemplate).toHaveBeenCalledWith( - 'alias123', - testTemplateDTO - ) - - expect(actual).toEqual(testCollectionId) - }) - - test('should return error result on repository error', async () => { - const collectionRepositoryStub: ICollectionsRepository = {} as ICollectionsRepository - collectionRepositoryStub.createDatasetTemplate = jest.fn().mockRejectedValue(new WriteError()) - const testCreateTemplate = new CreateDatasetTemplate(collectionRepositoryStub) - - await expect(testCreateTemplate.execute(testTemplateDTO)).rejects.toThrow(WriteError) - }) -}) diff --git a/test/unit/template/createDatasetTemplate.test.ts b/test/unit/template/createDatasetTemplate.test.ts new file mode 100644 index 00000000..c541cb96 --- /dev/null +++ b/test/unit/template/createDatasetTemplate.test.ts @@ -0,0 +1,44 @@ +import { CreateDatasetTemplate } from '../../../src/template/domain/useCases/CreateDatasetTemplate' +import { ITemplatesRepository } from '../../../src/template/domain/repositories/ITemplatesRepository' +import { CreateDatasetTemplateDTO } from '../../../src/template/domain/dtos/CreateDatasetTemplateDTO' +import { WriteError } from '../../../src' + +describe('execute', () => { + const testTemplateDTO = { name: 't' } as CreateDatasetTemplateDTO + test('should return undefined when repository call is successful', async () => { + const templatesRepositoryStub: ITemplatesRepository = {} as ITemplatesRepository + templatesRepositoryStub.createDatasetTemplate = jest.fn().mockResolvedValue(undefined) + const sut = new CreateDatasetTemplate(templatesRepositoryStub) + + const actual = await sut.execute(testTemplateDTO) + + expect(templatesRepositoryStub.createDatasetTemplate).toHaveBeenCalledWith( + ':root', + testTemplateDTO + ) + expect(actual).toBeUndefined() + }) + + test('should call repository with provided collection id/alias', async () => { + const templatesRepositoryStub: ITemplatesRepository = {} as ITemplatesRepository + templatesRepositoryStub.createDatasetTemplate = jest.fn().mockResolvedValue(undefined) + + const sut = new CreateDatasetTemplate(templatesRepositoryStub) + const actual = await sut.execute(testTemplateDTO, 'alias123') + + expect(templatesRepositoryStub.createDatasetTemplate).toHaveBeenCalledWith( + 'alias123', + testTemplateDTO + ) + + expect(actual).toBeUndefined() + }) + + test('should return error result on repository error', async () => { + const templatesRepositoryStub: ITemplatesRepository = {} as ITemplatesRepository + templatesRepositoryStub.createDatasetTemplate = jest.fn().mockRejectedValue(new WriteError()) + const testCreateTemplate = new CreateDatasetTemplate(templatesRepositoryStub) + + await expect(testCreateTemplate.execute(testTemplateDTO)).rejects.toThrow(WriteError) + }) +}) From 778f30cd09ac9572adc55789c395c4c5184c474d Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Wed, 7 Jan 2026 16:37:30 -0500 Subject: [PATCH 2/5] feat: get and delete a single template by id --- CHANGELOG.md | 8 +- docs/useCases.md | 36 ++++ .../repositories/ITemplatesRepository.ts | 2 + .../domain/useCases/DeleteTemplate.ts | 19 +++ src/template/domain/useCases/GetTemplate.ts | 21 +++ src/template/index.ts | 6 +- .../infra/repositories/TemplatesRepository.ts | 25 ++- .../datasetTemplateTransformers.ts | 103 ++++++----- .../template/TemplateRepository.test.ts | 160 ++++++++++++++++-- test/unit/template/deleteTemplate.test.ts | 26 +++ test/unit/template/getTemplate.test.ts | 28 +++ 11 files changed, 372 insertions(+), 62 deletions(-) create mode 100644 src/template/domain/useCases/DeleteTemplate.ts create mode 100644 src/template/domain/useCases/GetTemplate.ts create mode 100644 test/unit/template/deleteTemplate.test.ts create mode 100644 test/unit/template/getTemplate.test.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 01908608..61a9e8c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,8 +9,14 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel ### Added - Datasets: Added `updateDatasetLicense` use case and repository method to support Dataverse endpoint `PUT /datasets/{id}/license`, for updating dataset license or custom terms + - New Use Case: [Get Collections For Linking Use Case](./docs/useCases.md#get-collections-for-linking). -- New Use Case: [Create a Dataset Template](./docs/useCases.md#create-a-dataset-template) under Collections. + +- New Use Case: [Create a Dataset Template](./docs/useCases.md#create-a-dataset-template) under Templates. + +- New Use Case: [Get a Template](./docs/useCases.md#get-a-template) under Templates. + +- New Use Case: [Delete a Template](./docs/useCases.md#delete-a-template) under Templates. - New Use Case: [Update Terms of Access](./docs/useCases.md#update-terms-of-access). diff --git a/docs/useCases.md b/docs/useCases.md index 6bf629db..3301d025 100644 --- a/docs/useCases.md +++ b/docs/useCases.md @@ -27,9 +27,11 @@ The different use cases currently available in the package are classified below, - [Delete a Collection Featured Item](#delete-a-collection-featured-item) - [Templates](#Templates) - [Templates read use cases](#templates-read-use-cases) + - [Get a Template](#get-a-template) - [Get Dataset Templates](#get-dataset-templates) - [Templates write use cases](#templates-write-use-cases) - [Create a Dataset Template](#create-a-dataset-template) + - [Delete a Template](#delete-a-template) - [Datasets](#Datasets) - [Datasets read use cases](#datasets-read-use-cases) - [Get a Dataset](#get-a-dataset) @@ -576,6 +578,24 @@ _See [use case](../src/collections/domain/useCases/DeleteCollectionFeaturedItem. ### Templates Read Use Cases +#### Get a Template + +Returns a [DatasetTemplate](../src/template/domain/models/DatasetTemplate.ts) by its template id. + +##### Example call: + +```typescript +import { getTemplate } from '@iqss/dataverse-client-javascript' + +const templateId = 12345 + +getTemplate.execute(templateId).then((template: DatasetTemplate) => { + /* ... */ +}) +``` + +_See [use case](../src/template/domain/useCases/GetTemplate.ts)_ definition. + #### Get Dataset Templates Returns a [DatasetTemplate](../src/template/domain/models/DatasetTemplate.ts) array containing the dataset templates of the requested collection, given the collection identifier or alias. @@ -631,6 +651,22 @@ await createDatasetTemplate.execute(template, collectionAlias) _See [use case](../src/template/domain/useCases/CreateDatasetTemplate.ts) implementation_. +#### Delete a Template + +Deletes a dataset template by its template id. + +##### Example call: + +```typescript +import { deleteTemplate } from '@iqss/dataverse-client-javascript' + +const templateId = 12345 + +await deleteTemplate.execute(templateId) +``` + +_See [use case](../src/template/domain/useCases/DeleteTemplate.ts)_ definition. + ## Datasets ### Datasets Read Use Cases diff --git a/src/template/domain/repositories/ITemplatesRepository.ts b/src/template/domain/repositories/ITemplatesRepository.ts index b05e9893..7cac1aa4 100644 --- a/src/template/domain/repositories/ITemplatesRepository.ts +++ b/src/template/domain/repositories/ITemplatesRepository.ts @@ -6,5 +6,7 @@ export interface ITemplatesRepository { collectionIdOrAlias: number | string, template: CreateDatasetTemplateDTO ): Promise + getTemplate(templateId: number): Promise getDatasetTemplates(collectionIdOrAlias: number | string): Promise + deleteTemplate(templateId: number): Promise } diff --git a/src/template/domain/useCases/DeleteTemplate.ts b/src/template/domain/useCases/DeleteTemplate.ts new file mode 100644 index 00000000..ef0aec84 --- /dev/null +++ b/src/template/domain/useCases/DeleteTemplate.ts @@ -0,0 +1,19 @@ +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { ITemplatesRepository } from '../repositories/ITemplatesRepository' + +export class DeleteTemplate implements UseCase { + private templatesRepository: ITemplatesRepository + + constructor(templatesRepository: ITemplatesRepository) { + this.templatesRepository = templatesRepository + } + + /** + * Deletes a dataset template by its template id. + * + * @param {number} templateId - Dataset template id. + */ + async execute(templateId: number): Promise { + return await this.templatesRepository.deleteTemplate(templateId) + } +} diff --git a/src/template/domain/useCases/GetTemplate.ts b/src/template/domain/useCases/GetTemplate.ts new file mode 100644 index 00000000..27db14ba --- /dev/null +++ b/src/template/domain/useCases/GetTemplate.ts @@ -0,0 +1,21 @@ +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { DatasetTemplate } from '../models/DatasetTemplate' +import { ITemplatesRepository } from '../repositories/ITemplatesRepository' + +export class GetTemplate implements UseCase { + private templatesRepository: ITemplatesRepository + + constructor(templatesRepository: ITemplatesRepository) { + this.templatesRepository = templatesRepository + } + + /** + * Returns a dataset template by its template id. + * + * @param {number} templateId - Dataset template id. + * @returns {Promise} + */ + async execute(templateId: number): Promise { + return await this.templatesRepository.getTemplate(templateId) + } +} diff --git a/src/template/index.ts b/src/template/index.ts index 1bebaeef..bb1f765e 100644 --- a/src/template/index.ts +++ b/src/template/index.ts @@ -1,13 +1,17 @@ import { TemplatesRepository } from './infra/repositories/TemplatesRepository' import { CreateDatasetTemplate } from './domain/useCases/CreateDatasetTemplate' +import { DeleteTemplate } from './domain/useCases/DeleteTemplate' import { GetDatasetTemplates } from './domain/useCases/GetDatasetTemplates' +import { GetTemplate } from './domain/useCases/GetTemplate' const templatesRepository = new TemplatesRepository() const createDatasetTemplate = new CreateDatasetTemplate(templatesRepository) +const deleteTemplate = new DeleteTemplate(templatesRepository) const getDatasetTemplates = new GetDatasetTemplates(templatesRepository) +const getTemplate = new GetTemplate(templatesRepository) -export { createDatasetTemplate, getDatasetTemplates } +export { createDatasetTemplate, deleteTemplate, getDatasetTemplates, getTemplate } export { CreateDatasetTemplateDTO, TemplateFieldDTO, diff --git a/src/template/infra/repositories/TemplatesRepository.ts b/src/template/infra/repositories/TemplatesRepository.ts index dc613e4c..2a8412fd 100644 --- a/src/template/infra/repositories/TemplatesRepository.ts +++ b/src/template/infra/repositories/TemplatesRepository.ts @@ -4,7 +4,10 @@ import { CreateDatasetTemplateDTO } from '../../domain/dtos/CreateDatasetTemplat import { DatasetTemplate } from '../../domain/models/DatasetTemplate' import { ITemplatesRepository } from '../../domain/repositories/ITemplatesRepository' import { DatasetTemplatePayload } from './transformers/DatasetTemplatePayload' -import { transformDatasetTemplatePayloadToDatasetTemplate } from './transformers/datasetTemplateTransformers' +import { + transformTemplatePayloadToTemplate, + transformTemplatePayloadsToTemplates +} from './transformers/datasetTemplateTransformers' export class TemplatesRepository extends ApiRepository implements ITemplatesRepository { private readonly collectionsResourceName: string = 'dataverses' @@ -23,15 +26,33 @@ export class TemplatesRepository extends ApiRepository implements ITemplatesRepo }) } + public async getTemplate(templateId: number): Promise { + return this.doGet(`/dataverses/${templateId}/template`, true) + .then((response: AxiosResponse<{ data: DatasetTemplatePayload }>) => + transformTemplatePayloadToTemplate(response.data.data) + ) + .catch((error) => { + throw error + }) + } + public async getDatasetTemplates( collectionIdOrAlias: number | string ): Promise { return this.doGet(`/${this.collectionsResourceName}/${collectionIdOrAlias}/templates`, true) .then((response: AxiosResponse<{ data: DatasetTemplatePayload[] }>) => - transformDatasetTemplatePayloadToDatasetTemplate(response.data.data) + transformTemplatePayloadsToTemplates(response.data.data) ) .catch((error) => { throw error }) } + + public async deleteTemplate(templateId: number): Promise { + return this.doDelete(`/dataverses/${templateId}/template`) + .then(() => undefined) + .catch((error) => { + throw error + }) + } } diff --git a/src/template/infra/repositories/transformers/datasetTemplateTransformers.ts b/src/template/infra/repositories/transformers/datasetTemplateTransformers.ts index d48496f8..59fe8179 100644 --- a/src/template/infra/repositories/transformers/datasetTemplateTransformers.ts +++ b/src/template/infra/repositories/transformers/datasetTemplateTransformers.ts @@ -3,55 +3,66 @@ import { DatasetTemplate } from '../../../domain/models/DatasetTemplate' import { DatasetTemplatePayload } from './DatasetTemplatePayload' import { transformPayloadToDatasetMetadataBlocks } from '../../../../datasets/infra/repositories/transformers/datasetTransformers' -export const transformDatasetTemplatePayloadToDatasetTemplate = ( - collectionDatasetTemplatePayload: DatasetTemplatePayload[] -): DatasetTemplate[] => { - return collectionDatasetTemplatePayload.map((payload) => { - const datasetTemplate: DatasetTemplate = { - id: payload.id, - name: payload.name, - collectionAlias: payload.dataverseAlias, - isDefault: payload.isDefault, - usageCount: payload.usageCount, - createTime: payload.createTime, - createDate: payload.createDate, - datasetMetadataBlocks: transformPayloadToDatasetMetadataBlocks(payload.datasetFields, false), - instructions: payload.instructions.map((instruction) => ({ - instructionField: instruction.instructionField, - instructionText: instruction.instructionText - })), - termsOfUse: { - termsOfAccess: { - fileAccessRequest: payload.termsOfUseAndAccess.fileAccessRequest, - termsOfAccessForRestrictedFiles: payload.termsOfUseAndAccess.termsOfAccess, - dataAccessPlace: payload.termsOfUseAndAccess.dataAccessPlace, - originalArchive: payload.termsOfUseAndAccess.originalArchive, - availabilityStatus: payload.termsOfUseAndAccess.availabilityStatus, - contactForAccess: payload.termsOfUseAndAccess.contactForAccess, - sizeOfCollection: payload.termsOfUseAndAccess.sizeOfCollection, - studyCompletion: payload.termsOfUseAndAccess.studyCompletion - } +export const transformTemplatePayloadToTemplate = ( + collectionDatasetTemplatePayload: DatasetTemplatePayload +): DatasetTemplate => { + const datasetTemplate: DatasetTemplate = { + id: collectionDatasetTemplatePayload.id, + name: collectionDatasetTemplatePayload.name, + collectionAlias: collectionDatasetTemplatePayload.dataverseAlias, + isDefault: collectionDatasetTemplatePayload.isDefault, + usageCount: collectionDatasetTemplatePayload.usageCount, + createTime: collectionDatasetTemplatePayload.createTime, + createDate: collectionDatasetTemplatePayload.createDate, + datasetMetadataBlocks: transformPayloadToDatasetMetadataBlocks( + collectionDatasetTemplatePayload.datasetFields, + false + ), + instructions: collectionDatasetTemplatePayload.instructions.map((instruction) => ({ + instructionField: instruction.instructionField, + instructionText: instruction.instructionText + })), + termsOfUse: { + termsOfAccess: { + fileAccessRequest: collectionDatasetTemplatePayload.termsOfUseAndAccess.fileAccessRequest, + termsOfAccessForRestrictedFiles: + collectionDatasetTemplatePayload.termsOfUseAndAccess.termsOfAccess, + dataAccessPlace: collectionDatasetTemplatePayload.termsOfUseAndAccess.dataAccessPlace, + originalArchive: collectionDatasetTemplatePayload.termsOfUseAndAccess.originalArchive, + availabilityStatus: collectionDatasetTemplatePayload.termsOfUseAndAccess.availabilityStatus, + contactForAccess: collectionDatasetTemplatePayload.termsOfUseAndAccess.contactForAccess, + sizeOfCollection: collectionDatasetTemplatePayload.termsOfUseAndAccess.sizeOfCollection, + studyCompletion: collectionDatasetTemplatePayload.termsOfUseAndAccess.studyCompletion } } + } - if (payload.termsOfUseAndAccess.license) { - datasetTemplate.license = transformPayloadLicenseToLicense( - payload.termsOfUseAndAccess.license - ) - } else { - datasetTemplate.termsOfUse.customTerms = { - termsOfUse: payload.termsOfUseAndAccess.termsOfUse as string, - confidentialityDeclaration: payload.termsOfUseAndAccess - .confidentialityDeclaration as string, - specialPermissions: payload.termsOfUseAndAccess.specialPermissions as string, - restrictions: payload.termsOfUseAndAccess.restrictions as string, - citationRequirements: payload.termsOfUseAndAccess.citationRequirements as string, - depositorRequirements: payload.termsOfUseAndAccess.depositorRequirements as string, - conditions: payload.termsOfUseAndAccess.conditions as string, - disclaimer: payload.termsOfUseAndAccess.disclaimer as string - } + if (collectionDatasetTemplatePayload.termsOfUseAndAccess.license) { + datasetTemplate.license = transformPayloadLicenseToLicense( + collectionDatasetTemplatePayload.termsOfUseAndAccess.license + ) + } else { + datasetTemplate.termsOfUse.customTerms = { + termsOfUse: collectionDatasetTemplatePayload.termsOfUseAndAccess.termsOfUse as string, + confidentialityDeclaration: collectionDatasetTemplatePayload.termsOfUseAndAccess + .confidentialityDeclaration as string, + specialPermissions: collectionDatasetTemplatePayload.termsOfUseAndAccess + .specialPermissions as string, + restrictions: collectionDatasetTemplatePayload.termsOfUseAndAccess.restrictions as string, + citationRequirements: collectionDatasetTemplatePayload.termsOfUseAndAccess + .citationRequirements as string, + depositorRequirements: collectionDatasetTemplatePayload.termsOfUseAndAccess + .depositorRequirements as string, + conditions: collectionDatasetTemplatePayload.termsOfUseAndAccess.conditions as string, + disclaimer: collectionDatasetTemplatePayload.termsOfUseAndAccess.disclaimer as string } + } - return datasetTemplate - }) + return datasetTemplate +} + +export const transformTemplatePayloadsToTemplates = ( + datasetTemplatePayloads: DatasetTemplatePayload[] +): DatasetTemplate[] => { + return datasetTemplatePayloads.map((payload) => transformTemplatePayloadToTemplate(payload)) } diff --git a/test/integration/template/TemplateRepository.test.ts b/test/integration/template/TemplateRepository.test.ts index 83432eb8..196193f0 100644 --- a/test/integration/template/TemplateRepository.test.ts +++ b/test/integration/template/TemplateRepository.test.ts @@ -8,10 +8,7 @@ import { createCollectionViaApi, deleteCollectionViaApi } from '../../testHelpers/collections/collectionHelper' -import { - createDatasetTemplateViaApi, - deleteDatasetTemplateViaApi -} from '../../testHelpers/datasets/datasetTemplatesHelper' +import { deleteDatasetTemplateViaApi } from '../../testHelpers/datasets/datasetTemplatesHelper' describe('TemplatesRepository', () => { const sut: TemplatesRepository = new TemplatesRepository() @@ -33,7 +30,7 @@ describe('TemplatesRepository', () => { describe('createDatasetTemplate', () => { const templateDto: CreateDatasetTemplateDTO = { name: 'CollectionsRepository template', - isDefault: true, + isDefault: false, fields: [ { typeName: 'author', @@ -73,7 +70,7 @@ describe('TemplatesRepository', () => { templateDto.instructions?.length ?? 0 ) - deleteDatasetTemplateViaApi(templates[templates.length - 1].id) + await deleteDatasetTemplateViaApi(templates[templates.length - 1].id) }) test('should return error when creating a template with invalidCollectionAlias', async () => { @@ -87,27 +84,166 @@ describe('TemplatesRepository', () => { }) describe('getDatasetTemplates', () => { - test('should return the right number of dataset templates', async () => { + test('should return empty dataset templates', async () => { const actual = await sut.getDatasetTemplates(testCollectionAlias) - expect(actual.length).toBe(1) + expect(actual.length).toBe(0) }) test('should return dataset templates for a collection', async () => { - const templateCreated = await createDatasetTemplateViaApi(testCollectionAlias) + await createDatasetTemplate.execute( + { + name: 'Template for GetDatasetTemplates', + isDefault: false, + fields: [ + { + typeName: 'author', + typeClass: MetadataFieldTypeClass.Compound, + multiple: true, + value: [ + { + authorName: { + typeName: 'authorName', + typeClass: MetadataFieldTypeClass.Primitive, + value: 'Belicheck, Bill' + }, + authorAffiliation: { + typeName: 'authorIdentifierScheme', + typeClass: MetadataFieldTypeClass.Primitive, + value: 'ORCID' + } + } + ] + } + ], + instructions: [ + { + instructionField: 'author', + instructionText: 'The author data' + } + ] + }, + testCollectionAlias + ) const actual = await sut.getDatasetTemplates(testCollectionAlias) expect(actual.length).toBe(1) - expect(actual[0].name).toBe(templateCreated.name) - expect(actual[0].isDefault).toBe(templateCreated.isDefault) + expect(actual[0].name).toBe('Template for GetDatasetTemplates') + expect(actual[0].isDefault).toBe(false) expect(actual[0].datasetMetadataBlocks.length).toBe(1) expect(actual[0].datasetMetadataBlocks[0].name).toBe('citation') expect(actual[0].datasetMetadataBlocks[0].fields.author.length).toBe(1) - expect(actual[0].instructions.length).toBe(templateCreated.instructions.length) + expect(actual[0].instructions.length).toBe(1) await deleteDatasetTemplateViaApi(actual[0].id) }) }) + + describe('getTemplate', () => { + test('should return a dataset template by id', async () => { + await createDatasetTemplate.execute( + { + name: 'Template for GetTemplate', + isDefault: false, + fields: [ + { + typeName: 'author', + typeClass: MetadataFieldTypeClass.Compound, + multiple: true, + value: [ + { + authorName: { + typeName: 'authorName', + typeClass: MetadataFieldTypeClass.Primitive, + value: 'Belicheck, Bill' + }, + authorAffiliation: { + typeName: 'authorIdentifierScheme', + typeClass: MetadataFieldTypeClass.Primitive, + value: 'ORCID' + } + } + ] + } + ], + instructions: [ + { + instructionField: 'author', + instructionText: 'The author data' + } + ] + }, + testCollectionAlias + ) + const templates = await getDatasetTemplates.execute(testCollectionAlias) + const templateId = templates[templates.length - 1].id + const templateExpectedIsDefault = templates[templates.length - 1].isDefault + + const actual = await sut.getTemplate(templateId) + + expect(actual.name).toBe('Template for GetTemplate') + expect(actual.isDefault).toBe(templateExpectedIsDefault) + expect(actual.datasetMetadataBlocks.length).toBe(1) + expect(actual.datasetMetadataBlocks[0].name).toBe('citation') + expect(actual.datasetMetadataBlocks[0].fields.author.length).toBe(1) + expect(actual.instructions.length).toBe(1) + + await deleteDatasetTemplateViaApi(templateId) + }) + + test('should return error when template does not exist', async () => { + await expect(sut.getTemplate(999999)).rejects.toThrow() + }) + }) + + describe('deleteTemplate', () => { + test('should delete a dataset template by id', async () => { + await createDatasetTemplate.execute( + { + name: 'Template for DeleteTemplate', + isDefault: false, + fields: [ + { + typeName: 'author', + typeClass: MetadataFieldTypeClass.Compound, + multiple: true, + value: [ + { + authorName: { + typeName: 'authorName', + typeClass: MetadataFieldTypeClass.Primitive, + value: 'Belicheck, Bill' + }, + authorAffiliation: { + typeName: 'authorIdentifierScheme', + typeClass: MetadataFieldTypeClass.Primitive, + value: 'ORCID' + } + } + ] + } + ], + instructions: [ + { + instructionField: 'author', + instructionText: 'The author data' + } + ] + }, + testCollectionAlias + ) + const templates = await getDatasetTemplates.execute(testCollectionAlias) + const templateId = templates[templates.length - 1].id + + await sut.deleteTemplate(templateId) + + await expect(sut.getTemplate(templateId)).rejects.toThrow() + }) + + test('should return error when deleting a template that does not exist', async () => { + await expect(sut.deleteTemplate(999999)).rejects.toThrow() + }) + }) }) diff --git a/test/unit/template/deleteTemplate.test.ts b/test/unit/template/deleteTemplate.test.ts new file mode 100644 index 00000000..f1f71ac4 --- /dev/null +++ b/test/unit/template/deleteTemplate.test.ts @@ -0,0 +1,26 @@ +import { DeleteTemplate } from '../../../src/template/domain/useCases/DeleteTemplate' +import { ITemplatesRepository } from '../../../src/template/domain/repositories/ITemplatesRepository' +import { WriteError } from '../../../src' + +describe('execute', () => { + const templateId = 123 + + test('should delete a dataset template', async () => { + const templatesRepositoryStub: ITemplatesRepository = {} as ITemplatesRepository + templatesRepositoryStub.deleteTemplate = jest.fn().mockResolvedValue(undefined) + const sut = new DeleteTemplate(templatesRepositoryStub) + + const actual = await sut.execute(templateId) + + expect(templatesRepositoryStub.deleteTemplate).toHaveBeenCalledWith(templateId) + expect(actual).toBeUndefined() + }) + + test('should return error result on repository error', async () => { + const templatesRepositoryStub: ITemplatesRepository = {} as ITemplatesRepository + templatesRepositoryStub.deleteTemplate = jest.fn().mockRejectedValue(new WriteError()) + const sut = new DeleteTemplate(templatesRepositoryStub) + + await expect(sut.execute(templateId)).rejects.toThrow(WriteError) + }) +}) diff --git a/test/unit/template/getTemplate.test.ts b/test/unit/template/getTemplate.test.ts new file mode 100644 index 00000000..0e480e21 --- /dev/null +++ b/test/unit/template/getTemplate.test.ts @@ -0,0 +1,28 @@ +import { GetTemplate } from '../../../src/template/domain/useCases/GetTemplate' +import { ITemplatesRepository } from '../../../src/template/domain/repositories/ITemplatesRepository' +import { DatasetTemplate } from '../../../src/template/domain/models/DatasetTemplate' +import { ReadError } from '../../../src' + +describe('execute', () => { + const templateId = 123 + const template = { id: templateId } as DatasetTemplate + + test('should return a dataset template', async () => { + const templatesRepositoryStub: ITemplatesRepository = {} as ITemplatesRepository + templatesRepositoryStub.getTemplate = jest.fn().mockResolvedValue(template) + const sut = new GetTemplate(templatesRepositoryStub) + + const actual = await sut.execute(templateId) + + expect(templatesRepositoryStub.getTemplate).toHaveBeenCalledWith(templateId) + expect(actual).toBe(template) + }) + + test('should return error result on repository error', async () => { + const templatesRepositoryStub: ITemplatesRepository = {} as ITemplatesRepository + templatesRepositoryStub.getTemplate = jest.fn().mockRejectedValue(new ReadError()) + const sut = new GetTemplate(templatesRepositoryStub) + + await expect(sut.execute(templateId)).rejects.toThrow(ReadError) + }) +}) From 0d51b50c6114c8ea3727882f3da150d11d813ed6 Mon Sep 17 00:00:00 2001 From: Cheng Shi Date: Wed, 7 Jan 2026 19:01:26 -0500 Subject: [PATCH 3/5] chore: sync the naming to template fron DatasetTemplate --- CHANGELOG.md | 2 +- docs/useCases.md | 28 +++++++++---------- src/index.ts | 2 +- .../domain/dtos/CreateDatasetTemplateDTO.ts | 0 .../domain/models/Template.ts} | 6 ++-- .../repositories/ITemplatesRepository.ts | 6 ++-- .../domain/useCases/CreateTemplate.ts} | 4 +-- .../domain/useCases/DeleteTemplate.ts | 4 +-- .../domain/useCases/GetDatasetTemplates.ts | 12 ++++---- .../domain/useCases/GetTemplate.ts | 12 ++++---- src/{template => templates}/index.ts | 8 +++--- .../infra/repositories/TemplatesRepository.ts | 16 +++++------ .../transformers/TemplatePayload.ts} | 2 +- .../transformers/templateTransformers.ts} | 20 ++++++------- .../createDatasetTemplate.test.ts | 6 ++-- .../TemplateRepository.test.ts | 26 ++++++++--------- .../datasets/datasetTemplatesHelper.ts | 4 +-- .../createDatasetTemplate.test.ts | 12 ++++---- .../deleteTemplate.test.ts | 6 ++-- .../getTemplate.test.ts | 10 +++---- 20 files changed, 91 insertions(+), 95 deletions(-) rename src/{template => templates}/domain/dtos/CreateDatasetTemplateDTO.ts (100%) rename src/{template/domain/models/DatasetTemplate.ts => templates/domain/models/Template.ts} (82%) rename src/{template => templates}/domain/repositories/ITemplatesRepository.ts (71%) rename src/{template/domain/useCases/CreateDatasetTemplate.ts => templates/domain/useCases/CreateTemplate.ts} (89%) rename src/{template => templates}/domain/useCases/DeleteTemplate.ts (82%) rename src/{template => templates}/domain/useCases/GetDatasetTemplates.ts (64%) rename src/{template => templates}/domain/useCases/GetTemplate.ts (54%) rename src/{template => templates}/index.ts (70%) rename src/{template => templates}/infra/repositories/TemplatesRepository.ts (73%) rename src/{template/infra/repositories/transformers/DatasetTemplatePayload.ts => templates/infra/repositories/transformers/TemplatePayload.ts} (97%) rename src/{template/infra/repositories/transformers/datasetTemplateTransformers.ts => templates/infra/repositories/transformers/templateTransformers.ts} (86%) rename test/functional/{template => templates}/createDatasetTemplate.test.ts (89%) rename test/integration/{template => templates}/TemplateRepository.test.ts (89%) rename test/unit/{template => templates}/createDatasetTemplate.test.ts (73%) rename test/unit/{template => templates}/deleteTemplate.test.ts (78%) rename test/unit/{template => templates}/getTemplate.test.ts (69%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61a9e8c0..324a28e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel - New Use Case: [Get Collections For Linking Use Case](./docs/useCases.md#get-collections-for-linking). -- New Use Case: [Create a Dataset Template](./docs/useCases.md#create-a-dataset-template) under Templates. +- New Use Case: [Create a Template](./docs/useCases.md#create-a-template) under Templates. - New Use Case: [Get a Template](./docs/useCases.md#get-a-template) under Templates. diff --git a/docs/useCases.md b/docs/useCases.md index 3301d025..48291b7a 100644 --- a/docs/useCases.md +++ b/docs/useCases.md @@ -30,7 +30,7 @@ The different use cases currently available in the package are classified below, - [Get a Template](#get-a-template) - [Get Dataset Templates](#get-dataset-templates) - [Templates write use cases](#templates-write-use-cases) - - [Create a Dataset Template](#create-a-dataset-template) + - [Create a Template](#create-a-template) - [Delete a Template](#delete-a-template) - [Datasets](#Datasets) - [Datasets read use cases](#datasets-read-use-cases) @@ -580,7 +580,7 @@ _See [use case](../src/collections/domain/useCases/DeleteCollectionFeaturedItem. #### Get a Template -Returns a [DatasetTemplate](../src/template/domain/models/DatasetTemplate.ts) by its template id. +Returns a [Template](../src/templates/domain/models/Template.ts) by its template id. ##### Example call: @@ -589,16 +589,16 @@ import { getTemplate } from '@iqss/dataverse-client-javascript' const templateId = 12345 -getTemplate.execute(templateId).then((template: DatasetTemplate) => { +getTemplate.execute(templateId).then((template: Template) => { /* ... */ }) ``` -_See [use case](../src/template/domain/useCases/GetTemplate.ts)_ definition. +_See [use case](../src/templates/domain/useCases/GetTemplate.ts)_ definition. #### Get Dataset Templates -Returns a [DatasetTemplate](../src/template/domain/models/DatasetTemplate.ts) array containing the dataset templates of the requested collection, given the collection identifier or alias. +Returns a [Template](../src/templates/domain/models/Template.ts) array containing the templates of the requested collection, given the collection identifier or alias. ##### Example call: @@ -607,23 +607,23 @@ import { getDatasetTemplates } from '@iqss/dataverse-client-javascript' const collectionIdOrAlias = 12345 -getDatasetTemplates.execute(collectionIdOrAlias).then((datasetTemplates: DatasetTemplate[]) => { +getDatasetTemplates.execute(collectionIdOrAlias).then((datasetTemplates: Template[]) => { /* ... */ }) ``` -_See [use case](../src/template/domain/useCases/GetDatasetTemplates.ts)_ definition. +_See [use case](../src/templates/domain/useCases/GetDatasetTemplates.ts)_ definition. ### Templates Write Use Cases -#### Create a Dataset Template +#### Create a Template -Creates a dataset template for a given Dataverse collection id or alias. +Creates a template for a given Dataverse collection id or alias. ##### Example call: ```typescript -import { createDatasetTemplate } from '@iqss/dataverse-client-javascript' +import { createTemplate } from '@iqss/dataverse-client-javascript' import { CreateDatasetTemplateDTO } from '@iqss/dataverse-client-javascript' const collectionAlias = ':root' @@ -646,14 +646,14 @@ const template: CreateDatasetTemplateDTO = { instructions: [{ instructionField: 'author', instructionText: 'The author data' }] } -await createDatasetTemplate.execute(template, collectionAlias) +await createTemplate.execute(template, collectionAlias) ``` -_See [use case](../src/template/domain/useCases/CreateDatasetTemplate.ts) implementation_. +_See [use case](../src/templates/domain/useCases/CreateTemplate.ts) implementation_. #### Delete a Template -Deletes a dataset template by its template id. +Deletes a template by its template id. ##### Example call: @@ -665,7 +665,7 @@ const templateId = 12345 await deleteTemplate.execute(templateId) ``` -_See [use case](../src/template/domain/useCases/DeleteTemplate.ts)_ definition. +_See [use case](../src/templates/domain/useCases/DeleteTemplate.ts)_ definition. ## Datasets diff --git a/src/index.ts b/src/index.ts index e7f4475a..578f1924 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,4 +12,4 @@ export * from './notifications' export * from './search' export * from './licenses' export * from './externalTools' -export * from './template' +export * from './templates' diff --git a/src/template/domain/dtos/CreateDatasetTemplateDTO.ts b/src/templates/domain/dtos/CreateDatasetTemplateDTO.ts similarity index 100% rename from src/template/domain/dtos/CreateDatasetTemplateDTO.ts rename to src/templates/domain/dtos/CreateDatasetTemplateDTO.ts diff --git a/src/template/domain/models/DatasetTemplate.ts b/src/templates/domain/models/Template.ts similarity index 82% rename from src/template/domain/models/DatasetTemplate.ts rename to src/templates/domain/models/Template.ts index afe5d8d3..b5b93b62 100644 --- a/src/template/domain/models/DatasetTemplate.ts +++ b/src/templates/domain/models/Template.ts @@ -1,7 +1,7 @@ import { DatasetMetadataBlock, TermsOfUse } from '../../../datasets/domain/models/Dataset' import { License } from '../../../licenses/domain/models/License' -export interface DatasetTemplate { +export interface Template { id: number name: string collectionAlias: string @@ -11,13 +11,13 @@ export interface DatasetTemplate { createDate: string // 👇 From Edit Template Metadata datasetMetadataBlocks: DatasetMetadataBlock[] - instructions: DatasetTemplateInstruction[] + instructions: TemplateInstruction[] // 👇 From Edit Template Terms termsOfUse: TermsOfUse license?: License // This license property is going to be present if not custom terms are added in the UI } -export interface DatasetTemplateInstruction { +export interface TemplateInstruction { instructionField: string instructionText: string } diff --git a/src/template/domain/repositories/ITemplatesRepository.ts b/src/templates/domain/repositories/ITemplatesRepository.ts similarity index 71% rename from src/template/domain/repositories/ITemplatesRepository.ts rename to src/templates/domain/repositories/ITemplatesRepository.ts index 7cac1aa4..a79e4cc9 100644 --- a/src/template/domain/repositories/ITemplatesRepository.ts +++ b/src/templates/domain/repositories/ITemplatesRepository.ts @@ -1,12 +1,12 @@ import { CreateDatasetTemplateDTO } from '../dtos/CreateDatasetTemplateDTO' -import { DatasetTemplate } from '../models/DatasetTemplate' +import { Template } from '../models/Template' export interface ITemplatesRepository { createDatasetTemplate( collectionIdOrAlias: number | string, template: CreateDatasetTemplateDTO ): Promise - getTemplate(templateId: number): Promise - getDatasetTemplates(collectionIdOrAlias: number | string): Promise + getTemplate(templateId: number): Promise