diff --git a/docs/useCases.md b/docs/useCases.md index f77a40e1..94ff5f16 100644 --- a/docs/useCases.md +++ b/docs/useCases.md @@ -25,6 +25,7 @@ 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) + - [Set Default Contributor Role](#set-default-contributor-role) - [Templates](#Templates) - [Templates read use cases](#templates-read-use-cases) - [Get a Template](#get-a-template) @@ -576,6 +577,27 @@ deleteCollectionFeaturedItem.execute(featuredItemId) _See [use case](../src/collections/domain/useCases/DeleteCollectionFeaturedItem.ts)_ definition. +#### Set Default Contributor Role + +Sets the default contributor role of a collection, given a collection identifier and a role alias. + +##### Example call: + +```typescript +import { setDefaultContributorRole } from '@iqss/dataverse-client-javascript' + +/* ... */ + +const collectionIdOrAlias = 12345 +const roleAlias = 'curator' + +setDefaultContributorRole.execute(collectionIdOrAlias, roleAlias) + +/* ... */ +``` + +_See [use case](../src/collections/domain/useCases/SetDefaultContributorRole.ts)_ definition. + ## Templates ### Templates Read Use Cases diff --git a/src/collections/domain/repositories/ICollectionsRepository.ts b/src/collections/domain/repositories/ICollectionsRepository.ts index bc8960c8..8a67c5c8 100644 --- a/src/collections/domain/repositories/ICollectionsRepository.ts +++ b/src/collections/domain/repositories/ICollectionsRepository.ts @@ -25,6 +25,10 @@ export interface ICollectionsRepository { getCollectionUserPermissions( collectionIdOrAlias: number | string ): Promise + setDefaultContributorRole( + collectionIdOrAlias: number | string, + roleAlias: string + ): Promise getCollectionItems( collectionId?: string, limit?: number, diff --git a/src/collections/domain/useCases/SetDefaultContributorRole.ts b/src/collections/domain/useCases/SetDefaultContributorRole.ts new file mode 100644 index 00000000..7e3f09c0 --- /dev/null +++ b/src/collections/domain/useCases/SetDefaultContributorRole.ts @@ -0,0 +1,26 @@ +import { UseCase } from '../../../core/domain/useCases/UseCase' +import { ICollectionsRepository } from '../repositories/ICollectionsRepository' +import { ROOT_COLLECTION_ID } from '../models/Collection' + +export class SetDefaultContributorRole implements UseCase { + private collectionsRepository: ICollectionsRepository + + constructor(collectionsRepository: ICollectionsRepository) { + this.collectionsRepository = collectionsRepository + } + + /** + * Sets the default Role that is assigned to contributors in the given collection. + * + * @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 {string} [roleAlias] - The alias of the role to be assigned + * @returns {Promise} + */ + async execute( + collectionIdOrAlias: number | string = ROOT_COLLECTION_ID, + roleAlias: string + ): Promise { + return await this.collectionsRepository.setDefaultContributorRole(collectionIdOrAlias, roleAlias) + } +} diff --git a/src/collections/index.ts b/src/collections/index.ts index 59e2e50b..0849bb2a 100644 --- a/src/collections/index.ts +++ b/src/collections/index.ts @@ -16,6 +16,7 @@ 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 { SetDefaultContributorRole } from './domain/useCases/SetDefaultContributorRole' const collectionsRepository = new CollectionsRepository() @@ -36,6 +37,7 @@ const linkCollection = new LinkCollection(collectionsRepository) const unlinkCollection = new UnlinkCollection(collectionsRepository) const getCollectionLinks = new GetCollectionLinks(collectionsRepository) const getCollectionsForLinking = new GetCollectionsForLinking(collectionsRepository) +const setDefaultContributorRole = new SetDefaultContributorRole(collectionsRepository) export { getCollection, @@ -54,7 +56,8 @@ export { linkCollection, unlinkCollection, getCollectionLinks, - getCollectionsForLinking + getCollectionsForLinking, + setDefaultContributorRole } 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 e0e459b0..b71a676e 100644 --- a/src/collections/infra/repositories/CollectionsRepository.ts +++ b/src/collections/infra/repositories/CollectionsRepository.ts @@ -167,6 +167,20 @@ export class CollectionsRepository extends ApiRepository implements ICollections }) } + public async setDefaultContributorRole( + collectionIdOrAlias: number | string, + roleAlias: string + ): Promise { + return this.doPut( + `/${this.collectionsResourceName}/${collectionIdOrAlias}/defaultContributorRole/${roleAlias}`, + {} + ) + .then(() => undefined) + .catch((error) => { + throw error + }) + } + public async getCollectionItems( collectionId?: string, limit?: number, diff --git a/test/unit/collections/SetDefaultContributorRole.test.ts b/test/unit/collections/SetDefaultContributorRole.test.ts new file mode 100644 index 00000000..ee95a3f2 --- /dev/null +++ b/test/unit/collections/SetDefaultContributorRole.test.ts @@ -0,0 +1,29 @@ +import { ICollectionsRepository } from '../../../src/collections/domain/repositories/ICollectionsRepository' +import { WriteError } from '../../../src' +import { SetDefaultContributorRole } from '../../../src/collections/domain/useCases/SetDefaultContributorRole' + +describe('execute', () => { + test('should set default contributor role on repository success', async () => { + const collectionRepositoryStub: ICollectionsRepository = {} as ICollectionsRepository + collectionRepositoryStub.setDefaultContributorRole = jest.fn().mockResolvedValue(undefined) + const testSetDefaultContributorRole = new SetDefaultContributorRole( + collectionRepositoryStub + ) + + await expect(testSetDefaultContributorRole.execute(1, "curator")).resolves.toBeUndefined() + expect(collectionRepositoryStub.setDefaultContributorRole).toHaveBeenCalledWith(1, "curator") + }) + + test('should return error result on repository error', async () => { + const collectionRepositoryStub: ICollectionsRepository = {} as ICollectionsRepository + collectionRepositoryStub.setDefaultContributorRole = jest + .fn() + .mockRejectedValue(new WriteError()) + const testSetDefaultContributorRole = new SetDefaultContributorRole( + collectionRepositoryStub + ) + + await expect(testSetDefaultContributorRole.execute(1, "curator")).rejects.toThrow(WriteError) + expect(collectionRepositoryStub.setDefaultContributorRole).toHaveBeenCalledWith(1, "curator") + }) +})