app/api/locomotive/api/resources/snippet_resource.rb
module Locomotive
module API
module Resources
class SnippetResource < Grape::API
resource :snippets do
entity_klass = Entities::SnippetEntity
before do
setup_resource_methods_for(:snippets)
authenticate_locomotive_account!
end
desc 'Index of snippets'
get '/' do
authorize Snippet, :index?
present snippets, with: entity_klass
end
desc 'Show a snippet'
params do
requires :id, type: String, desc: 'Snippet ID'
end
route_param :id do
get do
authorize snippet, :show?
present snippet, with: entity_klass
end
end
desc 'Create a snippet'
params do
requires :snippet, type: Hash do
requires :name
requires :slug
requires :template
end
end
post do
authorize Snippet, :create?
form = form_klass.new(snippet_params)
persist_from_form(form)
present snippet, with: entity_klass
end
desc 'Update a Snippet (or create one)'
params do
requires :id, type: String, desc: 'Snippet ID or Slug'
requires :snippet, type: Hash do
optional :name
optional :slug
optional :template
end
end
put ':id' do
if @snippet = current_site.snippets.by_id_or_slug(params[:id]).first
authorize @snippet, :update?
else
authorize Snippet, :create?
@snippet = current_site.snippets.build
end
form = form_klass.new(snippet_params)
persist_from_form(form)
present snippet, with: entity_klass
end
desc "Delete a snippet"
params do
requires :id, type: String, desc: 'Snippet ID or SLUG'
end
delete ':id' do
@snippet = current_site.snippets.by_id_or_slug(params[:id]).first
raise ::Mongoid::Errors::DocumentNotFound.new(current_site.snippets, params) if snippet.nil?
object_auth :destroy?
snippet.destroy
present snippet, with: entity_klass
end
desc 'Delete all snippets'
delete '/' do
auth :destroy_all?
number = current_site.snippets.count
current_site.snippets.destroy_all
present({ deletions: number })
end
end
end
end
end
end