@@ -4,6 +4,8 @@ defmodule AlgoraWeb.SignInLive do
44
55 alias Algora.Accounts
66 alias Algora.Accounts.User
7+ alias Algora.Organizations
8+ alias Algora.Repo
79 alias AlgoraWeb.Components.Logos
810 alias AlgoraWeb.LocalStore
911
@@ -263,39 +265,52 @@ defmodule AlgoraWeb.SignInLive do
263265 def handle_event ( "send_login_code" , % { "user" => % { "email" => email } } , socket ) do
264266 { secret , code } = AlgoraWeb.UserAuth . generate_totp ( )
265267
266- case Accounts . get_user_by_email ( email ) do
267- % User { } = user ->
268- changeset = User . login_changeset ( % User { } , % { } )
269-
270- case Accounts . deliver_totp_login_email ( user , code ) do
271- { :ok , _id } ->
272- { :noreply ,
273- socket
274- |> LocalStore . assign_cached ( :secret , secret )
275- |> LocalStore . assign_cached ( :email , email )
276- |> assign ( :user , user )
277- |> assign_form ( changeset ) }
278-
279- { :error , reason } ->
280- Logger . error ( "Failed to send login code to #{ email } : #{ inspect ( reason ) } " )
281- { :noreply , put_flash ( socket , :error , "We had trouble sending mail to #{ email } . Please try again" ) }
282- end
283-
284- nil ->
285- throttle ( )
286- { :noreply , put_flash ( socket , :error , "Email address not found." ) }
268+ changeset = User . login_changeset ( % User { } , % { } )
269+
270+ case Accounts . deliver_totp_signup_email ( email , code ) do
271+ { :ok , _id } ->
272+ { :noreply ,
273+ socket
274+ |> LocalStore . assign_cached ( :secret , secret )
275+ |> LocalStore . assign_cached ( :email , email )
276+ |> assign_form ( changeset ) }
277+
278+ { :error , reason } ->
279+ Logger . error ( "Failed to send login code to #{ email } : #{ inspect ( reason ) } " )
280+ { :noreply , put_flash ( socket , :error , "We had trouble sending mail to #{ email } . Please try again" ) }
287281 end
288282 end
289283
290284 @ impl true
291285 def handle_event ( "send_login_code" , % { "user" => % { "login_code" => code } } , socket ) do
292286 case AlgoraWeb.UserAuth . verify_totp ( socket . assigns . ip_address , socket . assigns . secret , String . trim ( code ) ) do
293287 :ok ->
294- Accounts . ensure_org_context ( socket . assigns . user )
288+ handle =
289+ socket . assigns . email
290+ |> Organizations . generate_handle_from_email ( )
291+ |> Organizations . ensure_unique_handle ( )
292+
293+ user =
294+ case Repo . get_by ( User , email: socket . assigns . email ) do
295+ nil ->
296+ { :ok , user } =
297+ % { handle: handle , email: socket . assigns . email }
298+ |> User . user_registration_changeset ( )
299+ |> Repo . insert ( returning: true )
300+
301+ Accounts . auto_join_orgs ( user )
302+
303+ Accounts . ensure_org_context ( user )
304+
305+ user
306+
307+ user ->
308+ user
309+ end
295310
296311 { :noreply ,
297312 redirect ( socket ,
298- to: AlgoraWeb.UserAuth . generate_login_path ( socket . assigns . user . email , socket . assigns [ :return_to ] )
313+ to: AlgoraWeb.UserAuth . generate_login_path ( user . email , socket . assigns [ :return_to ] )
299314 ) }
300315
301316 { :error , :rate_limit_exceeded } ->
0 commit comments