85 lines
2.4 KiB
Ruby
85 lines
2.4 KiB
Ruby
module Carto
|
|
module Api
|
|
class SnapshotsController < ::Api::ApplicationController
|
|
include ControllerHelper
|
|
|
|
ssl_required :index, :show, :create, :update, :destroy
|
|
|
|
before_filter :load_visualization,
|
|
:check_visualization_viewable
|
|
before_filter :load_snapshot,
|
|
:owners_only, only: [:show, :update, :destroy]
|
|
|
|
rescue_from LoadError,
|
|
UnauthorizedError,
|
|
UnprocesableEntityError, with: :rescue_from_carto_error
|
|
|
|
def index
|
|
snapshots = @visualization.snapshots.where(user_id: current_viewer.id)
|
|
|
|
presentation = snapshots.map do |snapshot|
|
|
SnapshotPresenter.new(snapshot).to_hash
|
|
end
|
|
|
|
render json: presentation
|
|
end
|
|
|
|
def show
|
|
render json: SnapshotPresenter.new(@snapshot).to_hash
|
|
end
|
|
|
|
def create
|
|
snapshot = Snapshot.create!(user_id: current_viewer.id,
|
|
visualization_id: @visualization.id,
|
|
state: params[:state])
|
|
|
|
render json: SnapshotPresenter.new(snapshot).to_hash, status: :created
|
|
rescue ActiveRecord::RecordInvalid => exception
|
|
message = exception.record.errors.full_messages.join(', ')
|
|
raise UnprocesableEntityError.new(message)
|
|
end
|
|
|
|
def update
|
|
@snapshot.update_attributes!(state: params[:state])
|
|
|
|
render json: SnapshotPresenter.new(@snapshot).to_hash
|
|
rescue ActiveRecord::RecordInvalid => exception
|
|
message = exception.record.errors.full_messages.join(', ')
|
|
raise UnprocesableEntityError.new(message)
|
|
end
|
|
|
|
def destroy
|
|
@snapshot.destroy
|
|
|
|
render json: Hash.new, status: :no_content
|
|
end
|
|
|
|
private
|
|
|
|
def load_visualization
|
|
@visualization = Visualization.find(params[:visualization_id])
|
|
rescue ActiveRecord::RecordNotFound
|
|
raise LoadError.new('Visualization not found')
|
|
end
|
|
|
|
def check_visualization_viewable
|
|
unless @visualization.is_viewable_by_user?(current_viewer)
|
|
raise UnauthorizedError.new
|
|
end
|
|
end
|
|
|
|
def load_snapshot
|
|
@snapshot = Snapshot.find(params[:id])
|
|
rescue ActiveRecord::RecordNotFound
|
|
raise LoadError.new('Snapshot not found')
|
|
end
|
|
|
|
def owners_only
|
|
unless @snapshot.user_id == current_viewer.id
|
|
raise UnauthorizedError.new
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|