From 8db3d5b92ad3172ae33f74354e3a6b9083617958 Mon Sep 17 00:00:00 2001 From: Imene-Amirat Date: Mon, 23 Mar 2026 09:32:45 +0100 Subject: [PATCH 1/2] Add federation search endpoint --- controllers/federation_controller.rb | 71 ++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 controllers/federation_controller.rb diff --git a/controllers/federation_controller.rb b/controllers/federation_controller.rb new file mode 100644 index 000000000..b65f7fcbc --- /dev/null +++ b/controllers/federation_controller.rb @@ -0,0 +1,71 @@ +require 'faraday' + +class FederationController < ApplicationController + + GATEWAY_URL = "https://terminology.services.base4nfdi.de/api-gateway" + GATEWAY_CONNECTION = Faraday.new(url: GATEWAY_URL) do |conn| + conn.headers['Accept'] = 'application/json' + end + + + namespace "/api/federation" do + + get'/search' do + query = params[:query] || params[:q] + + if query.nil? || query.strip.empty? + error 400, "You must provide a 'query' parameter to execute a search" + end + + gateway_params = { query: query, database: "ontoportal" } + + response = GATEWAY_CONNECTION.get("search", gateway_params) + + unless response.success? + error response.status, "API Gateway error: #{response.body}" + end + + gateway_response_data = JSON.parse(response.body) + results = gateway_response_data.is_a?(Array) ? gateway_response_data : [] + + docs = [] + + results.each do |item| + acronym = item["ontology"] + ontology_iri = item["ontology_iri"] || item["source"].to_s + "/ontologies/" + acronym.to_s + + doc = { + id: item["@id"] || item["iri"], + prefLabel: item["label"], + synonym: item["synonyms"] || [], + definition: item["descriptions"] || [], + obsolete: item["obsolete"] || false, + matchType: "prefLabel", + ontology_rank: 0.0 + } + + ontology = LinkedData::Models::Ontology.read_only( + id: ontology_iri, + acronym: acronym + ) + + submission = LinkedData::Models::OntologySubmission.read_only( + id: ontology_iri , + ontology: ontology + ) + + doc[:submission] = submission + + instance = LinkedData::Models::Class.read_only(doc) + docs.push(instance) + + end + + total_found = results.size + + reply 200, page_object(docs, total_found) + end + + end + +end From 95aefe2ed1baad1294169f41ae522375620acad5 Mon Sep 17 00:00:00 2001 From: Imene-Amirat Date: Mon, 23 Mar 2026 12:18:06 +0100 Subject: [PATCH 2/2] fix fields --- controllers/federation_controller.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/controllers/federation_controller.rb b/controllers/federation_controller.rb index b65f7fcbc..000ac81bd 100644 --- a/controllers/federation_controller.rb +++ b/controllers/federation_controller.rb @@ -40,7 +40,8 @@ class FederationController < ApplicationController synonym: item["synonyms"] || [], definition: item["descriptions"] || [], obsolete: item["obsolete"] || false, - matchType: "prefLabel", + matchType: "", + ontologyType: "", ontology_rank: 0.0 }