diff --git a/CHANGELOG.md b/CHANGELOG.md index c1d822c2..1a806053 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel ### Added +- Collections: Added optional `ignoreSettingExcludeEmailFromExport` support to `getCollection`. + ### Changed ### Fixed diff --git a/src/collections/domain/repositories/ICollectionsRepository.ts b/src/collections/domain/repositories/ICollectionsRepository.ts index cf1fad5b..a6578730 100644 --- a/src/collections/domain/repositories/ICollectionsRepository.ts +++ b/src/collections/domain/repositories/ICollectionsRepository.ts @@ -17,7 +17,10 @@ import { LinkingObjectType } from '../useCases/GetCollectionsForLinking' import { RoleAlias } from '../../../roles/domain/models/RoleAlias' 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..13338400 100644 --- a/src/collections/domain/useCases/GetCollection.ts +++ b/src/collections/domain/useCases/GetCollection.ts @@ -14,9 +14,16 @@ 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 99dddaf3..2fcabd9c 100644 --- a/src/collections/infra/repositories/CollectionsRepository.ts +++ b/src/collections/infra/repositories/CollectionsRepository.ts @@ -99,11 +99,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) => { diff --git a/test/integration/collections/CollectionsRepository.test.ts b/test/integration/collections/CollectionsRepository.test.ts index 0e30d5f2..13116a44 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 { @@ -196,6 +197,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 075034cc..670a79ab 100644 --- a/test/unit/collections/CollectionsRepository.test.ts +++ b/test/unit/collections/CollectionsRepository.test.ts @@ -222,6 +222,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', () => {