implemented optional 'allow_registration' config, with first registered user being pre-confirmed Admin, registration unavailable after that point if allow_registration: :false
This commit is contained in:
parent
ea74a89078
commit
f27df8d676
22 changed files with 395 additions and 244 deletions
lib/shift73k_web/live/user
|
@ -1,6 +1,6 @@
|
|||
defmodule Shift73kWeb.UserLive.Registration do
|
||||
use Shift73kWeb, :live_view
|
||||
|
||||
alias Shift73k.Repo
|
||||
alias Shift73k.Accounts
|
||||
alias Shift73k.Accounts.User
|
||||
|
||||
|
@ -20,9 +20,7 @@ defmodule Shift73kWeb.UserLive.Registration do
|
|||
user_id: nil,
|
||||
user_return_to: Map.get(session, "user_return_to", "/"),
|
||||
messages: [
|
||||
success: "Welcome! Your new account has been created, and you've been logged in.",
|
||||
info:
|
||||
"Some features may be unavailable until you confirm your email address. Check your inbox for instructions."
|
||||
success: "Welcome! Your new account has been created, and you've been logged in."
|
||||
]
|
||||
}
|
||||
end
|
||||
|
@ -35,19 +33,33 @@ defmodule Shift73kWeb.UserLive.Registration do
|
|||
|
||||
@impl true
|
||||
def handle_event("save", %{"user" => user_params}, socket) do
|
||||
is_first_user = !Repo.exists?(User)
|
||||
user_params
|
||||
|> Map.put("role", Accounts.registration_role())
|
||||
|> Accounts.register_user()
|
||||
|> case do
|
||||
{:ok, user} ->
|
||||
{:ok, _, %Swoosh.Email{} = _captured_email} =
|
||||
Accounts.deliver_user_confirmation_instructions(
|
||||
user,
|
||||
&Routes.user_confirmation_url(socket, :confirm, &1)
|
||||
)
|
||||
# If this is the first user, we just confirm them
|
||||
if is_first_user do
|
||||
user |> User.confirm_changeset() |> Repo.update()
|
||||
else
|
||||
# Otherwise, all new users require email confirmation so we wend instructions
|
||||
{:ok, _, %Swoosh.Email{} = _captured_email} =
|
||||
Accounts.deliver_user_confirmation_instructions(
|
||||
user,
|
||||
&Routes.user_confirmation_url(socket, :confirm, &1)
|
||||
)
|
||||
end
|
||||
|
||||
login_params =
|
||||
if is_first_user do
|
||||
socket.assigns.login_params
|
||||
else
|
||||
put_in(socket.assigns.login_params, [:messages, :info], "Some features may be unavailable until you confirm your email address. Check your inbox for instructions.")
|
||||
end
|
||||
|> put_in([:user_id], user.id)
|
||||
|
||||
socket
|
||||
|> assign(login_params: %{socket.assigns.login_params | user_id: user.id})
|
||||
|> assign(login_params: login_params)
|
||||
|> assign(trigger_submit: true)
|
||||
|> live_noreply()
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
</h2>
|
||||
<p class="lead">Create an account to manage your work shifts with us.</p>
|
||||
|
||||
<%= form_for @changeset, "#", [phx_change: :validate, phx_submit: :save, novalidate: true, id: "reg_form"], fn f -> %>
|
||||
<.form let={f} for={@changeset} phx-change="validate" phx-submit="save" novalidate id="reg_form">
|
||||
|
||||
<%= label f, :email, class: "form-label" %>
|
||||
<div class="inner-addon left-addon mb-3" phx-feedback-for={input_id(f, :email)}>
|
||||
|
@ -45,7 +45,7 @@
|
|||
%>
|
||||
</div>
|
||||
|
||||
<% end %>
|
||||
</.form>
|
||||
|
||||
<p>
|
||||
<%= link "Log in", to: Routes.user_session_path(@socket, :new) %> |
|
||||
|
|
|
@ -4,6 +4,9 @@ defmodule Shift73kWeb.UserLive.ResetPassword do
|
|||
alias Shift73k.Accounts
|
||||
alias Shift73k.Accounts.User
|
||||
|
||||
@app_vars Application.compile_env(:shift73k, :app_global_vars, allow_registration: :true)
|
||||
@app_allow_registration @app_vars[:allow_registration]
|
||||
|
||||
@impl true
|
||||
def mount(_params, session, socket) do
|
||||
user = Accounts.get_user!(session["user_id"])
|
||||
|
@ -37,4 +40,6 @@ defmodule Shift73kWeb.UserLive.ResetPassword do
|
|||
|> assign(changeset: changeset)}
|
||||
end
|
||||
end
|
||||
|
||||
def allow_registration, do: @app_allow_registration
|
||||
end
|
||||
|
|
|
@ -45,7 +45,9 @@
|
|||
<% end %>
|
||||
|
||||
<p class="mt-3 is-pulled-right">
|
||||
<%= link "Register", to: Routes.user_registration_path(@socket, :new) %> |
|
||||
<%= if allow_registration() do %>
|
||||
<%= link "Register", to: Routes.user_registration_path(@socket, :new) %> |
|
||||
<% end %>
|
||||
<%= link "Log in", to: Routes.user_session_path(@socket, :new) %>
|
||||
</p>
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue