Skip to content

Commit 05f7d3f

Browse files
authored
Merge pull request #313 from IQSS/304-mydata-collection-items-return-type
Change return type of getMyDataCollectionItems use case
2 parents 68315ed + 1839da5 commit 05f7d3f

File tree

12 files changed

+201
-195
lines changed

12 files changed

+201
-195
lines changed

src/collections/domain/models/CollectionItemSubset.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ export interface CollectionItemSubset {
66
items: (CollectionPreview | DatasetPreview | FilePreview)[]
77
facets: CollectionItemsFacet[]
88
totalItemCount: number
9-
countPerObjectType: CountPerObjectType
9+
countPerObjectType?: CountPerObjectType
1010
}
1111

1212
export interface CollectionItemsFacet {
@@ -20,7 +20,7 @@ export interface CollectionItemsFacetLabel {
2020
count: number
2121
}
2222

23-
interface CountPerObjectType {
23+
export interface CountPerObjectType {
2424
collections: number
2525
datasets: number
2626
files: number
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { CollectionPreview } from './CollectionPreview'
2+
import { DatasetPreview } from '../../../datasets'
3+
import { FilePreview } from '../../../files'
4+
import { CountPerObjectType } from './CollectionItemSubset'
5+
import { PublicationStatus } from '../../../core/domain/models/PublicationStatus'
6+
7+
export interface MyDataCollectionItemSubset {
8+
items: (CollectionPreview | DatasetPreview | FilePreview)[]
9+
publicationStatusCounts: PublicationStatusCount[]
10+
totalItemCount: number
11+
countPerObjectType: CountPerObjectType
12+
}
13+
14+
export interface PublicationStatusCount {
15+
publicationStatus: PublicationStatus
16+
count: number
17+
}

src/collections/domain/repositories/ICollectionsRepository.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ import { Collection } from '../models/Collection'
44
import { CollectionFacet } from '../models/CollectionFacet'
55
import { CollectionFeaturedItem } from '../models/CollectionFeaturedItem'
66
import { CollectionItemSubset } from '../models/CollectionItemSubset'
7+
import { MyDataCollectionItemSubset } from '../models/MyDataCollectionItemSubset'
78
import { CollectionSearchCriteria } from '../models/CollectionSearchCriteria'
89
import { CollectionUserPermissions } from '../models/CollectionUserPermissions'
9-
import { PublicationStatus } from '../../../../src/core/domain/models/PublicationStatus'
10-
import { CollectionItemType } from '../../../../src/collections/domain/models/CollectionItemType'
10+
import { PublicationStatus } from '../../../core/domain/models/PublicationStatus'
11+
import { CollectionItemType } from '../../../collections/domain/models/CollectionItemType'
1112

1213
export interface ICollectionsRepository {
1314
getCollection(collectionIdOrAlias: number | string): Promise<Collection>
@@ -25,7 +26,8 @@ export interface ICollectionsRepository {
2526
collectionId?: string,
2627
limit?: number,
2728
offset?: number,
28-
collectionSearchCriteria?: CollectionSearchCriteria
29+
collectionSearchCriteria?: CollectionSearchCriteria,
30+
showTypeCounts?: boolean
2931
): Promise<CollectionItemSubset>
3032
getMyDataCollectionItems(
3133
roleIds: number[],
@@ -35,7 +37,7 @@ export interface ICollectionsRepository {
3537
selectedPage?: number,
3638
searchText?: string,
3739
otherUserName?: string
38-
): Promise<CollectionItemSubset>
40+
): Promise<MyDataCollectionItemSubset>
3941
updateCollection(
4042
collectionIdOrAlias: number | string,
4143
updatedCollection: CollectionDTO

src/collections/domain/useCases/GetCollectionItems.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,22 @@ export class GetCollectionItems implements UseCase<CollectionItemSubset> {
1818
* @param {number} [limit] - Limit for pagination (optional).
1919
* @param {number} [offset] - Offset for pagination (optional).
2020
* @param {CollectionSearchCriteria} [collectionSearchCriteria] - Supports filtering the collection items by different properties (optional).
21+
* @param {boolean} [showTypeCounts] - If true, the response will include the count per object type (optional).
2122
* @returns {Promise<CollectionItemSubset>}
2223
*/
2324
async execute(
2425
collectionId?: string,
2526
limit?: number,
2627
offset?: number,
27-
collectionSearchCriteria?: CollectionSearchCriteria
28+
collectionSearchCriteria?: CollectionSearchCriteria,
29+
showTypeCounts = false
2830
): Promise<CollectionItemSubset> {
2931
return await this.collectionsRepository.getCollectionItems(
3032
collectionId,
3133
limit,
3234
offset,
33-
collectionSearchCriteria
35+
collectionSearchCriteria,
36+
showTypeCounts
3437
)
3538
}
3639
}

src/collections/domain/useCases/GetMyDataCollectionItems.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import { UseCase } from '../../../core/domain/useCases/UseCase'
2-
import { CollectionItemSubset } from '../models/CollectionItemSubset'
2+
import { MyDataCollectionItemSubset } from '../models/MyDataCollectionItemSubset'
33
import { ICollectionsRepository } from '../repositories/ICollectionsRepository'
4-
import { CollectionItemType } from '../../../../src/collections/domain/models/CollectionItemType'
5-
import { PublicationStatus } from '../../../../src/core/domain/models/PublicationStatus'
4+
import { CollectionItemType } from '../../../collections/domain/models/CollectionItemType'
5+
import { PublicationStatus } from '../../../core/domain/models/PublicationStatus'
66

7-
export class GetMyDataCollectionItems implements UseCase<CollectionItemSubset> {
7+
export class GetMyDataCollectionItems implements UseCase<MyDataCollectionItemSubset> {
88
private collectionsRepository: ICollectionsRepository
99

1010
constructor(collectionsRepository: ICollectionsRepository) {
@@ -31,7 +31,7 @@ export class GetMyDataCollectionItems implements UseCase<CollectionItemSubset> {
3131
selectedPage?: number,
3232
searchText?: string,
3333
otherUserName?: string
34-
): Promise<CollectionItemSubset> {
34+
): Promise<MyDataCollectionItemSubset> {
3535
return this.collectionsRepository.getMyDataCollectionItems(
3636
roleIds,
3737
collectionItemTypes,

src/collections/infra/repositories/CollectionsRepository.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { CollectionFacet } from '../../domain/models/CollectionFacet'
1212
import { CollectionUserPermissions } from '../../domain/models/CollectionUserPermissions'
1313
import { transformCollectionUserPermissionsResponseToCollectionUserPermissions } from './transformers/collectionUserPermissionsTransformers'
1414
import { CollectionItemSubset } from '../../domain/models/CollectionItemSubset'
15+
import { MyDataCollectionItemSubset } from '../../domain/models/MyDataCollectionItemSubset'
1516
import {
1617
CollectionSearchCriteria,
1718
OrderType,
@@ -22,7 +23,7 @@ import { CollectionFeaturedItem } from '../../domain/models/CollectionFeaturedIt
2223
import { transformCollectionFeaturedItemsPayloadToCollectionFeaturedItems } from './transformers/collectionFeaturedItemsTransformer'
2324
import { CollectionFeaturedItemsDTO } from '../../domain/dtos/CollectionFeaturedItemsDTO'
2425
import { ApiConstants } from '../../../core/infra/repositories/ApiConstants'
25-
import { PublicationStatus } from '../../../../src/core/domain/models/PublicationStatus'
26+
import { PublicationStatus } from '../../../core/domain/models/PublicationStatus'
2627
import { ReadError } from '../../../core/domain/repositories/ReadError'
2728

2829
export interface NewCollectionRequestPayload {
@@ -155,14 +156,14 @@ export class CollectionsRepository extends ApiRepository implements ICollections
155156
collectionId?: string,
156157
limit?: number,
157158
offset?: number,
158-
collectionSearchCriteria?: CollectionSearchCriteria
159+
collectionSearchCriteria?: CollectionSearchCriteria,
160+
showTypeCounts?: boolean
159161
): Promise<CollectionItemSubset> {
160162
const queryParams = new URLSearchParams({
161163
[GetCollectionItemsQueryParams.QUERY]: '*',
162164
[GetCollectionItemsQueryParams.SHOW_FACETS]: 'true',
163165
[GetCollectionItemsQueryParams.SORT]: SortType.DATE,
164-
[GetCollectionItemsQueryParams.ORDER]: OrderType.DESC,
165-
[GetCollectionItemsQueryParams.SHOW_TYPE_COUNTS]: 'true'
166+
[GetCollectionItemsQueryParams.ORDER]: OrderType.DESC
166167
})
167168

168169
if (collectionId) {
@@ -177,6 +178,10 @@ export class CollectionsRepository extends ApiRepository implements ICollections
177178
queryParams.set(GetCollectionItemsQueryParams.START, offset.toString())
178179
}
179180

181+
if (showTypeCounts) {
182+
queryParams.set(GetCollectionItemsQueryParams.SHOW_TYPE_COUNTS, 'true')
183+
}
184+
180185
if (collectionSearchCriteria) {
181186
this.applyCollectionSearchCriteriaToQueryParams(queryParams, collectionSearchCriteria)
182187
}
@@ -209,7 +214,7 @@ export class CollectionsRepository extends ApiRepository implements ICollections
209214
selectedPage?: number,
210215
searchText?: string,
211216
userIdentifier?: string
212-
): Promise<CollectionItemSubset> {
217+
): Promise<MyDataCollectionItemSubset> {
213218
const queryParams = new URLSearchParams()
214219

215220
if (limit) {

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

Lines changed: 42 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import { CollectionFacet } from '../../../domain/models/CollectionFacet'
1010
import { CollectionFacetPayload } from './CollectionFacetPayload'
1111
import {
1212
CollectionItemsFacet,
13-
CollectionItemsFacetLabel,
14-
CollectionItemSubset
13+
CollectionItemSubset,
14+
CountPerObjectType
1515
} from '../../../domain/models/CollectionItemSubset'
1616
import { DatasetPreview } from '../../../../datasets'
1717
import { FilePreview } from '../../../../files'
@@ -39,7 +39,11 @@ import { MyDataFilePreviewPayload } from '../../../../files/infra/repositories/t
3939
import { MyDataDatasetPreviewPayload } from '../../../../datasets/infra/repositories/transformers/MyDataDatasetPreviewPayload'
4040
import { MyDataCollectionPreviewPayload } from './MyDataCollectionPreviewPayload'
4141
import { MyDataCountPerObjectTypePayload } from './MyDataCountPerObjectTypePayload'
42-
import { MyDataPublicationStatusCountsPayload } from './MyDataPublicationStatusCountsPayload'
42+
import {
43+
MyDataCollectionItemSubset,
44+
PublicationStatusCount
45+
} from '../../../domain/models/MyDataCollectionItemSubset'
46+
import { PublicationStatus } from '../../../../core/domain/models/PublicationStatus'
4347

4448
export const transformCollectionResponseToCollection = (response: AxiosResponse): Collection => {
4549
const collectionPayload = response.data.data
@@ -98,9 +102,9 @@ export const transformCollectionItemsResponseToCollectionItemSubset = (
98102
const responseDataPayload = response.data.data
99103
const itemsPayload = responseDataPayload.items
100104
const facetsPayload = responseDataPayload.facets as CollectionItemsFacetPayload
101-
const countPerObjectTypePayload = responseDataPayload[
102-
'total_count_per_object_type'
103-
] as CollectionItemsCountPerObjectTypePayload
105+
const countPerObjectTypePayload = responseDataPayload['total_count_per_object_type'] as
106+
| CollectionItemsCountPerObjectTypePayload
107+
| undefined
104108

105109
const items: (DatasetPreview | FilePreview | CollectionPreview)[] = []
106110

@@ -133,23 +137,25 @@ export const transformCollectionItemsResponseToCollectionItemSubset = (
133137
})
134138
)
135139

136-
const countPerObjectType = {
137-
collections: countPerObjectTypePayload['Dataverses'],
138-
datasets: countPerObjectTypePayload['Datasets'],
139-
files: countPerObjectTypePayload['Files']
140-
}
140+
const countPerObjectType: CountPerObjectType | undefined = countPerObjectTypePayload
141+
? {
142+
collections: countPerObjectTypePayload['Dataverses'],
143+
datasets: countPerObjectTypePayload['Datasets'],
144+
files: countPerObjectTypePayload['Files']
145+
}
146+
: undefined
141147

142148
return {
143149
items,
144150
facets,
145151
totalItemCount: responseDataPayload.total_count,
146-
countPerObjectType
152+
...(countPerObjectType && { countPerObjectType })
147153
}
148154
}
149155

150156
export const transformMyDataResponseToCollectionItemSubset = (
151157
response: AxiosResponse
152-
): CollectionItemSubset => {
158+
): MyDataCollectionItemSubset => {
153159
const responseDataPayload = response.data.data
154160
const itemsPayload = responseDataPayload.items
155161
const countPerObjectTypePayload = responseDataPayload[
@@ -188,14 +194,32 @@ export const transformMyDataResponseToCollectionItemSubset = (
188194
datasets: countPerObjectTypePayload['datasets_count'],
189195
files: countPerObjectTypePayload['files_count']
190196
}
191-
const publishingFacet: CollectionItemsFacet = transformPublicationStatusResponseToFacet(
192-
responseDataPayload.pubstatus_counts as MyDataPublicationStatusCountsPayload
193-
)
194-
const facets: CollectionItemsFacet[] = [publishingFacet]
195197

198+
const publicationStatusCounts: PublicationStatusCount[] = [
199+
{
200+
publicationStatus: PublicationStatus.Published,
201+
count: responseDataPayload.pubstatus_counts.published_count
202+
},
203+
{
204+
publicationStatus: PublicationStatus.Unpublished,
205+
count: responseDataPayload.pubstatus_counts.unpublished_count
206+
},
207+
{
208+
publicationStatus: PublicationStatus.Draft,
209+
count: responseDataPayload.pubstatus_counts.draft_count
210+
},
211+
{
212+
publicationStatus: PublicationStatus.InReview,
213+
count: responseDataPayload.pubstatus_counts.in_review_count
214+
},
215+
{
216+
publicationStatus: PublicationStatus.Deaccessioned,
217+
count: responseDataPayload.pubstatus_counts.deaccessioned_count
218+
}
219+
]
196220
return {
197221
items,
198-
facets,
222+
publicationStatusCounts,
199223
totalItemCount: responseDataPayload.pagination.numResults,
200224
countPerObjectType
201225
}
@@ -209,20 +233,3 @@ const transformContactsPayloadToContacts = (
209233
displayOrder: contactPayload.displayOrder
210234
}))
211235
}
212-
213-
const transformPublicationStatusResponseToFacet = (
214-
publicationStatusCounts: MyDataPublicationStatusCountsPayload
215-
): CollectionItemsFacet => {
216-
const labels: CollectionItemsFacetLabel[] = [
217-
{ name: 'Published', count: publicationStatusCounts.published_count },
218-
{ name: 'Unpublished', count: publicationStatusCounts.unpublished_count },
219-
{ name: 'Draft', count: publicationStatusCounts.draft_count },
220-
{ name: 'In Review', count: publicationStatusCounts.in_review_count },
221-
{ name: 'Deaccessioned', count: publicationStatusCounts.deaccessioned_count }
222-
]
223-
return {
224-
name: 'publicationStatus',
225-
friendlyName: 'Publication Status',
226-
labels
227-
}
228-
}

src/core/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ export { ReadError } from './domain/repositories/ReadError'
22
export { WriteError } from './domain/repositories/WriteError'
33
export { ApiConfig } from './infra/repositories/ApiConfig'
44
export { DvObjectOwnerNode, DvObjectType } from './domain/models/DvObjectOwnerNode'
5+
export { PublicationStatus } from './domain/models/PublicationStatus'

test/functional/collections/GetMyDataCollectionItems.test.ts

Lines changed: 19 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -106,32 +106,26 @@ describe('execute', () => {
106106
expect(actualCollectionPreview.alias).toBe(testCollectionAlias)
107107

108108
expect(actual.totalItemCount).toBe(1)
109-
expect(actual.facets).toEqual([
109+
expect(actual.publicationStatusCounts).toEqual([
110110
{
111-
name: 'publicationStatus',
112-
friendlyName: 'Publication Status',
113-
labels: [
114-
{
115-
name: 'Published',
116-
count: 0
117-
},
118-
{
119-
name: 'Unpublished',
120-
count: 1
121-
},
122-
{
123-
name: 'Draft',
124-
count: 0
125-
},
126-
{
127-
name: 'In Review',
128-
count: 0
129-
},
130-
{
131-
name: 'Deaccessioned',
132-
count: 0
133-
}
134-
]
111+
publicationStatus: 'Published',
112+
count: 0
113+
},
114+
{
115+
publicationStatus: 'Unpublished',
116+
count: 1
117+
},
118+
{
119+
publicationStatus: 'Draft',
120+
count: 0
121+
},
122+
{
123+
publicationStatus: 'In Review',
124+
count: 0
125+
},
126+
{
127+
publicationStatus: 'Deaccessioned',
128+
count: 0
135129
}
136130
])
137131
expect(actual.countPerObjectType).toEqual({

0 commit comments

Comments
 (0)