87 lines
2.7 KiB
Ruby
87 lines
2.7 KiB
Ruby
require_dependency 'carto/db/database'
|
|
require_dependency 'carto/db/connection'
|
|
|
|
class Superadmin::PlatformController < Superadmin::SuperadminController
|
|
|
|
respond_to :json
|
|
ssl_required :databases_info
|
|
layout 'application'
|
|
|
|
before_filter :check_for_database_host, only: [:database_validation]
|
|
|
|
def databases_info
|
|
if params[:database_host]
|
|
hosts = [params[:database_host]]
|
|
else
|
|
hosts = ::User.distinct(:database_host).select(:database_host).all.map(&:database_host)
|
|
end
|
|
dbs = {}
|
|
hosts.each do |h|
|
|
total_account_types = ::User.where(database_host: h).group_and_count(:account_type).order(Sequel.desc(:count)).all
|
|
users_in_database = ::User.where(database_host: h).count
|
|
dbs[h] = { count: users_in_database, total_account_types_percentages: {}, total_account_types_count: {} }
|
|
total_account_types.each do |a|
|
|
if users_in_database.to_i > 0
|
|
percentage = (a[:count] * 100) / users_in_database
|
|
dbs[h][:total_account_types_percentages][a[:account_type]] = percentage
|
|
dbs[h][:total_account_types_count][a[:account_type]] = a[:count]
|
|
end
|
|
end
|
|
end
|
|
respond_with(dbs)
|
|
end
|
|
|
|
def database_validation
|
|
Carto::Db::Connection.connect(params[:database_host], 'postgres', as: :cluster_admin) do |database, _|
|
|
db_users = database.roles
|
|
non_carto_users = db_users.select { |r| !r.system_db_role? && !r.carto_db_role? }
|
|
carto_users = db_users.select(&:carto_db_role?)
|
|
connected_users = Carto::User.where(database_host: params[:database_host])
|
|
.where(id: carto_users.map(&:id))
|
|
.pluck(:username)
|
|
return render json: { db_users: non_carto_users, carto_users: connected_users }
|
|
end
|
|
end
|
|
|
|
def total_users
|
|
respond_with({:count => CartoDB::Stats::Platform.new.users})
|
|
end
|
|
|
|
def total_pay_users
|
|
respond_with({:count => CartoDB::Stats::Platform.new.pay_users})
|
|
end
|
|
|
|
def total_datasets
|
|
respond_with({:count => CartoDB::Stats::Platform.new.datasets})
|
|
end
|
|
|
|
def total_seats_among_orgs
|
|
respond_with(CartoDB::Stats::Platform.new.seats_among_orgs)
|
|
end
|
|
|
|
def total_shared_objects_among_orgs
|
|
respond_with(CartoDB::Stats::Platform.new.shared_objects_among_orgs)
|
|
end
|
|
|
|
def total_visualizations
|
|
respond_with({:count => CartoDB::Stats::Platform.new.visualizations})
|
|
end
|
|
|
|
def total_maps
|
|
respond_with({:count => CartoDB::Stats::Platform.new.maps})
|
|
end
|
|
|
|
def total_active_users
|
|
respond_with({:count => CartoDB::Stats::Platform.new.active_users})
|
|
end
|
|
|
|
private
|
|
|
|
def check_for_database_host
|
|
if !params[:database_host]
|
|
render json: { error: "Database host parameter is mandatory" }, status: 400
|
|
end
|
|
end
|
|
|
|
end
|