Skip to content

Commit f199086

Browse files
committed
add linkCollection and unlinkCollection use cases
1 parent 97cba99 commit f199086

File tree

8 files changed

+168
-0
lines changed

8 files changed

+168
-0
lines changed

.DS_Store

8 KB
Binary file not shown.

src/collections/domain/repositories/ICollectionsRepository.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,4 +50,12 @@ export interface ICollectionsRepository {
5050
): Promise<FeaturedItem[]>
5151
deleteCollectionFeaturedItems(collectionIdOrAlias: number | string): Promise<void>
5252
deleteCollectionFeaturedItem(featuredItemId: number): Promise<void>
53+
linkCollection(
54+
linkedCollectionIdOrAlias: number | string,
55+
linkingCollectionIdOrAlias: number | string
56+
): Promise<void>
57+
unlinkCollection(
58+
linkedCollectionIdOrAlias: number | string,
59+
linkingCollectionIdOrAlias: number | string
60+
): Promise<void>
5361
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { ICollectionsRepository } from '../repositories/ICollectionsRepository'
3+
4+
export class LinkCollection implements UseCase<void> {
5+
private collectionsRepository: ICollectionsRepository
6+
7+
constructor(collectionsRepository: ICollectionsRepository) {
8+
this.collectionsRepository = collectionsRepository
9+
}
10+
11+
/**
12+
* Deletes the Dataverse collection whose database ID or alias is given:
13+
*
14+
* @param {number| string} [linkedCollectionIdOrAlias] - The collection to be linked. Can be either a string (collection alias), or a number (collection id)
15+
* @param { number | string} [linkingCollectionIdOrAlias] - The collection that will be linking to the linked collection. Can be either a string (collection alias), or a number (collection id)
16+
* @returns {Promise<void>} -This method does not return anything upon successful completion.
17+
*/
18+
async execute(
19+
linkedCollectionIdOrAlias: string,
20+
linkingCollectionIdOrAlias: string
21+
): Promise<void> {
22+
return await this.collectionsRepository.linkCollection(
23+
linkedCollectionIdOrAlias,
24+
linkingCollectionIdOrAlias
25+
)
26+
}
27+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { ICollectionsRepository } from '../repositories/ICollectionsRepository'
3+
4+
export class UnLinkCollection implements UseCase<void> {
5+
private collectionsRepository: ICollectionsRepository
6+
7+
constructor(collectionsRepository: ICollectionsRepository) {
8+
this.collectionsRepository = collectionsRepository
9+
}
10+
11+
/**
12+
* Unlinks a collection from the collection that links to it
13+
*
14+
* @param {number| string} [linkedCollectionIdOrAlias] - The collection that is linked. Can be either a string (collection alias), or a number (collection id)
15+
* @param { number | string} [linkingCollectionIdOrAlias] - The collection that links to the linked collection. Can be either a string (collection alias), or a number (collection id)
16+
* @returns {Promise<void>} -This method does not return anything upon successful completion.
17+
*/
18+
async execute(
19+
linkedCollectionIdOrAlias: string,
20+
linkingCollectionIdOrAlias: string
21+
): Promise<void> {
22+
return await this.collectionsRepository.unlinkCollection(
23+
linkedCollectionIdOrAlias,
24+
linkingCollectionIdOrAlias
25+
)
26+
}
27+
}

src/collections/infra/repositories/CollectionsRepository.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,4 +446,30 @@ export class CollectionsRepository extends ApiRepository implements ICollections
446446
throw error
447447
})
448448
}
449+
public async linkCollection(
450+
linkedCollectionIdOrAlias: number | string,
451+
linkingCollectionIdOrAlias: number | string
452+
): Promise<void> {
453+
console.log(linkedCollectionIdOrAlias, linkingCollectionIdOrAlias)
454+
return this.doPut(
455+
`/dataverses/${linkedCollectionIdOrAlias}` + `/link/${linkingCollectionIdOrAlias}`,
456+
{} // No data is needed for this operation
457+
)
458+
.then(() => undefined)
459+
.catch((error) => {
460+
throw error
461+
})
462+
}
463+
public async unlinkCollection(
464+
linkedCollectionIdOrAlias: number | string,
465+
linkingCollectionIdOrAlias: number | string
466+
): Promise<void> {
467+
return this.doDelete(
468+
`/dataverses/${linkedCollectionIdOrAlias}` + `/deleteLink/${linkingCollectionIdOrAlias}`
469+
)
470+
.then(() => undefined)
471+
.catch((error) => {
472+
throw error
473+
})
474+
}
449475
}

