@@ -4,6 +4,8 @@ defmodule AlgoraWeb.SignInLive do
4
4
5
5
alias Algora.Accounts
6
6
alias Algora.Accounts.User
7
+ alias Algora.Organizations
8
+ alias Algora.Repo
7
9
alias AlgoraWeb.Components.Logos
8
10
alias AlgoraWeb.LocalStore
9
11
@@ -263,39 +265,52 @@ defmodule AlgoraWeb.SignInLive do
263
265
def handle_event ( "send_login_code" , % { "user" => % { "email" => email } } , socket ) do
264
266
{ secret , code } = AlgoraWeb.UserAuth . generate_totp ( )
265
267
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" ) }
287
281
end
288
282
end
289
283
290
284
@ impl true
291
285
def handle_event ( "send_login_code" , % { "user" => % { "login_code" => code } } , socket ) do
292
286
case AlgoraWeb.UserAuth . verify_totp ( socket . assigns . ip_address , socket . assigns . secret , String . trim ( code ) ) do
293
287
: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
295
310
296
311
{ :noreply ,
297
312
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 ] )
299
314
) }
300
315
301
316
{ :error , :rate_limit_exceeded } ->
0 commit comments