geonetwork-ui 2.3.0-dev.2c3530dc → 2.3.0-dev.376e0e90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/libs/api/metadata-converter/src/index.mjs +5 -5
- package/esm2022/libs/api/metadata-converter/src/lib/base.converter.mjs +14 -0
- package/esm2022/libs/api/metadata-converter/src/lib/find-converter.mjs +15 -0
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +3 -3
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.converter.mjs +52 -0
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +3 -3
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/index.mjs +4 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/index.mjs +2 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.mjs +123 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.mjs +116 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.mjs +138 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/index.mjs +2 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +242 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +58 -62
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.mjs +18 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.mjs +14 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/role.mapper.mjs +48 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.mjs +18 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/update-frequency.mapper.mjs +64 -0
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +75 -58
- package/esm2022/libs/api/metadata-converter/src/lib/xml-utils.mjs +76 -14
- package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +4 -4
- package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
- package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +8 -8
- package/fesm2022/geonetwork-ui.mjs +822 -245
- package/fesm2022/geonetwork-ui.mjs.map +1 -1
- package/libs/api/metadata-converter/src/index.d.ts +4 -4
- package/libs/api/metadata-converter/src/index.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/{metadata-base.mapper.d.ts → base.converter.d.ts} +3 -3
- package/libs/api/metadata-converter/src/lib/base.converter.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/find-converter.d.ts +3 -0
- package/libs/api/metadata-converter/src/lib/find-converter.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/gn4/{gn4.metadata.mapper.d.ts → gn4.converter.d.ts} +5 -5
- package/libs/api/metadata-converter/src/lib/gn4/gn4.converter.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/gn4/index.d.ts +4 -0
- package/libs/api/metadata-converter/src/lib/gn4/index.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19115-3/index.d.ts +2 -0
- package/libs/api/metadata-converter/src/lib/iso19115-3/index.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts +9 -0
- package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +20 -0
- package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts +21 -0
- package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/index.d.ts +2 -0
- package/libs/api/metadata-converter/src/lib/iso19139/index.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts +11 -0
- package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +34 -6
- package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.d.ts +8 -0
- package/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/utils/role.mapper.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/utils/update-frequency.mapper.d.ts.map +1 -0
- package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +39 -3
- package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/xml-utils.d.ts +14 -1
- package/libs/api/metadata-converter/src/lib/xml-utils.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +2 -2
- package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +6 -4
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
- package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/libs/api/metadata-converter/src/index.ts +4 -4
- package/src/libs/api/metadata-converter/src/lib/{metadata-base.mapper.ts → base.converter.ts} +2 -2
- package/src/libs/api/metadata-converter/src/lib/find-converter.ts +16 -0
- package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +32 -5
- package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +11 -4
- package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +33 -7
- package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +580 -0
- package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +2 -2
- package/src/libs/api/metadata-converter/src/lib/gn4/{gn4.metadata.mapper.ts → gn4.converter.ts} +2 -2
- package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +2 -2
- package/src/libs/api/metadata-converter/src/lib/gn4/index.ts +3 -0
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/index.ts +1 -0
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.ts +176 -0
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +329 -0
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +513 -0
- package/src/libs/api/metadata-converter/src/lib/iso19139/index.ts +1 -0
- package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +327 -0
- package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +121 -82
- package/src/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.ts +20 -0
- package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +175 -95
- package/src/libs/api/metadata-converter/src/lib/xml-utils.ts +84 -16
- package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +2 -2
- package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +9 -4
- package/src/libs/feature/editor/src/lib/services/editor.service.ts +27 -16
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +0 -52
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.mjs +0 -14
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/role.mapper.mjs +0 -48
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/status.mapper.mjs +0 -18
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/update-frequency.mapper.mjs +0 -64
- package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +0 -130
- package/esm2022/libs/api/metadata-converter/src/lib/metadata-base.mapper.mjs +0 -14
- package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19139/codelists/role.mapper.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19139/codelists/status.mapper.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19139/codelists/update-frequency.mapper.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts +0 -4
- package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +0 -1
- package/libs/api/metadata-converter/src/lib/metadata-base.mapper.d.ts.map +0 -1
- package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +0 -196
- /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/keyword.mapper.d.ts +0 -0
- /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/role.mapper.d.ts +0 -0
- /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/status.mapper.d.ts +0 -0
- /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/update-frequency.mapper.d.ts +0 -0
- /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/keyword.mapper.ts +0 -0
- /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/role.mapper.ts +0 -0
- /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/status.mapper.ts +0 -0
- /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/update-frequency.mapper.ts +0 -0
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Constraint,
|
|
3
3
|
DatasetDistribution,
|
|
4
|
-
DatasetSpatialExtent,
|
|
5
|
-
DatasetTemporalExtent,
|
|
6
4
|
GraphicOverview,
|
|
7
5
|
Individual,
|
|
8
6
|
Keyword,
|
|
@@ -16,8 +14,8 @@ import {
|
|
|
16
14
|
UpdateFrequency,
|
|
17
15
|
UpdateFrequencyCustom,
|
|
18
16
|
} from '../../../../../../libs/common/domain/src/lib/model/record'
|
|
19
|
-
import { getStatusFromStatusCode } from './
|
|
20
|
-
import { getUpdateFrequencyFromFrequencyCode } from './
|
|
17
|
+
import { getStatusFromStatusCode } from './utils/status.mapper'
|
|
18
|
+
import { getUpdateFrequencyFromFrequencyCode } from './utils/update-frequency.mapper'
|
|
21
19
|
import {
|
|
22
20
|
findChildElement,
|
|
23
21
|
findChildrenElement,
|
|
@@ -39,11 +37,15 @@ import {
|
|
|
39
37
|
mapArray,
|
|
40
38
|
pipe,
|
|
41
39
|
} from '../function-utils'
|
|
42
|
-
import { getRoleFromRoleCode } from './
|
|
40
|
+
import { getRoleFromRoleCode } from './utils/role.mapper'
|
|
43
41
|
import { matchMimeType, matchProtocol } from '../common/distribution.mapper'
|
|
44
|
-
import { getKeywordTypeFromKeywordTypeCode } from './
|
|
42
|
+
import { getKeywordTypeFromKeywordTypeCode } from './utils/keyword.mapper'
|
|
43
|
+
import { fullNameToParts } from './utils/individual-name'
|
|
45
44
|
|
|
46
|
-
function extractCharacterString(): ChainableFunction<
|
|
45
|
+
export function extractCharacterString(): ChainableFunction<
|
|
46
|
+
XmlElement,
|
|
47
|
+
string
|
|
48
|
+
> {
|
|
47
49
|
return pipe(
|
|
48
50
|
fallback(
|
|
49
51
|
findChildElement('gco:CharacterString', false),
|
|
@@ -53,7 +55,7 @@ function extractCharacterString(): ChainableFunction<XmlElement, string> {
|
|
|
53
55
|
)
|
|
54
56
|
}
|
|
55
57
|
|
|
56
|
-
function extractDateTime(): ChainableFunction<XmlElement, Date> {
|
|
58
|
+
export function extractDateTime(): ChainableFunction<XmlElement, Date> {
|
|
57
59
|
return pipe(
|
|
58
60
|
fallback(
|
|
59
61
|
findChildElement('gco:DateTime', false),
|
|
@@ -64,7 +66,7 @@ function extractDateTime(): ChainableFunction<XmlElement, Date> {
|
|
|
64
66
|
)
|
|
65
67
|
}
|
|
66
68
|
|
|
67
|
-
function extractUrl(): ChainableFunction<XmlElement, URL> {
|
|
69
|
+
export function extractUrl(): ChainableFunction<XmlElement, URL> {
|
|
68
70
|
const getUrl = pipe(findChildElement('gmd:URL', false), readText())
|
|
69
71
|
const getCharacterString = pipe(
|
|
70
72
|
findChildElement('gco:CharacterString', false),
|
|
@@ -86,12 +88,12 @@ function extractUrl(): ChainableFunction<XmlElement, URL> {
|
|
|
86
88
|
)
|
|
87
89
|
}
|
|
88
90
|
|
|
89
|
-
function extractMandatoryUrl() {
|
|
91
|
+
export function extractMandatoryUrl() {
|
|
90
92
|
return fallback(extractUrl(), () => new URL('http://missing'))
|
|
91
93
|
}
|
|
92
94
|
|
|
93
95
|
// from gmd:role
|
|
94
|
-
function extractRole(): ChainableFunction<XmlElement, Role> {
|
|
96
|
+
export function extractRole(): ChainableFunction<XmlElement, Role> {
|
|
95
97
|
return pipe(
|
|
96
98
|
findChildElement('gmd:CI_RoleCode'),
|
|
97
99
|
readAttribute('codeListValue'),
|
|
@@ -100,7 +102,10 @@ function extractRole(): ChainableFunction<XmlElement, Role> {
|
|
|
100
102
|
}
|
|
101
103
|
|
|
102
104
|
// from gmd:CI_ResponsibleParty
|
|
103
|
-
function extractOrganization(): ChainableFunction<
|
|
105
|
+
export function extractOrganization(): ChainableFunction<
|
|
106
|
+
XmlElement,
|
|
107
|
+
Organization
|
|
108
|
+
> {
|
|
104
109
|
const getUrl = pipe(
|
|
105
110
|
findNestedElements(
|
|
106
111
|
'gmd:contactInfo',
|
|
@@ -128,10 +133,7 @@ function extractOrganization(): ChainableFunction<XmlElement, Organization> {
|
|
|
128
133
|
}
|
|
129
134
|
|
|
130
135
|
// from gmd:CI_ResponsibleParty
|
|
131
|
-
function
|
|
132
|
-
XmlElement,
|
|
133
|
-
Array<Individual>
|
|
134
|
-
> {
|
|
136
|
+
export function extractIndividual(): ChainableFunction<XmlElement, Individual> {
|
|
135
137
|
const getRole = pipe(findChildElement('gmd:role'), extractRole())
|
|
136
138
|
const getPosition = pipe(
|
|
137
139
|
findChildElement('gmd:positionName'),
|
|
@@ -142,40 +144,70 @@ function extractIndividuals(): ChainableFunction<
|
|
|
142
144
|
extractCharacterString(),
|
|
143
145
|
map((fullName) => {
|
|
144
146
|
if (!fullName) return []
|
|
145
|
-
|
|
146
|
-
if (!parts.length) return [fullName, null]
|
|
147
|
-
const first = parts.shift()
|
|
148
|
-
return [first, parts.join(' ')]
|
|
147
|
+
return fullNameToParts(fullName)
|
|
149
148
|
})
|
|
150
149
|
)
|
|
151
150
|
const getOrganization = extractOrganization()
|
|
151
|
+
const getContactRoot = findNestedElement('gmd:contactInfo', 'gmd:CI_Contact')
|
|
152
152
|
const getEmail = pipe(
|
|
153
|
+
getContactRoot,
|
|
153
154
|
findChildElement('gmd:electronicMailAddress'),
|
|
154
155
|
extractCharacterString(),
|
|
155
156
|
map((email) => (email === null ? 'missing@missing.com' : email))
|
|
156
157
|
)
|
|
158
|
+
const getAddress = pipe(
|
|
159
|
+
getContactRoot,
|
|
160
|
+
findNestedElement('gmd:address', 'gmd:CI_Address'),
|
|
161
|
+
combine(
|
|
162
|
+
pipe(
|
|
163
|
+
findChildElement('gmd:deliveryPoint', false),
|
|
164
|
+
extractCharacterString()
|
|
165
|
+
),
|
|
166
|
+
pipe(findChildElement('gmd:city', false), extractCharacterString()),
|
|
167
|
+
pipe(findChildElement('gmd:postalCode', false), extractCharacterString()),
|
|
168
|
+
pipe(findChildElement('gmd:country', false), extractCharacterString())
|
|
169
|
+
),
|
|
170
|
+
map((parts) => parts.filter((p) => !!p).join(', '))
|
|
171
|
+
)
|
|
172
|
+
const getPhone = pipe(
|
|
173
|
+
getContactRoot,
|
|
174
|
+
findNestedElement('gmd:phone', 'gmd:CI_Telephone', 'gmd:voice'),
|
|
175
|
+
extractCharacterString()
|
|
176
|
+
)
|
|
157
177
|
return pipe(
|
|
158
178
|
combine(
|
|
159
179
|
getRole,
|
|
160
180
|
getPosition,
|
|
161
181
|
getNameParts,
|
|
162
182
|
getOrganization,
|
|
163
|
-
|
|
183
|
+
getEmail,
|
|
184
|
+
getAddress,
|
|
185
|
+
getPhone
|
|
164
186
|
),
|
|
165
|
-
map(
|
|
166
|
-
|
|
187
|
+
map(
|
|
188
|
+
([
|
|
189
|
+
role,
|
|
190
|
+
position,
|
|
191
|
+
[firstName, lastName],
|
|
192
|
+
organization,
|
|
193
|
+
email,
|
|
194
|
+
address,
|
|
195
|
+
phone,
|
|
196
|
+
]) => ({
|
|
167
197
|
email,
|
|
168
198
|
role,
|
|
169
199
|
organization,
|
|
170
200
|
...(position && { position }),
|
|
171
201
|
...(firstName && { firstName }),
|
|
172
202
|
...(lastName && { lastName }),
|
|
173
|
-
|
|
203
|
+
...(address && { address }),
|
|
204
|
+
...(phone && { phone }),
|
|
205
|
+
})
|
|
174
206
|
)
|
|
175
207
|
)
|
|
176
208
|
}
|
|
177
209
|
|
|
178
|
-
function extractStatus(): ChainableFunction<XmlElement, RecordStatus> {
|
|
210
|
+
export function extractStatus(): ChainableFunction<XmlElement, RecordStatus> {
|
|
179
211
|
return pipe(
|
|
180
212
|
findChildElement('gmd:MD_ProgressCode'),
|
|
181
213
|
readAttribute('codeListValue'),
|
|
@@ -184,7 +216,7 @@ function extractStatus(): ChainableFunction<XmlElement, RecordStatus> {
|
|
|
184
216
|
}
|
|
185
217
|
|
|
186
218
|
// from gmd:resourceConstraints
|
|
187
|
-
function extractLegalConstraints(): ChainableFunction<
|
|
219
|
+
export function extractLegalConstraints(): ChainableFunction<
|
|
188
220
|
XmlElement,
|
|
189
221
|
Array<Constraint>
|
|
190
222
|
> {
|
|
@@ -214,7 +246,7 @@ function extractLegalConstraints(): ChainableFunction<
|
|
|
214
246
|
}
|
|
215
247
|
|
|
216
248
|
// from gmd:resourceConstraints
|
|
217
|
-
function extractSecurityConstraints(): ChainableFunction<
|
|
249
|
+
export function extractSecurityConstraints(): ChainableFunction<
|
|
218
250
|
XmlElement,
|
|
219
251
|
Array<Constraint>
|
|
220
252
|
> {
|
|
@@ -230,7 +262,7 @@ function extractSecurityConstraints(): ChainableFunction<
|
|
|
230
262
|
}
|
|
231
263
|
|
|
232
264
|
// from gmd:resourceConstraints
|
|
233
|
-
function extractOtherConstraints(): ChainableFunction<
|
|
265
|
+
export function extractOtherConstraints(): ChainableFunction<
|
|
234
266
|
XmlElement,
|
|
235
267
|
Array<Constraint>
|
|
236
268
|
> {
|
|
@@ -246,7 +278,10 @@ function extractOtherConstraints(): ChainableFunction<
|
|
|
246
278
|
}
|
|
247
279
|
|
|
248
280
|
// from gmd:resourceConstraints
|
|
249
|
-
function extractLicenses(): ChainableFunction<
|
|
281
|
+
export function extractLicenses(): ChainableFunction<
|
|
282
|
+
XmlElement,
|
|
283
|
+
Array<Constraint>
|
|
284
|
+
> {
|
|
250
285
|
return pipe(
|
|
251
286
|
findChildrenElement('gmd:MD_LegalConstraints', false),
|
|
252
287
|
filterArray(
|
|
@@ -272,18 +307,20 @@ function extractLicenses(): ChainableFunction<XmlElement, Array<Constraint>> {
|
|
|
272
307
|
)
|
|
273
308
|
}
|
|
274
309
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
findParent('gmd:MD_Distribution'),
|
|
282
|
-
findNestedElement('gmd:distributionFormat', 'gmd:MD_Format', 'gmd:name'),
|
|
283
|
-
extractCharacterString(),
|
|
284
|
-
map(matchMimeType)
|
|
285
|
-
)
|
|
310
|
+
const getMimeType = pipe(
|
|
311
|
+
findParent('gmd:MD_Distribution'),
|
|
312
|
+
findNestedElement('gmd:distributionFormat', 'gmd:MD_Format', 'gmd:name'),
|
|
313
|
+
extractCharacterString(),
|
|
314
|
+
map(matchMimeType)
|
|
315
|
+
)
|
|
286
316
|
|
|
317
|
+
/**
|
|
318
|
+
* Extract distributions from a MD_Distribution element
|
|
319
|
+
* @param getMimeTypeFn This function starts from a gmd:transferOptions element
|
|
320
|
+
*/
|
|
321
|
+
export function extractDatasetDistributions(
|
|
322
|
+
getMimeTypeFn: ChainableFunction<XmlElement, string>
|
|
323
|
+
): ChainableFunction<XmlElement, DatasetDistribution[]> {
|
|
287
324
|
const getUrl = pipe(findChildElement('gmd:linkage'), extractMandatoryUrl())
|
|
288
325
|
const getProtocolStr = pipe(
|
|
289
326
|
findChildElement('gmd:protocol'),
|
|
@@ -326,11 +363,11 @@ function extractDatasetDistributions(): ChainableFunction<
|
|
|
326
363
|
getUrl,
|
|
327
364
|
getName,
|
|
328
365
|
getDescription,
|
|
329
|
-
|
|
366
|
+
getMimeTypeFn
|
|
330
367
|
)
|
|
331
368
|
),
|
|
332
369
|
mapArray(
|
|
333
|
-
([isService, isDownload, protocol, url, name, description,
|
|
370
|
+
([isService, isDownload, protocol, url, name, description, mimeType]) => {
|
|
334
371
|
if (isService) {
|
|
335
372
|
const hasIdentifier = protocol === 'wms' || protocol === 'wfs'
|
|
336
373
|
return {
|
|
@@ -342,7 +379,6 @@ function extractDatasetDistributions(): ChainableFunction<
|
|
|
342
379
|
...(description && { description }),
|
|
343
380
|
}
|
|
344
381
|
} else if (isDownload) {
|
|
345
|
-
const mimeType = format
|
|
346
382
|
return {
|
|
347
383
|
type: 'download',
|
|
348
384
|
url: url,
|
|
@@ -363,7 +399,7 @@ function extractDatasetDistributions(): ChainableFunction<
|
|
|
363
399
|
)
|
|
364
400
|
}
|
|
365
401
|
|
|
366
|
-
function getUpdateFrequencyFromCustomPeriod(
|
|
402
|
+
export function getUpdateFrequencyFromCustomPeriod(
|
|
367
403
|
isoPeriod: string
|
|
368
404
|
): UpdateFrequencyCustom {
|
|
369
405
|
if (!isoPeriod) return null
|
|
@@ -415,7 +451,7 @@ function getUpdateFrequencyFromCustomPeriod(
|
|
|
415
451
|
}
|
|
416
452
|
|
|
417
453
|
// from gmd:MD_MaintenanceInformation
|
|
418
|
-
function extractUpdateFrequency(): ChainableFunction<
|
|
454
|
+
export function extractUpdateFrequency(): ChainableFunction<
|
|
419
455
|
XmlElement,
|
|
420
456
|
UpdateFrequency
|
|
421
457
|
> {
|
|
@@ -439,18 +475,24 @@ function extractUpdateFrequency(): ChainableFunction<
|
|
|
439
475
|
|
|
440
476
|
/**
|
|
441
477
|
* Looks for srv:SV_ServiceIdentification or gmd:MD_DataIdentification element
|
|
442
|
-
*
|
|
478
|
+
* Will find the first one that exists, not reading the type of the record
|
|
479
|
+
* (this allows using this function in other similar schemas)
|
|
443
480
|
*/
|
|
444
|
-
function findIdentification() {
|
|
445
|
-
return (
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
481
|
+
export function findIdentification() {
|
|
482
|
+
return pipe(
|
|
483
|
+
findChildElement('gmd:identificationInfo', false),
|
|
484
|
+
combine(
|
|
485
|
+
findChildElement('gmd:MD_DataIdentification', false),
|
|
486
|
+
findChildElement('srv:SV_ServiceIdentification', false)
|
|
487
|
+
),
|
|
488
|
+
filterArray((el) => el !== null),
|
|
489
|
+
getAtIndex(0)
|
|
490
|
+
)
|
|
451
491
|
}
|
|
452
492
|
|
|
453
|
-
function
|
|
493
|
+
export function extractIdentificationDate(
|
|
494
|
+
type: 'creation' | 'revision' | 'publication'
|
|
495
|
+
) {
|
|
454
496
|
return pipe(
|
|
455
497
|
findIdentification(),
|
|
456
498
|
findNestedElements('gmd:citation', 'gmd:CI_Citation', 'gmd:date'),
|
|
@@ -473,7 +515,7 @@ function extractCitationDate(type: 'creation' | 'revision' | 'publication') {
|
|
|
473
515
|
)
|
|
474
516
|
}
|
|
475
517
|
|
|
476
|
-
function getSpatialRepresentationFromCode(
|
|
518
|
+
export function getSpatialRepresentationFromCode(
|
|
477
519
|
spatialRepresentationCode: string
|
|
478
520
|
): SpatialRepresentationType | null {
|
|
479
521
|
switch (spatialRepresentationCode) {
|
|
@@ -513,11 +555,19 @@ export function readOwnerOrganization(rootEl: XmlElement): Organization {
|
|
|
513
555
|
)(rootEl)
|
|
514
556
|
}
|
|
515
557
|
|
|
516
|
-
export function
|
|
517
|
-
return
|
|
558
|
+
export function readResourceUpdated(rootEl: XmlElement): Date {
|
|
559
|
+
return extractIdentificationDate('revision')(rootEl)
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
export function readResourceCreated(rootEl: XmlElement): Date {
|
|
563
|
+
return extractIdentificationDate('creation')(rootEl)
|
|
518
564
|
}
|
|
519
565
|
|
|
520
|
-
export function
|
|
566
|
+
export function readResourcePublished(rootEl: XmlElement): Date {
|
|
567
|
+
return extractIdentificationDate('publication')(rootEl)
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
export function readRecordUpdated(rootEl: XmlElement): Date {
|
|
521
571
|
return pipe(findChildElement('gmd:dateStamp'), extractDateTime())(rootEl)
|
|
522
572
|
}
|
|
523
573
|
|
|
@@ -537,30 +587,29 @@ export function readAbstract(rootEl: XmlElement): string {
|
|
|
537
587
|
)(rootEl)
|
|
538
588
|
}
|
|
539
589
|
|
|
540
|
-
export function
|
|
541
|
-
return
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
590
|
+
export function readContacts(rootEl: XmlElement): Individual[] {
|
|
591
|
+
return pipe(
|
|
592
|
+
findChildrenElement('gmd:contact', false),
|
|
593
|
+
mapArray(findChildElement('gmd:CI_ResponsibleParty', false)),
|
|
594
|
+
mapArray(extractIndividual())
|
|
595
|
+
)(rootEl)
|
|
546
596
|
}
|
|
547
597
|
|
|
548
|
-
export function
|
|
598
|
+
export function readContactsForResource(rootEl: XmlElement): Individual[] {
|
|
549
599
|
return pipe(
|
|
550
600
|
findIdentification(),
|
|
551
601
|
combine(
|
|
552
|
-
findChildrenElement('gmd:contact'),
|
|
553
|
-
findChildrenElement('gmd:pointOfContact')
|
|
602
|
+
findChildrenElement('gmd:contact', false),
|
|
603
|
+
findChildrenElement('gmd:pointOfContact', false)
|
|
554
604
|
),
|
|
555
605
|
flattenArray(),
|
|
556
606
|
mapArray(findChildElement('gmd:CI_ResponsibleParty', false)),
|
|
557
|
-
mapArray(
|
|
558
|
-
flattenArray()
|
|
607
|
+
mapArray(extractIndividual())
|
|
559
608
|
)(rootEl)
|
|
560
609
|
}
|
|
561
610
|
|
|
562
611
|
// from gmd:thesaurusName
|
|
563
|
-
function readThesaurus(rootEl: XmlElement): KeywordThesaurus {
|
|
612
|
+
export function readThesaurus(rootEl: XmlElement): KeywordThesaurus {
|
|
564
613
|
if (!rootEl) return null
|
|
565
614
|
|
|
566
615
|
const findIdentifier = findNestedElement(
|
|
@@ -583,7 +632,7 @@ function readThesaurus(rootEl: XmlElement): KeywordThesaurus {
|
|
|
583
632
|
}
|
|
584
633
|
|
|
585
634
|
// from gmd:MD_Keywords
|
|
586
|
-
function readKeywordGroup(rootEl: XmlElement): Keyword[] {
|
|
635
|
+
export function readKeywordGroup(rootEl: XmlElement): Keyword[] {
|
|
587
636
|
const type = pipe(
|
|
588
637
|
findChildrenElement('gmd:MD_KeywordTypeCode'),
|
|
589
638
|
mapArray(readAttribute('codeListValue')),
|
|
@@ -701,16 +750,6 @@ export function readOverviews(rootEl: XmlElement): GraphicOverview[] {
|
|
|
701
750
|
)(rootEl)
|
|
702
751
|
}
|
|
703
752
|
|
|
704
|
-
export function readSpatialExtents(rootEl: XmlElement): DatasetSpatialExtent[] {
|
|
705
|
-
return [] // TODO
|
|
706
|
-
}
|
|
707
|
-
|
|
708
|
-
export function readTemporalExtents(
|
|
709
|
-
rootEl: XmlElement
|
|
710
|
-
): DatasetTemporalExtent[] {
|
|
711
|
-
return [] // TODO
|
|
712
|
-
}
|
|
713
|
-
|
|
714
753
|
export function readLineage(rootEl: XmlElement): string {
|
|
715
754
|
return pipe(
|
|
716
755
|
findNestedElement(
|
|
@@ -727,7 +766,7 @@ export function readLineage(rootEl: XmlElement): string {
|
|
|
727
766
|
export function readDistributions(rootEl: XmlElement): DatasetDistribution[] {
|
|
728
767
|
return pipe(
|
|
729
768
|
findNestedElements('gmd:distributionInfo', 'gmd:MD_Distribution'),
|
|
730
|
-
mapArray(extractDatasetDistributions()),
|
|
769
|
+
mapArray(extractDatasetDistributions(getMimeType)),
|
|
731
770
|
flattenArray()
|
|
732
771
|
)(rootEl)
|
|
733
772
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parts are [firstName, lastName]
|
|
3
|
+
* Second part will be null if no separation could be done
|
|
4
|
+
* @param fullName
|
|
5
|
+
*/
|
|
6
|
+
export function fullNameToParts(fullName: string): [string, string | null] {
|
|
7
|
+
const parts = fullName.trim().split(/\s+/)
|
|
8
|
+
const first = parts.shift()
|
|
9
|
+
return [first, parts.join(' ').trim() || null]
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function namePartsToFull(
|
|
13
|
+
firstName: string | null,
|
|
14
|
+
lastName: string | null
|
|
15
|
+
): string | null {
|
|
16
|
+
const first = firstName?.trim()
|
|
17
|
+
const last = lastName?.trim()
|
|
18
|
+
if (!first && !last) return null
|
|
19
|
+
return last && first ? `${first} ${last}` : last || first
|
|
20
|
+
}
|