salkar/inkwell

View on GitHub
app/models/concerns/inkwell/can_be_blogged.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

module Inkwell::CanBeBlogged
  extend ActiveSupport::Concern

  included do
    has_one :inkwell_blogged,
             as: :blog_item_object,
             class_name: "Inkwell::BlogItem",
             dependent: :delete
    before_destroy :inkwell_can_be_blogged_before_destroy, prepend: true

    def blogged_by
      inkwell_blogged.try(:blog_item_subject)
    end

    def blogged_by?(subject)
      check_blogged_by(subject)
      subject.added_to_blog?(self)
    end

    private

      def check_blogged_by(obj)
        unless obj.class.try(:inkwell_can_blogging?)
          raise(Inkwell::Errors::CannotBlogging, obj)
        end
      end

      def inkwell_can_be_blogged_before_destroy
        if blogged_by.present?
          Inkwell::SubjectCounterCache.update_counters(
            blogged_by.id,
            blog_item_count: -1)
        end
      end
  end

  module ClassMethods
    def inkwell_can_be_blogged?
      true
    end
  end
end