From 7bce7d08fd07627b835224aed4010328cc3ef3b6 Mon Sep 17 00:00:00 2001 From: Florian Necas Date: Mon, 28 Aug 2023 11:56:53 +0200 Subject: [PATCH] feat: adds lang to es mappers --- .../src/lib/gn4/atomic-operations.ts | 10 +++-- .../src/lib/gn4/gn4.field.mapper.spec.ts | 9 +++++ .../src/lib/gn4/gn4.field.mapper.ts | 39 +++++++++++++------ .../src/lib/gn4/gn4.metadata.mapper.spec.ts | 11 +++++- .../src/lib/elasticsearch/full-response.ts | 2 + .../results-hits.container.component.spec.ts | 10 ++++- 6 files changed, 63 insertions(+), 18 deletions(-) diff --git a/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts b/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts index 7c1dc4d6a..b1129bec7 100644 --- a/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +++ b/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts @@ -22,13 +22,15 @@ export const selectFallback = (field: T, fallback: U): T | U => field === null ? fallback : field export const selectTranslatedValue = ( - source: SourceWithUnknownProps -): T | null => selectField(source, 'default') + source: SourceWithUnknownProps, + lang3: string +): T | null => selectField(source, lang3) || selectField(source, 'default') export const selectTranslatedField = ( source: SourceWithUnknownProps, - fieldName: string -): T | null => selectTranslatedValue(selectField(source, fieldName)) + fieldName: string, + lang3: string +): T | null => selectTranslatedValue(selectField(source, fieldName), lang3) export const toDate = (field) => new Date(field) diff --git a/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.spec.ts b/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.spec.ts index 2c6a88baa..55968a582 100644 --- a/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.spec.ts +++ b/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.spec.ts @@ -3,12 +3,17 @@ import { TestBed } from '@angular/core/testing' import { ES_LINK_FIXTURES } from '@geonetwork-ui/common/fixtures' import { Gn4FieldMapper } from './gn4.field.mapper' import { MetadataUrlService } from './metadata-url.service' +import { TranslateService } from '@ngx-translate/core' class MetadataUrlServiceMock { translate = undefined getUrl = () => 'url' } +const translateServiceMock = { + currentLang: 'de', +} + describe('Gn4FieldMapper', () => { let service: Gn4FieldMapper @@ -16,6 +21,10 @@ describe('Gn4FieldMapper', () => { TestBed.configureTestingModule({ providers: [ { provide: MetadataUrlService, useClass: MetadataUrlServiceMock }, + { + provide: TranslateService, + useValue: translateServiceMock, + }, ], }) service = TestBed.inject(Gn4FieldMapper) diff --git a/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts b/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts index 73f73d70e..7ee4ea6f7 100644 --- a/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +++ b/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts @@ -25,6 +25,8 @@ import { OnlineLinkResource, } from '@geonetwork-ui/common/domain/record' import { matchProtocol } from '../common/distribution.mapper' +import { TranslateService } from '@ngx-translate/core' +import { LANG_2_TO_3_MAPPER } from '@geonetwork-ui/util/i18n' type ESResponseSource = SourceWithUnknownProps @@ -37,7 +39,14 @@ type EsFieldMapperFn = ( providedIn: 'root', }) export class Gn4FieldMapper { - constructor(private metadataUrlService: MetadataUrlService) {} + constructor( + private metadataUrlService: MetadataUrlService, + private translateService: TranslateService + ) {} + + private lang3 = LANG_2_TO_3_MAPPER[this.translateService.currentLang] + ? 'lang' + LANG_2_TO_3_MAPPER[this.translateService.currentLang] + : null protected fields: Record = { id: (output, source) => @@ -50,21 +59,22 @@ export class Gn4FieldMapper { resourceTitleObject: (output, source) => ({ ...output, title: selectFallback( - selectTranslatedField(source, 'resourceTitleObject'), + selectTranslatedField(source, 'resourceTitleObject', this.lang3), 'no title' ), }), resourceAbstractObject: (output, source) => ({ ...output, abstract: selectFallback( - selectTranslatedField(source, 'resourceAbstractObject'), + selectTranslatedField(source, 'resourceAbstractObject', this.lang3), 'no title' ), }), overview: (output, source) => { const firstOverview = getFirstValue(selectField(source, 'overview')) const description = selectTranslatedValue( - selectField(firstOverview, 'text') + selectField(firstOverview, 'text'), + this.lang3 ) return { ...output, @@ -150,7 +160,7 @@ export class Gn4FieldMapper { ...output, keywords: getAsArray( selectField(source, 'tag') - ).map((tag) => selectTranslatedValue(tag)), + ).map((tag) => selectTranslatedValue(tag, this.lang3)), }), inspireTheme: (output, source) => ({ ...output, @@ -183,14 +193,14 @@ export class Gn4FieldMapper { ).map((license) => { const link = getAsUrl(selectField(license, 'link')) return { - text: selectTranslatedValue(license), + text: selectTranslatedValue(license, this.lang3), ...(link ? { link } : {}), } }), }), lineageObject: (output, source) => ({ ...output, - lineage: selectTranslatedField(source, 'lineageObject'), + lineage: selectTranslatedField(source, 'lineageObject', this.lang3), }), mainLanguage: (output) => output, userSavedCount: (output, source) => @@ -243,7 +253,8 @@ export class Gn4FieldMapper { useLimitations: [ ...(output.useLimitations || []), ...selectField(source, fieldName).map( - selectTranslatedValue + (source: SourceWithUnknownProps) => + selectTranslatedValue(source, this.lang3) ), ], } @@ -252,7 +263,7 @@ export class Gn4FieldMapper { ...(output.accessConstraints || []), ...selectField(source, fieldName).map( (field) => ({ - text: selectTranslatedValue(field), + text: selectTranslatedValue(field, this.lang3), type: this.getConstraintsType(fieldName), }) ), @@ -299,16 +310,20 @@ export class Gn4FieldMapper { ): DatasetDistribution | null => { const url = getAsUrl( selectFallback( - selectTranslatedField(sourceLink, 'urlObject'), + selectTranslatedField(sourceLink, 'urlObject', this.lang3), selectField(sourceLink, 'url') ) ) const name = selectFallback( - selectTranslatedField(sourceLink, 'nameObject'), + selectTranslatedField(sourceLink, 'nameObject', this.lang3), selectField(sourceLink, 'name') ) const description = selectFallback( - selectTranslatedField(sourceLink, 'descriptionObject'), + selectTranslatedField( + sourceLink, + 'descriptionObject', + this.lang3 + ), selectField(sourceLink, 'description') ) // no url: fail early diff --git a/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.spec.ts b/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.spec.ts index c26bfe606..ca8015d7e 100644 --- a/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.spec.ts +++ b/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.spec.ts @@ -12,6 +12,7 @@ import { CatalogRecord, DatasetRecord, } from '@geonetwork-ui/common/domain/record' +import { TranslateService } from '@ngx-translate/core' class MetadataUrlServiceMock { translate = undefined @@ -31,6 +32,10 @@ class OrganisationsServiceMock { ) } +const translateServiceMock = { + currentLang: 'de', +} + describe('Gn4MetadataMapper', () => { let service: Gn4MetadataMapper @@ -46,6 +51,10 @@ describe('Gn4MetadataMapper', () => { provide: OrganizationsServiceInterface, useClass: OrganisationsServiceMock, }, + { + provide: TranslateService, + useValue: translateServiceMock, + }, ], }) }) @@ -634,7 +643,7 @@ describe('Gn4MetadataMapper', () => { updatedTimes: 1, }, useLimitations: [ - 'Restriction lié à l’exercice du droit moral', + 'Einschränkung im Zusammenhang mit der Ausübung moralischer Rechte', "Restriction légale d'utilisation à préciser", ], spatialExtents: [], diff --git a/libs/common/fixtures/src/lib/elasticsearch/full-response.ts b/libs/common/fixtures/src/lib/elasticsearch/full-response.ts index 71777f407..6972d2d38 100644 --- a/libs/common/fixtures/src/lib/elasticsearch/full-response.ts +++ b/libs/common/fixtures/src/lib/elasticsearch/full-response.ts @@ -1269,6 +1269,8 @@ export const ES_FIXTURE_FULL_RESPONSE = deepFreeze({ { default: 'Restriction lié à l’exercice du droit moral', langfre: 'Restriction lié à l’exercice du droit moral', + langger: + 'Einschränkung im Zusammenhang mit der Ausübung moralischer Rechte', }, ], geom: { diff --git a/libs/feature/search/src/lib/results-hits-number/results-hits.container.component.spec.ts b/libs/feature/search/src/lib/results-hits-number/results-hits.container.component.spec.ts index 33b6b0082..b6791457f 100644 --- a/libs/feature/search/src/lib/results-hits-number/results-hits.container.component.spec.ts +++ b/libs/feature/search/src/lib/results-hits-number/results-hits.container.component.spec.ts @@ -2,7 +2,7 @@ import { Component, DebugElement, Input, NO_ERRORS_SCHEMA } from '@angular/core' import { ComponentFixture, TestBed } from '@angular/core/testing' import { By } from '@angular/platform-browser' import { SearchFacade } from '../state/search.facade' -import { TranslateModule } from '@ngx-translate/core' +import { TranslateModule, TranslateService } from '@ngx-translate/core' import { of } from 'rxjs' import { ResultsHitsContainerComponent } from './results-hits.container.component' @@ -21,6 +21,10 @@ const searchFacadeMock = { resultsHits$: of(null), } +const translateServiceMock = { + currentLang: 'de', +} + describe('ResultsHitsContainerComponent', () => { let component: ResultsHitsContainerComponent let fixture: ComponentFixture @@ -39,6 +43,10 @@ describe('ResultsHitsContainerComponent', () => { provide: SearchFacade, useValue: searchFacadeMock, }, + { + provide: TranslateService, + useValue: translateServiceMock, + }, ], schemas: [NO_ERRORS_SCHEMA], }).compileComponents()