Skip to content

Commit 61c784f

Browse files
committed
feat: add GetMyDataCollectionItems use case
1 parent acede5e commit 61c784f

File tree

18 files changed

+585
-9
lines changed

18 files changed

+585
-9
lines changed

src/collections/domain/models/CollectionItemSubset.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,20 @@ export interface CollectionItemSubset {
88
totalItemCount: number
99
countPerObjectType: CountPerObjectType
1010
}
11+
export interface MyDataCollectionItemSubset {
12+
items: (CollectionPreview | DatasetPreview | FilePreview)[]
13+
publishingFacet: CollectionItemsFacetLabel[]
14+
totalItemCount: number
15+
countPerObjectType: CountPerObjectType
16+
}
1117

1218
export interface CollectionItemsFacet {
1319
name: string
1420
friendlyName: string
1521
labels: CollectionItemsFacetLabel[]
1622
}
1723

18-
interface CollectionItemsFacetLabel {
24+
export interface CollectionItemsFacetLabel {
1925
name: string
2026
count: number
2127
}

src/collections/domain/models/CollectionPreview.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ export interface CollectionPreview {
1212
publicationStatuses: PublicationStatus[]
1313
releaseOrCreateDate: Date
1414
imageUrl?: string
15+
userRoles?: string[]
1516
}

src/collections/domain/repositories/ICollectionsRepository.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ import { CollectionFeaturedItemsDTO } from '../dtos/CollectionFeaturedItemsDTO'
33
import { Collection } from '../models/Collection'
44
import { CollectionFacet } from '../models/CollectionFacet'
55
import { CollectionFeaturedItem } from '../models/CollectionFeaturedItem'
6-
import { CollectionItemSubset } from '../models/CollectionItemSubset'
6+
import { CollectionItemSubset, MyDataCollectionItemSubset } from '../models/CollectionItemSubset'
77
import { CollectionSearchCriteria } from '../models/CollectionSearchCriteria'
88
import { CollectionUserPermissions } from '../models/CollectionUserPermissions'
9+
import { CollectionItemType } from '../../../../dist'
10+
import { PublicationStatus } from '../../../../dist/core/domain/models/PublicationStatus'
911

1012
export interface ICollectionsRepository {
1113
getCollection(collectionIdOrAlias: number | string): Promise<Collection>
@@ -25,6 +27,15 @@ export interface ICollectionsRepository {
2527
offset?: number,
2628
collectionSearchCriteria?: CollectionSearchCriteria
2729
): Promise<CollectionItemSubset>
30+
getMyDataCollectionItems(
31+
roleIds: number[],
32+
collectionItemTypes: CollectionItemType[],
33+
publicationStatuses: PublicationStatus[],
34+
limit?: number,
35+
page?: number,
36+
searchText?: string,
37+
otherUserName?: string
38+
): Promise<MyDataCollectionItemSubset>
2839
updateCollection(
2940
collectionIdOrAlias: number | string,
3041
updatedCollection: CollectionDTO
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { MyDataCollectionItemSubset } from '../models/CollectionItemSubset'
3+
import { ICollectionsRepository } from '../repositories/ICollectionsRepository'
4+
import { CollectionItemType } from '../../../../dist'
5+
import { PublicationStatus } from '../../../../dist/core/domain/models/PublicationStatus'
6+
7+
export class GetMyDataCollectionItems implements UseCase<MyDataCollectionItemSubset> {
8+
private collectionsRepository: ICollectionsRepository
9+
10+
constructor(collectionsRepository: ICollectionsRepository) {
11+
this.collectionsRepository = collectionsRepository
12+
}
13+
14+
/**
15+
* Returns an instance of MyDataCollectionItemSubset that contains the items for which the user has the specified role or roles
16+
*
17+
* @param {number[]} [roleIds] - the ids of the roles to filter the items by.
18+
* @param {CollectionItemType[]} [collectionItemTypes] - the types of items to filter by.
19+
* @param {number} [limit] - Limit for pagination (optional).
20+
* @param {number} [offset] - Offset for pagination (optional).
21+
* @param {string} [searchText] - filter by searching for this text in the results
22+
* * @returns {Promise<CollectionItemSubset>}
23+
*/
24+
async execute(
25+
roleIds: number[],
26+
collectionItemTypes: CollectionItemType[],
27+
publicationStatuses: PublicationStatus[],
28+
limit?: number,
29+
offset?: number,
30+
searchText?: string,
31+
otherUserName?: string
32+
): Promise<MyDataCollectionItemSubset> {
33+
return await this.collectionsRepository.getMyDataCollectionItems(
34+
roleIds,
35+
collectionItemTypes,
36+
publicationStatuses,
37+
limit,
38+
offset,
39+
searchText,
40+
otherUserName
41+
)
42+
}
43+
}

src/collections/infra/repositories/CollectionsRepository.ts

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,18 @@ import { ICollectionsRepository } from '../../domain/repositories/ICollectionsRe
33
import {
44
transformCollectionFacetsResponseToCollectionFacets,
55
transformCollectionItemsResponseToCollectionItemSubset,
6-
transformCollectionResponseToCollection
6+
transformCollectionResponseToCollection,
7+
transformMyDataResponseToCollectionItemSubset
78
} from './transformers/collectionTransformers'
89
import { Collection, ROOT_COLLECTION_ID } from '../../domain/models/Collection'
910
import { CollectionDTO } from '../../domain/dtos/CollectionDTO'
1011
import { CollectionFacet } from '../../domain/models/CollectionFacet'
1112
import { CollectionUserPermissions } from '../../domain/models/CollectionUserPermissions'
1213
import { transformCollectionUserPermissionsResponseToCollectionUserPermissions } from './transformers/collectionUserPermissionsTransformers'
13-
import { CollectionItemSubset } from '../../domain/models/CollectionItemSubset'
14+
import {
15+
CollectionItemSubset,
16+
MyDataCollectionItemSubset
17+
} from '../../domain/models/CollectionItemSubset'
1418
import {
1519
CollectionSearchCriteria,
1620
OrderType,
@@ -21,6 +25,7 @@ import { CollectionFeaturedItem } from '../../domain/models/CollectionFeaturedIt
2125
import { transformCollectionFeaturedItemsPayloadToCollectionFeaturedItems } from './transformers/collectionFeaturedItemsTransformer'
2226
import { CollectionFeaturedItemsDTO } from '../../domain/dtos/CollectionFeaturedItemsDTO'
2327
import { ApiConstants } from '../../../core/infra/repositories/ApiConstants'
28+
import { PublicationStatus } from '../../../../dist/core/domain/models/PublicationStatus'
2429

2530
export interface NewCollectionRequestPayload {
2631
alias: string
@@ -63,6 +68,17 @@ export enum GetCollectionItemsQueryParams {
6368
SHOW_TYPE_COUNTS = 'show_type_counts'
6469
}
6570

71+
export enum GetMyDataCollectionItemsQueryParams {
72+
QUERY = 'q',
73+
PER_PAGE = 'per_page',
74+
SELECTED_PAGE = 'selected_page',
75+
ROLE_ID = 'role_ids',
76+
TYPE = 'dvobject_types',
77+
PUBLISHED_STATES = 'published_states',
78+
USER_IDENTIFIER = 'userIdentifier',
79+
SHOW_TYPE_COUNTS = 'show_type_counts'
80+
}
81+
6682
export class CollectionsRepository extends ApiRepository implements ICollectionsRepository {
6783
private readonly collectionsResourceName: string = 'dataverses'
6884

@@ -188,6 +204,67 @@ export class CollectionsRepository extends ApiRepository implements ICollections
188204
})
189205
}
190206

207+
public async getMyDataCollectionItems(
208+
roleIds: number[],
209+
collectionItemTypes: CollectionItemType[],
210+
publicationStatuses: PublicationStatus[],
211+
limit?: number,
212+
page?: number,
213+
searchText?: string,
214+
userIdentifier?: string
215+
): Promise<MyDataCollectionItemSubset> {
216+
const queryParams = new URLSearchParams()
217+
218+
if (limit) {
219+
queryParams.set(GetMyDataCollectionItemsQueryParams.PER_PAGE, limit.toString())
220+
}
221+
222+
if (page) {
223+
queryParams.set(GetMyDataCollectionItemsQueryParams.SELECTED_PAGE, page.toString())
224+
}
225+
226+
if (searchText) {
227+
queryParams.set(GetMyDataCollectionItemsQueryParams.QUERY, encodeURIComponent(searchText))
228+
}
229+
230+
roleIds.forEach((roleId) => {
231+
queryParams.append(GetMyDataCollectionItemsQueryParams.ROLE_ID, roleId.toString())
232+
})
233+
if (userIdentifier) {
234+
queryParams.set(GetMyDataCollectionItemsQueryParams.USER_IDENTIFIER, userIdentifier)
235+
}
236+
237+
collectionItemTypes.forEach((itemType) => {
238+
let mappedItemType: string
239+
240+
switch (itemType) {
241+
case CollectionItemType.COLLECTION:
242+
mappedItemType = 'Dataverse'
243+
break
244+
case CollectionItemType.DATASET:
245+
mappedItemType = 'Dataset'
246+
break
247+
case CollectionItemType.FILE:
248+
mappedItemType = 'DataFile'
249+
break
250+
}
251+
queryParams.append(GetMyDataCollectionItemsQueryParams.TYPE, mappedItemType)
252+
})
253+
254+
publicationStatuses.forEach((publicationStatus) => {
255+
queryParams.append(
256+
GetMyDataCollectionItemsQueryParams.PUBLISHED_STATES,
257+
publicationStatus.toString()
258+
)
259+
})
260+
261+
return this.doGet('/retrieve', true, queryParams)
262+
.then((response) => transformMyDataResponseToCollectionItemSubset(response))
263+
.catch((error) => {
264+
throw error
265+
})
266+
}
267+
191268
private createCreateOrUpdateRequestBody(
192269
collectionDTO: CollectionDTO
193270
): NewCollectionRequestPayload {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
export interface MyDataCollectionPreviewPayload {
2+
name: string
3+
parentDataverseName: string
4+
identifier: string
5+
parentDataverseIdentifier: string
6+
url: string
7+
image_url: string
8+
description: string
9+
type?: string
10+
publicationStatuses: string[]
11+
affiliation: string
12+
published_at: string
13+
user_roles: string[]
14+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export interface MyDataCountPerObjectTypePayload {
2+
dataverses_count: number
3+
datasets_count: number
4+
files_count: number
5+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export interface MyDataPublicationStatusCountsPayload {
2+
deaccessioned_count: number
3+
draft_count: number
4+
in_review_count: number
5+
published_count: number
6+
unpublished_count: number
7+
}

src/collections/infra/repositories/transformers/collectionPreviewsTransformers.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { PublicationStatus } from '../../../../core/domain/models/PublicationSta
22
import { CollectionItemType } from '../../../../collections/domain/models/CollectionItemType'
33
import { CollectionPreview } from '../../../domain/models/CollectionPreview'
44
import { CollectionPreviewPayload } from './CollectionPreviewPayload'
5+
import { MyDataCollectionPreviewPayload } from './MyDataCollectionPreviewPayload'
56

67
export const transformCollectionPreviewPayloadToCollectionPreview = (
78
collectionPreviewPayload: CollectionPreviewPayload
@@ -25,3 +26,27 @@ export const transformCollectionPreviewPayloadToCollectionPreview = (
2526
releaseOrCreateDate: new Date(collectionPreviewPayload.published_at)
2627
}
2728
}
29+
30+
export const transformMyDataCollectionPreviewPayloadToCollectionPreview = (
31+
collectionPreviewPayload: MyDataCollectionPreviewPayload
32+
): CollectionPreview => {
33+
const publicationStatuses: PublicationStatus[] = []
34+
collectionPreviewPayload.publicationStatuses.forEach((element) => {
35+
publicationStatuses.push(element as unknown as PublicationStatus)
36+
})
37+
return {
38+
type: CollectionItemType.COLLECTION,
39+
name: collectionPreviewPayload.name,
40+
parentName: collectionPreviewPayload.parentDataverseName,
41+
alias: collectionPreviewPayload.identifier,
42+
parentAlias: collectionPreviewPayload.parentDataverseIdentifier,
43+
description: collectionPreviewPayload.description,
44+
publicationStatuses: publicationStatuses,
45+
affiliation: collectionPreviewPayload.affiliation,
46+
...(collectionPreviewPayload.image_url && {
47+
imageUrl: collectionPreviewPayload.image_url
48+
}),
49+
releaseOrCreateDate: new Date(collectionPreviewPayload.published_at),
50+
userRoles: collectionPreviewPayload.user_roles
51+
}
52+
}

src/collections/infra/repositories/transformers/collectionTransformers.ts

Lines changed: 85 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,37 @@ import { CollectionFacet } from '../../../domain/models/CollectionFacet'
1010
import { CollectionFacetPayload } from './CollectionFacetPayload'
1111
import {
1212
CollectionItemsFacet,
13-
CollectionItemSubset
13+
CollectionItemsFacetLabel,
14+
CollectionItemSubset,
15+
MyDataCollectionItemSubset
1416
} from '../../../domain/models/CollectionItemSubset'
1517
import { DatasetPreview } from '../../../../datasets'
1618
import { FilePreview } from '../../../../files'
1719
import { DatasetPreviewPayload } from '../../../../datasets/infra/repositories/transformers/DatasetPreviewPayload'
1820
import { FilePreviewPayload } from '../../../../files/infra/repositories/transformers/FilePreviewPayload'
19-
import { transformDatasetPreviewPayloadToDatasetPreview } from '../../../../datasets/infra/repositories/transformers/datasetPreviewsTransformers'
20-
import { transformFilePreviewPayloadToFilePreview } from '../../../../files/infra/repositories/transformers/filePreviewTransformers'
21-
import { transformCollectionPreviewPayloadToCollectionPreview } from './collectionPreviewsTransformers'
21+
import {
22+
transformDatasetPreviewPayloadToDatasetPreview,
23+
transformMyDataDatasetPreviewPayloadToDatasetPreview
24+
} from '../../../../datasets/infra/repositories/transformers/datasetPreviewsTransformers'
25+
import {
26+
transformFilePreviewPayloadToFilePreview,
27+
transformMyDataFilePreviewPayloadToFilePreview
28+
} from '../../../../files/infra/repositories/transformers/filePreviewTransformers'
29+
import {
30+
transformCollectionPreviewPayloadToCollectionPreview,
31+
transformMyDataCollectionPreviewPayloadToCollectionPreview
32+
} from './collectionPreviewsTransformers'
2233
import { CollectionPreviewPayload } from './CollectionPreviewPayload'
2334
import { CollectionPreview } from '../../../domain/models/CollectionPreview'
2435
import { CollectionContact } from '../../../domain/models/CollectionContact'
2536
import { CollectionType } from '../../../domain/models/CollectionType'
2637
import { CollectionItemsFacetPayload } from './CollectionItemsFacetsPayload'
2738
import { CollectionItemsCountPerObjectTypePayload } from './CollectionItemsCountPerObjectTypePayload'
39+
import { MyDataFilePreviewPayload } from '../../../../files/infra/repositories/transformers/MyDataFilePreviewPayload'
40+
import { MyDataDatasetPreviewPayload } from '../../../../datasets/infra/repositories/transformers/MyDataDatasetPreviewPayload'
41+
import { MyDataCollectionPreviewPayload } from './MyDataCollectionPreviewPayload'
42+
import { MyDataCountPerObjectTypePayload } from './MyDataCountPerObjectTypePayload'
43+
import { MyDataPublicationStatusCountsPayload } from './MyDataPublicationStatusCountsPayload'
2844

2945
export const transformCollectionResponseToCollection = (response: AxiosResponse): Collection => {
3046
const collectionPayload = response.data.data
@@ -132,6 +148,59 @@ export const transformCollectionItemsResponseToCollectionItemSubset = (
132148
}
133149
}
134150

151+
export const transformMyDataResponseToCollectionItemSubset = (
152+
response: AxiosResponse
153+
): MyDataCollectionItemSubset => {
154+
const responseDataPayload = response.data.data
155+
const itemsPayload = responseDataPayload.items
156+
const countPerObjectTypePayload = responseDataPayload[
157+
'dvobject_counts'
158+
] as MyDataCountPerObjectTypePayload
159+
160+
const items: (DatasetPreview | FilePreview | CollectionPreview)[] = []
161+
162+
itemsPayload.forEach(function (
163+
itemPayload:
164+
| MyDataCollectionPreviewPayload
165+
| MyDataDatasetPreviewPayload
166+
| MyDataFilePreviewPayload
167+
) {
168+
if (itemPayload.type === 'file') {
169+
items.push(
170+
transformMyDataFilePreviewPayloadToFilePreview(itemPayload as MyDataFilePreviewPayload)
171+
)
172+
} else if (itemPayload.type === 'dataset') {
173+
items.push(
174+
transformMyDataDatasetPreviewPayloadToDatasetPreview(
175+
itemPayload as MyDataDatasetPreviewPayload
176+
)
177+
)
178+
} else if (itemPayload.type === 'dataverse') {
179+
items.push(
180+
transformMyDataCollectionPreviewPayloadToCollectionPreview(
181+
itemPayload as unknown as MyDataCollectionPreviewPayload
182+
)
183+
)
184+
}
185+
})
186+
187+
const countPerObjectType = {
188+
dataverses: countPerObjectTypePayload['dataverses_count'],
189+
datasets: countPerObjectTypePayload['datasets_count'],
190+
files: countPerObjectTypePayload['files_count']
191+
}
192+
const publishingFacet: CollectionItemsFacetLabel[] = transformPublicationStatusResponseToLabels(
193+
responseDataPayload.pubstatus_counts as MyDataPublicationStatusCountsPayload
194+
)
195+
196+
return {
197+
items,
198+
publishingFacet,
199+
totalItemCount: responseDataPayload.pagination.numResults,
200+
countPerObjectType
201+
}
202+
}
203+
135204
const transformContactsPayloadToContacts = (
136205
contactsPayload: CollectionContactPayload[]
137206
): CollectionContact[] => {
@@ -140,3 +209,15 @@ const transformContactsPayloadToContacts = (
140209
displayOrder: contactPayload.displayOrder
141210
}))
142211
}
212+
213+
const transformPublicationStatusResponseToLabels = (
214+
publicationStatusCounts: MyDataPublicationStatusCountsPayload
215+
): CollectionItemsFacetLabel[] => {
216+
const labels: CollectionItemsFacetLabel[] = []
217+
labels.push({ name: 'Published', count: publicationStatusCounts.published_count })
218+
labels.push({ name: 'Unpublished', count: publicationStatusCounts.unpublished_count })
219+
labels.push({ name: 'Draft ', count: publicationStatusCounts.draft_count })
220+
labels.push({ name: 'In Review', count: publicationStatusCounts.in_review_count })
221+
labels.push({ name: 'Deaccessioned', count: publicationStatusCounts.deaccessioned_count })
222+
return labels
223+
}

0 commit comments

Comments
 (0)