Skip to content
Open
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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel
- Guestbooks: Added `downloadGuestbookResponsesByCollectionId` and `downloadGuestbookResponsesOfAGuestbook` use cases and repository support for exporting guestbook responses as raw CSV content.
- Guestbooks: Added optional `includeStats` support to `getGuestbooksByCollectionId`, returning `usageCount` and `responseCount` when requested.
- Files: Added `getFileCitationByFormat` use case, repository method, and `FileCitationFormat` enum to support Dataverse file citation exports in `EndNote`, `RIS`, `BibTeX`, `CSL`, and `Internal` formats.
- Datasets: Added `getDatasetReviews` use case and repository method to support Dataverse endpoint `GET /datasets/{identifier}/reviews`, for retrieving review datasets associated with a dataset by persistent id or numeric id.
- Collections: Added `allowedDatasetTypes` field to the [Collection](./src/collections/domain/models/Collection.ts) model. This field is optional and only populated the feature is enabled on the installation and configured on the collection.
- Collections: Added theme information when retrieving a collection using `getCollection`.

Expand Down
24 changes: 24 additions & 0 deletions docs/useCases.md
Original file line number Diff line number Diff line change
Expand Up @@ -1098,6 +1098,30 @@ _See [use case](../src/datasets/domain/useCases/GetDatasetLocks.ts) implementati

The `datasetId` parameter can be a string, for persistent identifiers, or a number, for numeric identifiers.

#### Get Dataset Reviews

Returns a [DatasetReview](../src/datasets/domain/models/DatasetReview.ts) array with the local review datasets that review a dataset. Review datasets are matched by their `itemReviewedUrl` metadata field pointing at the URL form of the dataset persistent identifier.

##### Example call:

```typescript
import { getDatasetReviews } from '@iqss/dataverse-client-javascript'

/* ... */

const datasetId = 'doi:10.5072/FK2/ABCDEF'

getDatasetReviews.execute(datasetId).then((datasetReviews: DatasetReview[]) => {
/* ... */
})

/* ... */
```

_See [use case](../src/datasets/domain/useCases/GetDatasetReviews.ts) implementation_.

The `datasetId` parameter can be a string, for persistent identifiers, or a number, for numeric identifiers. An API token is optional when the review dataset has been published, but unpublished targets require permission to view the unpublished dataset.

#### Get Dataset Summary Field Names

Returns the names of the dataset summary fields configured in the installation.
Expand Down
23 changes: 23 additions & 0 deletions src/datasets/domain/models/DatasetReview.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
export interface DatasetReview {
title: string
authors: string[]
persistentId: string
persistentIdUrl: string
id: number
citation: string
citationHtml: string
datePublished: string
description: string
rubricMetadataBlocks: DatasetReviewRubricMetadataBlock[]
}

export interface DatasetReviewRubricMetadataBlock {
name: string
displayName: string
fields: DatasetReviewRubricMetadataField[]
}

export interface DatasetReviewRubricMetadataField {
typeName: string
value: string
}
2 changes: 2 additions & 0 deletions src/datasets/domain/repositories/IDatasetsRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import { DatasetLicenseUpdateRequest } from '../dtos/DatasetLicenseUpdateRequest
import { DatasetTypeDTO } from '../dtos/DatasetTypeDTO'
import { StorageDriver } from '../../../core/domain/models/StorageDriver'
import { DatasetUploadLimits } from '../models/DatasetUploadLimits'
import { DatasetReview } from '../models/DatasetReview'

