From 694c9356e066af30863b2c0b929e408e92df514d Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Fri, 6 Mar 2026 13:32:50 +0100 Subject: [PATCH 1/4] feat: add ignoreSettingExcludeEmailFromExport param to GetCollection use case --- .../domain/repositories/ICollectionsRepository.ts | 5 ++++- src/collections/domain/useCases/GetCollection.ts | 8 ++++++-- .../infra/repositories/CollectionsRepository.ts | 6 ++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/collections/domain/repositories/ICollectionsRepository.ts b/src/collections/domain/repositories/ICollectionsRepository.ts index ed6cf4ff..03a5fff9 100644 --- a/src/collections/domain/repositories/ICollectionsRepository.ts +++ b/src/collections/domain/repositories/ICollectionsRepository.ts @@ -16,7 +16,10 @@ import { StorageDriver } from '../../../core/domain/models/StorageDriver' import { LinkingObjectType } from '../useCases/GetCollectionsForLinking' export interface ICollectionsRepository { - getCollection(collectionIdOrAlias: number | string): Promise + getCollection( + collectionIdOrAlias: number | string, + ignoreSettingExcludeEmailFromExport?: boolean + ): Promise getCollectionStorageDriver( collectionIdOrAlias: number | string, getEffective?: boolean diff --git a/src/collections/domain/useCases/GetCollection.ts b/src/collections/domain/useCases/GetCollection.ts index 38f1d6d6..55cce8b3 100644 --- a/src/collections/domain/useCases/GetCollection.ts +++ b/src/collections/domain/useCases/GetCollection.ts @@ -14,9 +14,13 @@ export class GetCollection implements UseCase { * * @param {number | string} [collectionIdOrAlias = ':root'] - A generic collection identifier, which can be either a string (for queries by CollectionAlias), or a number (for queries by CollectionId) * If this parameter is not set, the default value is: ':root' + * @param {boolean} ignoreSettingExcludeEmailFromExport - This prevents the contact emails from being excluded when the setting `ExcludeEmailFromExport` is set to true and the user has EditDataverse permissions. * @returns {Promise} */ - async execute(collectionIdOrAlias: number | string = ROOT_COLLECTION_ID): Promise { - return await this.collectionsRepository.getCollection(collectionIdOrAlias) + async execute(collectionIdOrAlias: number | string = ROOT_COLLECTION_ID, ignoreSettingExcludeEmailFromExport?: boolean): Promise { + return await this.collectionsRepository.getCollection( + collectionIdOrAlias, + ignoreSettingExcludeEmailFromExport + ) } } diff --git a/src/collections/infra/repositories/CollectionsRepository.ts b/src/collections/infra/repositories/CollectionsRepository.ts index ccf22729..83fe9fe0 100644 --- a/src/collections/infra/repositories/CollectionsRepository.ts +++ b/src/collections/infra/repositories/CollectionsRepository.ts @@ -98,11 +98,13 @@ export enum GetMyDataCollectionItemsQueryParams { export class CollectionsRepository extends ApiRepository implements ICollectionsRepository { private readonly collectionsResourceName: string = 'dataverses' public async getCollection( - collectionIdOrAlias: number | string = ROOT_COLLECTION_ID + collectionIdOrAlias: number | string = ROOT_COLLECTION_ID, + ignoreSettingExcludeEmailFromExport?: boolean ): Promise { return this.doGet(`/${this.collectionsResourceName}/${collectionIdOrAlias}`, true, { returnOwners: true, - returnChildCount: true + returnChildCount: true, + ignoreSettingExcludeEmailFromExport: ignoreSettingExcludeEmailFromExport }) .then((response) => transformCollectionResponseToCollection(response)) .catch((error) => { From b9232a65115a75a4f3318628188a9a9e0b16b3d8 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Tue, 18 Aug 2026 15:56:09 +0200 Subject: [PATCH 2/4] docs: update CHANGELOG with ignoreSettingExcludeEmailFromExport support in getCollection --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad4a912c..2ad33f64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel - Datasets: Added `exportDatasetMetadata` use case, repository method, and `ExportedDatasetMetadata` response type to support exporting dataset metadata by numeric id or persistent id through Dataverse endpoint `GET /datasets/export`. - Collections: Added `allowedDatasetTypes` field to the [Collection](./src/collections/domain/models/Collection.ts) model. This field is optional and only populated the feature is enabled on the installation and configured on the collection. - Collections: Added theme information when retrieving a collection using `getCollection`. +- Collections: Added optional `ignoreSettingExcludeEmailFromExport` support to `getCollection`. ### Changed From 386ff4fa30deba2978fcd3ee51211d34809161a7 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Tue, 18 Aug 2026 16:09:43 +0200 Subject: [PATCH 3/4] style: reformat GetCollection use case --- src/collections/domain/useCases/GetCollection.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/collections/domain/useCases/GetCollection.ts b/src/collections/domain/useCases/GetCollection.ts index 55cce8b3..13338400 100644 --- a/src/collections/domain/useCases/GetCollection.ts +++ b/src/collections/domain/useCases/GetCollection.ts @@ -17,7 +17,10 @@ export class GetCollection implements UseCase { * @param {boolean} ignoreSettingExcludeEmailFromExport - This prevents the contact emails from being excluded when the setting `ExcludeEmailFromExport` is set to true and the user has EditDataverse permissions. * @returns {Promise} */ - async execute(collectionIdOrAlias: number | string = ROOT_COLLECTION_ID, ignoreSettingExcludeEmailFromExport?: boolean): Promise { + async execute( + collectionIdOrAlias: number | string = ROOT_COLLECTION_ID, + ignoreSettingExcludeEmailFromExport?: boolean + ): Promise { return await this.collectionsRepository.getCollection( collectionIdOrAlias, ignoreSettingExcludeEmailFromExport From db9bdc2a5881fcab566e30160f54faaefb687206 Mon Sep 17 00:00:00 2001 From: Vera Clemens Date: Fri, 6 Nov 2026 16:25:56 +0100 Subject: [PATCH 4/4] test: add ignoreSettingExcludeEmailFromExport param to GetCollection use case --- .../collections/CollectionsRepository.test.ts | 46 +++++++++++++++++++ .../collections/CollectionsRepository.test.ts | 25 ++++++++++ 2 files changed, 71 insertions(+) diff --git a/test/integration/collections/CollectionsRepository.test.ts b/test/integration/collections/CollectionsRepository.test.ts index 72a46165..5d273c7a 100644 --- a/test/integration/collections/CollectionsRepository.test.ts +++ b/test/integration/collections/CollectionsRepository.test.ts @@ -1,3 +1,4 @@ +import axios from 'axios' import { CollectionsRepository } from '../../../src/collections/infra/repositories/CollectionsRepository' import { TestConstants } from '../../testHelpers/TestConstants' import { @@ -195,6 +196,51 @@ describe('CollectionsRepository', () => { actual.allowedDatasetTypes === undefined || Array.isArray(actual.allowedDatasetTypes) ).toBe(true) }) + + describe('ignoreSettingExcludeEmailFromExport', () => { + const settingEndpoint = `${TestConstants.TEST_API_URL}/admin/settings/:ExcludeEmailFromExport` + let originalSetting: string | undefined + let settingLoaded = false + + beforeAll(async () => { + const response = await axios.get(settingEndpoint, { + validateStatus: (status) => status === 200 || status === 404 + }) + originalSetting = response.status === 200 ? response.data.data : undefined + settingLoaded = true + await axios.put(settingEndpoint, 'true') + }) + + afterAll(async () => { + if (settingLoaded) { + if (originalSetting === undefined) { + await axios.delete(settingEndpoint) + } else { + await axios.put(settingEndpoint, originalSetting) + } + } + }) + + test.each([true, false, undefined])( + 'should send ignoreSettingExcludeEmailFromExport=%s as query parameter', + async (ignoreSettingExcludeEmailFromExport) => { + const actual = await sut.getCollection( + testCollectionAlias, + ignoreSettingExcludeEmailFromExport + ) + + expect(actual.id).toBe(testCollectionId) + expect(actual.contacts).toEqual( + ignoreSettingExcludeEmailFromExport + ? [ + { email: 'pi@example.edu', displayOrder: 0 }, + { email: 'student@example.edu', displayOrder: 1 } + ] + : undefined + ) + } + ) + }) }) describe('publishCollection', () => { diff --git a/test/unit/collections/CollectionsRepository.test.ts b/test/unit/collections/CollectionsRepository.test.ts index adcdf8cf..bbbed0f5 100644 --- a/test/unit/collections/CollectionsRepository.test.ts +++ b/test/unit/collections/CollectionsRepository.test.ts @@ -213,6 +213,31 @@ describe('CollectionsRepository', () => { expect(error).toBeInstanceOf(Error) }) }) + + test.each([true, false, undefined])( + 'should send ignoreSettingExcludeEmailFromExport=%s as query parameter', + async (ignoreSettingExcludeEmailFromExport) => { + jest.spyOn(axios, 'get').mockResolvedValue(testCollectionSuccessfulResponse) + + const actual = await sut.getCollection( + testCollectionModel.alias, + ignoreSettingExcludeEmailFromExport + ) + + expect(axios.get).toHaveBeenCalledWith( + `${TestConstants.TEST_API_URL}/dataverses/${testCollectionModel.alias}`, + { + ...expectedRequestConfigApiKey, + params: { + returnOwners: true, + returnChildCount: true, + ignoreSettingExcludeEmailFromExport + } + } + ) + expect(actual).toStrictEqual(testCollectionModel) + } + ) }) describe('getCollectionStorageDriver', () => {