app/controllers/api/base_controller.rb in spree_api-0.50.4 vs app/controllers/api/base_controller.rb in spree_api-0.60.0.RC1

- old
+ new

@@ -1,57 +1,58 @@ class Api::BaseController < Spree::BaseController + before_filter :check_http_authorization + before_filter :load_resource + skip_before_filter :verify_authenticity_token, :if => lambda { admin_token_passed_in_headers } + authorize_resource + + respond_to :json - def self.resource_controller_for_api - resource_controller - before_filter :check_http_authorization - skip_before_filter :verify_authenticity_token, :if => lambda { admin_token_passed_in_headers } - - index do - wants.json { render :json => collection.to_json(collection_serialization_options) } + def index + respond_with(@collection) do |format| + format.json { render :json => @collection.to_json(collection_serialization_options) } end + end - show do - wants.json { render :json => object.to_json(object_serialization_options) } - failure.wants.json { render :text => "Failure\n", :status => 500 } + def show + respond_with(@object) do |format| + format.json { render :json => @object.to_json(object_serialization_options) } end + end - create do - wants.json { render :text => "Resource created\n", :status => 201, :location => object_url } - failure.wants.json { render :text => "Failure\n", :status => 500 } + def create + if @object.save + render :text => "Resource created\n", :status => 201, :location => object_url + else + respond_with(@object.errors, :status => 422) end + end - update do - wants.json { render :nothing => true } - failure.wants.json { render :text => "Failure\n", :status => 500 } + def update + if @object.update_attributes(params[object_name]) + render :nothing => true + else + respond_with(@object.errors, :status => 422) end + end - define_method :admin_token_passed_in_headers do - request.headers['HTTP_AUTHORIZATION'].present? - end - - define_method :end_of_association_chain do - parent? ? parent_association.scoped : model.scoped(:include => eager_load_associations) - end - - define_method :collection do - @collection ||= search.relation.limit(100) - end + def admin_token_passed_in_headers + request.headers['HTTP_AUTHORIZATION'].present? end def access_denied render :text => 'access_denied', :status => 401 end # Generic action to handle firing of state events on an object def event - valid_events = model.state_machine.events.map(&:name) - valid_events_for_object = object.state_transitions.map(&:event) + valid_events = model_class.state_machine.events.map(&:name) + valid_events_for_object = @object ? @object.state_transitions.map(&:event) : [] if params[:e].blank? errors = t('api.errors.missing_event') elsif valid_events_for_object.include?(params[:e].to_sym) - object.send("#{params[:e]}!") + @object.send("#{params[:e]}!") errors = nil elsif valid_events.include?(params[:e].to_sym) errors = t('api.errors.invalid_event_for_object', :events => valid_events_for_object.join(',')) else errors = t('api.errors.invalid_event', :events => valid_events.join(',')) @@ -67,16 +68,64 @@ end end end protected + def model_class + controller_name.classify.constantize + end + + def object_name + controller_name.singularize + end + + def load_resource + if member_action? + @object ||= load_resource_instance + instance_variable_set("@#{object_name}", @object) + else + @collection ||= collection + instance_variable_set("@#{controller_name}", @collection) + end + end + + def load_resource_instance + if new_actions.include?(params[:action].to_sym) + build_resource + elsif params[:id] + find_resource + end + end + + def parent + nil + end - def search - return @search unless @search.nil? + def find_resource + if parent.present? + parent.send(controller_name).find(params[:id]) + else + model_class.includes(eager_load_associations).find(params[:id]) + end + end + + def build_resource + if parent.present? + parent.send(controller_name).build(params[object_name]) + else + model_class.new(params[object_name]) + end + end + + def collection + return @search unless @search.nil? params[:search] = {} if params[:search].blank? params[:search][:meta_sort] = 'created_at.desc' if params[:search][:meta_sort].blank? - @search = end_of_association_chain.metasearch(params[:search]) + + scope = parent.present? ? parent.send(controller_name) : model_class.scoped + + @search = scope.metasearch(params[:search]).relation.limit(100) @search end def collection_serialization_options {} @@ -92,11 +141,34 @@ def object_errors {:errors => object.errors.full_messages} end + def object_url(object = nil, options = {}) + target = object ? object : @object + if parent.present? + send "admin_#{parent[:model_name]}_#{object_name}_url", parent, target, options + else + send "admin_#{object_name}_url", target, options + end + end + + def collection_actions + [:index] + end + + def member_action? + !collection_actions.include? params[:action].to_sym + end + + def new_actions + [:new, :create] + end + private def check_http_authorization - render :text => "Access Denied\n", :status => 401 unless request.headers['HTTP_AUTHORIZATION'].present? + if request.headers['HTTP_AUTHORIZATION'].blank? + render :text => "Access Denied\n", :status => 401 + end end end