66 lines
1.9 KiB
Ruby
66 lines
1.9 KiB
Ruby
|
module Carto
|
||
|
module Api
|
||
|
class MapsController < ::Api::ApplicationController
|
||
|
ssl_required :show, :update
|
||
|
|
||
|
before_filter :load_map, :owners_only
|
||
|
|
||
|
rescue_from Carto::LoadError,
|
||
|
Carto::UnprocesableEntityError, with: :rescue_from_carto_error
|
||
|
|
||
|
def show
|
||
|
render_jsonp(map_presentation)
|
||
|
end
|
||
|
|
||
|
def update
|
||
|
@map.update_attributes!(update_params)
|
||
|
|
||
|
render_jsonp(map_presentation)
|
||
|
rescue ActiveRecord::RecordInvalid
|
||
|
validation_errors = @map.errors.full_messages.join(', ')
|
||
|
raise Carto::UnprocesableEntityError.new(validation_errors)
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def load_map
|
||
|
@map = Carto::Map.find(params[:id])
|
||
|
rescue ActiveRecord::RecordNotFound
|
||
|
raise Carto::LoadError.new('Map not found')
|
||
|
end
|
||
|
|
||
|
def owners_only
|
||
|
unless @map.writable_by_user?(current_viewer)
|
||
|
raise Carto::LoadError.new('Map not found')
|
||
|
end
|
||
|
end
|
||
|
|
||
|
STRING_PARAMS = [:bounding_box_sw, :bounding_box_ne, :center, :view_bounds_sw, :view_bounds_ne].freeze
|
||
|
|
||
|
def update_params
|
||
|
update_params = params.slice(:bounding_box_ne,
|
||
|
:bounding_box_sw,
|
||
|
:center,
|
||
|
:options,
|
||
|
:provider,
|
||
|
:view_bounds_ne,
|
||
|
:view_bounds_sw,
|
||
|
:zoom,
|
||
|
:legends,
|
||
|
:scrollwheel).permit!
|
||
|
|
||
|
STRING_PARAMS.each do |param|
|
||
|
update_params[param] = update_params[param].to_s
|
||
|
end
|
||
|
|
||
|
# Remove empty values, keeping `false`s (`present?` can't be used because of this)
|
||
|
update_params.reject { |_k, v| v.nil? || v == '' }
|
||
|
end
|
||
|
|
||
|
def map_presentation
|
||
|
Carto::Api::MapPresenter.new(@map).to_hash
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|