Sha256: 1b62f782031b119c81578c748072b13fdd31fcfcbb272dc9a9516745bd326c83

Contents?: true

Size: 1.83 KB

Versions: 75

Compression:

Stored size: 1.83 KB

Contents

module Pageflow
  class EditLock < ApplicationRecord
    scope :active, (lambda do
      time = Time.now - EditLock.time_to_live
      where('pageflow_edit_locks.updated_at >= ?', time)
    end)

    class Error < RuntimeError
      def code
        self.class.name.split('::').last.underscore
      end
    end

    class HeldByOtherUserError < Error
      attr_reader :user

      def initialize(user)
        @user = user
      end
    end

    class HeldByOtherSessionError < Error; end
    class NotHeldError < Error; end

    belongs_to :user
    belongs_to :entry, :inverse_of => :edit_lock

    def self.time_to_live
      timer_tolerance = 2.3
      Pageflow.config.edit_lock_polling_interval * timer_tolerance
    end

    def held_by?(user)
      self.user == user
    end

    def matches?(id)
      self.id == id.to_i
    end

    def timed_out?
      Time.now > updated_at + EditLock.time_to_live
    end

    def acquire(current_user, options = {})
      verify!(current_user, options)
    rescue Error
      if options[:force] || timed_out?
        entry.create_edit_lock(:user => current_user)
      else
        raise
      end
    end

    def release(current_user)
      if user == current_user
        destroy
      end
    end

    def verify!(current_user, options)
      raise HeldByOtherUserError.new(user) unless held_by?(current_user)
      raise HeldByOtherSessionError unless matches?(options[:id])
      touch
    end

    class Null
      attr_reader :entry

      def initialize(entry)
        @entry = entry
      end

      def held_by?(user)
        false
      end

      def blank?
        true
      end

      def acquire(user, options = {})
        entry.create_edit_lock!(:user => user)
      end

      def release(user)
      end

      def verify!(user, options = {})
        raise NotHeldError.new
      end
    end
  end
end

Version data entries

75 entries across 75 versions & 1 rubygems

Version Path
pageflow-17.0.4 app/models/pageflow/edit_lock.rb
pageflow-17.0.3 app/models/pageflow/edit_lock.rb
pageflow-17.0.2 app/models/pageflow/edit_lock.rb
pageflow-17.0.1 app/models/pageflow/edit_lock.rb
pageflow-17.0.0 app/models/pageflow/edit_lock.rb
pageflow-16.2.0 app/models/pageflow/edit_lock.rb
pageflow-16.1.0 app/models/pageflow/edit_lock.rb
pageflow-16.0.0 app/models/pageflow/edit_lock.rb
pageflow-15.8.0 app/models/pageflow/edit_lock.rb
pageflow-14.5.2 app/models/pageflow/edit_lock.rb
pageflow-15.7.1 app/models/pageflow/edit_lock.rb
pageflow-15.7.0 app/models/pageflow/edit_lock.rb
pageflow-15.6.1 app/models/pageflow/edit_lock.rb
pageflow-15.6.0 app/models/pageflow/edit_lock.rb
pageflow-15.5.0 app/models/pageflow/edit_lock.rb
pageflow-15.4.0 app/models/pageflow/edit_lock.rb
pageflow-15.3.0 app/models/pageflow/edit_lock.rb
pageflow-15.2.2 app/models/pageflow/edit_lock.rb
pageflow-15.2.1 app/models/pageflow/edit_lock.rb
pageflow-15.2.0 app/models/pageflow/edit_lock.rb