|
- # == 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
|