91 lines
2.6 KiB
Ruby
91 lines
2.6 KiB
Ruby
|
require_relative '../visualization/collection'
|
||
|
require_relative '../visualization/member'
|
||
|
|
||
|
module CartoDB
|
||
|
class TableRelator
|
||
|
INTERFACE = %w{
|
||
|
synchronization
|
||
|
row_count_and_size
|
||
|
related_templates
|
||
|
}
|
||
|
|
||
|
def initialize(db, table)
|
||
|
@db = db
|
||
|
@table = table
|
||
|
end
|
||
|
|
||
|
def dependent_visualizations
|
||
|
affected_visualizations.select { |v| v.dependent_on?(table) }
|
||
|
end
|
||
|
|
||
|
def affected_visualizations
|
||
|
affected_visualization_records.to_a
|
||
|
.uniq { |attributes| attributes.fetch(:id) }
|
||
|
.map { |attributes| Visualization::Member.new(attributes) }
|
||
|
end
|
||
|
|
||
|
def preview_for(visualization)
|
||
|
data = {
|
||
|
id: visualization.id,
|
||
|
name: visualization.name,
|
||
|
updated_at: visualization.updated_at
|
||
|
}
|
||
|
if visualization[:permission_id].present? && !visualization.permission.nil?
|
||
|
data[:permission] = CartoDB::PermissionPresenter.new(visualization.permission).to_poro.select do |key, _val|
|
||
|
[:id, :owner].include?(key)
|
||
|
end
|
||
|
end
|
||
|
data[:auth_tokens] = if visualization.password_protected?
|
||
|
visualization.get_auth_tokens
|
||
|
elsif visualization.is_privacy_private?
|
||
|
visualization.user.get_auth_tokens
|
||
|
else
|
||
|
[]
|
||
|
end
|
||
|
data
|
||
|
end
|
||
|
|
||
|
def synchronization
|
||
|
return nil unless synchronization_record && !synchronization_record.empty?
|
||
|
CartoDB::Synchronization::Member.new(synchronization_record.first)
|
||
|
end
|
||
|
|
||
|
def row_count_and_size
|
||
|
@table.row_count_and_size
|
||
|
end
|
||
|
|
||
|
def related_templates
|
||
|
Carto::Template.all.select { |template| template.relates_to_table?(@table) }
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
attr_reader :db, :table
|
||
|
|
||
|
def affected_visualization_records
|
||
|
db[:visualizations].with_sql(%Q{
|
||
|
SELECT *
|
||
|
FROM layers_user_tables, layers_maps, visualizations
|
||
|
WHERE layers_user_tables.user_table_id = '#{table.id}'
|
||
|
AND layers_user_tables.layer_id = layers_maps.layer_id
|
||
|
AND layers_maps.map_id = visualizations.map_id
|
||
|
})
|
||
|
end
|
||
|
|
||
|
def synchronization_record
|
||
|
@syncronization_record ||= db[:synchronizations].with_sql(%Q{
|
||
|
SELECT *
|
||
|
FROM synchronizations
|
||
|
WHERE synchronizations.user_id = '#{table.user_id}'
|
||
|
AND synchronizations.name = '#{table.name}'
|
||
|
LIMIT 1
|
||
|
}).to_a
|
||
|
rescue StandardError => exception
|
||
|
puts exception.to_s
|
||
|
puts exception.backtrace
|
||
|
nil
|
||
|
end
|
||
|
|
||
|
end
|
||
|
end
|