* Change: #591 ホワイトリストのドメイン一覧の保存先・画面変更 * Update account_batch.rb * 表示まわりを改善 * Update dangerous.rake
78 lines
1.9 KiB
Ruby
78 lines
1.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# == Schema Information
|
|
#
|
|
# Table name: specified_domains
|
|
#
|
|
# id :bigint(8) not null, primary key
|
|
# domain :string not null
|
|
# table :integer default(0), not null
|
|
# options :jsonb not null
|
|
# created_at :datetime not null
|
|
# updated_at :datetime not null
|
|
#
|
|
class SpecifiedDomain < ApplicationRecord
|
|
attr_accessor :domains
|
|
|
|
validates :domain, uniqueness: { scope: :table }
|
|
after_commit :invalidate_cache!
|
|
|
|
scope :white_list_domains, -> { where(table: 0) }
|
|
|
|
class << self
|
|
def white_list_domain_caches
|
|
Rails.cache.fetch('specified_domains:white_list') { white_list_domains.to_a }
|
|
end
|
|
|
|
def save_from_hashes(rows, type, caches)
|
|
unmatched = caches
|
|
matched = []
|
|
|
|
SpecifiedDomain.transaction do
|
|
rows.filter { |item| item[:domain].present? }.each do |item|
|
|
exists = unmatched.find { |i| i.domain == item[:domain] }
|
|
|
|
if exists.present?
|
|
unmatched.delete(exists)
|
|
matched << exists
|
|
|
|
next unless item.key?(:options) && item[:options] == exists.options
|
|
|
|
exists.update!(options: item[:options])
|
|
elsif matched.none? { |i| i.domain == item[:domain] }
|
|
SpecifiedDomain.create!(
|
|
domain: item[:domain],
|
|
table: type,
|
|
options: item[:options] || {}
|
|
)
|
|
end
|
|
end
|
|
|
|
SpecifiedDomain.destroy(unmatched.map(&:id))
|
|
end
|
|
|
|
true
|
|
end
|
|
|
|
def save_from_raws(rows, type, caches)
|
|
hashes = (rows['domains'] || []).map do |domain|
|
|
{
|
|
domain: domain,
|
|
type: type,
|
|
}
|
|
end
|
|
|
|
save_from_hashes(hashes, type, caches)
|
|
end
|
|
|
|
def save_from_raws_as_white_list(rows)
|
|
save_from_raws(rows, 0, white_list_domain_caches)
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def invalidate_cache!
|
|
Rails.cache.delete('specified_domains:white_list')
|
|
end
|
|
end
|