test/.DS_Store

6 KB
Binary file not shown.

test/integration/.DS_Store

6 KB
Binary file not shown.

test/integration/collections/CollectionsRepository.test.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1911,4 +1911,84 @@ describe('CollectionsRepository', () => {
19111911
).rejects.toThrow(expectedError)
19121912
})
19131913
})
1914+
describe('linkCollection', () => {
1915+
const firstCollectionAlias = 'linkCollectionFirst'
1916+
const secondCollectionAlias = 'linkCollectionSecond'
1917+
1918+
beforeAll(async () => {
1919+
await createCollectionViaApi(firstCollectionAlias)
1920+
await createCollectionViaApi(secondCollectionAlias)
1921+
})
1922+
1923+
afterAll(async () => {
1924+
await deleteCollectionViaApi(firstCollectionAlias)
1925+
await deleteCollectionViaApi(secondCollectionAlias)
1926+
})
1927+
1928+
test('should link a collection successfully', async () => {
1929+
const firstCollection = await sut.getCollection(firstCollectionAlias)
1930+
await sut.getCollection(secondCollectionAlias)
1931+
1932+
await sut.linkCollection(secondCollectionAlias, firstCollectionAlias)
1933+
1934+
await sut.getCollection(secondCollectionAlias)
1935+
await new Promise((res) => setTimeout(res, 2000))
1936+
const collectionItemSubset = await sut.getCollectionItems(firstCollection.alias)
1937+
expect(collectionItemSubset.items.length).toBe(1)
1938+
})
1939+
1940+
test('should throw error when linking a non-existent collection', async () => {
1941+
const invalidCollectionId = 99999
1942+
const firstCollection = await sut.getCollection(firstCollectionAlias)
1943+
1944+
const expectedError = new WriteError("[404] Can't find dataverse with identifier='99999'")
1945+
1946+
await expect(sut.linkCollection(invalidCollectionId, firstCollection.id)).rejects.toThrow(
1947+
expectedError
1948+
)
1949+
})
1950+
})
1951+
1952+
describe('unlinkCollection', () => {
1953+
const firstCollectionAlias = 'unlinkCollectionFirst'
1954+
const secondCollectionAlias = 'unlinkCollectionSecond'
1955+
1956+
beforeAll(async () => {
1957+
await createCollectionViaApi(firstCollectionAlias)
1958+
await createCollectionViaApi(secondCollectionAlias)
1959+
1960+
const firstCollection = await sut.getCollection(firstCollectionAlias)
1961+
const secondCollection = await sut.getCollection(secondCollectionAlias)
1962+
1963+
await sut.linkCollection(secondCollection.id, firstCollection.id)
1964+
})
1965+
1966+
afterAll(async () => {
1967+
await deleteCollectionViaApi(firstCollectionAlias)
1968+
await deleteCollectionViaApi(secondCollectionAlias)
1969+
})
1970+
1971+
test('should unlink a collection successfully', async () => {
1972+
const firstCollection = await sut.getCollection(firstCollectionAlias)
1973+
const secondCollection = await sut.getCollection(secondCollectionAlias)
1974+
1975+
await sut.unlinkCollection(secondCollection.id, firstCollection.id)
1976+
await new Promise((res) => setTimeout(res, 2000))
1977+
1978+
await sut.getCollection(secondCollectionAlias)
1979+
const collectionItemSubset = await sut.getCollectionItems(firstCollection.alias)
1980+
expect(collectionItemSubset.items).toStrictEqual([])
1981+
})
1982+
1983+
test('should throw error when unlinking a non-existent collection', async () => {
1984+
const invalidCollectionId = 99999
1985+
const firstCollection = await sut.getCollection(firstCollectionAlias)
1986+
1987+
const expectedError = new WriteError("[404] Can't find dataverse with identifier='99999'")
1988+
1989+
await expect(sut.unlinkCollection(invalidCollectionId, firstCollection.id)).rejects.toThrow(
1990+
expectedError
1991+
)
1992+
})
1993+
})
19141994
})

0 commit comments

Comments
 (0)