172 lines
6.0 KiB
Ruby
172 lines
6.0 KiB
Ruby
require_relative './member'
|
|
require_relative './external_source'
|
|
|
|
module CartoDB
|
|
module Visualization
|
|
class Presenter
|
|
def initialize(visualization, options={})
|
|
@visualization = visualization
|
|
@viewing_user = options.fetch(:user, nil)
|
|
@options = options
|
|
@table = options[:table] || visualization.table
|
|
@synchronization = options[:synchronization] || visualization.synchronization
|
|
# Expose real privacy (used for normal JSON purposes)
|
|
@real_privacy = options[:real_privacy] || false
|
|
end
|
|
|
|
def to_poro
|
|
permission = visualization.permission
|
|
|
|
poro = {
|
|
id: visualization.id,
|
|
name: visualization.name,
|
|
display_name: visualization.display_name,
|
|
map_id: visualization.map_id,
|
|
active_layer_id: visualization.active_layer_id,
|
|
type: visualization.type,
|
|
tags: visualization.tags,
|
|
description: visualization.description,
|
|
privacy: privacy_for_vizjson.upcase,
|
|
stats: visualization.stats,
|
|
created_at: visualization.created_at,
|
|
updated_at: visualization.updated_at,
|
|
permission: permission.nil? ? nil : CartoDB::PermissionPresenter.new(permission).to_poro,
|
|
locked: visualization.locked,
|
|
source: visualization.source,
|
|
title: visualization.title,
|
|
parent_id: visualization.parent_id,
|
|
license: visualization.license,
|
|
attributions: visualization.attributions,
|
|
kind: visualization.kind,
|
|
prev_id: visualization.prev_id,
|
|
next_id: visualization.next_id,
|
|
transition_options: visualization.transition_options,
|
|
active_child: visualization.active_child
|
|
}
|
|
poro.merge!(table: table_data_for(table, permission))
|
|
poro.merge!(external_source: external_source_data_for(visualization))
|
|
poro.merge!(synchronization: synchronization)
|
|
poro.merge!(related) if options.fetch(:related, true)
|
|
poro.merge!(children: children)
|
|
poro[:liked] = visualization.liked_by?(@viewing_user) unless @viewing_user.nil?
|
|
poro
|
|
end
|
|
|
|
def to_public_poro
|
|
{
|
|
id: visualization.id,
|
|
name: visualization.name,
|
|
display_name: visualization.display_name,
|
|
type: visualization.type,
|
|
tags: visualization.tags,
|
|
description: visualization.description,
|
|
updated_at: visualization.updated_at,
|
|
title: visualization.title,
|
|
kind: visualization.kind,
|
|
privacy: privacy_for_vizjson.upcase,
|
|
}
|
|
end
|
|
|
|
private
|
|
|
|
attr_reader :visualization, :options, :table, :synchronization
|
|
|
|
# Simplify certain privacy values for the vizjson
|
|
def privacy_for_vizjson
|
|
return @visualization.privacy if @real_privacy
|
|
case @visualization.privacy
|
|
when Member::PRIVACY_PUBLIC, Member::PRIVACY_LINK
|
|
Member::PRIVACY_PUBLIC
|
|
when Member::PRIVACY_PRIVATE
|
|
Member::PRIVACY_PRIVATE
|
|
when Member::PRIVACY_PROTECTED
|
|
Member::PRIVACY_PROTECTED
|
|
else
|
|
Member::PRIVACY_PRIVATE
|
|
end
|
|
end
|
|
|
|
def related
|
|
{ related_tables: related_tables }
|
|
end
|
|
|
|
def table_data_for(table=nil, permission = nil)
|
|
return {} unless table
|
|
table_name = table.name
|
|
unless @viewing_user.nil?
|
|
unless @visualization.is_owner?(@viewing_user)
|
|
table_name = "#{@visualization.user.sql_safe_database_schema}.#{table.name}"
|
|
end
|
|
end
|
|
|
|
table_data = {
|
|
id: table.id,
|
|
name: table_name,
|
|
permission: nil
|
|
}
|
|
table_visualization = table.table_visualization
|
|
unless table_visualization.nil?
|
|
presented_permission = if !permission.nil? && table_visualization.id == permission.entity_id
|
|
permission
|
|
else
|
|
table_visualization.permission
|
|
end
|
|
table_data[:permission] = CartoDB::PermissionPresenter.new(presented_permission).to_poro
|
|
table_data[:geometry_types] = table.geometry_types
|
|
end
|
|
|
|
table_data.merge!(
|
|
privacy: table.privacy_text_for_vizjson,
|
|
updated_at: table.updated_at
|
|
)
|
|
|
|
table_data.merge!(table.row_count_and_size)
|
|
table_data[:synchronization] = synchronization_data_for(table)
|
|
|
|
table_data
|
|
end
|
|
|
|
def external_source_data_for(visualization)
|
|
return {} unless visualization.type == Member::TYPE_REMOTE
|
|
|
|
external_source = Carto::ExternalSource.where(visualization_id: visualization.id).first
|
|
return {} unless external_source.present?
|
|
|
|
{
|
|
size: external_source.size,
|
|
row_count: external_source.rows_counted,
|
|
geometry_types: external_source.geometry_types
|
|
}
|
|
|
|
end
|
|
|
|
def children
|
|
@visualization.children.map { |vis| {
|
|
id: vis.id,
|
|
prev_id: vis.prev_id,
|
|
type: Visualization::Member::TYPE_SLIDE,
|
|
next_id: vis.next_id,
|
|
transition_options: vis.transition_options,
|
|
map_id: vis.map_id
|
|
}
|
|
}
|
|
end
|
|
|
|
def synchronization_data_for(table=nil)
|
|
return nil unless table
|
|
table.synchronization
|
|
end
|
|
|
|
def related_tables
|
|
without_associated_table(visualization.related_tables)
|
|
.map { |table| table_data_for(table) }
|
|
end
|
|
|
|
def without_associated_table(tables)
|
|
return tables unless visualization.table
|
|
tables.select { |table| table.id != visualization.table.id }
|
|
end
|
|
end
|
|
end
|
|
end
|