@@ -43,6 +43,7 @@ class User < ApplicationRecord
4343 belongs_to :role , optional : true
4444 has_many :subscriptions , dependent : :destroy
4545 has_many :stars , dependent : :destroy
46+ has_many :identities , dependent : :destroy
4647 has_one :ban , dependent : :destroy , inverse_of : :user
4748 has_many :bans_as_banner , class_name : 'Ban' , foreign_key : :banner_id , inverse_of : :banner , dependent : :nullify
4849 has_many :activities_as_owner ,
@@ -201,21 +202,21 @@ def self.from_omniauth(auth)
201202 # TODO: The code below will update their account to note the Elixir auth. but leave their password intact;
202203 # TODO: is this what we should be doing?
203204
204- # find by provider and { uid or email}
205- users = User . where ( provider : auth . provider , uid : auth . uid )
206- if users . none? && auth . info . email . present? && auth . provider . present?
207- users = User . where ( provider : auth . provider , email : auth . info . email )
208- end
205+ identity = Identity . where ( provider : auth . provider , uid : auth . uid ) . first
206+ user = identity &.user
209207
210- # get first user
211- user = users . first
208+ if user . nil? && auth . info . email . present? && auth . provider . present?
209+ user = User . joins ( :identities ) . where ( email : auth . info . email , identities : { provider : auth . provider } ) . first
210+ end
212211
213212 if user
214- # update provider and uid if present
215- if user . provider . nil? and user . uid . nil?
216- user . uid = auth . uid
217- user . provider = auth . provider
218- user . save
213+ existing_identity = user . identities . find_by ( provider : auth . provider )
214+ unless existing_identity &.uid == auth . uid
215+ if existing_identity &.uid . blank?
216+ existing_identity . update ( uid : auth . uid )
217+ else
218+ user . identities . create ( provider : auth . provider , uid : auth . uid )
219+ end
219220 end
220221 else
221222 # set name components
@@ -226,12 +227,11 @@ def self.from_omniauth(auth)
226227
227228 # create user
228229 username = User . username_from_auth_info ( auth . info )
229- user = User . new ( provider : auth . provider ,
230- uid : auth . uid ,
231- email : auth . info . email ,
230+ user = User . new ( email : auth . info . email ,
232231 username : username ,
233232 profile_attributes : { firstname : first_name , surname : last_name } ,
234233 )
234+ user . identities . build ( provider : auth . provider , uid : auth . uid )
235235 user . skip_confirmation!
236236 end
237237
@@ -260,7 +260,7 @@ def self.not_banned
260260 end
261261
262262 def using_omniauth?
263- provider . present? && uid . present?
263+ identities . any? || ( provider . present? && uid . present? )
264264 end
265265
266266 def password_required?
0 commit comments