From ab9fd65a193c1fe34baa95f49f9b66f792dd90eb Mon Sep 17 00:00:00 2001 From: Oleksii Kriuchykhin Date: Fri, 12 Mar 2021 10:53:10 +0100 Subject: [PATCH 1/2] Add basic API client for BMT [SCI-5531] --- app/services/biomolecule_toolkit_client.rb | 67 +++++++++++++++++++ .../biomolecule_toolkit_client.rb | 4 ++ .../locales/biomolecule_toolkit_client/en.yml | 4 ++ 3 files changed, 75 insertions(+) create mode 100644 app/services/biomolecule_toolkit_client.rb create mode 100644 config/initializers/biomolecule_toolkit_client.rb create mode 100644 config/locales/biomolecule_toolkit_client/en.yml diff --git a/app/services/biomolecule_toolkit_client.rb b/app/services/biomolecule_toolkit_client.rb new file mode 100644 index 000000000..c01f1cdc4 --- /dev/null +++ b/app/services/biomolecule_toolkit_client.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true + +class BiomoleculeToolkitClient + MACROMOLECULES_PATH = '/api/macromolecules' + + class BiomoleculeToolkitClientException < StandardError; end + + def initialize + @host = Rails.configuration.x.biomolecule_toolkit_host + @http = Net::HTTP.new( + Rails.configuration.x.biomolecule_toolkit_host, + Rails.application.config.x.biomolecule_toolkit_port + ) + end + + def healthy? + request = Net::HTTP::Get.new('/api/health') + process_request(request)&.dig('status') == 'UP' + end + + def list + request = Net::HTTP::Get.new(MACROMOLECULES_PATH) + process_request(request) + end + + def create(params:) + request = Net::HTTP::Post.new(MACROMOLECULES_PATH, 'Content-Type': 'application/json') + request.body = params + process_request(request) + end + + def get(cid:) + request = Net::HTTP::Get.new("#{MACROMOLECULES_PATH}/#{CGI.escape(cid)}") + process_request(request) + end + + def update(cid:, params:) + request = Net::HTTP::Put.new("#{MACROMOLECULES_PATH}/#{CGI.escape(cid)}", 'Content-Type': 'application/json') + request.body = params + process_request(request) + end + + def delete + request = Net::HTTP::Delete.new("#{MACROMOLECULES_PATH}/#{CGI.escape(cid)}") + process_request(request) + end + + private + + def process_request(request) + responce = @http.request(request) + + if responce.is_a? Net::HTTPOK + JSON.parse(responce.body) + elsif responce.is_a? Net::HTTPNoContent + true + else + error_message = JSON.parse(responce.body).dig('error', 'message') + error_message ||= I18n.t('biomolecule_toolkit_client.generic_error') + raise BiomoleculeToolkitClientException, error_message + end + rescue JSON::ParserError + raise BiomoleculeToolkitClientException, I18n.t('biomolecule_toolkit_client.responce_parsing_error') + rescue StandardError + raise BiomoleculeToolkitClientException, I18n.t('biomolecule_toolkit_client.generic_error') + end +end diff --git a/config/initializers/biomolecule_toolkit_client.rb b/config/initializers/biomolecule_toolkit_client.rb new file mode 100644 index 000000000..241d21088 --- /dev/null +++ b/config/initializers/biomolecule_toolkit_client.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true + +Rails.application.config.x.biomolecule_toolkit_host = ENV['BIOMOLECULE_TOOLKIT_HOST'] +Rails.application.config.x.biomolecule_toolkit_port = ENV['BIOMOLECULE_TOOLKIT_PORT'] || 80 diff --git a/config/locales/biomolecule_toolkit_client/en.yml b/config/locales/biomolecule_toolkit_client/en.yml new file mode 100644 index 000000000..6739dff13 --- /dev/null +++ b/config/locales/biomolecule_toolkit_client/en.yml @@ -0,0 +1,4 @@ +en: + biomolecule_toolkit_client: + generic_error: 'Failed to execute API command' + responce_parsing_error: 'Failed to parse API response' From 36708b47cf847497ee7c9c178f04725447ff1385 Mon Sep 17 00:00:00 2001 From: Oleksii Kriuchykhin Date: Wed, 21 Jul 2021 13:10:30 +0200 Subject: [PATCH 2/2] Fix code styling [SCI-5531] --- app/services/biomolecule_toolkit_client.rb | 13 +++++++------ config/locales/biomolecule_toolkit_client/en.yml | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/services/biomolecule_toolkit_client.rb b/app/services/biomolecule_toolkit_client.rb index c01f1cdc4..2909c2cc2 100644 --- a/app/services/biomolecule_toolkit_client.rb +++ b/app/services/biomolecule_toolkit_client.rb @@ -48,19 +48,20 @@ class BiomoleculeToolkitClient private def process_request(request) - responce = @http.request(request) + response = @http.request(request) - if responce.is_a? Net::HTTPOK - JSON.parse(responce.body) - elsif responce.is_a? Net::HTTPNoContent + case response.class + when Net::HTTPOK + JSON.parse(response.body) + when Net::HTTPNoContent true else - error_message = JSON.parse(responce.body).dig('error', 'message') + error_message = JSON.parse(response.body).dig('error', 'message') error_message ||= I18n.t('biomolecule_toolkit_client.generic_error') raise BiomoleculeToolkitClientException, error_message end rescue JSON::ParserError - raise BiomoleculeToolkitClientException, I18n.t('biomolecule_toolkit_client.responce_parsing_error') + raise BiomoleculeToolkitClientException, I18n.t('biomolecule_toolkit_client.response_parsing_error') rescue StandardError raise BiomoleculeToolkitClientException, I18n.t('biomolecule_toolkit_client.generic_error') end diff --git a/config/locales/biomolecule_toolkit_client/en.yml b/config/locales/biomolecule_toolkit_client/en.yml index 6739dff13..8ac3858c1 100644 --- a/config/locales/biomolecule_toolkit_client/en.yml +++ b/config/locales/biomolecule_toolkit_client/en.yml @@ -1,4 +1,4 @@ en: biomolecule_toolkit_client: generic_error: 'Failed to execute API command' - responce_parsing_error: 'Failed to parse API response' + response_parsing_error: 'Failed to parse API response'