Sha256: cae6a70b39f6fc2d48b5f824655603fd84a5c6d01eb6019c259f5dbbde295ac3

Contents?: true

Size: 1.67 KB

Versions: 2

Compression:

Stored size: 1.67 KB

Contents

require 'databound/extensions'
require 'databound/version'
require 'databound/data'
require 'databound/manager'
require 'databound/config'
require 'databound/controller'
require 'databound/rails/routes'

module Databound
  def self.included(base)
    base.send(:before_action, :init_crud, only: %i(where create update destroy))
  end

  def where
    records = @crud.find_scoped_records
    render json: serialize_array(records)
  end

  def create
    record = @crud.create_from_data

    render json: {
      success: true,
      id: serialize(record, :id),
      scoped_records: serialize_array(scoped_records),
    }
  end

  def update
    record = @crud.update_from_data

    render json: {
      success: true,
      id: serialize(record, :id),
      scoped_records: serialize_array(scoped_records),
    }
  end

  def destroy
    @crud.destroy_from_data

    render json: {
      success: true,
      scoped_records: serialize_array(scoped_records),
    }
  end

  private

  def serialize_array(records)
    return records.to_json unless defined?(ActiveModel::Serializer)

    serializer = ActiveModel::Serializer.serializer_for(records.first)
    return records unless serializer

    ActiveModel::ArraySerializer.new(records).to_json
  end

  def serialize(record, attribute)
    unserialized = record.send(attribute)
    return unserialized.to_json unless defined?(ActiveModel::Serializer)

    serializer = ActiveModel::Serializer.serializer_for(record)
    return unserialized unless serializer

    serializer.new(record).attributes[:id]
  end

  def init_crud
    @crud = Databound::Manager.new(self)
  end

  def scoped_records
    @crud.find_scoped_records(only_extra_scopes: true)
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
databound-3.0.1 lib/databound.rb
databound-3.0.0 lib/databound.rb