90 lines
2.6 KiB
Ruby
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
|