module APIQL::CRUD

Public Instance Methods

model(klass) click to toggle source
# File lib/apiql.rb, line 18
def model(klass)
  define_method "#{klass.name.pluralize.underscore}" do |page = nil, page_size = 10|
    authorize! :read, klass

    if page.present?
      {
        total: klass.count,
        items: klass.eager_load(eager_load).offset(page * page_size).limit(page_size)
      }
    else
      klass.eager_load(eager_load).all
    end
  end

  define_method "#{klass.name.underscore}" do |id|
    item = klass.eager_load(eager_load).find(id)

    authorize! :read, item

    item
  end

  define_method "#{klass.name.underscore}.create" do |params|
    authorize! :create, klass

    klass_entity = "#{klass.name}::Entity".constantize

    if klass_entity.respond_to?(:create_params, params)
      params = klass_entity.send(:create_params, params)
    elsif klass_entity.respond_to?(:params, params)
      params = klass_entity.send(:params, params)
    end

    klass.create!(params)
  end

  define_method "#{klass.name.underscore}.update" do |id, params|
    item = klass.find(id)

    authorize! :update, item

    klass_entity = "#{klass.name}::Entity".constantize

    if klass_entity.respond_to?(:update_params, params)
      params = klass_entity.send(:update_params, params)
    elsif klass_entity.respond_to?(:params, params)
      params = klass_entity.send(:params, params)
    end

    item.update!(params)
  end

  define_method "#{klass.name.underscore}.destroy" do |id|
    item = klass.find(id)

    authorize! :destroy, item

    item.destroy!
  end
end