78 lines
3.0 KiB
Ruby
78 lines
3.0 KiB
Ruby
require 'carto/connector'
|
|
|
|
class Carto::ConnectorConfiguration < ActiveRecord::Base
|
|
belongs_to :connector_provider, class_name: Carto::ConnectorProvider
|
|
belongs_to :user, class_name: Carto::User, inverse_of: :connector_configurations
|
|
belongs_to :organization, class_name: Carto::Organization, inverse_of: :connector_configurations
|
|
|
|
# A ConnectorConfiguration can belong to either user or an organization, but not both;
|
|
# it may also be a default configuration (no user or organization).
|
|
# Only one configuration may exist for any valid combination of user, organization and provider.
|
|
# So we have 3 kinds of configuration records:
|
|
# * default configuration for provider: user.nil? && organization.nil? FIXME: remove this? (only app_config defaults)
|
|
# * organization configuration: user.nil? && organization.present?
|
|
# * user configuration: organization.nil? && user.present?
|
|
validates :connector_provider_id, presence: true
|
|
validates :user_id, uniqueness: { scope: [:connector_provider_id, :organization_id] }, if: 'organization_id.nil?'
|
|
validates :organization_id, uniqueness: { scope: [:connector_provider_id, :user_id] }, if: 'user_id.nil?'
|
|
validate :not_user_and_organization_simultaneously
|
|
|
|
def not_user_and_organization_simultaneously
|
|
if user_id.present? && organization_id.present?
|
|
errors.add(:user_id, "can't assign to an organization simultaneously with a user")
|
|
end
|
|
end
|
|
|
|
# columns:
|
|
# enabled boolean
|
|
# max_rows integer
|
|
|
|
def self.default(provider)
|
|
# Look for default provider configration
|
|
config = where(user_id: nil, organization_id: nil, connector_provider_id: provider.id).first
|
|
if !config
|
|
# Create in memory record using app_config defaults
|
|
config = new(
|
|
connector_provider: provider,
|
|
enabled: Cartodb.get_config(:connectors, provider.name, 'enabled') || false,
|
|
max_rows: Cartodb.get_config(:connectors, provider.name, 'max_rows')
|
|
)
|
|
end
|
|
config
|
|
end
|
|
|
|
def self.for_organization(organization, provider)
|
|
if provider
|
|
config = where(organization_id: organization.id, connector_provider_id: provider.id).first
|
|
if config.blank?
|
|
config = default(provider)
|
|
end
|
|
config
|
|
end
|
|
end
|
|
|
|
def self.for_user(user, provider)
|
|
if provider
|
|
config = where(user_id: user.id, connector_provider_id: provider.id).first
|
|
if config.blank? && user.organization_id.present?
|
|
config = for_organization(user.organization, provider)
|
|
end
|
|
if config.blank?
|
|
config = default(provider)
|
|
end
|
|
config
|
|
end
|
|
end
|
|
|
|
# default statement timeout in ms used for imports
|
|
DEFAULT_CONNECTOR_TIMEOUT = 1.hour * 1000
|
|
# FIXME: should we unify with DataImport::DIRECT_STATEMENT_TIMEOUT
|
|
# and CartoDB::Synchronization::Adapter::STATEMENT_TIMEOUT ?
|
|
|
|
# statement timeout in ms used for imports
|
|
def timeout
|
|
# this is currently not in the connector_configurations table and is taken from global app configuration
|
|
Cartodb.get_config(:connectors, connector_provider.name, 'timeout') || DEFAULT_CONNECTOR_TIMEOUT
|
|
end
|
|
end
|