Sha256: 9a8ed984715ec2f9653c00f241ad4663e8339a81bcfd226bee1e2198baedb560

Contents?: true

Size: 1.34 KB

Versions: 3

Compression:

Stored size: 1.34 KB

Contents

require 'state_machine'
require 'active_record'

module ClickSession
  class SessionState < ActiveRecord::Base
    validates :model_record, presence: true

    state_machine initial: :active do
      state :active, value: 0
      state :processed, value: 1
      state :success_reported, value: 10
      state :failed_to_process, value: 2
      state :failure_reported, value: 20

      event :success do
        transition active: :processed
      end

      event :failure do
        transition active: :failed_to_process
      end

      event :reported_back do
        transition processed: :success_reported, failed_to_process: :failure_reported
      end
    end

    def model=(model)
      set_model_record_for(model)
    end

    def model
      @model ||= model_class.find_by_id(self.model_record)
    end

    def webhook_attempt_failed
      self.webhook_attempts += 1
    end

    private

    delegate :model_class, to: :clicksession_configuration

    def set_model_record_for(model)
      if model.is_a? Integer
        self.model_record = model
      else
        set_active_record_model_id_for(model)
      end
    end

    def set_active_record_model_id_for(model)
      if model.new_record?
        model.save!
      end

      self.model_record = model.id
    end

    def clicksession_configuration
      ClickSession.configuration
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
click_session-0.1.1 lib/click_session/session_state.rb
click_session-0.1.0 lib/click_session/session_state.rb
click_session-0.0.1 lib/click_session/session_state.rb