Files
cartodb/app/controllers/carto/helpers/table_locator.rb
2020-06-15 10:58:47 +08:00

44 lines
1.4 KiB
Ruby

module Carto
module Helpers
class TableLocator
# Getter by table uuid or table name using canonical visualizations
# @param id_or_name String If is a name, can become qualified as "schema.tablename"
# @param viewer_user ::User
def get_by_id_or_name(id_or_name, viewer_user)
return nil unless id_or_name && viewer_user
rx = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/
# Fetch by visualization name or UUID
table_name, table_schema = ::Table.table_and_schema(id_or_name)
vqb = Carto::VisualizationQueryBuilder.new
vqb.with_name(table_name).with_type(Carto::Visualization::TYPE_CANONICAL)
if table_schema.nil?
vqb.with_user_id(viewer_user.id)
else
owner = Carto::User.where(username: table_schema).select(:id).first
user_id = owner ? owner.id : viewer_user.id
vqb.with_owned_by_or_shared_with_user_id(user_id)
end
vis = vqb.build.first
user_table = vis.nil? ? nil : vis.user_table
# Fetch by UserTable UUID
if user_table.nil? && rx.match(id_or_name)
user_table_temp = Carto::UserTable.where(id: id_or_name).first
unless user_table_temp.nil?
vis = user_table_temp.visualization
user_table = vis.user_table if vis && vis.is_viewable_by_user?(viewer_user)
end
end
user_table
end
end
end
end