-
-
Notifications
You must be signed in to change notification settings - Fork 527
/
Copy pathuser.rb
149 lines (123 loc) · 5.09 KB
/
user.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# == Schema Information
#
# Table name: users
#
# id :integer not null, primary key
# current_sign_in_at :datetime
# current_sign_in_ip :inet
# discarded_at :datetime
# email :string default(""), not null
# encrypted_password :string default(""), not null
# invitation_accepted_at :datetime
# invitation_created_at :datetime
# invitation_limit :integer
# invitation_sent_at :datetime
# invitation_token :string
# invitations_count :integer default(0)
# invited_by_type :string
# last_request_at :datetime
# last_sign_in_at :datetime
# last_sign_in_ip :inet
# name :string
# organization_admin :boolean
# provider :string
# remember_created_at :datetime
# reset_password_sent_at :datetime
# reset_password_token :string
# sign_in_count :integer default(0), not null
# super_admin :boolean default(FALSE)
# uid :string
# created_at :datetime not null
# updated_at :datetime not null
# invited_by_id :integer
# last_role_id :bigint
# organization_id :integer
# partner_id :bigint
#
class User < ApplicationRecord
before_validation :normalize_blank_name_to_nil
has_paper_trail
rolify
include Discard::Model
has_one :organization_role_join, class_name: "UsersRole", dependent: :destroy
has_one :organization_role, through: :organization_role_join, class_name: "Role", source: :role
belongs_to :last_role_join, class_name: "UsersRole", optional: true, inverse_of: :user, foreign_key: :last_role_id
has_one :last_role, through: :last_role_join, class_name: "Role", source: :role
accepts_nested_attributes_for :organization_role_join
has_one :organization, through: :organization_role, source: :resource, source_type: "Organization"
has_many :organizations, through: :roles, source: :resource, source_type: "Organization"
has_one :partner_role_join, class_name: "UsersRole", dependent: :destroy
has_one :partner_role, through: :partner_role_join, class_name: "Role", source: :role
has_one :partner, through: :partner_role, source: :resource, source_type: "Partner"
has_many :partners, through: :roles, source: :resource, source_type: "Partner"
attr_accessor :organization_admin # for creation / update time
# :invitable is from the devise_invitable gem
# If you change any of these options, adjust ConsolidatedLoginsController::DeviseMappingShunt accordingly
devise :invitable, :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:timeoutable
devise :omniauthable, omniauth_providers: [:google_oauth2]
validates :email, presence: true, uniqueness: {case_sensitive: false},
format: {with: URI::MailTo::EMAIL_REGEXP, on: :create}
validate :password_complexity
default_scope -> { kept }
scope :alphabetized, -> { order(discarded_at: :desc, name: :asc) }
scope :partner_users, -> { with_role(Role::PARTNER, :any) }
scope :org_users, -> { with_role(Role::ORG_USER, :any) }
scope :search_name, ->(query) { where("name ilike ?", "%#{query}%") }
scope :search_email, ->(query) { where("email LIKE ?", "%#{query}%") }
filterrific(
available_filters: [
:search_name,
:search_email
]
)
has_many :requests, class_name: "::Request", foreign_key: :partner_id, dependent: :destroy, inverse_of: :partner_user
has_many :submitted_requests, class_name: "Request", foreign_key: :partner_user_id, dependent: :destroy, inverse_of: :partner_user
def normalize_blank_name_to_nil
self.name = nil if name.blank?
end
def display_name
name.presence || "Name Not Provided"
end
def formatted_email
email.present? ? "#{name} <#{email}>" : ""
end
def password_complexity
return if password.blank? || password =~ /(?=.*?[#?!@$%^&*\-;,.()=+|:])/
errors.add :password, "Complexity requirement not met. Please use at least 1 special character"
end
def invitation_status
return "joined" if current_sign_in_at.present?
return "accepted" if invitation_accepted_at.present?
"invited" if invitation_sent_at.present?
end
def org_role
return "admin" if has_cached_role?(Role::ORG_ADMIN, organization)
return "normal" if has_cached_role?(Role::ORG_USER, organization)
"not a member"
end
def is_admin?(org)
has_cached_role?(Role::ORG_ADMIN, org) || has_cached_role?(Role::SUPER_ADMIN)
end
def switchable_roles
all_roles = roles.to_a.group_by(&:resource_id)
all_roles.values.each do |role_list|
if role_list.any? { |r| r.name == Role::ORG_ADMIN.to_s }
role_list.delete_if { |r| r.name == Role::ORG_USER.to_s }
end
end
all_roles.values.flatten
end
def flipper_id
"User:#{id}"
end
def reinvitable?
return true if invitation_status == "invited" && invitation_sent_at <= 7.days.ago
false
end
def self.from_omniauth(access_token)
data = access_token.info
User.find_by(email: data["email"])
end
end