Sha256: 2a5e8224422874e522eb3d78a4b91ab144df953bb6b711c4acd602fbe15f7d2e

Contents?: true

Size: 1.83 KB

Versions: 2

Compression:

Stored size: 1.83 KB

Contents

module Approval
  class Item < ApplicationRecord
    class UnexistResource < StandardError; end

    self.table_name = :approval_items
    EVENTS = %w[create update destroy].freeze

    belongs_to :request, class_name: :"Approval::Request", inverse_of: :items
    belongs_to :resource, polymorphic: true, optional: true

    serialize :params, Hash

    validates :resource_type, presence: true
    validates :event,         presence: true, inclusion: { in: EVENTS }

    with_options unless: :create_event? do
      validates :resource_id, presence: true
    end

    with_options if: :update_event? do
      validates :params, presence: true
    end

    validate :ensure_resource_be_valid

    EVENTS.each do |event_name|
      define_method "#{event_name}_event?" do
        event_name.to_s == event.to_s
      end
    end

    def apply
      case event
      when "create"
        resource_model.create!(params).tap do |created_resource|
          update!(resource_id: created_resource.id)
        end
      when "update"
        raise UnexistResource unless resource

        resource.update!(params)
      when "destroy"
        raise UnexistResource unless resource

        resource.destroy
      end
    end

    private

      def resource_model
        @resource_model ||= resource_type.to_s.safe_constantize
      end

      def ensure_resource_be_valid
        return if resource_model.nil? || destroy_event?

        record = if resource_id.present?
                   resource_model.find(resource_id).tap {|m| m.assign_attributes(params) }
                 else
                   resource_model.new(params || {})
                 end

        unless record.valid?
          errors.add(:base, :invalid)
          record.errors.full_messages.each do |message|
            request.errors.add(:base, message)
          end
        end
      end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
approval-0.4.0 app/models/approval/item.rb
approval-0.3.7 app/models/approval/item.rb