Skip to content

Commit 76fa636

Browse files
committed
feat: use case
1 parent 39aa3da commit 76fa636

File tree

5 files changed

+80
-4
lines changed

5 files changed

+80
-4
lines changed

src/collections/domain/repositories/ICollectionsRepository.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import { CollectionUserPermissions } from '../models/CollectionUserPermissions'
1010
import { PublicationStatus } from '../../../core/domain/models/PublicationStatus'
1111
import { CollectionItemType } from '../../../collections/domain/models/CollectionItemType'
1212
import { CollectionLinks } from '../models/CollectionLinks'
13+
import { CollectionSummary } from '../models/CollectionSummary'
14+
import { LinkingObjectType } from '../useCases/GetCollectionsForLinking'
1315

1416
export interface ICollectionsRepository {
1517
getCollection(collectionIdOrAlias: number | string): Promise<Collection>
@@ -60,4 +62,9 @@ export interface ICollectionsRepository {
6062
linkingCollectionIdOrAlias: number | string
6163
): Promise<void>
6264
getCollectionLinks(collectionIdOrAlias: number | string): Promise<CollectionLinks>
65+
getCollectionsForLinking(
66+
objectType: LinkingObjectType,
67+
id: number | string,
68+
searchTerm: string
69+
): Promise<CollectionSummary[]>
6370
}
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+
import { CollectionSummary } from '../models/CollectionSummary'
4+
5+
export type LinkingObjectType = 'collection' | 'dataset'
6+
7+
export class GetCollectionsForLinking implements UseCase<CollectionSummary[]> {
8+
private collectionsRepository: ICollectionsRepository
9+
10+
constructor(collectionsRepository: ICollectionsRepository) {
11+
this.collectionsRepository = collectionsRepository
12+
}
13+
14+
/**
15+
* Returns an array of CollectionSummary (id, alias, displayName) to which the given Dataverse collection or Dataset may be linked.
16+
* @param objectType - 'dataverse' when providing a collection identifier/alias; 'dataset' when providing a dataset persistentId.
17+
* @param id - For objectType 'dataverse', a numeric id or alias string. For 'dataset', the persistentId string (e.g., doi:...)
18+
* @param searchTerm - Optional search term to filter by collection name. Defaults to empty string (no filtering).
19+
*/
20+
async execute(
21+
objectType: LinkingObjectType,
22+
id: number | string,
23+
searchTerm = ''
24+
): Promise<CollectionSummary[]> {
25+
return await this.collectionsRepository.getCollectionsForLinking(objectType, id, searchTerm)
26+
}
27+
}

src/collections/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { DeleteCollectionFeaturedItem } from './domain/useCases/DeleteCollection
1515
import { LinkCollection } from './domain/useCases/LinkCollection'
1616
import { UnlinkCollection } from './domain/useCases/UnlinkCollection'
1717
import { GetCollectionLinks } from './domain/useCases/GetCollectionLinks'
18+
import { GetCollectionsForLinking } from './domain/useCases/GetCollectionsForLinking'
1819

1920
const collectionsRepository = new CollectionsRepository()
2021

@@ -34,6 +35,7 @@ const deleteCollectionFeaturedItem = new DeleteCollectionFeaturedItem(collection
3435
const linkCollection = new LinkCollection(collectionsRepository)
3536
const unlinkCollection = new UnlinkCollection(collectionsRepository)
3637
const getCollectionLinks = new GetCollectionLinks(collectionsRepository)
38+
const getCollectionsForLinking = new GetCollectionsForLinking(collectionsRepository)
3739

3840
export {
3941
getCollection,
@@ -51,7 +53,8 @@ export {
5153
deleteCollectionFeaturedItem,
5254
linkCollection,
5355
unlinkCollection,
54-
getCollectionLinks
56+
getCollectionLinks,
57+
getCollectionsForLinking
5558
}
5659
export { Collection, CollectionInputLevel } from './domain/models/Collection'
5760
export { CollectionFacet } from './domain/models/CollectionFacet'
@@ -62,3 +65,4 @@ export { CollectionItemType } from './domain/models/CollectionItemType'
6265
export { CollectionSearchCriteria } from './domain/models/CollectionSearchCriteria'
6366
export { FeaturedItem } from './domain/models/FeaturedItem'
6467
export { FeaturedItemsDTO } from './domain/dtos/FeaturedItemsDTO'
68+
export { CollectionSummary } from './domain/models/CollectionSummary'

src/collections/infra/repositories/CollectionsRepository.ts

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ import { ApiConstants } from '../../../core/infra/repositories/ApiConstants'
3838
import { PublicationStatus } from '../../../core/domain/models/PublicationStatus'
3939
import { ReadError } from '../../../core/domain/repositories/ReadError'
4040
import { CollectionLinks } from '../../domain/models/CollectionLinks'
41+
import { CollectionSummary } from '../../domain/models/CollectionSummary'
42+
import { LinkingObjectType } from '../../domain/useCases/GetCollectionsForLinking'
4143

4244
export interface NewCollectionRequestPayload {
4345
alias: string
@@ -93,7 +95,6 @@ export enum GetMyDataCollectionItemsQueryParams {
9395

9496
export class CollectionsRepository extends ApiRepository implements ICollectionsRepository {
9597
private readonly collectionsResourceName: string = 'dataverses'
96-
9798
public async getCollection(
9899
collectionIdOrAlias: number | string = ROOT_COLLECTION_ID
99100
): Promise<Collection> {
@@ -485,4 +486,41 @@ export class CollectionsRepository extends ApiRepository implements ICollections
485486
throw error
486487
})
487488
}
489+
490+
public async getCollectionsForLinking(
491+
objectType: LinkingObjectType,
492+
id: number | string,
493+
searchTerm: string
494+
): Promise<CollectionSummary[]> {
495+
let path: string
496+
const queryParams = new URLSearchParams()
497+
if (objectType === 'collection') {
498+
path = `/${this.collectionsResourceName}/${id}/dataverse/linkingDataverses`
499+
} else {
500+
path = `/${this.collectionsResourceName}/:persistentId/dataset/linkingDataverses`
501+
queryParams.set('persistentId', String(id))
502+
}
503+
504+
if (searchTerm) {
505+
queryParams.set('searchTerm', searchTerm)
506+
}
507+
508+
return this.doGet(path, true, queryParams)
509+
.then((response) => {
510+
const payload = response.data.data as {
511+
id: number
512+
alias: string
513+
name: string
514+
}[]
515+
516+
return payload.map((item) => ({
517+
id: item.id,
518+
alias: item.alias,
519+
displayName: item.name
520+
}))
521+
})
522+
.catch((error) => {
523+
throw error
524+
})
525+
}
488526
}

test/environment/.env

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
POSTGRES_VERSION=17
22
DATAVERSE_DB_USER=dataverse
33
SOLR_VERSION=9.8.0
4-
DATAVERSE_IMAGE_REGISTRY=docker.io
5-
DATAVERSE_IMAGE_TAG=unstable
4+
DATAVERSE_IMAGE_REGISTRY=ghcr.io
5+
DATAVERSE_IMAGE_TAG=11710-find-dataverses-for-linking
66
DATAVERSE_BOOTSTRAP_TIMEOUT=5m

0 commit comments

Comments
 (0)