diff --git a/app/decorators/invitation_decorator.rb b/app/decorators/invitation_decorator.rb index e2b3f177a..0066ff9d3 100644 --- a/app/decorators/invitation_decorator.rb +++ b/app/decorators/invitation_decorator.rb @@ -3,9 +3,9 @@ class InvitationDecorator < Draper::Decorator decorates_association :proposal STATE_LABEL_MAP = { - Invitation::State::PENDING => 'label-default', - Invitation::State::DECLINED => 'label-danger', - Invitation::State::ACCEPTED => 'label-success' + Invitation.states[:pending] => 'label-default', + Invitation.states[:declined] => 'label-danger', + Invitation.states[:accepted] => 'label-success' } def decline_button(small: false) diff --git a/app/models/concerns/invitable.rb b/app/models/concerns/invitable.rb deleted file mode 100644 index 7b3a4a3c7..000000000 --- a/app/models/concerns/invitable.rb +++ /dev/null @@ -1,47 +0,0 @@ -# frozen_string_literal: true - -module Invitable - extend ActiveSupport::Concern - - included do - module State - unless const_defined?(:DECLINED) - DECLINED = 'declined' - PENDING = 'pending' - ACCEPTED = 'accepted' - end - end - - scope :pending, -> { where(state: State::PENDING) } - scope :declined, -> { where(state: State::DECLINED) } - scope :not_accepted, -> { where(state: [State::DECLINED, State::PENDING]) } - - before_create :set_default_state - before_create :set_slug - - validates :email, presence: true - validates_format_of :email, with: /@/ - end - - def decline - update(state: State::DECLINED) - end - - def pending? - state == State::PENDING - end - - def declined? - state == State::DECLINED - end - - private - - def set_slug - self.slug = Digest::SHA1.hexdigest([email, rand(1000)].map(&:to_s).join('-'))[0, 10] - end - - def set_default_state - self.state = State::PENDING if state.nil? - end -end diff --git a/app/models/invitation.rb b/app/models/invitation.rb index 49d763a3c..995616faf 100644 --- a/app/models/invitation.rb +++ b/app/models/invitation.rb @@ -1,17 +1,39 @@ class Invitation < ApplicationRecord - include Invitable + enum :state, {pending: 'pending', accepted: 'accepted', declined: 'declined'} belongs_to :proposal belongs_to :user, optional: true + scope :not_accepted, -> { where(state: [:pending, :declined]) } + + before_create :set_default_state + before_create :set_slug + + validates :email, presence: true + validates_format_of :email, with: /@/ + def accept(user) transaction do self.user = user - self.state = State::ACCEPTED + self.state = :accepted proposal.speakers.create(user: user, event: proposal.event, skip_name_email_validation: true) save end end + + def decline + update(state: :declined) + end + + private + + def set_slug + self.slug = Digest::SHA1.hexdigest([email, rand(1000)].map(&:to_s).join('-'))[0, 10] + end + + def set_default_state + self.state = :pending if state.nil? + end end # == Schema Information diff --git a/spec/models/invitation_spec.rb b/spec/models/invitation_spec.rb index ddefd9c29..e979a0f90 100644 --- a/spec/models/invitation_spec.rb +++ b/spec/models/invitation_spec.rb @@ -19,14 +19,14 @@ it "sets state as declined" do invitation = create(:invitation, state: nil, proposal: proposal, user: user) invitation.decline - expect(invitation.state).to eq(Invitation::State::DECLINED) + expect(invitation).to be_declined end end describe "#accept" do it "sets state as accepted" do invitation.accept(user) - expect(invitation.state).to eq(Invitation::State::ACCEPTED) + expect(invitation).to be_accepted end it "sets the user on the invitation" do @@ -42,24 +42,24 @@ describe "#pending?" do it "returns true if invitation is pending" do - invitation = create(:invitation, state: Invitation::State::PENDING, proposal: proposal, user: user) + invitation = create(:invitation, state: :pending, proposal: proposal, user: user) expect(invitation).to be_pending end it "returns false if invitation is not pending" do - invitation = create(:invitation, state: Invitation::State::ACCEPTED, proposal: proposal, user: user) + invitation = create(:invitation, state: :accepted, proposal: proposal, user: user) expect(invitation).to_not be_pending end end describe "#declined?" do it "returns true if invitation was declined" do - invitation = create(:invitation, state: Invitation::State::DECLINED, proposal: proposal, user: user) + invitation = create(:invitation, state: :declined, proposal: proposal, user: user) expect(invitation).to be_declined end it "returns false if invitation was not declined" do - invitation = create(:invitation, state: Invitation::State::ACCEPTED, proposal: proposal, user: user) + invitation = create(:invitation, state: :accepted, proposal: proposal, user: user) expect(invitation).to_not be_declined end end