cartodb-4.42/app/models/carto/connector_configuration.rb
2024-04-06 05:25:13 +00:00

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