Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions docs/useCases.md
Original file line number Diff line number Diff line change
Expand Up @@ -423,6 +423,12 @@ This use case supports the following optional parameters depending on the search
- **selectedPage**: (number) the page of results to be returned. (default is 1)
- **searchText** is an optional string to filter the results by.
- **otherUserName** is an optional string to return the collection items of another user. If not set, the calling user will be used. _Only superusers can use this parameter_.
- **showCollections**: If true, dataset results will include a `collections` array containing [CollectionSummary](../src/collections/domain/models/CollectionSummary.ts) objects for their collections (Optional).
- **metadataFields**: A list of metadata fields to include in dataset results. Each value must use the `metadata_block_name:field_name` format (Optional).
- **keepRawFields**: If true, metadata field values are returned without Markdown transformation (Optional).
- **filterQueries**: A list of simple `key:value` filters or a single complete filter expression. A single string is sent unchanged and may contain parentheses, `AND`/`OR`, wildcards, ranges, and other search syntax (Optional).
- **sort**: The field by which to sort the results (Optional).
- **order**: The sort order, either ascending or descending (Optional).

The `CollectionItemSubset`returned instance contains a property called `totalItemCount` which is necessary for pagination.

Expand Down
10 changes: 8 additions & 2 deletions src/collections/domain/repositories/ICollectionsRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { CollectionFacet } from '../models/CollectionFacet'
import { FeaturedItem } from '../models/FeaturedItem'
import { CollectionItemSubset } from '../models/CollectionItemSubset'
import { MyDataCollectionItemSubset } from '../models/MyDataCollectionItemSubset'
import { CollectionSearchCriteria } from '../models/CollectionSearchCriteria'
import { CollectionSearchCriteria, OrderType, SortType } from '../models/CollectionSearchCriteria'
import { CollectionUserPermissions } from '../models/CollectionUserPermissions'
import { PublicationStatus } from '../../../core/domain/models/PublicationStatus'
import { CollectionItemType } from '../../../collections/domain/models/CollectionItemType'
Expand Down Expand Up @@ -59,7 +59,13 @@ export interface ICollectionsRepository {
limit?: number,
selectedPage?: number,
searchText?: string,
otherUserName?: string
otherUserName?: string,
showCollections?: boolean,
metadataFields?: `${string}:${string}`[],
keepRawFields?: boolean,
filterQueries?: string | string[],
sort?: SortType,
order?: OrderType
): Promise<MyDataCollectionItemSubset>
updateCollection(
collectionIdOrAlias: number | string,
Expand Down
23 changes: 21 additions & 2 deletions src/collections/domain/useCases/GetMyDataCollectionItems.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { MyDataCollectionItemSubset } from '../models/MyDataCollectionItemSubset
import { ICollectionsRepository } from '../repositories/ICollectionsRepository'
import { CollectionItemType } from '../../../collections/domain/models/CollectionItemType'
import { PublicationStatus } from '../../../core/domain/models/PublicationStatus'
import { OrderType, SortType } from '../models/CollectionSearchCriteria'

export class GetMyDataCollectionItems implements UseCase<MyDataCollectionItemSubset> {
private collectionsRepository: ICollectionsRepository
Expand All @@ -21,6 +22,12 @@ export class GetMyDataCollectionItems implements UseCase<MyDataCollectionItemSub
* @param {number} [selectedPage] - Offset (starting point) for pagination (optional).
* @param {string} [searchText] - filter by searching for this text in the results (optional).
* @param {string} [otherUserName] - filter by searching for this text in the results (optional).
* @param {boolean} [showCollections] - If true, dataset results will include the collections they belong to (optional).
* @param {`${string}:${string}`} [metadataFields] - Metadata fields to include in dataset results (optional).
* @param {boolean} [keepRawFields] - If true, metadata field values will not be transformed to Markdown (optional).
* @param {string | string[]} [filterQueries] - A simple filter query list or a complete raw filter expression (optional).
* @param {SortType} [sort] - The field by which to sort the results (optional).
* @param {OrderType} [order] - The sort order (optional).
* * @returns {Promise<CollectionItemSubset>}
*/
async execute(
Expand All @@ -30,7 +37,13 @@ export class GetMyDataCollectionItems implements UseCase<MyDataCollectionItemSub
limit?: number,
selectedPage?: number,
searchText?: string,
otherUserName?: string
otherUserName?: string,
showCollections = false,
metadataFields?: `${string}:${string}`[],
keepRawFields = false,
filterQueries?: string | string[],
sort?: SortType,
order?: OrderType
): Promise<MyDataCollectionItemSubset> {
return this.collectionsRepository.getMyDataCollectionItems(
roleIds,
Expand All @@ -39,7 +52,13 @@ export class GetMyDataCollectionItems implements UseCase<MyDataCollectionItemSub
limit,
selectedPage,
searchText,
otherUserName
otherUserName,
showCollections,
metadataFields,
keepRawFields,
filterQueries,
sort,
order
)
}
}
50 changes: 46 additions & 4 deletions src/collections/infra/repositories/CollectionsRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,12 @@ export enum GetMyDataCollectionItemsQueryParams {
ROLE_ID = 'role_ids',
TYPE = 'dvobject_types',
PUBLISHED_STATES = 'published_states',
USER_IDENTIFIER = 'userIdentifier'
USER_IDENTIFIER = 'userIdentifier',
SHOW_COLLECTIONS = 'show_collections',
METADATA_FIELDS = 'metadata_fields',
FILTERQUERY = 'fq',
SORT = 'sort',
ORDER = 'order'
}

export class CollectionsRepository extends ApiRepository implements ICollectionsRepository {
Expand Down Expand Up @@ -306,7 +311,13 @@ export class CollectionsRepository extends ApiRepository implements ICollections
limit?: number,
selectedPage?: number,
searchText?: string,
userIdentifier?: string
userIdentifier?: string,
showCollections?: boolean,
metadataFields?: `${string}:${string}`[],
keepRawFields = false,
filterQueries?: string | string[],
sort?: SortType,
order?: OrderType
): Promise<MyDataCollectionItemSubset> {
const queryParams = new URLSearchParams()

Expand All @@ -329,6 +340,26 @@ export class CollectionsRepository extends ApiRepository implements ICollections
queryParams.set(GetMyDataCollectionItemsQueryParams.USER_IDENTIFIER, userIdentifier)
}

if (showCollections) {
queryParams.set(GetMyDataCollectionItemsQueryParams.SHOW_COLLECTIONS, 'true')
}

metadataFields?.forEach((metadataField) => {
queryParams.append(GetMyDataCollectionItemsQueryParams.METADATA_FIELDS, metadataField)
})

if (filterQueries) {
this.applyFilterQueriesToQueryParams(queryParams, filterQueries)
}

if (sort) {
queryParams.set(GetMyDataCollectionItemsQueryParams.SORT, sort)
}

if (order) {
queryParams.set(GetMyDataCollectionItemsQueryParams.ORDER, order)
}

collectionItemTypes.forEach((itemType) => {
let mappedItemType: string

Expand Down Expand Up @@ -357,7 +388,7 @@ export class CollectionsRepository extends ApiRepository implements ICollections
if (response.data.success !== true) {
throw new ReadError(response.data.error_message)
}
return transformMyDataResponseToCollectionItemSubset(response)
return transformMyDataResponseToCollectionItemSubset(response, keepRawFields)
})
.catch((error) => {
throw error
Expand Down Expand Up @@ -510,7 +541,18 @@ export class CollectionsRepository extends ApiRepository implements ICollections
}

if (collectionSearchCriteria?.filterQueries) {
collectionSearchCriteria.filterQueries.forEach((filterQuery) => {
this.applyFilterQueriesToQueryParams(queryParams, collectionSearchCriteria.filterQueries)
}
}

private applyFilterQueriesToQueryParams(
queryParams: URLSearchParams,
filterQueries: string | string[]
) {
if (typeof filterQueries === 'string') {
queryParams.append(GetCollectionItemsQueryParams.FILTERQUERY, filterQueries)
} else {
filterQueries.forEach((filterQuery) => {
const idx = filterQuery.indexOf(':')
if (idx === -1) return // Invalid filter query, skip it

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,8 @@ export const transformCollectionLinksResponseToCollectionLinks = (
}
}
export const transformMyDataResponseToCollectionItemSubset = (
response: AxiosResponse
response: AxiosResponse,
keepRawFields = false
): MyDataCollectionItemSubset => {
const responseDataPayload = response.data.data
const itemsPayload = responseDataPayload.items
Expand All @@ -205,7 +206,8 @@ export const transformMyDataResponseToCollectionItemSubset = (
} else if (itemPayload.type === 'dataset') {
items.push(
transformMyDataDatasetPreviewPayloadToDatasetPreview(
itemPayload as MyDataDatasetPreviewPayload
itemPayload as MyDataDatasetPreviewPayload,
keepRawFields
)
)
} else if (itemPayload.type === 'dataverse') {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { MetadataBlocksPayload } from './DatasetPayload'

export interface MyDataDatasetPreviewPayload {
name: string
type: string
Expand All @@ -18,4 +20,12 @@ export interface MyDataDatasetPreviewPayload {
user_roles: string[]
image_url?: string
published_at?: string
collections?: MyDataDatasetCollectionPayload[]
metadataBlocks?: MetadataBlocksPayload
}

export interface MyDataDatasetCollectionPayload {
id: number
name: string
alias: string
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@ import { DatasetPreviewSubset } from '../../../domain/models/DatasetPreviewSubse
import { DatasetPreviewPayload } from './DatasetPreviewPayload'
import { PublicationStatus } from '../../../../core/domain/models/PublicationStatus'
import { CollectionItemType } from '../../../../collections/domain/models/CollectionItemType'
import { MyDataDatasetPreviewPayload } from './MyDataDatasetPreviewPayload'
import {
MyDataDatasetCollectionPayload,
MyDataDatasetPreviewPayload
} from './MyDataDatasetPreviewPayload'

export const transformDatasetPreviewsResponseToDatasetPreviewSubset = (
response: AxiosResponse
Expand Down Expand Up @@ -56,12 +59,23 @@ export const transformDatasetPreviewPayloadToDatasetPreview = (
}

export const transformMyDataDatasetPreviewPayloadToDatasetPreview = (
datasetPreviewPayload: MyDataDatasetPreviewPayload
datasetPreviewPayload: MyDataDatasetPreviewPayload,
keepRawFields = false
): DatasetPreview => {
const publicationStatuses: PublicationStatus[] = []
datasetPreviewPayload.publicationStatuses.forEach((element) => {
publicationStatuses.push(element as unknown as PublicationStatus)
})
const collections: CollectionSummary[] | undefined = datasetPreviewPayload.collections?.map(
(collection: MyDataDatasetCollectionPayload) => ({
id: collection.id,
alias: collection.alias,
displayName: collection.name
})
)
const metadataBlocks: DatasetMetadataBlock[] | undefined = datasetPreviewPayload.metadataBlocks
? transformPayloadToDatasetMetadataBlocks(datasetPreviewPayload.metadataBlocks, keepRawFields)
: undefined
return {
type: CollectionItemType.DATASET,
persistentId: datasetPreviewPayload.global_id,
Expand All @@ -85,6 +99,8 @@ export const transformMyDataDatasetPreviewPayloadToDatasetPreview = (
...(datasetPreviewPayload.image_url && {
imageUrl: datasetPreviewPayload.image_url
}),
userRoles: datasetPreviewPayload.user_roles
userRoles: datasetPreviewPayload.user_roles,
...(collections && { collections }),
...(metadataBlocks && { metadataBlocks })
}
}
Loading