From 7a0c080048946b731634fdd529579c53375a44cb Mon Sep 17 00:00:00 2001 From: KochTobi Date: Fri, 8 Aug 2025 15:49:05 +0200 Subject: [PATCH 1/2] Add Client ID for ROR repository Due to a change coming december, the ROR repository requires the addition of a client id to the http request. This PR introduces these changes. It does not adapt the data manager to being able to use the `v2` api of the ROR repository. For more information see https://ror.readme.io/docs/client-id. --- .../infrastructure/CachedOrganisationRepository.java | 10 +++++++--- .../src/main/java/life/qbic/datamanager/AppConfig.java | 4 ++-- .../additional-spring-configuration-metadata.json | 5 +++++ .../src/main/resources/application.properties | 3 +++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/project-management-infrastructure/src/main/java/life/qbic/projectmanagement/infrastructure/CachedOrganisationRepository.java b/project-management-infrastructure/src/main/java/life/qbic/projectmanagement/infrastructure/CachedOrganisationRepository.java index ef9f93644..e7d6534d1 100644 --- a/project-management-infrastructure/src/main/java/life/qbic/projectmanagement/infrastructure/CachedOrganisationRepository.java +++ b/project-management-infrastructure/src/main/java/life/qbic/projectmanagement/infrastructure/CachedOrganisationRepository.java @@ -14,6 +14,7 @@ import java.time.Duration; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.regex.MatchResult; import java.util.regex.Pattern; @@ -41,17 +42,19 @@ public class CachedOrganisationRepository implements OrganisationRepository { private static final String ROR_API_URL = "https://api.ror.org/v1/organizations/%s"; private static final String ROR_ID_PATTERN = "0[a-z|0-9]{6}[0-9]{2}$"; private final Map iriToOrganisation = new HashMap<>(); + private final String apiClientId; private final int configuredCacheSize; private boolean cacheUsedForLastRequest = false; - - public CachedOrganisationRepository(int cacheSize) { + public CachedOrganisationRepository(String apiClientId, int cacheSize) { + this.apiClientId = Objects.requireNonNull(apiClientId); this.configuredCacheSize = cacheSize; } - public CachedOrganisationRepository() { + public CachedOrganisationRepository(String apiClientId) { + this.apiClientId = Objects.requireNonNull(apiClientId); this.configuredCacheSize = DEFAULT_CACHE_SIZE; } @@ -85,6 +88,7 @@ private Organisation findOrganisationInROR(String rorId) { .followRedirects(Redirect.NORMAL).connectTimeout( Duration.ofSeconds(10)).build(); HttpRequest rorQuery = HttpRequest.newBuilder().uri(URI.create(ROR_API_URL.formatted(rorId))) + .header("Client-Id", apiClientId) .header("Content-Type", "application/json").GET().build(); var result = client.send(rorQuery, BodyHandlers.ofString()); //If a valid RoRId was provided but the ID does not exist we fail diff --git a/user-interface/src/main/java/life/qbic/datamanager/AppConfig.java b/user-interface/src/main/java/life/qbic/datamanager/AppConfig.java index 0bdd634ec..5da73cbc6 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/AppConfig.java +++ b/user-interface/src/main/java/life/qbic/datamanager/AppConfig.java @@ -107,8 +107,8 @@ public IdentityService userRegistrationService( } @Bean - public OrganisationRepository organisationRepository() { - return new CachedOrganisationRepository(); + public OrganisationRepository organisationRepository(@Value("") String clientId) { + return new CachedOrganisationRepository(clientId); } diff --git a/user-interface/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/user-interface/src/main/resources/META-INF/additional-spring-configuration-metadata.json index a3b671386..6eb913bfb 100644 --- a/user-interface/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/user-interface/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -184,6 +184,11 @@ "name": "qbic.external-service.person-search.orcid.issuer", "type": "java.lang.String", "description": "The URL of the orcid issuer. Most probably https://orcid.org" + }, + { + "name": "qbic.external-service.organisation-search.ror.client-id", + "type": "java.lang.String", + "description": "The client id for the ROR API to allow for a rate limit of 2000 requests/5 minutes. See https://ror.readme.io/docs/client-id for more detail." } ] } diff --git a/user-interface/src/main/resources/application.properties b/user-interface/src/main/resources/application.properties index 8bd86442e..5415bc152 100644 --- a/user-interface/src/main/resources/application.properties +++ b/user-interface/src/main/resources/application.properties @@ -124,6 +124,9 @@ qbic.external-service.person-search.orcid.extended-search-uri=${qbic.external-se qbic.external-service.person-search.orcid.scope=/read-public qbic.external-service.person-search.orcid.grant-type=client_credentials qbic.external-service.person-search.orcid.issuer=${ORCID_SEARCH_ISSUER_URL:https://orcid.org} +############################################################################### +################### ROR ID #################################################### +qbic.external-service.organisation-search.ror.client-id=${ROR_CLIENT_ID} ############################################################################### ################### ActiveMQ Artemis ########################################## From 588303e0a1b63326bda5cd61157c3a9e1a26008c Mon Sep 17 00:00:00 2001 From: KochTobi Date: Fri, 8 Aug 2025 15:51:53 +0200 Subject: [PATCH 2/2] Use the application.propertes key in the config --- .../src/main/java/life/qbic/datamanager/AppConfig.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user-interface/src/main/java/life/qbic/datamanager/AppConfig.java b/user-interface/src/main/java/life/qbic/datamanager/AppConfig.java index 5da73cbc6..9ce850602 100644 --- a/user-interface/src/main/java/life/qbic/datamanager/AppConfig.java +++ b/user-interface/src/main/java/life/qbic/datamanager/AppConfig.java @@ -107,7 +107,8 @@ public IdentityService userRegistrationService( } @Bean - public OrganisationRepository organisationRepository(@Value("") String clientId) { + public OrganisationRepository organisationRepository( + @Value("${qbic.external-service.organisation-search.ror.client-id}") String clientId) { return new CachedOrganisationRepository(clientId); }