Skip to content

Commit 7fd61ba

Browse files
committed
Merge branch 'develop' of github.com:IQSS/dataverse-client-javascript into 167-get-all-facets
2 parents ba9abf1 + 69f4005 commit 7fd61ba

File tree

17 files changed

+353
-28
lines changed

17 files changed

+353
-28
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ node_modules
44
# intellij
55
.idea
66

7+
# Visual Studio
8+
/.vscode
9+
710
# unit tests
811
coverage
912

docs/useCases.md

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ The different use cases currently available in the package are classified below,
4444
- [Metadata Blocks](#metadata-blocks)
4545
- [Metadata Blocks read use cases](#metadata-blocks-read-use-cases)
4646
- [Get All Facetable Metadata Fields](#get-all-facetable-metadata-fields)
47+
- [Get All Metadata Blocks](#get-all-metadata-blocks)
4748
- [Get Metadata Block By Name](#get-metadata-block-by-name)
4849
- [Get Collection Metadata Blocks](#get-collection-metadata-blocks)
4950
- [Users](#Users)
@@ -507,15 +508,16 @@ publishDataset.execute(datasetId, versionUpdateType)
507508
_See [use case](../src/datasets/domain/useCases/PublishDataset.ts) implementation_.
508509

509510
The above example publishes the dataset with the specified identifier and performs a minor version update. If the response
510-
is successful, the use case does not return the dataset object, but the HTTP status code `200`. Otherwise, it throws an error.
511-
If you want to perform a major version update, you must set the `versionUpdateType` parameter to `VersionUpdateType.MAJOR`.
512-
511+
is successful, the use case does not return the dataset object, but the HTTP status code `200`. Otherwise, it throws an error.\
512+
If you want to perform a major version update, you must set the `versionUpdateType` parameter to `VersionUpdateType.MAJOR`.\
513+
Superusers can pass `VersionUpdateType.UPDATE_CURRENT` to update metadata without changing the version number. This will overwrite the latest published version and therefore will only work for a dataset that has been published at least once. \*Note that this will only work also if there were no file changes in the update.\
513514
The `datasetId` parameter can be a string, for persistent identifiers, or a number, for numeric identifiers.
514515

515516
The `versionUpdateType` parameter can be a [VersionUpdateType](../src/datasets/domain/models/VersionUpdateType.ts) enum value, which can be one of the following:
516517

517518
- `VersionUpdateType.MINOR`
518519
- `VersionUpdateType.MAJOR`
520+
- `VersionUpdateType.UPDATE_CURRENT`
519521

520522
## Files
521523

@@ -985,6 +987,26 @@ getAllFacetableMetadataFields.execute().then((metadataFieldInfos: MetadataFieldI
985987

986988
_See [use case](../src/metadataBlocks/domain/useCases/GetAllFacetableMetadataFields.ts) implementation_.
987989

990+
#### Get All Metadata Blocks
991+
992+
Returns a [MetadataBlock](../src/metadataBlocks/domain/models/MetadataBlock.ts) array containing the metadata blocks defined in the installation.
993+
994+
##### Example call:
995+
996+
```typescript
997+
import { getAllMetadataBlocks } from '@iqss/dataverse-client-javascript'
998+
999+
/* ... */
1000+
1001+
getAllMetadataBlocks.execute().then((metadataBlocks: MetadataBlock[]) => {
1002+
/* ... */
1003+
})
1004+
1005+
/* ... */
1006+
```
1007+
1008+
_See [use case](../src/metadataBlocks/domain/useCases/GetAllMetadataBlocks.ts) implementation_.
1009+
9881010
#### Get Metadata Block By Name
9891011

9901012
Returns a [MetadataBlock](../src/metadataBlocks/domain/models/MetadataBlock.ts) instance, given its name.

src/datasets/domain/models/Dataset.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,5 +186,6 @@ interface Software extends DatasetMetadataSubField {
186186

187187
export enum VersionUpdateType {
188188
MAJOR = 'major',
189-
MINOR = 'minor'
189+
MINOR = 'minor',
190+
UPDATE_CURRENT = 'updatecurrent'
190191
}

src/datasets/domain/useCases/PublishDataset.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export class PublishDataset implements UseCase<void> {
1313
* Publishes a dataset, given its identifier and the type of version update type.
1414
*
1515
* @param {number | string} [datasetId] - The dataset identifier, which can be a string (for persistent identifiers), or a number (for numeric identifiers).
16-
* @param {VersionUpdateType} versionUpdateType - Specifies the type of version update, 'major' or 'minor'.
16+
* @param {VersionUpdateType} versionUpdateType - Specifies the type of version update, 'major', 'minor' or 'updatecurrent'
1717
* @returns {Promise<void>} - This method does not return anything upon successful completion.
1818
*/
1919
async execute(datasetId: number | string, versionUpdateType: VersionUpdateType): Promise<void> {

src/datasets/domain/useCases/validators/SingleMetadataFieldValidator.ts

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ import { DateFormatFieldError } from './errors/DateFormatFieldError'
77
import { MetadataFieldValidator } from './MetadataFieldValidator'
88
import { DatasetMetadataChildFieldValueDTO } from '../../dtos/DatasetDTO'
99
import { MultipleMetadataFieldValidator } from './MultipleMetadataFieldValidator'
10-
import { MetadataFieldType } from '../../../../metadataBlocks/domain/models/MetadataBlock'
10+
import {
11+
MetadataFieldType,
12+
MetadataFieldWatermark
13+
} from '../../../../metadataBlocks/domain/models/MetadataBlock'
1114

1215
export class SingleMetadataFieldValidator extends BaseMetadataFieldValidator {
1316
validate(datasetMetadataFieldAndValueInfo: DatasetMetadataFieldAndValueInfo): void {
@@ -75,11 +78,38 @@ export class SingleMetadataFieldValidator extends BaseMetadataFieldValidator {
7578
private validateDateFieldValue(
7679
datasetMetadataFieldAndValueInfo: DatasetMetadataFieldAndValueInfo
7780
) {
78-
const dateFormatRegex = /^\d{4}-\d{2}-\d{2}$/
79-
if (!dateFormatRegex.test(datasetMetadataFieldAndValueInfo.metadataFieldValue as string)) {
81+
const {
82+
metadataFieldInfo: { watermark },
83+
metadataFieldValue
84+
} = datasetMetadataFieldAndValueInfo
85+
86+
const acceptsAllDateFormats = watermark === MetadataFieldWatermark.YYYYOrYYYYMMOrYYYYMMDD
87+
88+
const YYYY_MM_DD_DATE_FORMAT_REGEX = /^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/
89+
90+
const YYYY_MM_FORMAT_REGEX = /^\d{4}-(0[1-9]|1[0-2])$/
91+
92+
const YYYY_FORMAT_REGEX = /^\d{4}$/
93+
94+
const isValidDateFormat = (value: string): boolean => {
95+
if (acceptsAllDateFormats) {
96+
// Check if it matches any of the formats
97+
return (
98+
YYYY_MM_DD_DATE_FORMAT_REGEX.test(value) ||
99+
YYYY_MM_FORMAT_REGEX.test(value) ||
100+
YYYY_FORMAT_REGEX.test(value)
101+
)
102+
} else {
103+
// Only accepts YYYY-MM-DD format
104+
return YYYY_MM_DD_DATE_FORMAT_REGEX.test(value)
105+
}
106+
}
107+
108+
if (!isValidDateFormat(metadataFieldValue as string)) {
80109
throw new DateFormatFieldError(
81110
datasetMetadataFieldAndValueInfo.metadataFieldKey,
82111
datasetMetadataFieldAndValueInfo.metadataBlockName,
112+
watermark,
83113
datasetMetadataFieldAndValueInfo.metadataParentFieldKey,
84114
datasetMetadataFieldAndValueInfo.metadataFieldPosition
85115
)

src/datasets/domain/useCases/validators/errors/DateFormatFieldError.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export class DateFormatFieldError extends FieldValidationError {
44
constructor(
55
metadataFieldName: string,
66
citationBlockName: string,
7+
validDateFormat: string,
78
parentMetadataFieldName?: string,
89
fieldPosition?: number
910
) {
@@ -12,7 +13,7 @@ export class DateFormatFieldError extends FieldValidationError {
1213
citationBlockName,
1314
parentMetadataFieldName,
1415
fieldPosition,
15-
'The field requires a valid date format (YYYY-MM-DD).'
16+
`The field requires a valid date format (${validDateFormat}).`
1617
)
1718
}
1819
}

src/metadataBlocks/domain/repositories/IMetadataBlocksRepository.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@ export interface IMetadataBlocksRepository {
77
collectionIdOrAlias: number | string,
88
onlyDisplayedOnCreate: boolean
99
): Promise<MetadataBlock[]>
10+
11+
getAllMetadataBlocks(): Promise<MetadataBlock[]>
1012
}
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 { MetadataBlock } from '../..'
3+
import { IMetadataBlocksRepository } from '../repositories/IMetadataBlocksRepository'
4+
5+
export class GetAllMetadataBlocks implements UseCase<MetadataBlock[]> {
6+
private metadataBlocksRepository: IMetadataBlocksRepository
7+
8+
constructor(metadataBlocksRepository: IMetadataBlocksRepository) {
9+
this.metadataBlocksRepository = metadataBlocksRepository
10+
}
11+
12+
/**
13+
* Returns a MetadataBlock array containing the metadata blocks defined in the installation.
14+
*
15+
* @returns {Promise<MetadataBlock[]>}
16+
*/
17+
async execute(): Promise<MetadataBlock[]> {
18+
return await this.metadataBlocksRepository.getAllMetadataBlocks()
19+
}
20+
}

src/metadataBlocks/index.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { MetadataBlocksRepository } from './infra/repositories/MetadataBlocksRep
33
import { GetCollectionMetadataBlocks } from './domain/useCases/GetCollectionMetadataBlocks'
44
import { GetAllFacetableMetadataFields } from './domain/useCases/GetAllFacetableMetadataFields'
55
import { MetadataFieldInfosRepository } from './infra/repositories/MetadataFieldInfosRepository'
6+
import { GetAllMetadataBlocks } from './domain/useCases/GetAllMetadataBlocks'
67

78
const metadataBlocksRepository = new MetadataBlocksRepository()
89
const metadataFieldInfosRepository = new MetadataFieldInfosRepository()
@@ -12,12 +13,15 @@ const getCollectionMetadataBlocks = new GetCollectionMetadataBlocks(metadataBloc
1213
const getAllFacetableMetadataFields = new GetAllFacetableMetadataFields(
1314
metadataFieldInfosRepository
1415
)
16+
const getAllMetadataBlocks = new GetAllMetadataBlocks(metadataBlocksRepository)
1517

1618
export {
1719
getMetadataBlockByName,
1820
getCollectionMetadataBlocks,
19-
getAllFacetableMetadataFields
21+
getAllFacetableMetadataFields,
22+
getAllMetadataBlocks
2023
}
24+
2125
export {
2226
MetadataBlock,
2327
MetadataFieldInfo,

src/metadataBlocks/infra/repositories/MetadataBlocksRepository.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,14 @@ export class MetadataBlocksRepository extends ApiRepository implements IMetadata
2828
throw error
2929
})
3030
}
31+
32+
public async getAllMetadataBlocks(): Promise<MetadataBlock[]> {
33+
return this.doGet('/metadatablocks', false, {
34+
returnDatasetFieldTypes: true
35+
})
36+
.then((response) => transformMetadataBlocksResponseToMetadataBlocks(response))
37+
.catch((error) => {
38+
throw error
39+
})
40+
}
3141
}

0 commit comments

Comments
 (0)