Skip to content

Commit 514f4ac

Browse files
committed
allow new account creation in login page
1 parent 24c2592 commit 514f4ac

File tree

1 file changed

+38
-23
lines changed

1 file changed

+38
-23
lines changed

lib/algora_web/live/sign_in_live.ex

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)