Skip to content

Commit 4bb06bf

Browse files
committed
iMerge branch 'develop' into feat/202-featured-items-use-cases
2 parents b6608d9 + c789d0f commit 4bb06bf

31 files changed

+214
-150
lines changed

src/collections/infra/repositories/CollectionsRepository.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ export interface NewCollectionContactRequestPayload {
3737
}
3838

3939
export interface NewCollectionMetadataBlocksRequestPayload {
40-
metadataBlockNames: string[]
41-
facetIds: string[]
42-
inputLevels: NewCollectionInputLevelRequestPayload[]
40+
metadataBlockNames?: string[]
41+
facetIds?: string[]
42+
inputLevels?: NewCollectionInputLevelRequestPayload[]
4343
}
4444

4545
export interface NewCollectionInputLevelRequestPayload {
@@ -183,7 +183,7 @@ export class CollectionsRepository extends ApiRepository implements ICollections
183183
})
184184
)
185185

186-
const inputLevelsRequestBody: NewCollectionInputLevelRequestPayload[] =
186+
const inputLevelsRequestBody: NewCollectionInputLevelRequestPayload[] | undefined =
187187
collectionDTO.inputLevels?.map((inputLevel) => ({
188188
datasetFieldTypeName: inputLevel.datasetFieldName,
189189
include: inputLevel.include,

src/core/infra/repositories/ApiRepository.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export abstract class ApiRepository {
4848
protected buildApiEndpoint(
4949
resourceName: string,
5050
operation: string,
51-
resourceId: number | string = undefined
51+
resourceId: number | string | undefined = undefined
5252
) {
5353
return typeof resourceId === 'number'
5454
? `/${resourceName}/${resourceId}/${operation}`

src/core/infra/repositories/apiConfigBuilders.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export const buildRequestConfig = (
88
contentType: string = ApiConstants.CONTENT_TYPE_APPLICATION_JSON,
99
abortSignal?: AbortSignal
1010
): AxiosRequestConfig => {
11-
const requestConfig: AxiosRequestConfig = {
11+
const requestConfig: AxiosRequestConfig & { headers: Record<string, unknown> } = {
1212
params: queryParams,
1313
headers: {
1414
'Content-Type': contentType

src/datasets/domain/models/Dataset.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export interface Dataset {
66
versionId: number
77
versionInfo: DatasetVersionInfo
88
license?: DatasetLicense
9+
termsOfUse: TermsOfUse
910
alternativePersistentId?: string
1011
publicationDate?: string
1112
citationDate?: string
@@ -35,6 +36,17 @@ export interface DatasetLicense {
3536
iconUri?: string
3637
}
3738

39+
export interface TermsOfUse {
40+
fileAccessRequest: boolean
41+
termsOfAccess?: string
42+
dataAccessPlace?: string
43+
originalArchive?: string
44+
availabilityStatus?: string
45+
contactForAccess?: string
46+
sizeOfCollection?: string
47+
studyCompletion?: string
48+
}
49+
3850
export type DatasetMetadataBlocks = [CitationMetadataBlock, ...DatasetMetadataBlock[]]
3951

4052
export interface DatasetMetadataBlock {
@@ -53,7 +65,7 @@ export type DatasetMetadataFieldValue =
5365
| DatasetMetadataSubField[]
5466
| AnonymizedField
5567

56-
export type DatasetMetadataSubField = Record<string, string>
68+
export type DatasetMetadataSubField = Record<string, string | undefined>
5769

5870
export interface CitationMetadataBlock extends DatasetMetadataBlock {
5971
name: 'citation'

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ export class DatasetResourceValidator implements ResourceValidator {
1717
metadataBlocks: MetadataBlock[]
1818
) {
1919
const metadataBlockName = metadataBlockValues.name
20-
const metadataBlock: MetadataBlock = metadataBlocks.find(
20+
const metadataBlock = metadataBlocks.find(
2121
(metadataBlock) => metadataBlock.name === metadataBlockName
22-
)
22+
) as MetadataBlock
23+
2324
for (const metadataFieldKey of Object.keys(metadataBlock.metadataFields)) {
2425
this.metadataFieldValidator.validate({
2526
metadataFieldInfo: metadataBlock.metadataFields[metadataFieldKey],

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { MetadataFieldValidator } from './MetadataFieldValidator'
88
import { DatasetMetadataChildFieldValueDTO } from '../../dtos/DatasetDTO'
99
import { MultipleMetadataFieldValidator } from './MultipleMetadataFieldValidator'
1010
import {
11+
MetadataFieldInfo,
1112
MetadataFieldType,
1213
MetadataFieldWatermark
1314
} from '../../../../metadataBlocks/domain/models/MetadataBlock'
@@ -62,7 +63,7 @@ export class SingleMetadataFieldValidator extends BaseMetadataFieldValidator {
6263
datasetMetadataFieldAndValueInfo: DatasetMetadataFieldAndValueInfo
6364
) {
6465
if (
65-
!datasetMetadataFieldAndValueInfo.metadataFieldInfo.controlledVocabularyValues.includes(
66+
!datasetMetadataFieldAndValueInfo.metadataFieldInfo.controlledVocabularyValues?.includes(
6667
datasetMetadataFieldAndValueInfo.metadataFieldValue as string
6768
)
6869
) {
@@ -120,13 +121,21 @@ export class SingleMetadataFieldValidator extends BaseMetadataFieldValidator {
120121
datasetMetadataFieldAndValueInfo: DatasetMetadataFieldAndValueInfo
121122
) {
122123
const metadataFieldInfo = datasetMetadataFieldAndValueInfo.metadataFieldInfo
123-
const childMetadataFieldKeys = Object.keys(metadataFieldInfo.childMetadataFields)
124+
125+
const childMetadataFieldKeys = Object.keys(
126+
metadataFieldInfo.childMetadataFields as Record<string, MetadataFieldInfo>
127+
)
128+
124129
const metadataFieldValidator = new MetadataFieldValidator(
125130
this,
126131
new MultipleMetadataFieldValidator(this)
127132
)
133+
128134
for (const childMetadataFieldKey of childMetadataFieldKeys) {
129-
const childMetadataFieldInfo = metadataFieldInfo.childMetadataFields[childMetadataFieldKey]
135+
const childMetadataFieldInfo = (
136+
metadataFieldInfo.childMetadataFields as Record<string, MetadataFieldInfo>
137+
)[childMetadataFieldKey]
138+
130139
metadataFieldValidator.validate({
131140
metadataFieldInfo: childMetadataFieldInfo,
132141
metadataFieldKey: childMetadataFieldKey,

src/datasets/infra/repositories/transformers/DatasetPayload.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@ export interface DatasetPayload {
1616
alternativePersistentId?: string
1717
publicationDate?: string
1818
citationDate?: string
19+
fileAccessRequest: boolean
20+
termsOfAccess?: string
21+
dataAccessPlace?: string
22+
originalArchive?: string
23+
availabilityStatus?: string
24+
contactForAccess?: string
25+
sizeOfCollection?: string
26+
studyCompletion?: string
1927
files: FilePayload[]
2028
isPartOf: OwnerNodePayload
2129
}

src/datasets/infra/repositories/transformers/datasetTransformers.ts

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,9 @@ export const transformDatasetModelToUpdateDatasetRequestPayload = (
6868
datasetMetadataBlocksValues.forEach(function (
6969
newDatasetMetadataBlockValues: DatasetMetadataBlockValuesDTO
7070
) {
71-
const metadataBlock: MetadataBlock = metadataBlocks.find(
71+
const metadataBlock = metadataBlocks.find(
7272
(metadataBlock) => metadataBlock.name == newDatasetMetadataBlockValues.name
73-
)
73+
) as MetadataBlock
7474
const metadataBlockFieldsPayload: MetadataFieldRequestPayload[] = []
7575
const metadataBlockFields = metadataBlock.metadataFields
7676
const datasetMetadataFields = newDatasetMetadataBlockValues.fields
@@ -119,7 +119,7 @@ export const transformMetadataBlockModelsToRequestPayload = (
119119
) {
120120
const metadataBlock: MetadataBlock = metadataBlocks.find(
121121
(metadataBlock) => metadataBlock.name == newDatasetMetadataBlockValues.name
122-
)
122+
) as MetadataBlock
123123
metadataBlocksRequestPayload[newDatasetMetadataBlockValues.name] = {
124124
fields: transformMetadataFieldModelsToRequestPayload(
125125
newDatasetMetadataBlockValues.fields,
@@ -195,8 +195,9 @@ export const transformMetadataChildFieldValueToRequestPayload = (
195195
): Record<string, MetadataFieldRequestPayload> => {
196196
const metadataChildFieldRequestPayload: Record<string, MetadataFieldRequestPayload> = {}
197197
for (const metadataChildFieldKey of Object.keys(datasetMetadataChildFieldValue)) {
198-
const childMetadataFieldInfo: MetadataFieldInfo =
199-
metadataBlockFieldInfo.childMetadataFields[metadataChildFieldKey]
198+
const childMetadataFieldInfo: MetadataFieldInfo = (
199+
metadataBlockFieldInfo.childMetadataFields as Record<string, MetadataFieldInfo>
200+
)[metadataChildFieldKey]
200201
const value: string = datasetMetadataChildFieldValue[metadataChildFieldKey] as unknown as string
201202
metadataChildFieldRequestPayload[metadataChildFieldKey] = {
202203
value: value,
@@ -233,6 +234,16 @@ export const transformVersionPayloadToDataset = (
233234
lastUpdateTime: new Date(versionPayload.lastUpdateTime),
234235
releaseTime: new Date(versionPayload.releaseTime)
235236
},
237+
termsOfUse: {
238+
fileAccessRequest: versionPayload.fileAccessRequest,
239+
termsOfAccess: versionPayload.termsOfAccess,
240+
dataAccessPlace: versionPayload.dataAccessPlace,
241+
originalArchive: versionPayload.originalArchive,
242+
availabilityStatus: versionPayload.availabilityStatus,
243+
contactForAccess: versionPayload.contactForAccess,
244+
sizeOfCollection: versionPayload.sizeOfCollection,
245+
studyCompletion: versionPayload.studyCompletion
246+
},
236247
metadataBlocks: transformPayloadToDatasetMetadataBlocks(
237248
versionPayload.metadataBlocks,
238249
keepRawFields
@@ -242,7 +253,9 @@ export const transformVersionPayloadToDataset = (
242253
})
243254
}
244255
if ('license' in versionPayload) {
245-
datasetModel.license = transformPayloadToDatasetLicense(versionPayload.license)
256+
datasetModel.license = transformPayloadToDatasetLicense(
257+
versionPayload.license as LicensePayload
258+
)
246259
}
247260
if ('alternativePersistentId' in versionPayload) {
248261
datasetModel.alternativePersistentId = versionPayload.alternativePersistentId

src/files/infra/clients/DirectUploadClient.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ export class DirectUploadClient implements IDirectUploadClient {
7373
if (axios.isCancel(error)) {
7474
throw new FileUploadCancelError(file.name, datasetId)
7575
}
76-
throw new FileUploadError(file.name, datasetId, error.message)
76+
const errorMessage = error instanceof Error ? error.message : 'Upload singlepart file failed'
77+
throw new FileUploadError(file.name, datasetId, errorMessage)
7778
}
7879
}
7980

@@ -114,16 +115,20 @@ export class DirectUploadClient implements IDirectUploadClient {
114115
eTags[`${index + 1}`] = eTag
115116
} catch (error) {
116117
if (axios.isCancel(error)) {
117-
await this.abortMultipartUpload(file.name, datasetId, destination.abortEndpoint)
118+
await this.abortMultipartUpload(file.name, datasetId, destination.abortEndpoint as string)
118119
throw new FileUploadCancelError(file.name, datasetId)
119120
}
120121
if (retries < maxRetries) {
121122
const backoffDelay = Math.pow(2, retries) * 1000
122123
await new Promise((resolve) => setTimeout(resolve, backoffDelay))
123124
await uploadPart(destinationUrl, index, retries + 1)
124125
} else {
125-
await this.abortMultipartUpload(file.name, datasetId, destination.abortEndpoint)
126-
throw new FilePartUploadError(file.name, datasetId, error.message, index + 1)
126+
await this.abortMultipartUpload(file.name, datasetId, destination.abortEndpoint as string)
127+
128+
const errorMessage =
129+
error instanceof Error ? error.message : 'Upload part of multipart file failed'
130+
131+
throw new FilePartUploadError(file.name, datasetId, errorMessage, index + 1)
127132
}
128133
}
129134
}
@@ -165,7 +170,7 @@ export class DirectUploadClient implements IDirectUploadClient {
165170
): Promise<void> {
166171
return await axios
167172
.put(
168-
buildRequestUrl(destination.completeEndpoint),
173+
buildRequestUrl(destination.completeEndpoint as string),
169174
eTags,
170175
buildRequestConfig(
171176
true,
@@ -177,7 +182,7 @@ export class DirectUploadClient implements IDirectUploadClient {
177182
.then(() => undefined)
178183
.catch(async (error) => {
179184
if (axios.isCancel(error)) {
180-
await this.abortMultipartUpload(fileName, datasetId, destination.abortEndpoint)
185+
await this.abortMultipartUpload(fileName, datasetId, destination.abortEndpoint as string)
181186
throw new FileUploadCancelError(fileName, datasetId)
182187
}
183188
throw new MultipartCompletionError(fileName, datasetId, error.message)

src/metadataBlocks/infra/repositories/transformers/metadataBlockTransformers.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,19 @@ const transformMetadataBlockPayloadToMetadataBlock = (
6464

6565
const getChildFieldKeys = (metadataBlockFieldsPayload: Record<string, unknown>): Set<string> => {
6666
const childFieldKeys = new Set<string>()
67-
Object.values(metadataBlockFieldsPayload).forEach(
68-
(fieldInfo: { childFields?: Record<string, unknown> }) => {
69-
if (fieldInfo.childFields) {
70-
Object.keys(fieldInfo.childFields).forEach((childKey) => {
71-
childFieldKeys.add(childKey)
72-
})
73-
}
67+
Object.values(metadataBlockFieldsPayload).forEach((fieldInfo) => {
68+
if (
69+
fieldInfo &&
70+
typeof fieldInfo === 'object' &&
71+
'childFields' in fieldInfo &&
72+
typeof fieldInfo.childFields === 'object' &&
73+
(fieldInfo?.childFields as Record<string, unknown>)
74+
) {
75+
Object.keys(fieldInfo.childFields as Record<string, unknown>).forEach((childKey) => {
76+
childFieldKeys.add(childKey)
77+
})
7478
}
75-
)
79+
})
7680
return childFieldKeys
7781
}
7882

0 commit comments

Comments
 (0)