@@ -21,7 +21,6 @@ def show
2121
2222 def handle_register ( token )
2323 existing_aliases = Alias . by_email ( token . email )
24- # If email already linked to another user, block registration
2524 if existing_aliases . where . not ( user_id : nil ) . exists?
2625 return redirect_to new_session_path , alert : 'This email is already claimed. Please sign in.'
2726 end
@@ -30,27 +29,34 @@ def handle_register(token)
3029 metadata = JSON . parse ( token . metadata || '{}' ) rescue { }
3130 desired_username = metadata [ 'username' ]
3231 user . username = desired_username
33- if metadata [ 'password' ] . present?
34- user . password = metadata [ 'password' ]
35- user . password_confirmation = metadata [ 'password_confirmation' ]
32+ if metadata [ 'password_digest' ] . present?
33+ user . password_digest = metadata [ 'password_digest' ]
3634 end
37- begin
35+
36+ ActiveRecord ::Base . transaction do
3837 user . save! ( context : :registration )
39- rescue ActiveRecord ::RecordNotUnique , ActiveRecord ::RecordInvalid => e
40- if e . message =~ /username/i
41- return redirect_to new_registration_path , alert : "Username is already taken."
38+
39+ reservation = NameReservation . find_by (
40+ owner_type : 'UserToken' ,
41+ owner_id : token . id ,
42+ name : NameReservation . normalize ( desired_username )
43+ )
44+ if reservation
45+ reservation . update! ( owner_type : 'User' , owner_id : user . id )
4246 else
43- raise
47+ begin
48+ NameReservation . reserve! ( name : desired_username , owner : user )
49+ rescue ActiveRecord ::RecordInvalid
50+ raise ActiveRecord ::RecordInvalid . new ( user ) , "Username is already taken."
51+ end
4452 end
4553 end
4654
4755 if existing_aliases . exists?
4856 existing_aliases . update_all ( user_id : user . id , verified_at : Time . current )
49- # Ensure one primary alias
5057 primary = existing_aliases . find_by ( primary_alias : true ) || existing_aliases . first
5158 primary . update! ( primary_alias : true )
5259 else
53- # Use provided name if any
5460 name = metadata [ 'name' ] || token . email
5561 Alias . create! ( user : user , name : name , email : token . email , primary_alias : true , verified_at : Time . current )
5662 end
@@ -63,7 +69,6 @@ def handle_register(token)
6369 def handle_add_alias ( token )
6470 require_authentication
6571 email = token . email
66- # Block if email belongs to another active user
6772 if Alias . by_email ( email ) . where . not ( user_id : [ nil , current_user . id ] ) . exists?
6873 return redirect_to settings_path , alert : 'Email is linked to another account. Delete that account first to release it.'
6974 end
0 commit comments