mirror of
https://github.com/internetee/registry.git
synced 2025-05-16 17:37:17 +02:00
Story #105846070 - BusinessRegistryCache to use Arireg service
This commit is contained in:
parent
38c43d6279
commit
d60029d85c
2 changed files with 88 additions and 0 deletions
75
app/models/business_registry_cache.rb
Normal file
75
app/models/business_registry_cache.rb
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
|
||||||
|
=begin
|
||||||
|
The portal for registrants has to offer an overview of the domains the user is related to directly or through an organisation.
|
||||||
|
Personal relation is defined by matching the personal identification code associated with a domain and the one acquired on
|
||||||
|
authentication using electronic ID. Association through a business organisation requires a query to business registry.
|
||||||
|
|
||||||
|
* when user logs in the personal identification code is sent to business registry (using XML service)
|
||||||
|
* business registry returns the list of business registry codes the user is a board member of
|
||||||
|
* the list is cached for two days (configurable)
|
||||||
|
* during that time no new queries are made to business registry for that personal identification code
|
||||||
|
and the cached organisation code listing is used
|
||||||
|
* user sees the listing of domains that are associated with him/her directly or through registered organisation
|
||||||
|
* UI of the portal displays the list of organisation codes and names used to fetch additional domains for the user
|
||||||
|
(currently by clicking on a username in top right corner of the screen).
|
||||||
|
Also time and date of the query to the business registry is displayed with the list of organisations.
|
||||||
|
* if the query to the business registry fails for any reason the list of
|
||||||
|
domains associated directly with the user is still displayed with an error message indicating a problem
|
||||||
|
with receiving current list business entities. Outdated list of organisations cannot be used.
|
||||||
|
=end
|
||||||
|
|
||||||
|
class BusinessRegistryCache < ActiveRecord::Base
|
||||||
|
|
||||||
|
def associated_domains
|
||||||
|
domains = []
|
||||||
|
contact_ids = associated_businesses.map do |bic|
|
||||||
|
Contact.select(:id).where("ident = ? AND ident_type = 'org' AND ident_country_code = 'EE'", bic).pluck(:id)
|
||||||
|
end
|
||||||
|
contact_ids = Contact.select(:id).where("ident = ? AND ident_type = 'priv' AND ident_country_code = ?",
|
||||||
|
ident, ident_country_code).pluck(:id) + contact_ids
|
||||||
|
contact_ids.flatten!.compact! unless contact_ids.blank?
|
||||||
|
contact_ids.uniq! unless contact_ids.blank?
|
||||||
|
unless contact_ids.blank?
|
||||||
|
DomainContact.select(:domain_id).distinct.where("contact_id in (?)", contact_ids).pluck(:domain_id).try(:each) do |domain_id|
|
||||||
|
domains << Domain.find(domain_id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
domains
|
||||||
|
end
|
||||||
|
|
||||||
|
class << self
|
||||||
|
|
||||||
|
def fetch_associated_domains(ident_code, ident_cc)
|
||||||
|
cached = fetch_by_ident_and_cc(ident_code, ident_cc)
|
||||||
|
cached.associated_domains unless cached.blank?
|
||||||
|
end
|
||||||
|
|
||||||
|
def fetch_by_ident_and_cc(ident_code, ident_cc)
|
||||||
|
cache = BusinessRegistryCache.find_by(ident: ident_code, ident_country_code: ident_cc)
|
||||||
|
# fetch new data if cache is expired
|
||||||
|
return cache if cache.present? && cache.retrieved_on > (Time.zone.now - Setting.days_to_keep_business_registry_cache.days)
|
||||||
|
cache = nil # expired data is forbidden
|
||||||
|
data = business_registry.associated_businesses(ident_code, ident_cc)
|
||||||
|
unless data.nil?
|
||||||
|
cache = BusinessRegistryCache.new(data)
|
||||||
|
cache.save
|
||||||
|
end
|
||||||
|
cache
|
||||||
|
end
|
||||||
|
|
||||||
|
def business_registry
|
||||||
|
# TODO: can this be cached and shared?
|
||||||
|
Soap::Arireg.new
|
||||||
|
end
|
||||||
|
|
||||||
|
def purge
|
||||||
|
STDOUT << "#{Time.zone.now.utc} - Starting Purge of old BusinessRegistry data from cache\n" unless Rails.env.test?
|
||||||
|
purged = 0
|
||||||
|
BusinessRegistryCache.where('retrieved_on < ?',
|
||||||
|
Time.zone.now < Setting.days_to_keep_business_registry_cache.days).each do |br|
|
||||||
|
br.destroy and purged += 1
|
||||||
|
end
|
||||||
|
STDOUT << "#{Time.zone.now.utc} - Finished purging #{purged} old BusinessRegistry cache items\n" unless Rails.env.test?
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
13
db/migrate/20151209122816_create_business_registry_caches.rb
Normal file
13
db/migrate/20151209122816_create_business_registry_caches.rb
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
class CreateBusinessRegistryCaches < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
create_table :business_registry_caches do |t|
|
||||||
|
t.string :ident
|
||||||
|
t.string :ident_country_code
|
||||||
|
t.datetime :retrieved_on
|
||||||
|
t.string :associated_businesses, array: true
|
||||||
|
t.timestamps null: false
|
||||||
|
end
|
||||||
|
|
||||||
|
add_index :business_registry_caches, :ident
|
||||||
|
end
|
||||||
|
end
|
Loading…
Add table
Add a link
Reference in a new issue