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

105 lines
3.4 KiB
Ruby

require_dependency 'carto/controller_helper'
module Carto
module Api
class OverlaysController < ::Api::ApplicationController
include Carto::ControllerHelper
ssl_required :index, :show, :create, :update, :destroy
before_filter :logged_users_only
before_filter :load_visualization
before_filter :check_current_user_has_permissions_on_vis
before_filter :load_overlay, only: [:show, :update, :destroy]
rescue_from StandardError, with: :rescue_from_standard_error
rescue_from Carto::CartoError, with: :rescue_from_carto_error
def index
collection = @visualization.overlays.map do |overlay|
Carto::Api::OverlayPresenter.new(overlay).to_poro
end
render_jsonp(collection)
end
def show
render_jsonp(Carto::Api::OverlayPresenter.new(@overlay).to_poro)
end
def create
@stats_aggregator.timing('overlays.create') do
begin
overlay = Carto::Overlay.new(type: params[:type],
options: params[:options],
template: params[:template],
order: params[:order],
visualization_id: @visualization.id)
saved = @stats_aggregator.timing('save') do
overlay.save
end
if saved
render_jsonp(Carto::Api::OverlayPresenter.new(overlay).to_poro)
else
render_jsonp({ errors: overlay.errors }, :unprocessable_entity)
end
end
end
end
def update
@stats_aggregator.timing('overlays.update') do
begin
@overlay.type = params[:type] if params[:type]
@overlay.options = params[:options] if params[:options]
@overlay.template = params[:template] if params[:template]
@overlay.order = params[:order] if params[:order]
saved = @stats_aggregator.timing('save') do
@overlay.save
end
if saved
render_jsonp(Carto::Api::OverlayPresenter.new(@overlay).to_poro)
else
render_jsonp({ errors: @overlay.errors }, :unprocessable_entity)
end
end
end
end
def destroy
@stats_aggregator.timing('overlays.destroy') do
@stats_aggregator.timing('delete') do
@overlay.destroy
end
head :no_content
end
end
protected
def logged_users_only
raise Carto::UnauthorizedError.new if current_user.nil?
end
def load_visualization
visualization_id = uuid_parameter('visualization_id')
@visualization = Carto::Visualization.where(id: visualization_id).first
raise Carto::LoadError.new("Visualization not found: #{visualization_id}") unless @visualization
end
def check_current_user_has_permissions_on_vis
unless @visualization.writable_by?(current_user)
raise Carto::UnauthorizedError.new("#{current_user.id} doesn't own visualization #{@visualization.id}")
end
end
def load_overlay
overlay_id = uuid_parameter('id')
@overlay = @visualization.overlays.where(id: overlay_id).first
raise Carto::LoadError.new("Overlay not found: #{overlay_id}") unless @overlay
end
end
end
end