From 448cb00d2e6899e5088d9739b9bd8a6aeb8854a7 Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Thu, 5 Feb 2026 15:56:24 -0500 Subject: [PATCH 1/5] Add use cases for new settings --- .../repositories/IDataverseInfoRepository.ts | 2 + .../GetDatasetPublishPopupCustomText.ts | 19 ++++++++++ .../GetPublishDatasetDisclaimerText.ts | 19 ++++++++++ .../repositories/DataverseInfoRepository.ts | 22 +++++++++++ .../info/DataverseInfoRepository.test.ts | 37 ++++++++++++++++++- test/testHelpers/info/infoHelper.ts | 23 +++++++++++- 6 files changed, 120 insertions(+), 2 deletions(-) create mode 100644 src/info/domain/useCases/GetDatasetPublishPopupCustomText.ts create mode 100644 src/info/domain/useCases/GetPublishDatasetDisclaimerText.ts diff --git a/src/info/domain/repositories/IDataverseInfoRepository.ts b/src/info/domain/repositories/IDataverseInfoRepository.ts index e0e85644..7ce0769a 100644 --- a/src/info/domain/repositories/IDataverseInfoRepository.ts +++ b/src/info/domain/repositories/IDataverseInfoRepository.ts @@ -7,4 +7,6 @@ export interface IDataverseInfoRepository { getMaxEmbargoDurationInMonths(): Promise getApplicationTermsOfUse(lang?: string): Promise getAvailableDatasetMetadataExportFormats(): Promise + getDatasetPublishPopupCustomText(): Promise + getPublishDatasetDisclaimerText(): Promise } diff --git a/src/info/domain/useCases/GetDatasetPublishPopupCustomText.ts b/src/info/domain/useCases/GetDatasetPublishPopupCustomText.ts new file mode 100644 index 00000000..b8286474 --- /dev/null +++ b/src/info/domain/useCases/GetDatasetPublishPopupCustomText.ts @@ -0,0 +1,19 @@ +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IDataverseInfoRepository } from '../repositories/IDataverseInfoRepository' + +export class GetDatasetPublishPopupCustomText implements UseCase { + private dataverseInfoRepository: IDataverseInfoRepository + + constructor(dataverseInfoRepository: IDataverseInfoRepository) { + this.dataverseInfoRepository = dataverseInfoRepository + } + + /** + * Returns a string containing custom text for the Publish Dataset modal. + * + * @returns {Promise} + */ + async execute(): Promise { + return await this.dataverseInfoRepository.getDatasetPublishPopupCustomText() + } +} diff --git a/src/info/domain/useCases/GetPublishDatasetDisclaimerText.ts b/src/info/domain/useCases/GetPublishDatasetDisclaimerText.ts new file mode 100644 index 00000000..db30a615 --- /dev/null +++ b/src/info/domain/useCases/GetPublishDatasetDisclaimerText.ts @@ -0,0 +1,19 @@ +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { IDataverseInfoRepository } from '../repositories/IDataverseInfoRepository' + +export class GetPublishDatasetDisclaimerText implements UseCase { + private dataverseInfoRepository: IDataverseInfoRepository + + constructor(dataverseInfoRepository: IDataverseInfoRepository) { + this.dataverseInfoRepository = dataverseInfoRepository + } + + /** + * Returns a string containing the disclaimer text for the Publish Dataset modal. + * + * @returns {Promise} + */ + async execute(): Promise { + return await this.dataverseInfoRepository.getPublishDatasetDisclaimerText() + } +} diff --git a/src/info/infra/repositories/DataverseInfoRepository.ts b/src/info/infra/repositories/DataverseInfoRepository.ts index 5e8aa5e0..a7306cbd 100644 --- a/src/info/infra/repositories/DataverseInfoRepository.ts +++ b/src/info/infra/repositories/DataverseInfoRepository.ts @@ -66,4 +66,26 @@ export class DataverseInfoRepository extends ApiRepository implements IDataverse throw error }) } + public async getDatasetPublishPopupCustomText(): Promise { + return this.doGet( + this.buildApiEndpoint(this.infoResourceName, `settings/:DatasetPublishPopupCustomText`) + ) + .then((response: AxiosResponse<{ data: { message: string } }>) => { + return response.data.data.message + }) + .catch((error) => { + throw error + }) + } + public async getPublishDatasetDisclaimerText(): Promise { + return this.doGet( + this.buildApiEndpoint(this.infoResourceName, `settings/:PublishDatasetDisclaimerText`) + ) + .then((response: AxiosResponse<{ data: { message: string } }>) => { + return response.data.data.message + }) + .catch((error) => { + throw error + }) + } } diff --git a/test/integration/info/DataverseInfoRepository.test.ts b/test/integration/info/DataverseInfoRepository.test.ts index 41487312..6b2d658a 100644 --- a/test/integration/info/DataverseInfoRepository.test.ts +++ b/test/integration/info/DataverseInfoRepository.test.ts @@ -7,7 +7,9 @@ import { TestConstants } from '../../testHelpers/TestConstants' import { deleteApplicationTermsOfUseViaApi, setApplicationTermsOfUseViaApi, - setMaxEmbargoDurationInMonthsViaApi + setDatasetPublishPopupCustomTextViaApi, + setMaxEmbargoDurationInMonthsViaApi, + setPublishDatasetDisclaimerTextViaApi } from '../../testHelpers/info/infoHelper' import { ReadError } from '../../../src/core/domain/repositories/ReadError' @@ -53,7 +55,40 @@ describe('DataverseInfoRepository', () => { expect(actual).toBe(testMaxEmbargoDurationInMonths) }) }) + describe('getPublishDatasetDisclaimerText', () => { + test('should return error when the setting does not exist', async () => { + const errorExpected: ReadError = new ReadError( + '[404] Setting :PublishDatasetDisclaimerText not found' + ) + + await expect(sut.getPublishDatasetDisclaimerText()).rejects.toThrow(errorExpected) + }) + test('should return text when the setting exists', async () => { + const testPublishDatasetDisclaimerText = 'please read and accept' + await setPublishDatasetDisclaimerTextViaApi(testPublishDatasetDisclaimerText) + const actual = await sut.getPublishDatasetDisclaimerText() + + expect(actual).toBe(testPublishDatasetDisclaimerText) + }) + }) + describe('getDatasetPublishPopupCustomText', () => { + test('should return error when the setting does not exist', async () => { + const errorExpected: ReadError = new ReadError( + '[404] Setting :DatasetPublishPopupCustomText not found' + ) + + await expect(sut.getDatasetPublishPopupCustomText()).rejects.toThrow(errorExpected) + }) + + test('should return text when the setting exists', async () => { + const testDatasetPublishPopupCustomText = 'custom publish popup text' + await setDatasetPublishPopupCustomTextViaApi(testDatasetPublishPopupCustomText) + const actual = await sut.getDatasetPublishPopupCustomText() + + expect(actual).toBe(testDatasetPublishPopupCustomText) + }) + }) describe('getApplicationTermsOfUse', () => { test('should return no terms message when terms are not set', async () => { const defaultNoTermsOfUseMessage = diff --git a/test/testHelpers/info/infoHelper.ts b/test/testHelpers/info/infoHelper.ts index 121e9489..a11c7b2d 100644 --- a/test/testHelpers/info/infoHelper.ts +++ b/test/testHelpers/info/infoHelper.ts @@ -24,7 +24,28 @@ export const setApplicationTermsOfUseViaApi = async ( } ) } - +export const setDatasetPublishPopupCustomTextViaApi = async ( + datasetPublishPopupCustomText: string +): Promise => { + return await axios.put( + `${TestConstants.TEST_API_URL}/admin/settings/:DatasetPublishPopupCustomText`, + datasetPublishPopupCustomText, + { + headers: { 'Content-Type': 'text/plain' } + } + ) +} +export const setPublishDatasetDisclaimerTextViaApi = async ( + publishDatasetDisclaimerText: string +): Promise => { + return await axios.put( + `${TestConstants.TEST_API_URL}/admin/settings/:PublishDatasetDisclaimerText`, + publishDatasetDisclaimerText, + { + headers: { 'Content-Type': 'text/plain' } + } + ) +} export const deleteApplicationTermsOfUseViaApi = async (): Promise => { return await axios.delete(`${TestConstants.TEST_API_URL}/admin/settings/:ApplicationTermsOfUse`) } From 5067542ed78dc7024d3921ac212623734df9ebb7 Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Fri, 6 Feb 2026 08:46:15 -0500 Subject: [PATCH 2/5] Add documentation and unit tests --- docs/useCases.md | 40 ++++++++++- src/info/index.ts | 9 ++- .../unit/info/DataverseInfoRepository.test.ts | 72 +++++++++++++++++++ 3 files changed, 117 insertions(+), 4 deletions(-) diff --git a/docs/useCases.md b/docs/useCases.md index f77a40e1..b3482ec7 100644 --- a/docs/useCases.md +++ b/docs/useCases.md @@ -1398,8 +1398,6 @@ _See [use case](../src/datasets/domain/useCases/GetDatasetAvailableCategories.ts The `datasetId` parameter is a number for numeric identifiers or string for persistent identifiers. -# <<<<<<< HEAD - #### 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. @@ -2525,6 +2523,42 @@ getAvailableDatasetMetadataExportFormats _See [use case](../src/info/domain/useCases/GetAvailableDatasetMetadataExportFormats.ts) implementation_. +#### Get Dataset Publish Popup Custom Text + +Returns the custom text displayed in the dataset publish confirmation popup + +##### Example call: + +```typescript +import { getDatasetPublishPopupCustomText } from '@iqss/dataverse-client-javascript' + +/* ... */ + +getDatasetPublishPopupCustomText.execute().then((text: string) => { + /* ... */ +}) +``` + +_See [use case](../src/info/domain/useCases/GetDatasetPublishPopupCustomText.ts) implementation_. + +#### Get Publish Dataset Disclaimer Text + +Returns the disclaimer text displayed in the dataset publish flow. + +##### Example calls: + +```typescript +import { getPublishDatasetDisclaimerText } from '@iqss/dataverse-client-javascript' + +/* ... */ + +getPublishDatasetDisclaimerText.execute().then((disclaimerText: string) => { + /* ... */ +}) +``` + +_See [use case](../src/info/domain/useCases/GetPublishDatasetDisclaimerText.ts) implementation_. + ## Licenses ### Get Available Standard License Terms @@ -2559,7 +2593,7 @@ import { submitContactInfo } from '@iqss/dataverse-client-javascript' /* ... */ const contactDTO: ContactDTO = { - targedId: 1 + targedId: 1, subject: 'Data Question', body: 'Please help me understand your data. Thank you!', fromEmail: 'test@gmail.com' diff --git a/src/info/index.ts b/src/info/index.ts index 3837e282..c11e5afb 100644 --- a/src/info/index.ts +++ b/src/info/index.ts @@ -4,6 +4,7 @@ import { GetZipDownloadLimit } from './domain/useCases/GetZipDownloadLimit' import { GetMaxEmbargoDurationInMonths } from './domain/useCases/GetMaxEmbargoDurationInMonths' import { GetApplicationTermsOfUse } from './domain/useCases/GetApplicationTermsOfUse' import { GetAvailableDatasetMetadataExportFormats } from './domain/useCases/GetAvailableDatasetMetadataExportFormats' +import { GetDatasetPublishPopupCustomText } from './domain/useCases/GetDatasetPublishPopupCustomText' const dataverseInfoRepository = new DataverseInfoRepository() @@ -14,13 +15,19 @@ const getApplicationTermsOfUse = new GetApplicationTermsOfUse(dataverseInfoRepos const getAvailableDatasetMetadataExportFormats = new GetAvailableDatasetMetadataExportFormats( dataverseInfoRepository ) +const getPublishDatasetDisclaimerText = new GetApplicationTermsOfUse(dataverseInfoRepository) +const getDatasetPublishPopupCustomText = new GetDatasetPublishPopupCustomText( + dataverseInfoRepository +) export { getDataverseVersion, getZipDownloadLimit, getMaxEmbargoDurationInMonths, getApplicationTermsOfUse, - getAvailableDatasetMetadataExportFormats + getAvailableDatasetMetadataExportFormats, + getDatasetPublishPopupCustomText, + getPublishDatasetDisclaimerText } export { DatasetMetadataExportFormats } from './domain/models/DatasetMetadataExportFormats' diff --git a/test/unit/info/DataverseInfoRepository.test.ts b/test/unit/info/DataverseInfoRepository.test.ts index 61010810..ac400fc2 100644 --- a/test/unit/info/DataverseInfoRepository.test.ts +++ b/test/unit/info/DataverseInfoRepository.test.ts @@ -240,4 +240,76 @@ describe('DataverseInfoRepository', () => { expect(error).toBeInstanceOf(Error) }) }) + + describe('getDatasetPublishPopupCustomText', () => { + test('should return dataset publish popup custom text on successful response', async () => { + const testPopupText = 'Custom popup text.' + const testSuccessfulResponse = { + data: { + status: 'OK', + data: { + message: testPopupText + } + } + } + jest.spyOn(axios, 'get').mockResolvedValue(testSuccessfulResponse) + + const actual = await sut.getDatasetPublishPopupCustomText() + + expect(axios.get).toHaveBeenCalledWith( + `${TestConstants.TEST_API_URL}/info/settings/:DatasetPublishPopupCustomText`, + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + expect(actual).toMatch(testPopupText) + }) + + test('should return error result on error response', async () => { + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) + + let error: ReadError | undefined + await sut.getDatasetPublishPopupCustomText().catch((e) => (error = e)) + + expect(axios.get).toHaveBeenCalledWith( + `${TestConstants.TEST_API_URL}/info/settings/:DatasetPublishPopupCustomText`, + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + expect(error).toBeInstanceOf(Error) + }) + }) + + describe('getPublishDatasetDisclaimerText', () => { + test('should return publish dataset disclaimer text on successful response', async () => { + const testDisclaimerText = 'Disclaimer text.' + const testSuccessfulResponse = { + data: { + status: 'OK', + data: { + message: testDisclaimerText + } + } + } + jest.spyOn(axios, 'get').mockResolvedValue(testSuccessfulResponse) + + const actual = await sut.getPublishDatasetDisclaimerText() + + expect(axios.get).toHaveBeenCalledWith( + `${TestConstants.TEST_API_URL}/info/settings/:PublishDatasetDisclaimerText`, + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + expect(actual).toMatch(testDisclaimerText) + }) + + test('should return error result on error response', async () => { + jest.spyOn(axios, 'get').mockRejectedValue(TestConstants.TEST_ERROR_RESPONSE) + + let error: ReadError | undefined + await sut.getPublishDatasetDisclaimerText().catch((e) => (error = e)) + + expect(axios.get).toHaveBeenCalledWith( + `${TestConstants.TEST_API_URL}/info/settings/:PublishDatasetDisclaimerText`, + TestConstants.TEST_EXPECTED_UNAUTHENTICATED_REQUEST_CONFIG + ) + expect(error).toBeInstanceOf(Error) + }) + }) }) From a4b6fd415510407957cff5ffa6538c9b29990493 Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Fri, 6 Feb 2026 09:04:59 -0500 Subject: [PATCH 3/5] update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f3a2c92..06be3f56 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,8 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel - 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). +- New Use Case: [Get Publish Dataset Disclaimer Text](./docs/useCases.md#get-publish-dataset-disclaimer-text). +- New Use Case: [Get Dataset Publish Popup Custom Text](./docs/useCases.md#get-dataset-publish-popup-custom-text). ### Changed From 77b688894c5801dd1b15fb83b43a4fbbeaaabf1b Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Fri, 6 Feb 2026 10:18:24 -0500 Subject: [PATCH 4/5] Update docs/useCases.md fix typo Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- docs/useCases.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/useCases.md b/docs/useCases.md index b3482ec7..f06153aa 100644 --- a/docs/useCases.md +++ b/docs/useCases.md @@ -2593,7 +2593,7 @@ import { submitContactInfo } from '@iqss/dataverse-client-javascript' /* ... */ const contactDTO: ContactDTO = { - targedId: 1, + targetId: 1, subject: 'Data Question', body: 'Please help me understand your data. Thank you!', fromEmail: 'test@gmail.com' From e191ba4fe9d1ced320a5cd17db8f54f37e3a7db8 Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Fri, 6 Feb 2026 10:22:53 -0500 Subject: [PATCH 5/5] fix instantiation of getPublishDatasetDisclaimerText --- src/info/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/info/index.ts b/src/info/index.ts index c11e5afb..6b0d02b8 100644 --- a/src/info/index.ts +++ b/src/info/index.ts @@ -5,6 +5,7 @@ import { GetMaxEmbargoDurationInMonths } from './domain/useCases/GetMaxEmbargoDu import { GetApplicationTermsOfUse } from './domain/useCases/GetApplicationTermsOfUse' import { GetAvailableDatasetMetadataExportFormats } from './domain/useCases/GetAvailableDatasetMetadataExportFormats' import { GetDatasetPublishPopupCustomText } from './domain/useCases/GetDatasetPublishPopupCustomText' +import { GetPublishDatasetDisclaimerText } from './domain/useCases/GetPublishDatasetDisclaimerText' const dataverseInfoRepository = new DataverseInfoRepository() @@ -15,7 +16,7 @@ const getApplicationTermsOfUse = new GetApplicationTermsOfUse(dataverseInfoRepos const getAvailableDatasetMetadataExportFormats = new GetAvailableDatasetMetadataExportFormats( dataverseInfoRepository ) -const getPublishDatasetDisclaimerText = new GetApplicationTermsOfUse(dataverseInfoRepository) +const getPublishDatasetDisclaimerText = new GetPublishDatasetDisclaimerText(dataverseInfoRepository) const getDatasetPublishPopupCustomText = new GetDatasetPublishPopupCustomText( dataverseInfoRepository )