Skip to content
4 changes: 2 additions & 2 deletions src/collections/domain/models/CollectionItemSubset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ export interface CollectionItemSubset {
items: (CollectionPreview | DatasetPreview | FilePreview)[]
facets: CollectionItemsFacet[]
totalItemCount: number
countPerObjectType: CountPerObjectType
countPerObjectType?: CountPerObjectType
}

export interface CollectionItemsFacet {
Expand All @@ -20,7 +20,7 @@ export interface CollectionItemsFacetLabel {
count: number
}

interface CountPerObjectType {
export interface CountPerObjectType {
collections: number
datasets: number
files: number
Expand Down
17 changes: 17 additions & 0 deletions src/collections/domain/models/MyDataCollectionItemSubset.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { CollectionPreview } from './CollectionPreview'
import { DatasetPreview } from '../../../datasets'
import { FilePreview } from '../../../files'
import { CountPerObjectType } from './CollectionItemSubset'
import { PublicationStatus } from '../../../core/domain/models/PublicationStatus'

export interface MyDataCollectionItemSubset {
items: (CollectionPreview | DatasetPreview | FilePreview)[]
publicationStatusCounts: PublicationStatusCount[]
totalItemCount: number
countPerObjectType: CountPerObjectType
}

export interface PublicationStatusCount {
publicationStatus: PublicationStatus
count: number
}
10 changes: 6 additions & 4 deletions src/collections/domain/repositories/ICollectionsRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ import { Collection } from '../models/Collection'
import { CollectionFacet } from '../models/CollectionFacet'
import { CollectionFeaturedItem } from '../models/CollectionFeaturedItem'
import { CollectionItemSubset } from '../models/CollectionItemSubset'
import { MyDataCollectionItemSubset } from '../models/MyDataCollectionItemSubset'
import { CollectionSearchCriteria } from '../models/CollectionSearchCriteria'
import { CollectionUserPermissions } from '../models/CollectionUserPermissions'
import { PublicationStatus } from '../../../../src/core/domain/models/PublicationStatus'
import { CollectionItemType } from '../../../../src/collections/domain/models/CollectionItemType'
import { PublicationStatus } from '../../../core/domain/models/PublicationStatus'
import { CollectionItemType } from '../../../collections/domain/models/CollectionItemType'

export interface ICollectionsRepository {
getCollection(collectionIdOrAlias: number | string): Promise<Collection>
Expand All @@ -25,7 +26,8 @@ export interface ICollectionsRepository {
collectionId?: string,
limit?: number,
offset?: number,
collectionSearchCriteria?: CollectionSearchCriteria
collectionSearchCriteria?: CollectionSearchCriteria,
showTypeCounts?: boolean
): Promise<CollectionItemSubset>
getMyDataCollectionItems(
roleIds: number[],
Expand All @@ -35,7 +37,7 @@ export interface ICollectionsRepository {
selectedPage?: number,
searchText?: string,
otherUserName?: string
): Promise<CollectionItemSubset>
): Promise<MyDataCollectionItemSubset>
updateCollection(
collectionIdOrAlias: number | string,
updatedCollection: CollectionDTO
Expand Down
7 changes: 5 additions & 2 deletions src/collections/domain/useCases/GetCollectionItems.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,22 @@ export class GetCollectionItems implements UseCase<CollectionItemSubset> {
* @param {number} [limit] - Limit for pagination (optional).
* @param {number} [offset] - Offset for pagination (optional).
* @param {CollectionSearchCriteria} [collectionSearchCriteria] - Supports filtering the collection items by different properties (optional).
* @param {boolean} [showTypeCounts] - If true, the response will include the count per object type (optional).
* @returns {Promise<CollectionItemSubset>}
*/
async execute(
collectionId?: string,
limit?: number,
offset?: number,
collectionSearchCriteria?: CollectionSearchCriteria
collectionSearchCriteria?: CollectionSearchCriteria,
showTypeCounts = false
): Promise<CollectionItemSubset> {
return await this.collectionsRepository.getCollectionItems(
collectionId,
limit,
offset,
collectionSearchCriteria
collectionSearchCriteria,
showTypeCounts
)
}
}
10 changes: 5 additions & 5 deletions src/collections/domain/useCases/GetMyDataCollectionItems.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { UseCase } from '../../../core/domain/useCases/UseCase'
import { CollectionItemSubset } from '../models/CollectionItemSubset'
import { MyDataCollectionItemSubset } from '../models/MyDataCollectionItemSubset'
import { ICollectionsRepository } from '../repositories/ICollectionsRepository'
import { CollectionItemType } from '../../../../src/collections/domain/models/CollectionItemType'
import { PublicationStatus } from '../../../../src/core/domain/models/PublicationStatus'
import { CollectionItemType } from '../../../collections/domain/models/CollectionItemType'
import { PublicationStatus } from '../../../core/domain/models/PublicationStatus'

export class GetMyDataCollectionItems implements UseCase<CollectionItemSubset> {
export class GetMyDataCollectionItems implements UseCase<MyDataCollectionItemSubset> {
private collectionsRepository: ICollectionsRepository

constructor(collectionsRepository: ICollectionsRepository) {
Expand All @@ -31,7 +31,7 @@ export class GetMyDataCollectionItems implements UseCase<CollectionItemSubset> {
selectedPage?: number,
searchText?: string,
otherUserName?: string
): Promise<CollectionItemSubset> {
): Promise<MyDataCollectionItemSubset> {
return this.collectionsRepository.getMyDataCollectionItems(
roleIds,
collectionItemTypes,
Expand Down
15 changes: 10 additions & 5 deletions src/collections/infra/repositories/CollectionsRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { CollectionFacet } from '../../domain/models/CollectionFacet'
import { CollectionUserPermissions } from '../../domain/models/CollectionUserPermissions'
import { transformCollectionUserPermissionsResponseToCollectionUserPermissions } from './transformers/collectionUserPermissionsTransformers'
import { CollectionItemSubset } from '../../domain/models/CollectionItemSubset'
import { MyDataCollectionItemSubset } from '../../domain/models/MyDataCollectionItemSubset'
import {
CollectionSearchCriteria,
OrderType,
Expand All @@ -22,7 +23,7 @@ import { CollectionFeaturedItem } from '../../domain/models/CollectionFeaturedIt
import { transformCollectionFeaturedItemsPayloadToCollectionFeaturedItems } from './transformers/collectionFeaturedItemsTransformer'
import { CollectionFeaturedItemsDTO } from '../../domain/dtos/CollectionFeaturedItemsDTO'
import { ApiConstants } from '../../../core/infra/repositories/ApiConstants'
import { PublicationStatus } from '../../../../src/core/domain/models/PublicationStatus'
import { PublicationStatus } from '../../../core/domain/models/PublicationStatus'
import { ReadError } from '../../../core/domain/repositories/ReadError'

export interface NewCollectionRequestPayload {
Expand Down Expand Up @@ -155,14 +156,14 @@ export class CollectionsRepository extends ApiRepository implements ICollections
collectionId?: string,
limit?: number,
offset?: number,
collectionSearchCriteria?: CollectionSearchCriteria
collectionSearchCriteria?: CollectionSearchCriteria,
showTypeCounts?: boolean
): Promise<CollectionItemSubset> {
const queryParams = new URLSearchParams({
[GetCollectionItemsQueryParams.QUERY]: '*',
[GetCollectionItemsQueryParams.SHOW_FACETS]: 'true',
[GetCollectionItemsQueryParams.SORT]: SortType.DATE,
[GetCollectionItemsQueryParams.ORDER]: OrderType.DESC,
[GetCollectionItemsQueryParams.SHOW_TYPE_COUNTS]: 'true'
[GetCollectionItemsQueryParams.ORDER]: OrderType.DESC
})

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

if (showTypeCounts) {
queryParams.set(GetCollectionItemsQueryParams.SHOW_TYPE_COUNTS, 'true')
}

if (collectionSearchCriteria) {
this.applyCollectionSearchCriteriaToQueryParams(queryParams, collectionSearchCriteria)
}
Expand Down Expand Up @@ -209,7 +214,7 @@ export class CollectionsRepository extends ApiRepository implements ICollections
selectedPage?: number,
searchText?: string,
userIdentifier?: string
): Promise<CollectionItemSubset> {
): Promise<MyDataCollectionItemSubset> {
const queryParams = new URLSearchParams()

if (limit) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import { CollectionFacet } from '../../../domain/models/CollectionFacet'
import { CollectionFacetPayload } from './CollectionFacetPayload'
import {
CollectionItemsFacet,
CollectionItemsFacetLabel,
CollectionItemSubset
CollectionItemSubset,
CountPerObjectType
} from '../../../domain/models/CollectionItemSubset'
import { DatasetPreview } from '../../../../datasets'
import { FilePreview } from '../../../../files'
Expand Down Expand Up @@ -39,7 +39,11 @@ import { MyDataFilePreviewPayload } from '../../../../files/infra/repositories/t
import { MyDataDatasetPreviewPayload } from '../../../../datasets/infra/repositories/transformers/MyDataDatasetPreviewPayload'
import { MyDataCollectionPreviewPayload } from './MyDataCollectionPreviewPayload'
import { MyDataCountPerObjectTypePayload } from './MyDataCountPerObjectTypePayload'
import { MyDataPublicationStatusCountsPayload } from './MyDataPublicationStatusCountsPayload'
import {
MyDataCollectionItemSubset,
PublicationStatusCount
} from '../../../domain/models/MyDataCollectionItemSubset'
import { PublicationStatus } from '../../../../core/domain/models/PublicationStatus'

export const transformCollectionResponseToCollection = (response: AxiosResponse): Collection => {
const collectionPayload = response.data.data
Expand Down Expand Up @@ -98,9 +102,9 @@ export const transformCollectionItemsResponseToCollectionItemSubset = (
const responseDataPayload = response.data.data
const itemsPayload = responseDataPayload.items
const facetsPayload = responseDataPayload.facets as CollectionItemsFacetPayload
const countPerObjectTypePayload = responseDataPayload[
'total_count_per_object_type'
] as CollectionItemsCountPerObjectTypePayload
const countPerObjectTypePayload = responseDataPayload['total_count_per_object_type'] as
| CollectionItemsCountPerObjectTypePayload
| undefined

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

Expand Down Expand Up @@ -133,23 +137,25 @@ export const transformCollectionItemsResponseToCollectionItemSubset = (
})
)

const countPerObjectType = {
collections: countPerObjectTypePayload['Dataverses'],
datasets: countPerObjectTypePayload['Datasets'],
files: countPerObjectTypePayload['Files']
}
const countPerObjectType: CountPerObjectType | undefined = countPerObjectTypePayload
? {
collections: countPerObjectTypePayload['Dataverses'],
datasets: countPerObjectTypePayload['Datasets'],
files: countPerObjectTypePayload['Files']
}
: undefined

return {
items,
facets,
totalItemCount: responseDataPayload.total_count,
countPerObjectType
...(countPerObjectType && { countPerObjectType })
}
}

export const transformMyDataResponseToCollectionItemSubset = (
response: AxiosResponse
): CollectionItemSubset => {
): MyDataCollectionItemSubset => {
const responseDataPayload = response.data.data
const itemsPayload = responseDataPayload.items
const countPerObjectTypePayload = responseDataPayload[
Expand Down Expand Up @@ -188,14 +194,32 @@ export const transformMyDataResponseToCollectionItemSubset = (
datasets: countPerObjectTypePayload['datasets_count'],
files: countPerObjectTypePayload['files_count']
}
const publishingFacet: CollectionItemsFacet = transformPublicationStatusResponseToFacet(
responseDataPayload.pubstatus_counts as MyDataPublicationStatusCountsPayload
)
const facets: CollectionItemsFacet[] = [publishingFacet]

const publicationStatusCounts: PublicationStatusCount[] = [
{
publicationStatus: PublicationStatus.Published,
count: responseDataPayload.pubstatus_counts.published_count
},
{
publicationStatus: PublicationStatus.Unpublished,
count: responseDataPayload.pubstatus_counts.unpublished_count
},
{
publicationStatus: PublicationStatus.Draft,
count: responseDataPayload.pubstatus_counts.draft_count
},
{
publicationStatus: PublicationStatus.InReview,
count: responseDataPayload.pubstatus_counts.in_review_count
},
{
publicationStatus: PublicationStatus.Deaccessioned,
count: responseDataPayload.pubstatus_counts.deaccessioned_count
}
]
return {
items,
facets,
publicationStatusCounts,
totalItemCount: responseDataPayload.pagination.numResults,
countPerObjectType
}
Expand All @@ -209,20 +233,3 @@ const transformContactsPayloadToContacts = (
displayOrder: contactPayload.displayOrder
}))
}

const transformPublicationStatusResponseToFacet = (
publicationStatusCounts: MyDataPublicationStatusCountsPayload
): CollectionItemsFacet => {
const labels: CollectionItemsFacetLabel[] = [
{ name: 'Published', count: publicationStatusCounts.published_count },
{ name: 'Unpublished', count: publicationStatusCounts.unpublished_count },
{ name: 'Draft', count: publicationStatusCounts.draft_count },
{ name: 'In Review', count: publicationStatusCounts.in_review_count },
{ name: 'Deaccessioned', count: publicationStatusCounts.deaccessioned_count }
]
return {
name: 'publicationStatus',
friendlyName: 'Publication Status',
labels
}
}
1 change: 1 addition & 0 deletions src/core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ export { ReadError } from './domain/repositories/ReadError'
export { WriteError } from './domain/repositories/WriteError'
export { ApiConfig } from './infra/repositories/ApiConfig'
export { DvObjectOwnerNode, DvObjectType } from './domain/models/DvObjectOwnerNode'
export { PublicationStatus } from './domain/models/PublicationStatus'
44 changes: 19 additions & 25 deletions test/functional/collections/GetMyDataCollectionItems.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,32 +106,26 @@ describe('execute', () => {
expect(actualCollectionPreview.alias).toBe(testCollectionAlias)

expect(actual.totalItemCount).toBe(1)
expect(actual.facets).toEqual([
expect(actual.publicationStatusCounts).toEqual([
{
name: 'publicationStatus',
friendlyName: 'Publication Status',
labels: [
{
name: 'Published',
count: 0
},
{
name: 'Unpublished',
count: 1
},
{
name: 'Draft',
count: 0
},
{
name: 'In Review',
count: 0
},
{
name: 'Deaccessioned',
count: 0
}
]
publicationStatus: 'Published',
count: 0
},
{
publicationStatus: 'Unpublished',
count: 1
},
{
publicationStatus: 'Draft',
count: 0
},
{
publicationStatus: 'In Review',
count: 0
},
{
publicationStatus: 'Deaccessioned',
count: 0
}
])
expect(actual.countPerObjectType).toEqual({
Expand Down
Loading