* Update annotate to version 2.7.3 * Update aws-sdk-s3 to version 1.9.2 * Update browser to version 2.5.3 * Update capistrano to version 3.10.2 * Update domain_name to version 0.5.20180417 * Update http to version 3.2.0 * Update lograge to version 0.10.0 * Update oj to version 3.5.1 * Update parallel_tests to version 2.21.3 * Update puma to version 3.11.4 * Update rubocop to version 0.55.0 * Update scss_lint to version 0.57.0 * Update simplecov to version 0.16.1 * Update tty-command to version 0.8.0 * Update tty-prompt to version 0.16.0 * Update pkg-config to version 1.3.0 * Update fog-local to version 0.5.0 * Update fog-openstack to version 0.1.25 * Update devise-two-factor to version 3.0.3 * bundle update
		
			
				
	
	
		
			53 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: true
 | |
| # == Schema Information
 | |
| #
 | |
| # Table name: invites
 | |
| #
 | |
| #  id         :bigint(8)        not null, primary key
 | |
| #  user_id    :bigint(8)        not null
 | |
| #  code       :string           default(""), not null
 | |
| #  expires_at :datetime
 | |
| #  max_uses   :integer
 | |
| #  uses       :integer          default(0), not null
 | |
| #  created_at :datetime         not null
 | |
| #  updated_at :datetime         not null
 | |
| #
 | |
| 
 | |
| class Invite < ApplicationRecord
 | |
|   belongs_to :user
 | |
|   has_many :users, inverse_of: :invite
 | |
| 
 | |
|   scope :available, -> { where(expires_at: nil).or(where('expires_at >= ?', Time.now.utc)) }
 | |
|   scope :expired, -> { where.not(expires_at: nil).where('expires_at < ?', Time.now.utc) }
 | |
| 
 | |
|   before_validation :set_code
 | |
| 
 | |
|   attr_reader :expires_in
 | |
| 
 | |
|   def expires_in=(interval)
 | |
|     self.expires_at = interval.to_i.seconds.from_now unless interval.blank?
 | |
|     @expires_in     = interval
 | |
|   end
 | |
| 
 | |
|   def valid_for_use?
 | |
|     (max_uses.nil? || uses < max_uses) && !expired?
 | |
|   end
 | |
| 
 | |
|   def expire!
 | |
|     touch(:expires_at)
 | |
|   end
 | |
| 
 | |
|   def expired?
 | |
|     !expires_at.nil? && expires_at < Time.now.utc
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def set_code
 | |
|     loop do
 | |
|       self.code = ([*('a'..'z'), *('A'..'Z'), *('0'..'9')] - %w(0 1 I l O)).sample(8).join
 | |
|       break if Invite.find_by(code: code).nil?
 | |
|     end
 | |
|   end
 | |
| end
 |