From 67c34a5409171a1d62e56fd672a8d1e9b2d32571 Mon Sep 17 00:00:00 2001 From: Akira Matsuda Date: Tue, 23 Dec 2025 11:22:35 +0900 Subject: [PATCH 1/4] Define Teammate#state enum --- app/models/teammate.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/models/teammate.rb b/app/models/teammate.rb index dbcf622eb..d5f0759bb 100644 --- a/app/models/teammate.rb +++ b/app/models/teammate.rb @@ -17,6 +17,8 @@ class Teammate < ApplicationRecord IN_APP_ONLY => 'In App Only' } + enum :state, {pending: 'pending', accepted: 'accepted', declined: 'declined'} + belongs_to :event belongs_to :user, optional: true From b4b45dfff907baeabad3773bcc93154db3e0a11e Mon Sep 17 00:00:00 2001 From: Akira Matsuda Date: Tue, 23 Dec 2025 11:24:56 +0900 Subject: [PATCH 2/4] Give Teammate#state and state= a label --- app/models/teammate.rb | 6 +++--- db/seeds.rb | 18 +++++++++--------- spec/factories/teammates.rb | 2 +- spec/support/shared_examples/an_open_event.rb | 6 +++--- spec/system/profile_spec.rb | 2 +- spec/system/staff/teammates_spec.rb | 6 +++--- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/app/models/teammate.rb b/app/models/teammate.rb index d5f0759bb..7e353d2dc 100644 --- a/app/models/teammate.rb +++ b/app/models/teammate.rb @@ -47,13 +47,13 @@ class Teammate < ApplicationRecord def accept(user) self.user = user self.accepted_at = Time.current - self.state = ACCEPTED + self.state = :accepted save end def decline self.declined_at = Time.current - self.state = DECLINED + self.state = :declined save end @@ -71,7 +71,7 @@ def pending? def invite self.token = Digest::SHA1.hexdigest(Time.current.to_s + email + rand(1000).to_s) - self.state = PENDING + self.state = :pending self.invited_at = Time.current save end diff --git a/db/seeds.rb b/db/seeds.rb index 5068f2370..566fe9f9e 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -133,34 +133,34 @@ def create_seed_data email: admin.email, role: "organizer", mention_name: "admin", - state: Teammate::ACCEPTED + state: :accepted ).first_or_create seed_event.teammates.where( user: organizer, email: organizer.email, role: "organizer", mention_name: "organizer", - state: Teammate::ACCEPTED + state: :accepted ).first_or_create seed_event.teammates.where( user: track_director, email: track_director.email, role: "program team", mention_name: "track_director", - state: Teammate::ACCEPTED + state: :accepted ).first_or_create seed_event.teammates.where( user: reviewer, email: reviewer.email, role: "reviewer", mention_name: "reviewer", - state: Teammate::ACCEPTED + state: :accepted ).first_or_create seed_event.teammates.where( user: speaker_reviewer, email: speaker_reviewer.email, role: "reviewer", - state: Teammate::ACCEPTED + state: :accepted ).first_or_create # can't be mentioned # Proposals - there are no proposals that are either fully "accepted" or offically "not accepted" @@ -430,8 +430,8 @@ def create_seed_data end # Event Team - sapphire_event.teammates.where(user: admin, email: admin.email, role: "organizer", state: Teammate::ACCEPTED).first_or_create - sapphire_event.teammates.where(user: organizer, email: organizer.email, role: "organizer", state: Teammate::ACCEPTED).first_or_create + sapphire_event.teammates.where(user: admin, email: admin.email, role: "organizer", state: :accepted).first_or_create + sapphire_event.teammates.where(user: organizer, email: organizer.email, role: "organizer", state: :accepted).first_or_create ### ScheduleConf -- this is an event that is ready to be scheduled schedule_conf_open_date = Date.yesterday @@ -466,8 +466,8 @@ def create_seed_data end # Event Team - schedule_event.teammates.where(user: admin, email: admin.email, role: "organizer", state: Teammate::ACCEPTED).first_or_create - schedule_event.teammates.where(user: organizer, email: organizer.email, role: "organizer", state: Teammate::ACCEPTED).first_or_create + schedule_event.teammates.where(user: admin, email: admin.email, role: "organizer", state: :accepted).first_or_create + schedule_event.teammates.where(user: organizer, email: organizer.email, role: "organizer", state: :accepted).first_or_create # Session Formats schedule_conf_formats = {} diff --git a/spec/factories/teammates.rb b/spec/factories/teammates.rb index 2992ffac8..6ddfa2d43 100644 --- a/spec/factories/teammates.rb +++ b/spec/factories/teammates.rb @@ -13,7 +13,7 @@ trait :has_been_invited do token { "token" } role { "reviewer" } - state { Teammate::PENDING } + state { :pending } end trait :reviewer do diff --git a/spec/support/shared_examples/an_open_event.rb b/spec/support/shared_examples/an_open_event.rb index b6bfd336f..ade4e252c 100644 --- a/spec/support/shared_examples/an_open_event.rb +++ b/spec/support/shared_examples/an_open_event.rb @@ -12,9 +12,9 @@ let(:no_reviews_user) { create :user } let(:invited_user) { create :user } - let(:teammate1) { create :teammate, :program_team, event: event, user: user1, state: Teammate::ACCEPTED } - let(:teammate2) { create :teammate, :reviewer, event: event, user: user2, state: Teammate::ACCEPTED } - let(:no_reviews_teammate) { create :teammate, :reviewer, event: event, user: no_reviews_user, state: Teammate::ACCEPTED } + let(:teammate1) { create :teammate, :program_team, event: event, user: user1, state: :accepted } + let(:teammate2) { create :teammate, :reviewer, event: event, user: user2, state: :accepted } + let(:no_reviews_teammate) { create :teammate, :reviewer, event: event, user: no_reviews_user, state: :accepted } let(:invited_teammate) { create :teammate, :has_been_invited, event: event, user: invited_user } let(:track1) { create :track, name: 'Open-source', event: event } diff --git a/spec/system/profile_spec.rb b/spec/system/profile_spec.rb index 59ff0b338..eac768c31 100644 --- a/spec/system/profile_spec.rb +++ b/spec/system/profile_spec.rb @@ -35,7 +35,7 @@ end scenario 'A user updates their event email preference' do - teammate = create(:teammate, role: 'organizer', user: user, state: Teammate::ACCEPTED) + teammate = create(:teammate, role: 'organizer', user: user, state: :accepted) visit(event_path(teammate.event)) visit(notifications_profile_path) choose(Teammate::NOTIFICATION_PREFERENCES[Teammate::MENTIONS]) diff --git a/spec/system/staff/teammates_spec.rb b/spec/system/staff/teammates_spec.rb index b924b5530..57195599d 100644 --- a/spec/system/staff/teammates_spec.rb +++ b/spec/system/staff/teammates_spec.rb @@ -4,13 +4,13 @@ let(:invitation) { create(:teammate, :has_been_invited) } let!(:organizer_user) { create(:user) } - let!(:organizer_teammate) { create(:teammate, :organizer, user: organizer_user, event: invitation.event, state: Teammate::ACCEPTED) } + let!(:organizer_teammate) { create(:teammate, :organizer, user: organizer_user, event: invitation.event, state: :accepted) } let!(:reviewer_user) { create(:user) } - let!(:reviewer_teammate) { create(:teammate, :reviewer, user: reviewer_user, event: invitation.event, state: Teammate::ACCEPTED) } + let!(:reviewer_teammate) { create(:teammate, :reviewer, user: reviewer_user, event: invitation.event, state: :accepted) } let!(:program_team_user) { create(:user) } - let!(:program_team_teammate) { create(:teammate, :program_team, user: program_team_user, event: invitation.event, state: Teammate::ACCEPTED) } + let!(:program_team_teammate) { create(:teammate, :program_team, user: program_team_user, event: invitation.event, state: :accepted) } before { login_as(organizer_user) } From e84222ff3fc6be07bff92b3704258d524666c324 Mon Sep 17 00:00:00 2001 From: Akira Matsuda Date: Tue, 23 Dec 2025 11:27:02 +0900 Subject: [PATCH 3/4] AR Enum defines them --- app/models/teammate.rb | 11 ++--------- spec/controllers/teammates_controller_spec.rb | 6 +++--- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/app/models/teammate.rb b/app/models/teammate.rb index 7e353d2dc..370f6f841 100644 --- a/app/models/teammate.rb +++ b/app/models/teammate.rb @@ -36,11 +36,8 @@ class Teammate < ApplicationRecord scope :program_team, -> { where(role: PROGRAM_TEAM_ROLES) } scope :reviewer, -> { where(role: STAFF_ROLES) } - scope :pending, -> { where(state: PENDING) } - scope :accepted, -> { where(state: ACCEPTED) } - scope :active, -> { where(state: ACCEPTED) } - scope :declined, -> { where(state: DECLINED) } - scope :invitations, -> { where(state: [PENDING, DECLINED]) } + scope :active, -> { accepted } + scope :invitations, -> { where(state: [:pending, :declined]) } scope :all_emails, -> { where(notification_preference: ALL) } @@ -65,10 +62,6 @@ def ratings_count(current_event) self.user.ratings.not_withdrawn.for_event(current_event).size end - def pending? - state == PENDING - end - def invite self.token = Digest::SHA1.hexdigest(Time.current.to_s + email + rand(1000).to_s) self.state = :pending diff --git a/spec/controllers/teammates_controller_spec.rb b/spec/controllers/teammates_controller_spec.rb index fadde2159..06cd62880 100644 --- a/spec/controllers/teammates_controller_spec.rb +++ b/spec/controllers/teammates_controller_spec.rb @@ -9,11 +9,11 @@ before { sign_in(user) } it "creates an accepted teammate for current user" do - expect(invitation.state).to eq(Teammate::PENDING) + expect(invitation).to be_pending get :accept, params: {token: invitation.token} expect(user).to be_reviewer_for_event(invitation.event) invitation.reload - expect(invitation.state).to eq(Teammate::ACCEPTED) + expect(invitation).to be_accepted end end @@ -25,7 +25,7 @@ it "sets invitation state to declined" do get :decline, params: {token: invitation.token} - expect(invitation.reload.state).to eq(Teammate::DECLINED) + expect(invitation.reload).to be_declined end end From 18f072e853cf13698974c9d7fcae7d44986fe7af Mon Sep 17 00:00:00 2001 From: Akira Matsuda Date: Tue, 23 Dec 2025 11:27:18 +0900 Subject: [PATCH 4/4] Unused constants --- app/models/teammate.rb | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/models/teammate.rb b/app/models/teammate.rb index 370f6f841..bd5f79ed6 100644 --- a/app/models/teammate.rb +++ b/app/models/teammate.rb @@ -1,9 +1,4 @@ class Teammate < ApplicationRecord - PENDING = "pending" - ACCEPTED = "accepted" - DECLINED = "declined" - STATES = ["pending", "accepted", "declined"] - STAFF_ROLES = ['reviewer', 'program team', 'organizer'] PROGRAM_TEAM_ROLES = ['program team', 'organizer']