Skip to content

Commit 6cd7e36

Browse files
authored
Merge pull request #233 from GenomicDataInfrastructure/add-language-tag
feat(api): implement Accept-Language header support for dataset queri…
2 parents 717dd76 + 6b44f85 commit 6cd7e36

File tree

19 files changed

+132
-44
lines changed

19 files changed

+132
-44
lines changed

src/main/java/io/github/genomicdatainfrastructure/discovery/api/DatasetQueryApiImpl.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,16 @@
1010
import io.github.genomicdatainfrastructure.discovery.model.DatasetSearchQuery;
1111
import io.quarkus.oidc.runtime.OidcJwtCallerPrincipal;
1212
import io.quarkus.security.identity.SecurityIdentity;
13+
import io.smallrye.common.constraint.Nullable;
14+
import jakarta.ws.rs.core.HttpHeaders;
15+
import jakarta.ws.rs.core.Context;
1316
import jakarta.ws.rs.core.Response;
17+
import org.eclipse.microprofile.config.inject.ConfigProperty;
1418
import lombok.RequiredArgsConstructor;
1519

20+
import java.util.List;
21+
import java.util.Locale;
22+
1623
@RequiredArgsConstructor
1724
public class DatasetQueryApiImpl implements DatasetQueryApi {
1825

@@ -21,15 +28,23 @@ public class DatasetQueryApiImpl implements DatasetQueryApi {
2128
private final RetrieveDatasetQuery retrieveDatasetQuery;
2229
private final SearchDatasetsQuery searchDatasetsQuery;
2330

31+
@Context
32+
HttpHeaders headers;
33+
34+
@ConfigProperty(name = "app.accept-language.default", defaultValue = "en")
35+
String defaultAcceptLanguage;
36+
2437
@Override
25-
public Response datasetSearch(DatasetSearchQuery datasetSearchQuery) {
26-
var content = searchDatasetsQuery.execute(datasetSearchQuery, accessToken());
38+
public Response datasetSearch(String acceptLanguage, DatasetSearchQuery datasetSearchQuery) {
39+
var preferredLanguage = preferredLanguage();
40+
var content = searchDatasetsQuery.execute(datasetSearchQuery, accessToken(),
41+
preferredLanguage);
2742
return Response.ok(content).build();
2843
}
2944

3045
@Override
31-
public Response retrieveDataset(String id) {
32-
var content = retrieveDatasetQuery.execute(id, accessToken());
46+
public Response retrieveDataset(String id, String acceptLanguage) {
47+
var content = retrieveDatasetQuery.execute(id, accessToken(), preferredLanguage());
3348
return Response.ok(content).build();
3449
}
3550

@@ -60,4 +75,19 @@ private String accessToken() {
6075
var principal = (OidcJwtCallerPrincipal) identity.getPrincipal();
6176
return principal.getRawToken();
6277
}
78+
79+
private String preferredLanguage() {
80+
return getString(headers, defaultAcceptLanguage);
81+
}
82+
83+
@Nullable
84+
public static String getString(HttpHeaders headers, String defaultAcceptLanguage) {
85+
List<Locale> languages = headers.getAcceptableLanguages();
86+
if (languages != null && !languages.isEmpty()) {
87+
return languages.getFirst().toLanguageTag().toLowerCase(Locale.ROOT);
88+
}
89+
return (defaultAcceptLanguage == null || defaultAcceptLanguage.isBlank())
90+
? null
91+
: defaultAcceptLanguage;
92+
}
6393
}

src/main/java/io/github/genomicdatainfrastructure/discovery/datasets/application/ports/DatasetsRepository.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@ List<SearchedDataset> search(
1717
String sort,
1818
Integer rows,
1919
Integer start,
20-
String accessToken);
20+
String accessToken,
21+
String preferredLanguage);
2122

22-
RetrievedDataset findById(String id, String accessToken);
23+
RetrievedDataset findById(String id, String accessToken, String preferredLanguage);
2324

2425
String retrieveDatasetInFormat(String id, String format, String accessToken);
2526
}

src/main/java/io/github/genomicdatainfrastructure/discovery/datasets/application/usecases/RetrieveDatasetQuery.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ public class RetrieveDatasetQuery {
1616

1717
private final DatasetsRepository repository;
1818

19-
public RetrievedDataset execute(String datasetId, String accessToken) {
20-
return repository.findById(datasetId, accessToken);
19+
public RetrievedDataset execute(String datasetId, String accessToken,
20+
String preferredLanguage) {
21+
return repository.findById(datasetId, accessToken, preferredLanguage);
2122
}
2223
}

src/main/java/io/github/genomicdatainfrastructure/discovery/datasets/application/usecases/SearchDatasetsQuery.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ public class SearchDatasetsQuery {
2828
private final DatasetsRepository repository;
2929
private final Instance<DatasetIdsCollector> collectors;
3030

31-
public DatasetsSearchResponse execute(DatasetSearchQuery query, String accessToken) {
31+
public DatasetsSearchResponse execute(DatasetSearchQuery query, String accessToken,
32+
String preferredLanguage) {
3233
var datasetIdsByRecordCount = collectors
3334
.stream()
3435
.map(collector -> collector.collect(query, accessToken))
@@ -40,7 +41,8 @@ public DatasetsSearchResponse execute(DatasetSearchQuery query, String accessTok
4041
query.getSort(),
4142
query.getRows(),
4243
query.getStart(),
43-
accessToken);
44+
accessToken,
45+
preferredLanguage);
4446

4547
var enhancedDatasets = datasets
4648
.stream()

src/main/java/io/github/genomicdatainfrastructure/discovery/datasets/infrastructure/ckan/persistence/CkanDatasetIdsCollector.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public Map<String, Integer> collect(DatasetSearchQuery query, String accessToken
4343
.build();
4444

4545
var response = ckanQueryApi.packageSearch(
46+
null,
4647
request
4748
);
4849

src/main/java/io/github/genomicdatainfrastructure/discovery/datasets/infrastructure/ckan/persistence/CkanDatasetsRepository.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ public List<SearchedDataset> search(
4141
String sort,
4242
Integer rows,
4343
Integer start,
44-
String accessToken) {
44+
String accessToken,
45+
String preferredLanguage) {
4546

4647
if (datasetIds == null || datasetIds.isEmpty()) {
4748
return List.of();
@@ -70,16 +71,17 @@ public List<SearchedDataset> search(
7071
.build();
7172

7273
var response = ckanQueryApi.packageSearch(
74+
preferredLanguage,
7375
request
7476
);
7577

7678
return ckanDatasetsMapper.map(response.getResult());
7779
}
7880

7981
@Override
80-
public RetrievedDataset findById(String id, String accessToken) {
82+
public RetrievedDataset findById(String id, String accessToken, String preferredLanguage) {
8183
try {
82-
var ckanPackage = ckanQueryApi.packageShow(id);
84+
var ckanPackage = ckanQueryApi.packageShow(id, preferredLanguage);
8385
return ckanDatasetsMapper.map(ckanPackage.getResult());
8486
} catch (WebApplicationException e) {
8587
if (e.getResponse().getStatus() == 404) {

src/main/java/io/github/genomicdatainfrastructure/discovery/filters/application/ports/FilterBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@
1010

1111
public interface FilterBuilder {
1212

13-
List<Filter> build(String accessToken);
13+
List<Filter> build(String accessToken, String preferredLanguage);
1414
}

src/main/java/io/github/genomicdatainfrastructure/discovery/filters/application/ports/FiltersRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99

1010
public interface FiltersRepository {
1111

12-
List<ValueLabel> getValuesForFilter(String key);
12+
List<ValueLabel> getValuesForFilter(String key, String preferredLanguage);
1313

1414
}

src/main/java/io/github/genomicdatainfrastructure/discovery/filters/application/usecases/RetrieveFiltersQuery.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ public class RetrieveFiltersQuery {
2727
private final Instance<FilterBuilder> filterBuilders;
2828
private final DatasetsConfig datasetsConfig;
2929

30-
public List<Filter> execute(String accessToken) {
30+
public List<Filter> execute(String accessToken, String preferredLanguage) {
3131
return filterBuilders
3232
.stream()
33-
.map(filterBuilder -> filterBuilder.build(accessToken))
33+
.map(filterBuilder -> filterBuilder.build(accessToken, preferredLanguage))
3434
.filter(Objects::nonNull)
3535
.flatMap(Collection::stream)
3636
.map(this::mapGroup)

src/main/java/io/github/genomicdatainfrastructure/discovery/filters/application/usecases/RetrieveFiltersValuesQuery.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ public class RetrieveFiltersValuesQuery {
1717

1818
private final FiltersRepository filtersRepository;
1919

20-
public List<ValueLabel> execute(String key) {
21-
return filtersRepository.getValuesForFilter(key);
20+
public List<ValueLabel> execute(String key, String preferredLanguage) {
21+
return filtersRepository.getValuesForFilter(key, preferredLanguage);
2222
}
2323

2424
}

0 commit comments

Comments
 (0)