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

90 lines
2.6 KiB
Ruby

module Carto
module Api
class LegendsController < ::Api::ApplicationController
include Carto::ControllerHelper
ssl_required :index, :show, :create, :update, :destroy
before_filter :load_layer,
:owners_only
before_filter :load_legend, only: [:show, :update, :destroy]
rescue_from Carto::LoadError,
Carto::UnauthorizedError,
Carto::UnprocesableEntityError, with: :rescue_from_carto_error
def index
legend_presentations = @layer.legends.map do |legend|
LegendPresenter.new(legend).to_hash
end
render_jsonp(legend_presentations, :ok)
end
def show
legend_presentation = LegendPresenter.new(@legend).to_hash
render_jsonp(legend_presentation, :ok)
end
def create
legend_params_with_layer_id = legend_params.merge(layer_id: @layer.id)
legend = Legend.create(legend_params_with_layer_id)
if legend.valid?
legend_presentation = LegendPresenter.new(legend).to_hash
render_jsonp(legend_presentation, :created)
else
error = legend.errors.full_messages.join(', ')
raise Carto::UnprocesableEntityError.new(error)
end
end
def update
@legend.update_attributes!(legend_params)
legend_presentation = LegendPresenter.new(@legend).to_hash
render_jsonp(legend_presentation, :ok)
rescue ActiveRecord::RecordInvalid
error = @legend.errors.full_messages.join(', ')
raise Carto::UnprocesableEntityError.new(error)
end
def destroy
@legend.destroy
render_jsonp({}, :no_content)
end
private
def load_layer
@layer = Carto::Layer.find(params[:layer_id])
rescue ActiveRecord::RecordNotFound
raise Carto::LoadError.new('Layer not found')
end
def owners_only
visualization = Carto::Visualization.find(params[:visualization_id])
unless visualization.layers.include?(@layer) &&
visualization.writable_by?(current_viewer)
raise Carto::UnauthorizedError.new
end
rescue ActiveRecord::RecordNotFound
raise Carto::LoadError.new('Visualization not found')
end
def load_legend
@legend = @layer.legends.find(params[:id])
rescue ActiveRecord::RecordNotFound
raise Carto::LoadError.new('Legend not found')
end
def legend_params
params.slice(:title, :pre_html, :post_html, :type, :definition, :conf).permit!
end
end
end
end