Skip to content

Commit 42c1ce3

Browse files
authored
Merge pull request #182 from IQSS/178-publish-collection
178 publish collection use case
2 parents 4537ac8 + 957496c commit 42c1ce3

File tree

8 files changed

+150
-1
lines changed

8 files changed

+150
-1
lines changed

docs/useCases.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ The different use cases currently available in the package are classified below,
1515
- [Get User Permissions on a Collection](#get-user-permissions-on-a-collection)
1616
- [Collections write use cases](#collections-write-use-cases)
1717
- [Create a Collection](#create-a-collection)
18+
- [Publish a Collection](#publish-a-collection)
1819
- [Datasets](#Datasets)
1920
- [Datasets read use cases](#datasets-read-use-cases)
2021
- [Get a Dataset](#get-a-dataset)
@@ -192,6 +193,28 @@ The above example creates the new collection in the `root` collection since no c
192193

193194
The use case returns a number, which is the identifier of the created collection.
194195

196+
#### Publish a Collection
197+
198+
Publishes a Collection, given the collection identifier.
199+
200+
##### Example call:
201+
202+
```typescript
203+
import { publishCollection } from '@iqss/dataverse-client-javascript'
204+
205+
/* ... */
206+
207+
const collectionIdOrAlias = 12345
208+
209+
publishCollection.execute(collectionIdOrAlias)
210+
211+
/* ... */
212+
```
213+
214+
The `collectionIdOrAlias` is a generic collection identifier, which can be either a string (for queries by CollectionAlias), or a number (for queries by CollectionId).
215+
216+
_See [use case](../src/collections/domain/useCases/PublishCollection.ts)_ definition.
217+
195218
## Datasets
196219

197220
### Datasets Read Use Cases

src/collections/domain/repositories/ICollectionsRepository.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export interface ICollectionsRepository {
99
collectionDTO: CollectionDTO,
1010
parentCollectionId: number | string
1111
): Promise<number>
12+
publishCollection(collectionIdOrAlias: number | string): Promise<void>
1213
getCollectionFacets(collectionIdOrAlias: number | string): Promise<CollectionFacet[]>
1314
getCollectionUserPermissions(
1415
collectionIdOrAlias: number | string
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { ICollectionsRepository } from '../repositories/ICollectionsRepository' // Assuming Axios for HTTP requests
3+
4+
export class PublishCollection implements UseCase<void> {
5+
private collectionsRepository: ICollectionsRepository
6+
7+
constructor(collectionsRepository: ICollectionsRepository) {
8+
this.collectionsRepository = collectionsRepository
9+
}
10+
11+
/**
12+
* Publishes a collection, given its identifier.
13+
*
14+
* @param {number | string} [collectionIdOrAlias] - The collection identifier, which can be a string (for collection alias), or a number (for numeric identifiers).
15+
* @returns {Promise<void>} - This method does not return anything upon successful completion.
16+
*/
17+
async execute(collectionIdOrAlias: number | string): Promise<void> {
18+
return await this.collectionsRepository.publishCollection(collectionIdOrAlias)
19+
}
20+
}

src/collections/index.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,23 @@ import { GetCollectionFacets } from './domain/useCases/GetCollectionFacets'
44
import { GetCollectionUserPermissions } from './domain/useCases/GetCollectionUserPermissions'
55

66
import { CollectionsRepository } from './infra/repositories/CollectionsRepository'
7+
import { PublishCollection } from './domain/useCases/PublishCollection'
78

89
const collectionsRepository = new CollectionsRepository()
910

1011
const getCollection = new GetCollection(collectionsRepository)
1112
const createCollection = new CreateCollection(collectionsRepository)
1213
const getCollectionFacets = new GetCollectionFacets(collectionsRepository)
1314
const getCollectionUserPermissions = new GetCollectionUserPermissions(collectionsRepository)
15+
const publishCollection = new PublishCollection(collectionsRepository)
1416

15-
export { getCollection, createCollection, getCollectionFacets, getCollectionUserPermissions }
17+
export {
18+
getCollection,
19+
createCollection,
20+
getCollectionFacets,
21+
getCollectionUserPermissions,
22+
publishCollection
23+
}
1624
export { Collection, CollectionInputLevel } from './domain/models/Collection'
1725
export { CollectionFacet } from './domain/models/CollectionFacet'
1826
export { CollectionUserPermissions } from './domain/models/CollectionUserPermissions'

src/collections/infra/repositories/CollectionsRepository.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,16 @@ export class CollectionsRepository extends ApiRepository implements ICollections
104104
throw error
105105
})
106106
}
107+
public async publishCollection(collectionIdOrAlias: string | number): Promise<void> {
108+
return this.doPost(
109+
`/${this.collectionsResourceName}/${collectionIdOrAlias}/actions/:publish`,
110+
{}
111+
)
112+
.then(() => undefined)
113+
.catch((error) => {
114+
throw error
115+
})
116+
}
107117

108118
public async getCollectionUserPermissions(
109119
collectionIdOrAlias: number | string
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { ApiConfig, createCollection, publishCollection, WriteError } from '../../../src'
2+
import { TestConstants } from '../../testHelpers/TestConstants'
3+
import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'
4+
import {
5+
createCollectionDTO,
6+
deleteCollectionViaApi
7+
} from '../../testHelpers/collections/collectionHelper'
8+
9+
const testNewCollection = createCollectionDTO('test-publish-collection')
10+
11+
describe('execute', () => {
12+
beforeEach(async () => {
13+
ApiConfig.init(
14+
TestConstants.TEST_API_URL,
15+
DataverseApiAuthMechanism.API_KEY,
16+
process.env.TEST_API_KEY
17+
)
18+
})
19+
20+
test('should successfully publish a collection with id', async () => {
21+
const createdCollectiontIdentifier = await createCollection.execute(testNewCollection)
22+
23+
const response = await publishCollection.execute(createdCollectiontIdentifier)
24+
25+
expect(response).toBeUndefined()
26+
await deleteCollectionViaApi(testNewCollection.alias)
27+
})
28+
test('should successfully publish a collection with alias', async () => {
29+
await createCollection.execute(testNewCollection)
30+
31+
const response = await publishCollection.execute(testNewCollection.alias)
32+
33+
expect(response).toBeUndefined()
34+
await deleteCollectionViaApi(testNewCollection.alias)
35+
})
36+
37+
test('should throw an error when trying to publish a collection that does not exist', async () => {
38+
const nonExistentTestCollectionId = 4567
39+
const expectedError = new WriteError(
40+
`[404] Can't find dataverse with identifier='${nonExistentTestCollectionId}'`
41+
)
42+
43+
await expect(publishCollection.execute(nonExistentTestCollectionId)).rejects.toThrow(
44+
expectedError
45+
)
46+
})
47+
})

test/integration/collections/CollectionsRepository.test.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,23 @@ describe('CollectionsRepository', () => {
9494
})
9595
})
9696

97+
describe('publishCollection', () => {
98+
const testPublishCollectionAlias = 'publishCollection-test'
99+
100+
afterAll(async () => {
101+
await deleteCollectionViaApi(testPublishCollectionAlias)
102+
})
103+
104+
test('should publish a collection', async () => {
105+
const newCollectionDTO = createCollectionDTO(testPublishCollectionAlias)
106+
const actualId = await sut.createCollection(newCollectionDTO)
107+
await sut.publishCollection(actualId)
108+
const createdCollection = await sut.getCollection(actualId)
109+
110+
expect(createdCollection.isReleased).toBe(true)
111+
expect(createdCollection.name).toBe(newCollectionDTO.name)
112+
})
113+
})
97114
describe('createCollection', () => {
98115
const testCreateCollectionAlias1 = 'createCollection-test-1'
99116
const testCreateCollectionAlias2 = 'createCollection-test-2'
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { ICollectionsRepository } from '../../../src/collections/domain/repositories/ICollectionsRepository'
2+
import { PublishCollection } from '../../../src/collections/domain/useCases/PublishCollection'
3+
import { WriteError } from '../../../src'
4+
5+
describe('execute', () => {
6+
test('should return undefined on repository success', async () => {
7+
const collectionsRepositoryStub: ICollectionsRepository = {} as ICollectionsRepository
8+
collectionsRepositoryStub.publishCollection = jest.fn().mockResolvedValue(undefined)
9+
const sut = new PublishCollection(collectionsRepositoryStub)
10+
11+
const actual = await sut.execute(1)
12+
13+
expect(actual).toEqual(undefined)
14+
})
15+
16+
test('should return error result on repository error', async () => {
17+
const collectionsRepositoryStub: ICollectionsRepository = {} as ICollectionsRepository
18+
collectionsRepositoryStub.publishCollection = jest.fn().mockRejectedValue(new WriteError())
19+
const sut = new PublishCollection(collectionsRepositoryStub)
20+
21+
await expect(sut.execute(1)).rejects.toThrow(WriteError)
22+
})
23+
})

0 commit comments

Comments
 (0)