105 lines
3.4 KiB
Ruby
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
|