module Basepack::Import::Controller::ClassMethods

Public Instance Methods

import_action(name, actions_class = Basepack::Import::Actions) click to toggle source
# File lib/basepack/import/controller.rb, line 14
def import_action(name, actions_class = Basepack::Import::Actions)
  name = name.to_sym
  self.__actions += [name] #custom_actions collection: [name] TODO - destroys URL helpers for other actions
  name_bang = "#{name}!"

  # [GET,POST,PATCH,DELETE] /resources/#{name}
  define_method name_bang do |&block|
    @title_params = [[resource_class, "Import"]]

    authorize!(name, resource_class) # CanCan

    @import_actions = actions_class.new(self, import_form)
    if request.get?
      @import_actions.get
    elsif request.patch?
      @import_actions.patch do |import_resource|
        # run import
        import_resource.import_data(current_ability.user) if import_resource.state == "not_started"
        redirect_to polymorphic_path([name, route_prefix, association_chain, resource_class].flatten,
                                     import_id: import_resource.id),
                    notice: message_edit_done(import_form.show_form.label)
      end
    elsif request.post?
      @import_actions.post do
        redirect_to polymorphic_path([name, route_prefix, association_chain, resource_class].flatten,
                                     import_id: import_form.edit_form.resource.id),
                    notice: message_new_done(import_form.edit_form.label)
      end
    elsif request.delete?
      @import_actions.delete do
        redirect_to polymorphic_path([name, route_prefix, association_chain, resource_class].flatten),
                    notice: message_destroy_done(import_form.edit_form.label)
      end
    end
  end

  define_method name do
    send(name_bang)
  end

  protected name_bang

  name_form = "#{name}_form"
  name_form_bang = "#{name}_form!"
  var = :"@#{name}_form"

  define_method name_form_bang do |&block|
    unless form = instance_variable_get(var)
      form = import_form_for(chain_with_class)
      form.configure(&block) if block
      form.configuration_params do |frm, import|
        import_actions = actions_class.new(self, frm)
        method = "import_configuration_#{import.file_type}"
        import_actions.send(method, import) if import_actions.respond_to?(method)
      end
      instance_variable_set(var, form)
    end
    form
  end

  helper_method name_form

  define_method name_form do
    send(name_form_bang)
  end
end