class Sinatra::RestApi::Actions

Action

Constants

DONE
SCHEMA

REF: en.wikipedia.org/wiki/Representational_state_transfer#Relationship_between_URL_and_HTTP_methods

Public Class Methods

create( route_args, params, mapping ) click to toggle source
# File lib/sinatra-rest-api/actions.rb, line 22
def self.create( route_args, params, mapping )
  unless route_args[:request].form_data?
    route_args[:request].body.rewind
    params.merge!( Provider.settings[:request_type].eql?( :json ) ? JSON.parse( route_args[:request].body.read ) : route_args[:request].body.read )
  end
  params[:_data] = {}
  resource = route_args[:resource]
  if !params[resource].nil? && params[resource].is_a?( Hash )
    cols = mapping[:columns].call( nil ) + mapping[:relations].call( nil ).map { |rel| "#{rel}_attributes" } + mapping[:extra_fields].call( nil )
    cols.delete( 'id' ) # TODO: option to set id field name
    params[:_data] = params[resource].select { |key, _valye| cols.include? key }
    # params[:_data] = params[resource]
    params.delete( resource )
  end
  # params[:_data]['created_at'] = Time.now.strftime( '%F %T' ).to_s
  # params[:_data]['updated_at'] = Time.now.strftime( '%F %T' ).to_s
  result = mapping[:create].call( params )
  # route_args[:response].headers['Location'] = '/' # TODO: todo
  [ 201, result.to_json ]
end
delete( _route_args, params, mapping ) click to toggle source
# File lib/sinatra-rest-api/actions.rb, line 43
def self.delete( _route_args, params, mapping )
  mapping[:delete].call( params )
  [ 200, DONE.to_json ]
end
list( route_args, params, mapping ) click to toggle source
# File lib/sinatra-rest-api/actions.rb, line 48
def self.list( route_args, params, mapping )
  # TODO: option to enable/disable X-Total-Count ?
  params[:_where] = params[:_where].nil? ? {} : JSON.parse( params[:_where] )
  route_args[:response].headers['X-Total-Count'] = mapping[:count].call( params ).to_s
  result = mapping[:list].call( params, route_args[:fields] )
  result = result.limit( route_args[:options][:limit].to_i ) if route_args[:options].include?( :limit )
  [ 200, result.to_json( include: route_args[:options].include?( :include ) ? route_args[:options][:include] : mapping[:relations].call( nil ) ) ]
end
other( _route_args, params, mapping ) click to toggle source
# File lib/sinatra-rest-api/actions.rb, line 57
def self.other( _route_args, params, mapping )
  action = params[:_action]
  raise( APIError, 'Action not implemented' ) if mapping[action].nil?
  ret = mapping[action].call( params )
  [ 200, ret.nil? ? DONE.to_json : ret.to_json ]
end
read( route_args, params, mapping ) click to toggle source
# File lib/sinatra-rest-api/actions.rb, line 64
def self.read( route_args, params, mapping )
  result = mapping[:read].call( params )
  [ 200, result.to_json( include: route_args[:options].include?( :include ) ? route_args[:options][:include] : mapping[:relations].call( nil ) ) ]
end
update( route_args, params, mapping ) click to toggle source
# File lib/sinatra-rest-api/actions.rb, line 69
def self.update( route_args, params, mapping )
  unless route_args[:request].form_data?
    route_args[:request].body.rewind
    params.merge!( Provider.settings[:request_type].eql?( :json ) ? JSON.parse( route_args[:request].body.read ) : route_args[:request].body.read )
  end
  params[:_data] = {}
  resource = route_args[:resource]
  if !params[resource].nil? && params[resource].is_a?( Hash )
    # params[resource].delete( 'id' ) # TODO: option to set id field name
    # params[:_data] = OpenStruct.new( params[resource] )
    cols = mapping[:columns].call( nil ) + mapping[:relations].call( nil ).map { |rel| "#{rel}_attributes" } + mapping[:extra_fields].call( nil )
    # TODO: consider relations _ids
    cols.delete( 'id' ) # TODO: option to set id field name
    params[:_data] = params[resource].select { |key, _valye| cols.include? key }
    params.delete( resource )
  end
  mapping[:update].call( params )
  [ 200, DONE.to_json ]
end