Module: Plutonium::Invites::Concerns::InviteToken
- Extended by:
- ActiveSupport::Concern
- Defined in:
- lib/plutonium/invites/concerns/invite_token.rb
Overview
InviteToken provides core invite functionality for models.
This concern handles:
-
Token generation and validation
-
State machine (pending, accepted, expired, cancelled)
-
Email constraint validation
-
Invite acceptance flow
Instance Method Summary collapse
-
#accept_for_user!(user) ⇒ Object
Accept the invitation for a user.
-
#create_membership_for(user) ⇒ Object
Override this method to create the entity membership.
-
#enforce_domain ⇒ String?
Override in subclass to enforce email domain matching.
-
#enforce_email? ⇒ Boolean
Override in subclass to require exact email match.
-
#invitation_mailer ⇒ Class
Override this method to specify the mailer class.
-
#validate_email_constraints!(user_email) ⇒ Object
Validate email constraints against the accepting user’s email.
Instance Method Details
#accept_for_user!(user) ⇒ Object
Accept the invitation for a user.
This method:
-
Validates email constraints
-
Marks the invite as accepted
-
Creates the entity membership
-
Notifies the invitable (if present)
123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
# File 'lib/plutonium/invites/concerns/invite_token.rb', line 123 def accept_for_user!(user) validate_email_constraints!(user.email) transaction do update!( state: :accepted, accepted_at: Time.current, user: user ) create_membership_for(user) notify_invitable(user) end end |
#create_membership_for(user) ⇒ Object
Override this method to create the entity membership.
150 151 152 |
# File 'lib/plutonium/invites/concerns/invite_token.rb', line 150 def create_membership_for(user) raise NotImplementedError, "#{self.class}#create_membership_for must be implemented to create the membership record" end |
#enforce_domain ⇒ String?
Override in subclass to enforce email domain matching.
82 83 84 |
# File 'lib/plutonium/invites/concerns/invite_token.rb', line 82 def enforce_domain nil end |
#enforce_email? ⇒ Boolean
Override in subclass to require exact email match.
89 90 91 |
# File 'lib/plutonium/invites/concerns/invite_token.rb', line 89 def enforce_email? true end |
#invitation_mailer ⇒ Class
Override this method to specify the mailer class.
142 143 144 |
# File 'lib/plutonium/invites/concerns/invite_token.rb', line 142 def invitation_mailer raise NotImplementedError, "#{self.class}#invitation_mailer must be implemented to return the mailer class" end |
#validate_email_constraints!(user_email) ⇒ Object
Validate email constraints against the accepting user’s email.
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/plutonium/invites/concerns/invite_token.rb', line 97 def validate_email_constraints!(user_email) if enforce_email? && user_email.downcase != email.downcase errors.add(:base, "This invitation is for #{email}. You must use an account with that email address.") raise ActiveRecord::RecordInvalid.new(self) end if (required_domain = enforce_domain) user_domain = extract_domain(user_email) if user_domain != required_domain errors.add(:base, "This invitation requires an email from the #{required_domain} domain.") raise ActiveRecord::RecordInvalid.new(self) end end end |