Skip to content

Commit daa3b79

Browse files
committed
feat: add delete single featured item use case
1 parent 95fe0b8 commit daa3b79

File tree

8 files changed

+190
-1
lines changed

8 files changed

+190
-1
lines changed

docs/useCases.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ The different use cases currently available in the package are classified below,
2323
- [Delete a Collection](#delete-a-collection)
2424
- [Update Collection Featured Items](#update-collection-featured-items)
2525
- [Delete Collection Featured Items](#delete-collection-featured-items)
26+
- [Delete a Collection Featured Item](#delete-a-collection-featured-item)
2627
- [Datasets](#Datasets)
2728
- [Datasets read use cases](#datasets-read-use-cases)
2829
- [Get a Dataset](#get-a-dataset)
@@ -451,6 +452,26 @@ The `collectionIdOrAlias` is a generic collection identifier, which can be eithe
451452

452453
_See [use case](../src/collections/domain/useCases/DeleteCollectionFeaturedItems.ts)_ definition.
453454

455+
#### Delete A Collection Featured Item
456+
457+
Deletes a single featured item, given a featured item id.
458+
459+
##### Example call:
460+
461+
```typescript
462+
import { deleteCollectionFeaturedItem } from '@iqss/dataverse-client-javascript'
463+
464+
/* ... */
465+
466+
const featuredItemId = 12345
467+
468+
deleteCollectionFeaturedItem.execute(featuredItemId)
469+
470+
/* ... */
471+
```
472+
473+
_See [use case](../src/collections/domain/useCases/DeleteCollectionFeaturedItem.ts)_ definition.
474+
454475
## Datasets
455476

456477
### Datasets Read Use Cases

src/collections/domain/repositories/ICollectionsRepository.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,5 @@ export interface ICollectionsRepository {
5050
featuredItemDTOs: CollectionFeaturedItemsDTO
5151
): Promise<CollectionFeaturedItem[]>
5252
deleteCollectionFeaturedItems(collectionIdOrAlias: number | string): Promise<void>
53+
deleteCollectionFeaturedItem(featuredItemId: number): Promise<void>
5354
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { ICollectionsRepository } from '../repositories/ICollectionsRepository'
3+
4+
export class DeleteCollectionFeaturedItem implements UseCase<void> {
5+
private collectionsRepository: ICollectionsRepository
6+
7+
constructor(collectionsRepository: ICollectionsRepository) {
8+
this.collectionsRepository = collectionsRepository
9+
}
10+
11+
/**
12+
* Deletes a single featured item, given a featured item id.
13+
*
14+
* @param {number} [featuredItemId] - The id of the featured item to delete.
15+
* @returns {Promise<void>} - This method does not return anything upon successful completion.
16+
* @throws {WriteError} - If there are errors while writing data.
17+
*/
18+
async execute(featuredItemId: number): Promise<void> {
19+
return await this.collectionsRepository.deleteCollectionFeaturedItem(featuredItemId)
20+
}
21+
}

src/collections/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { UpdateCollectionFeaturedItems } from './domain/useCases/UpdateCollectio
1111
import { DeleteCollectionFeaturedItems } from './domain/useCases/DeleteCollectionFeaturedItems'
1212
import { DeleteCollection } from './domain/useCases/DeleteCollection'
1313
import { GetMyDataCollectionItems } from './domain/useCases/GetMyDataCollectionItems'
14+
import { DeleteCollectionFeaturedItem } from './domain/useCases/DeleteCollectionFeaturedItem'
1415

1516
const collectionsRepository = new CollectionsRepository()
1617

@@ -26,6 +27,7 @@ const getCollectionFeaturedItems = new GetCollectionFeaturedItems(collectionsRep
2627
const updateCollectionFeaturedItems = new UpdateCollectionFeaturedItems(collectionsRepository)
2728
const deleteCollectionFeaturedItems = new DeleteCollectionFeaturedItems(collectionsRepository)
2829
const deleteCollection = new DeleteCollection(collectionsRepository)
30+
const deleteCollectionFeaturedItem = new DeleteCollectionFeaturedItem(collectionsRepository)
2931

3032
export {
3133
getCollection,
@@ -39,7 +41,8 @@ export {
3941
getCollectionFeaturedItems,
4042
updateCollectionFeaturedItems,
4143
deleteCollectionFeaturedItems,
42-
deleteCollection
44+
deleteCollection,
45+
deleteCollectionFeaturedItem
4346
}
4447
export { Collection, CollectionInputLevel } from './domain/models/Collection'
4548
export { CollectionFacet } from './domain/models/CollectionFacet'

src/collections/infra/repositories/CollectionsRepository.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,4 +436,12 @@ export class CollectionsRepository extends ApiRepository implements ICollections
436436
throw error
437437
})
438438
}
439+
440+
public async deleteCollectionFeaturedItem(featuredItemId: number): Promise<void> {
441+
return this.doDelete(`/dataverseFeaturedItems/${featuredItemId}`)
442+
.then(() => undefined)
443+
.catch((error) => {
444+
throw error
445+
})
446+
}
439447
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { ApiConfig, deleteCollectionFeaturedItem, WriteError } from '../../../src'
2+
import { TestConstants } from '../../testHelpers/TestConstants'
3+
import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'
4+
import {
5+
createCollectionViaApi,
6+
deleteCollectionViaApi
7+
} from '../../testHelpers/collections/collectionHelper'
8+
import { createCollectionCustomFeaturedItemViaApi } from '../../testHelpers/collections/collectionFeaturedItemsHelper'
9+
10+
describe('execute', () => {
11+
const testCollectionAlias = 'deleteCollectionFeaturedItemTest'
12+
let featuredItemTestId: number
13+
14+
beforeEach(async () => {
15+
ApiConfig.init(
16+
TestConstants.TEST_API_URL,
17+
DataverseApiAuthMechanism.API_KEY,
18+
process.env.TEST_API_KEY
19+
)
20+
})
21+
22+
beforeAll(async () => {
23+
try {
24+
await createCollectionViaApi(testCollectionAlias)
25+
const featuredItem = await createCollectionCustomFeaturedItemViaApi(testCollectionAlias, {
26+
content: '<p class="rte-paragraph">Test content</p>',
27+
displayOrder: 1,
28+
withFile: true,
29+
fileName: 'featured-item-test-image.png'
30+
})
31+
featuredItemTestId = featuredItem.id
32+
} catch (error) {
33+
throw new Error(
34+
`Tests beforeAll(): Error while creating test collection: ${testCollectionAlias}`
35+
)
36+
}
37+
})
38+
39+
afterAll(async () => {
40+
try {
41+
await deleteCollectionViaApi(testCollectionAlias)
42+
} catch (error) {
43+
throw new Error(
44+
`Tests afterAll(): Error while deleting test collection: ${testCollectionAlias}`
45+
)
46+
}
47+
})
48+
49+
test('should succesfully delete the featured item', async () => {
50+
const actual = await deleteCollectionFeaturedItem.execute(featuredItemTestId)
51+
52+
expect(actual).toBeUndefined()
53+
})
54+
55+
test('should throw an error when featured item does not exist', async () => {
56+
const invalidFeaturedItemId = 99
57+
let writeError: WriteError | undefined
58+
59+
try {
60+
await deleteCollectionFeaturedItem.execute(invalidFeaturedItemId)
61+
} catch (error) {
62+
writeError = error as WriteError
63+
} finally {
64+
expect(writeError).toBeInstanceOf(WriteError)
65+
expect((writeError as WriteError).message).toEqual(
66+
`There was an error when writing the resource. Reason was: [404] Could not find dataverse featured item with identifier ${invalidFeaturedItemId}`
67+
)
68+
}
69+
})
70+
})

test/integration/collections/CollectionsRepository.test.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1440,6 +1440,42 @@ describe('CollectionsRepository', () => {
14401440
expect(featuredItemsResponseAfterDeletion).toStrictEqual([])
14411441
})
14421442
})
1443+
1444+
describe('deleteCollectionFeaturedItem', () => {
1445+
let featuredItemTestId: number
1446+
1447+
beforeAll(async () => {
1448+
try {
1449+
const featuredItem = await createCollectionCustomFeaturedItemViaApi(testCollectionAlias, {
1450+
content: '<p class="rte-paragraph">Test content</p>',
1451+
displayOrder: 1,
1452+
withFile: true,
1453+
fileName: 'featured-item-test-image.png'
1454+
})
1455+
featuredItemTestId = featuredItem.id
1456+
} catch (error) {
1457+
throw new Error(
1458+
`Tests afterAll(): Error while creating test featured items for collection: ${testCollectionAlias}`
1459+
)
1460+
}
1461+
})
1462+
1463+
it('should delete a collection featured item', async () => {
1464+
const featuredItemsResponseBeforeDeletion = await sut.getCollectionFeaturedItems(
1465+
testCollectionAlias
1466+
)
1467+
1468+
expect(featuredItemsResponseBeforeDeletion).toHaveLength(1)
1469+
1470+
await sut.deleteCollectionFeaturedItem(featuredItemTestId)
1471+
1472+
const featuredItemsResponseAfterDeletion = await sut.getCollectionFeaturedItems(
1473+
testCollectionAlias
1474+
)
1475+
1476+
expect(featuredItemsResponseAfterDeletion).toStrictEqual([])
1477+
})
1478+
})
14431479
describe('getMyDataCollectionItems', () => {
14441480
let testDatasetIds: CreatedDatasetIdentifiers
14451481

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { ICollectionsRepository } from '../../../src/collections/domain/repositories/ICollectionsRepository'
2+
import { WriteError } from '../../../src'
3+
import { DeleteCollectionFeaturedItem } from '../../../src/collections/domain/useCases/DeleteCollectionFeaturedItem'
4+
5+
describe('execute', () => {
6+
test('should return undefined on repository success', async () => {
7+
const collectionRepositoryStub: ICollectionsRepository = {} as ICollectionsRepository
8+
collectionRepositoryStub.deleteCollectionFeaturedItem = jest.fn().mockResolvedValue(undefined)
9+
const testDeleteCollectionFeaturedItem = new DeleteCollectionFeaturedItem(
10+
collectionRepositoryStub
11+
)
12+
13+
const actual = await testDeleteCollectionFeaturedItem.execute(1)
14+
15+
expect(actual).toEqual(undefined)
16+
})
17+
18+
test('should return error result on repository error', async () => {
19+
const collectionRepositoryStub: ICollectionsRepository = {} as ICollectionsRepository
20+
collectionRepositoryStub.deleteCollectionFeaturedItem = jest
21+
.fn()
22+
.mockRejectedValue(new WriteError())
23+
const testDeleteCollectionFeaturedItem = new DeleteCollectionFeaturedItem(
24+
collectionRepositoryStub
25+
)
26+
27+
await expect(testDeleteCollectionFeaturedItem.execute(1)).rejects.toThrow(WriteError)
28+
})
29+
})

0 commit comments

Comments
 (0)