class Models::Groups::Invitation

Constants

STATUS

Attributes

access_key_length[RW]
status[RW]

Public Class Methods

accept(application_id, user_id, access_key) click to toggle source
# File lib/restpack_group_service/models/invitation.rb, line 47
def self.accept(application_id, user_id, access_key) #TODO: GJ: skip if already a member
  invitation = self.available.by_application_id(application_id).by_access_key(access_key).first

  raise "Invalid invitation" unless invitation

  invitation.accept(user_id)
end
access_key_unique?(application_id, access_key) click to toggle source
# File lib/restpack_group_service/models/invitation.rb, line 72
def self.access_key_unique?(application_id, access_key)
  self.by_application_id(application_id).by_access_key(access_key).empty?
end
by_access_key(key) click to toggle source
# File lib/restpack_group_service/models/invitation.rb, line 28
def self.by_access_key(key)
  self.where 'access_key = ?', key
end
by_application_id(application_id) click to toggle source
# File lib/restpack_group_service/models/invitation.rb, line 24
def self.by_application_id(application_id)
  self.where 'application_id = ?', application_id
end

Public Instance Methods

accept(user_id) click to toggle source
# File lib/restpack_group_service/models/invitation.rb, line 55
def accept(user_id)
  validate! user_id

  transaction do
    membership = Membership.new application_id: application_id, group_id: group_id, user_id: user_id
    self.memberships << membership
    self.use!

    membership
  end
end
configuration() click to toggle source
# File lib/restpack_group_service/models/invitation.rb, line 43
def configuration
  Configuration.find_or_create_by({ application_id: self.application_id })
end
reject(user_id) click to toggle source
# File lib/restpack_group_service/models/invitation.rb, line 67
def reject(user_id)
  validate! user_id
  self.use! false
end
status=(status) click to toggle source
# File lib/restpack_group_service/models/invitation.rb, line 39
def status=(status)
  write_attribute(:status_id, STATUS[status])
end

Protected Instance Methods

use!(accept = true) click to toggle source
# File lib/restpack_group_service/models/invitation.rb, line 78
def use!(accept = true)
  if single_use?
    self.status = accept ? :accepted : :rejected
  else
    self.remaining_uses -= 1
  end
  self.save!
end

Private Instance Methods

generate_access_key() click to toggle source
# File lib/restpack_group_service/models/invitation.rb, line 105
def generate_access_key
  length = access_key_length.to_i

  loop do
    self.access_key = SecureRandom.urlsafe_base64(length).first(length)
    break if Invitation.access_key_unique?(application_id, access_key)
  end
end
set_defaults() click to toggle source
# File lib/restpack_group_service/models/invitation.rb, line 100
def set_defaults
  self.access_key_length ||= 16
  self.status ||= :available
end
single_use?() click to toggle source
# File lib/restpack_group_service/models/invitation.rb, line 96
def single_use?
  remaining_uses.nil? || remaining_uses <= 1
end
validate!(user_id) click to toggle source
# File lib/restpack_group_service/models/invitation.rb, line 89
def validate!(user_id)
  raise "Invitation is #{status}" unless status == :available
  raise "Invalid invitee" unless invitee_id.nil? || invitee_id == user_id.to_i
  raise "Invitation has expired" unless remaining_uses.nil? || remaining_uses > 0
  raise "Invitation has expired" unless expires_at.nil? || expires_at > Time.now
end