Skip to content

Commit 0928200

Browse files
committed
feat: update use case get available categories
1 parent 97cba99 commit 0928200

File tree

9 files changed

+126
-3
lines changed

9 files changed

+126
-3
lines changed

docs/useCases.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ The different use cases currently available in the package are classified below,
3737
- [List All Datasets](#list-all-datasets)
3838
- [Get Dataset Versions Summaries](#get-dataset-versions-summaries)
3939
- [Get Dataset Linked Collections](#get-dataset-linked-collections)
40+
- [Get Dataset Available Categories](#get-dataset-available-categories)
4041
- [Datasets write use cases](#datasets-write-use-cases)
4142
- [Create a Dataset](#create-a-dataset)
4243
- [Update a Dataset](#update-a-dataset)
@@ -1049,6 +1050,28 @@ The `includeMDC` parameter is optional.
10491050
- If MDC isn't enabled, the download count will return a total count, without `MDCStartDate`.
10501051
- If MDC is enabled but the `includeMDC` is false, the count will be limited to the time before `MDCStartDate`
10511052

1053+
#### Get Dataset Available Categories
1054+
1055+
Returns a list of available file categories that may be applied to the files of a given dataset.
1056+
1057+
###### Example call:
1058+
1059+
```typescript
1060+
import { getDatasetAvailableCategories } from '@iqss/dataverse-client-javascript'
1061+
1062+
/* ... */
1063+
1064+
const datasetId = 1
1065+
1066+
getDatasetAvailableCategories.execute(datasetId).then((categories: String[]) => {
1067+
/* ... */
1068+
})
1069+
```
1070+
1071+
_See [use case](../src/files/domain/useCases/GetDatasetAvailableCategories.ts) implementation_.
1072+
1073+
The `datasetId` parameter is a number for numeric identifiers or string for persistent identifiers.
1074+
10521075
## Files
10531076

10541077
### Files read use cases

src/datasets/domain/repositories/IDatasetsRepository.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,5 @@ export interface IDatasetsRepository {
6565
linkDataset(datasetId: number, collectionAlias: string): Promise<void>
6666
unlinkDataset(datasetId: number, collectionAlias: string): Promise<void>
6767
getDatasetLinkedCollections(datasetId: number | string): Promise<DatasetLinkedCollection[]>
68+
getDatasetAvailableCategories(datasetId: number | string): Promise<string[]>
6869
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { UseCase } from '../../../core/domain/useCases/UseCase'
2+
import { IDatasetsRepository } from '../repositories/IDatasetsRepository'
3+
4+
export class GetDatasetAvailableCategories implements UseCase<string[]> {
5+
private readonly datasetsRepository: IDatasetsRepository
6+
7+
constructor(datasetsRepository: IDatasetsRepository) {
8+
this.datasetsRepository = datasetsRepository
9+
}
10+
11+
/**
12+
* Retrieves the available file categories for a dataset.
13+
*
14+
* @param {number | string} [datasetId] - Persistent dataset identifier
15+
* @returns {Promise<string[]>} - List of available file categories
16+
*/
17+
async execute(datasetId: number | string): Promise<string[]> {
18+
return this.datasetsRepository.getDatasetAvailableCategories(datasetId)
19+
}
20+
}

src/datasets/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { DeleteDatasetDraft } from './domain/useCases/DeleteDatasetDraft'
2323
import { LinkDataset } from './domain/useCases/LinkDataset'
2424
import { UnlinkDataset } from './domain/useCases/UnlinkDataset'
2525
import { GetDatasetLinkedCollections } from './domain/useCases/GetDatasetLinkedCollections'
26+
import { GetDatasetAvailableCategories } from './domain/useCases/GetDatasetAvailableCategories'
2627

2728
const datasetsRepository = new DatasetsRepository()
2829

@@ -60,6 +61,7 @@ const deleteDatasetDraft = new DeleteDatasetDraft(datasetsRepository)
6061
const linkDataset = new LinkDataset(datasetsRepository)
6162
const unlinkDataset = new UnlinkDataset(datasetsRepository)
6263
const getDatasetLinkedCollections = new GetDatasetLinkedCollections(datasetsRepository)
64+
const getDatasetAvailableCategories = new GetDatasetAvailableCategories(datasetsRepository)
6365

6466
export {
6567
getDataset,
@@ -80,7 +82,8 @@ export {
8082
deleteDatasetDraft,
8183
linkDataset,
8284
unlinkDataset,
83-
getDatasetLinkedCollections
85+
getDatasetLinkedCollections,
86+
getDatasetAvailableCategories
8487
}
8588
export { DatasetNotNumberedVersion } from './domain/models/DatasetNotNumberedVersion'
8689
export { DatasetUserPermissions } from './domain/models/DatasetUserPermissions'

src/datasets/infra/repositories/DatasetsRepository.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,4 +317,15 @@ export class DatasetsRepository extends ApiRepository implements IDatasetsReposi
317317
throw error
318318
})
319319
}
320+
321+
public async getDatasetAvailableCategories(datasetId: number | string): Promise<string[]> {
322+
return this.doGet(
323+
this.buildApiEndpoint(this.datasetsResourceName, 'availableFileCategories', datasetId),
324+
true
325+
)
326+
.then((response) => response.data.data as string[])
327+
.catch((error) => {
328+
throw error
329+
})
330+
}
320331
}

src/files/domain/useCases/UpdateFileCategories.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export class UpdateFileCategories implements UseCase<void> {
1010

1111
/**
1212
* Updates the categories for a particular File.
13-
* More detailed information about updating a file's categories behavior can be found in https://guides.dataverse.org/en/latest/api/native-api.html#updating-file-metadata
13+
* More detailed information about updating a file's categories behavior can be found in https://guides.dataverse.org/en/latest/api/native-api.html#updating-file-metadata-categories
1414
*
1515
* @param {number | string} [fileId] - The file identifier, which can be a string (for persistent identifiers), or a number (for numeric identifiers).
1616
* @param {string[]} [categories] - The categories to be added to the file.

src/files/domain/useCases/UpdateFileTabularTags.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export class UpdateFileTabularTags implements UseCase<void> {
1010

1111
/**
1212
* Updates the tabular tabular Tags for a particular File.
13-
* More detailed information about updating a file's tabularTags behavior can be found in https://guides.dataverse.org/en/latest/api/native-api.html#updating-file-metadata
13+
* More detailed information about updating a file's tabularTags behavior can be found in https://guides.dataverse.org/en/latest/api/native-api.html#updating-file-tabular-tags
1414
*
1515
* @param {number | string} [fileId] - The file identifier, which can be a string (for persistent identifiers), or a number (for numeric identifiers).
1616
* @param {string[]} [tabularTags] - The tabular tags to be added to the file.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import { ApiConfig, createDataset, getDatasetAvailableCategories, ReadError } from '../../../src'
2+
import { DataverseApiAuthMechanism } from '../../../src/core/infra/repositories/ApiConfig'
3+
import { deleteUnpublishedDatasetViaApi } from '../../testHelpers/datasets/datasetHelper'
4+
import { CreatedDatasetIdentifiers } from '../../../src/datasets/domain/models/CreatedDatasetIdentifiers'
5+
import { TestConstants } from '../../testHelpers/TestConstants'
6+
7+
describe('execute', () => {
8+
let createdDatasetIdentifiers: CreatedDatasetIdentifiers
9+
beforeEach(async () => {
10+
ApiConfig.init(
11+
TestConstants.TEST_API_URL,
12+
DataverseApiAuthMechanism.API_KEY,
13+
process.env.TEST_API_KEY
14+
)
15+
createdDatasetIdentifiers = await createDataset.execute(TestConstants.TEST_NEW_DATASET_DTO)
16+
})
17+
18+
afterEach(async () => {
19+
deleteUnpublishedDatasetViaApi(createdDatasetIdentifiers.numericId)
20+
})
21+
22+
it('should return categories array when a dataset has files categories', async () => {
23+
const defaultCategories = ['Code', 'Data', 'Documentation']
24+
const categoriesList = await getDatasetAvailableCategories.execute(
25+
createdDatasetIdentifiers.numericId
26+
)
27+
expect(categoriesList.sort()).toEqual(defaultCategories.sort())
28+
})
29+
30+
it('should return error when dataset does not exist', async () => {
31+
const nonExistentDatasetId = 99999
32+
33+
await expect(
34+
getDatasetAvailableCategories.execute(nonExistentDatasetId)
35+
).rejects.toBeInstanceOf(ReadError)
36+
})
37+
})

test/integration/datasets/DatasetsRepository.test.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1501,4 +1501,32 @@ describe('DatasetsRepository', () => {
15011501
await expect(sut.getDatasetLinkedCollections(nonExistentTestDatasetId)).rejects.toThrow()
15021502
})
15031503
})
1504+
1505+
describe('getDatasetAvailableCategories', () => {
1506+
let testDatasetIds: CreatedDatasetIdentifiers
1507+
1508+
beforeEach(async () => {
1509+
testDatasetIds = await createDataset.execute(TestConstants.TEST_NEW_DATASET_DTO)
1510+
// Dataset is in draft, so we need to publish it first
1511+
await sut.publishDataset(testDatasetIds.numericId, VersionUpdateType.MAJOR)
1512+
await waitForNoLocks(testDatasetIds.numericId, 10)
1513+
})
1514+
1515+
test('should get available categories', async () => {
1516+
const fileMetadata = {
1517+
description: 'test description',
1518+
directoryLabel: 'directoryLabel',
1519+
categories: ['category1', 'category2', 'Documentation', 'Data', 'Code']
1520+
}
1521+
1522+
await uploadFileViaApi(testDatasetIds.numericId, testTextFile1Name, fileMetadata)
1523+
1524+
const actual = await sut.getDatasetAvailableCategories(testDatasetIds.numericId)
1525+
expect(actual.sort()).toEqual(fileMetadata.categories.sort())
1526+
})
1527+
1528+
test('should return error when dataset does not exist', async () => {
1529+
await expect(sut.getDatasetAvailableCategories(nonExistentTestDatasetId)).rejects.toThrow()
1530+
})
1531+
})
15041532
})

0 commit comments

Comments
 (0)