module API<%= api_version %>

class <%= res_name.classify.pluralize %> < Grape::API
  rescue_from NotFoundError, ActiveRecord::RecordNotFound do |exception|
    error!('<%= res_name.classify %> not found', 404)
  end

  rescue_from ActiveRecord::RecordInvalid do |exception|
    error!(exception.message, 409)
  end

  helpers do
    def return_no_content_status
      status :no_content
      ''
    end

    def <%= res_name %>_params(params)
      {

<% res_attrs.each_key do |name| -%>

<%= name %>: params[:<%= name %>],

<% end -%>

    }
  end
end

resource :<%= res_name.pluralize %> do
  # GET '<%= api_version%>/<%= res_name.pluralize %>'
  desc 'Returns <%= res_name.pluralize %> list'
  get do
    present <%= res_name.classify %>.all, with: API::Entities::<%= res_name.classify %>
  end

  # GET '<%= api_version%>/<%= res_name.pluralize %>/:id'
  desc 'Returns <%= res_name %> by id'
  params do
    requires :id, type: Integer
  end
  get ':id' do
    <%= res_name %> = <%= res_name.classify %>.find(params[:id])
    raise NotFoundError if <%= res_name %>.nil?

    present <%= res_name %>, with: API::Entities::<%= res_name.classify %>
  end

  # POST '<%= api_version%>/<%= res_name.pluralize %>'
  desc 'Creates new <%= res_name %>'

<% unless res_attrs.empty? -%>

params do

<% res_attrs.each do |name, type| -%>

requires :<%= name %>, type: <%= param_to_type(type) %>

<% end -%>

end

<% end -%>

post do
  <%= res_name %> = <%= res_name.classify %>.new(<%= res_name %>_params(params))
  <%= res_name %>.save!

  present <%= res_name %>, with: API::Entities::<%= res_name.classify %>
end

# PUT '<%= api_version%>/<%= res_name.pluralize %>/:id'
desc 'Updates <%= res_name %>'
params do
  requires :id, type: Integer

<% res_attrs.each do |name, type| -%>

requires :<%= name %>, type: <%= param_to_type(type) %>

<% end -%>

    end
    put ':id' do
      <%= res_name %> = <%= res_name.classify %>.find(params[:id])
      <%= res_name %>.update!(<%= res_name %>_params(params))

      return_no_content_status
    end

    # DELETE '<%= api_version%>/<%= res_name.pluralize %>/:id'
    desc 'Deletes <%= res_name %>'
    params do
      requires :id, type: Integer
    end
    delete ':id' do
      <%= res_name %> = <%= res_name.classify %>.find(params[:id])
      <%= res_name %>.destroy!

      return_no_content_status
    end
  end
end

end