app/models/pageflow/membership.rb in pageflow-0.11.4 vs app/models/pageflow/membership.rb in pageflow-12.0.0.rc1

- old
+ new

@@ -1,9 +1,52 @@ module Pageflow class Membership < ActiveRecord::Base belongs_to :user - belongs_to :entry + belongs_to :entity, polymorphic: true + belongs_to :entry, + -> { where(pageflow_memberships: {entity_type: 'Pageflow::Entry'}) }, + foreign_key: 'entity_id' + belongs_to :account, + -> { where(pageflow_memberships: {entity_type: 'Pageflow::Account'}) }, + foreign_key: 'entity_id' - validates :user, :entry, :presence => true - validates :entry_id, :uniqueness => { :scope => :user_id } + validates :user, :entity, :role, presence: true + validates :user_id, uniqueness: {scope: [:entity_type, :entity_id]} + validate :account_membership_exists, if: :on_entry? + validates :role, + inclusion: {in: %w(previewer editor publisher manager)}, + if: :on_entry? + validates :role, + inclusion: {in: %w(member previewer editor publisher manager)}, + if: :on_account? + + scope :on_entries, -> { where(entity_type: 'Pageflow::Entry') } + scope :on_accounts, -> { where(entity_type: 'Pageflow::Account') } + scope :as_manager, -> { where(role: :manager) } + scope :as_publisher_or_above, -> { where(role: %w(publisher manager)) } + scope :as_previewer_or_above, -> { where(role: %w(previewer editor publisher manager)) } + + after_create do + entity.increment!(:users_count) + end + + after_destroy do + entity.decrement!(:users_count) + end + + private + + def account_membership_exists + unless user.accounts.include?(entity.account) + errors[:base] << 'Entry Membership misses presupposed Membership on account of entry' + end + end + + def on_entry? + entity_type == 'Pageflow::Entry' + end + + def on_account? + entity_type == 'Pageflow::Account' + end end end