44 lines
1.4 KiB
Ruby
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
|