1
0
Fork 0
mirror of https://github.com/maybe-finance/maybe.git synced 2025-07-18 20:59:39 +02:00

Remove dependency on stock exchange table (#1368)

This commit is contained in:
Josh Pigford 2024-10-25 13:09:02 -05:00 committed by GitHub
parent b75b41a5e2
commit 45935db5f3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 37 additions and 22 deletions

View file

@ -40,7 +40,8 @@ class Provider::Marketstack
{
name: ticker["name"],
symbol: ticker["symbol"],
exchange: exchange_mic || ticker.dig("stock_exchange", "mic"),
exchange_mic: exchange_mic || ticker.dig("stock_exchange", "mic"),
exchange_acronym: ticker.dig("stock_exchange", "acronym"),
country_code: ticker.dig("stock_exchange", "country_code")
}
end

View file

@ -3,7 +3,8 @@ class Security < ApplicationRecord
has_many :trades, dependent: :nullify, class_name: "Account::Trade"
validates :ticker, presence: true, uniqueness: { case_sensitive: false }
validates :ticker, presence: true
validates :ticker, uniqueness: { scope: :exchange_mic, case_sensitive: false }
def current_price
@current_price ||= Security::Price.find_price(ticker:, date: Date.current)

View file

@ -7,21 +7,24 @@ class Security::Importer
def import
securities = @provider.fetch_tickers(exchange_mic: @stock_exchange)&.tickers
stock_exchanges = StockExchange.where(mic: securities.map { |s| s[:exchange] }).index_by(&:mic)
existing_securities = Security.where(ticker: securities.map { |s| s[:symbol] }, stock_exchange_id: stock_exchanges.values.map(&:id)).pluck(:ticker, :stock_exchange_id).to_set
# Deduplicate securities based on ticker and exchange_mic
securities_to_create = securities
.map do |security|
{
name: security[:name],
ticker: security[:symbol],
country_code: security[:country_code],
exchange_mic: security[:exchange_mic],
exchange_acronym: security[:exchange_acronym]
}
end
.compact
.uniq { |security| [ security[:ticker], security[:exchange_mic] ] }
securities_to_create = securities.map do |security|
stock_exchange_id = stock_exchanges[security[:exchange]]&.id
next if existing_securities.include?([ security[:symbol], stock_exchange_id ])
{
name: security[:name],
ticker: security[:symbol],
stock_exchange_id: stock_exchange_id,
country_code: security[:country_code]
}
end.compact
Security.insert_all(securities_to_create) unless securities_to_create.empty?
Security.upsert_all(
securities_to_create,
unique_by: [ :ticker, :exchange_mic ],
update_only: [ :name, :country_code, :exchange_acronym ]
) unless securities_to_create.empty?
end
end

View file

@ -14,7 +14,7 @@ Rails.application.configure do
# Auth for jobs admin dashboard
ActiveSupport.on_load(:good_job_application_controller) do
before_action do
raise ActionController::RoutingError.new("Not Found") unless current_user&.super_admin?
raise ActionController::RoutingError.new("Not Found") unless current_user&.super_admin? || Rails.env.development?
end
def current_user

View file

@ -0,0 +1,10 @@
class AddMicToSecurities < ActiveRecord::Migration[7.2]
def change
add_column :securities, :exchange_mic, :string
add_column :securities, :exchange_acronym, :string
remove_column :securities, :stock_exchange_id, :uuid
add_index :securities, [ :ticker, :exchange_mic ], unique: true
end
end

8
db/schema.rb generated
View file

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[7.2].define(version: 2024_10_24_142537) do
ActiveRecord::Schema[7.2].define(version: 2024_10_25_174650) do
# These are extensions that must be enabled in order to support this database
enable_extension "pgcrypto"
enable_extension "plpgsql"
@ -479,9 +479,10 @@ ActiveRecord::Schema[7.2].define(version: 2024_10_24_142537) do
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "country_code"
t.uuid "stock_exchange_id"
t.string "exchange_mic"
t.string "exchange_acronym"
t.index ["country_code"], name: "index_securities_on_country_code"
t.index ["stock_exchange_id"], name: "index_securities_on_stock_exchange_id"
t.index ["ticker", "exchange_mic"], name: "index_securities_on_ticker_and_exchange_mic", unique: true
end
create_table "security_prices", id: :uuid, default: -> { "gen_random_uuid()" }, force: :cascade do |t|
@ -603,7 +604,6 @@ ActiveRecord::Schema[7.2].define(version: 2024_10_24_142537) do
add_foreign_key "imports", "families"
add_foreign_key "institutions", "families"
add_foreign_key "merchants", "families"
add_foreign_key "securities", "stock_exchanges"
add_foreign_key "sessions", "impersonation_sessions", column: "active_impersonator_session_id"
add_foreign_key "sessions", "users"
add_foreign_key "taggings", "tags"