# == Schema Information # # Table name: project_invite_links # # id :integer not null, primary key # project_id :integer # user_id :integer # role :integer default("4") # is_apply :boolean default("1") # sign :string(255) # expired_at :datetime # created_at :datetime not null # updated_at :datetime not null # # Indexes # # index_project_invite_links_on_project_id (project_id) # index_project_invite_links_on_sign (sign) # index_project_invite_links_on_user_id (user_id) # class ProjectInviteLink < ApplicationRecord default_scope { where("expired_at > ?", Time.now).or(where(expired_at: nil)) } belongs_to :project belongs_to :user has_many :applied_projects scope :with_project_id, -> (project_id) {where(project_id: project_id)} scope :with_user_id, -> (user_id) {where(user_id: user_id)} enum role: {manager: 3, developer: 4, reporter: 5} before_create :set_old_data_expired_at def self.random_hex_sign hex = (SecureRandom.hex(32)) return hex unless ProjectInviteLink.where(sign: hex).exists? end def self.build!(project, user, role="developer", is_apply=true) self.create!( project_id: project&.id, user_id: user&.id, role: role, is_apply: is_apply, sign: random_hex_sign, expired_at: Time.now + 3.days ) end private def set_old_data_expired_at ProjectInviteLink.where(user_id: self.user_id, project_id: self.project, role: self.role, is_apply: self.is_apply).update_all(expired_at: Time.now) end end