diff --git a/app/jobs/fetch_security_info_job.rb b/app/jobs/fetch_security_info_job.rb new file mode 100644 index 00000000..2612f633 --- /dev/null +++ b/app/jobs/fetch_security_info_job.rb @@ -0,0 +1,20 @@ +class FetchSecurityInfoJob < ApplicationJob + queue_as :default + + def perform(security_id) + return unless Security.security_info_provider.present? + + security = Security.find(security_id) + + security_info_response = Security.security_info_provider.fetch_security_info( + ticker: security.ticker, + mic_code: security.exchange_mic + ) + + security.update( + name: security_info_response.info.dig("name"), + exchange_acronym: security_info_response.info.dig("exchange", "acronym"), + country_code: security_info_response.info.dig("exchange", "country_code") + ) + end +end diff --git a/app/models/account/trade_builder.rb b/app/models/account/trade_builder.rb index 3219fb8a..eefdac29 100644 --- a/app/models/account/trade_builder.rb +++ b/app/models/account/trade_builder.rb @@ -33,7 +33,11 @@ class Account::TradeBuilder < Account::EntryBuilder def security ticker_symbol, exchange_mic = ticker.split("|") - Security.find_or_create_by(ticker: ticker_symbol, exchange_mic: exchange_mic) + security = Security.find_or_create_by(ticker: ticker_symbol, exchange_mic: exchange_mic) + + FetchSecurityInfoJob.perform_later(security.id) + + security end def amount diff --git a/app/models/concerns/providable.rb b/app/models/concerns/providable.rb index 5ba88932..996efff8 100644 --- a/app/models/concerns/providable.rb +++ b/app/models/concerns/providable.rb @@ -10,6 +10,10 @@ module Providable synth_provider end + def security_info_provider + synth_provider + end + def exchange_rates_provider synth_provider end diff --git a/app/models/provider/synth.rb b/app/models/provider/synth.rb index 6dabd941..764d670f 100644 --- a/app/models/provider/synth.rb +++ b/app/models/provider/synth.rb @@ -9,6 +9,7 @@ class Provider::Synth response = client.get("#{base_url}/user") JSON.parse(response.body).dig("id").present? end + def usage response = client.get("#{base_url}/user") @@ -147,6 +148,19 @@ class Provider::Synth raw_response: response end + def fetch_security_info(ticker:, mic_code:) + response = client.get("#{base_url}/tickers/#{ticker}") do |req| + req.params["mic_code"] = mic_code + end + + parsed = JSON.parse(response.body) + + SecurityInfoResponse.new \ + info: parsed.dig("data"), + success?: true, + raw_response: response + end + private attr_reader :api_key @@ -156,6 +170,7 @@ class Provider::Synth ExchangeRatesResponse = Struct.new :rates, :success?, :error, :raw_response, keyword_init: true UsageResponse = Struct.new :used, :limit, :utilization, :plan, :success?, :error, :raw_response, keyword_init: true SearchSecuritiesResponse = Struct.new :securities, :success?, :error, :raw_response, keyword_init: true + SecurityInfoResponse = Struct.new :info, :success?, :error, :raw_response, keyword_init: true def base_url "https://api.synthfinance.com"