cartodb/app/controllers/carto/api/group_presenter.rb
2020-06-15 10:58:47 +08:00

68 lines
1.8 KiB
Ruby

require_relative 'user_presenter'
module Carto
module Api
class GroupPresenter
FULL_FETCH_OPTIONS = {
fetch_shared_tables_count: true,
fetch_shared_maps_count: true,
fetch_users: true
}
def self.full(group)
Carto::Api::GroupPresenter.new(group, FULL_FETCH_OPTIONS)
end
# Available fetching options:
# - fetch_shared_tables_count
# - fetch_shared_maps_count
# - fetch_users
def initialize(group, fetching_options = {})
@group = group
@fetching_options = fetching_options
end
def to_poro
poro = {
id: @group.id,
organization_id: @group.organization_id,
name: @group.name,
display_name: @group.display_name
}
if @fetching_options[:fetch_shared_tables_count] == true
poro.merge!({ shared_tables_count: shared_tables_count })
end
if @fetching_options[:fetch_shared_maps_count] == true
poro.merge!({ shared_maps_count: shared_maps_count })
end
if @fetching_options[:fetch_users] == true
poro.merge!({ users: users })
end
poro
end
private
def shared_tables_count
shared_visualizations_query.where(:visualizations => { type: Carto::Visualization::TYPE_CANONICAL }).count
end
def shared_maps_count
shared_visualizations_query.where(:visualizations => { type: Carto::Visualization::TYPE_DERIVED }).count
end
def shared_visualizations_query
Carto::SharedEntity.where(recipient_id: @group.id).joins(:visualization)
end
def users
@group.users.map { |u| Carto::Api::UserPresenter.new(u, { fetch_groups: false } ).to_poro }
end
end
end
end