export interface IDatasetsRepository {
getDataset(
Expand Down Expand Up @@ -104,4 +105,5 @@ export interface IDatasetsRepository {
): Promise<void>
getDatasetStorageDriver(datasetId: number | string): Promise<StorageDriver>
getDatasetUploadLimits(datasetId: number | string): Promise<DatasetUploadLimits>
getDatasetReviews(datasetId: number | string): Promise<DatasetReview[]>
}
21 changes: 21 additions & 0 deletions src/datasets/domain/useCases/GetDatasetReviews.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { UseCase } from '../../../core/domain/useCases/UseCase'
import { DatasetReview } from '../models/DatasetReview'
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'

export class GetDatasetReviews implements UseCase<DatasetReview[]> {
private datasetsRepository: IDatasetsRepository

constructor(datasetsRepository: IDatasetsRepository) {
this.datasetsRepository = datasetsRepository
}

/**
* Returns the local review datasets that review the given dataset.
*
* @param {number | string} datasetId - The dataset identifier, which can be a string (for persistent identifiers), or a number (for numeric identifiers).
* @returns {Promise<DatasetReview[]>}
*/
async execute(datasetId: number | string): Promise<DatasetReview[]> {
return this.datasetsRepository.getDatasetReviews(datasetId)
}
}
10 changes: 9 additions & 1 deletion src/datasets/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ import { UpdateTermsOfAccess } from './domain/useCases/UpdateTermsOfAccess'
import { UpdateDatasetLicense } from './domain/useCases/UpdateDatasetLicense'
import { GetDatasetStorageDriver } from './domain/useCases/GetDatasetStorageDriver'
import { GetDatasetUploadLimits } from './domain/useCases/GetDatasetUploadLimits'
import { GetDatasetReviews } from './domain/useCases/GetDatasetReviews'

const datasetsRepository = new DatasetsRepository()

Expand Down Expand Up @@ -86,6 +87,7 @@ const updateTermsOfAccess = new UpdateTermsOfAccess(datasetsRepository)
const updateDatasetLicense = new UpdateDatasetLicense(datasetsRepository)
const getDatasetStorageDriver = new GetDatasetStorageDriver(datasetsRepository)
const getDatasetUploadLimits = new GetDatasetUploadLimits(datasetsRepository)
const getDatasetReviews = new GetDatasetReviews(datasetsRepository)

export {
getDataset,
Expand Down Expand Up @@ -118,7 +120,8 @@ export {
deleteDatasetType,
updateDatasetLicense,
getDatasetStorageDriver,
getDatasetUploadLimits
getDatasetUploadLimits,
getDatasetReviews
}
export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion'
export { DatasetUserPermissions } from './domain/models/DatasetUserPermissions'
Expand Down Expand Up @@ -158,3 +161,8 @@ export { DatasetLinkedCollection } from './domain/models/DatasetLinkedCollection
export { DatasetType } from './domain/models/DatasetType'
export { DatasetTypeDTO } from './domain/dtos/DatasetTypeDTO'
export { DatasetUploadLimits } from './domain/models/DatasetUploadLimits'
export {
DatasetReview,
DatasetReviewRubricMetadataBlock,
DatasetReviewRubricMetadataField
} from './domain/models/DatasetReview'
10 changes: 10 additions & 0 deletions src/datasets/infra/repositories/DatasetsRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ import { DatasetLicenseUpdateRequest } from '../../domain/dtos/DatasetLicenseUpd
import { DatasetTypeDTO } from '../../domain/dtos/DatasetTypeDTO'
import { StorageDriver } from '../../../core/domain/models/StorageDriver'
import { DatasetUploadLimits } from '../../domain/models/DatasetUploadLimits'
import { DatasetReview } from '../../domain/models/DatasetReview'
import { transformDatasetReviewsResponseToDatasetReviews } from './transformers/datasetReviewTransformers'

export interface GetAllDatasetPreviewsQueryParams {
per_page?: number
Expand Down Expand Up @@ -523,4 +525,12 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi
throw error
})
}

public async getDatasetReviews(datasetId: number | string): Promise<DatasetReview[]> {
return this.doGet(this.buildApiEndpoint(this.datasetsResourceName, 'reviews', datasetId), true)
.then((response) => transformDatasetReviewsResponseToDatasetReviews(response))
.catch((error) => {
throw error
})
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
export interface DatasetReviewPayload {
title: string
authors?: string[]
persistentId: string
persistentIdUrl: string
id: number
citation: string
citationHtml: string
datePublished?: string
description?: string
rubricMetadataBlocks?: DatasetReviewRubricMetadataBlockPayload[]
}

export interface DatasetReviewRubricMetadataBlockPayload {
name: string
displayName: string
fields?: DatasetReviewRubricMetadataFieldPayload[]
}

export interface DatasetReviewRubricMetadataFieldPayload {
typeName: string
value: string
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { AxiosResponse } from 'axios'

import { DatasetReview } from '../../../domain/models/DatasetReview'
import { DatasetReviewPayload } from './DatasetReviewPayload'

export const transformDatasetReviewsResponseToDatasetReviews = (
response: AxiosResponse
): DatasetReview[] => {
const reviews = (response.data.data?.reviews ?? []) as DatasetReviewPayload[]

return reviews.map((review) => ({
title: review.title,
authors: review.authors ?? [],
persistentId: review.persistentId,
persistentIdUrl: review.persistentIdUrl,
id: review.id,
citation: review.citation,
citationHtml: review.citationHtml,
datePublished: review.datePublished ?? '',
description: review.description ?? '',
rubricMetadataBlocks:
review.rubricMetadataBlocks?.map((metadataBlock) => ({
name: metadataBlock.name,
displayName: metadataBlock.displayName,
fields: metadataBlock.fields ?? []
})) ?? []
}))
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ describe('execute', () => {
} catch (error) {
throw new Error('Should not raise an error')
} finally {
expect(metadataFieldInfos?.length).toBe(64)
expect(metadataFieldInfos?.length).toBeGreaterThanOrEqual(64)
expect(metadataFieldInfos?.[0].name).toBe('authorName')
expect(metadataFieldInfos?.[0].displayName).toBe('Author Name')
}
Expand Down
Loading
Loading