diff --git a/lib/chess/store/user.ex b/lib/chess/store/user.ex index 4b51856..14bd573 100644 --- a/lib/chess/store/user.ex +++ b/lib/chess/store/user.ex @@ -23,12 +23,26 @@ defmodule Chess.Store.User do @doc false def changeset(struct, params \\ %{}) do struct - |> cast(params, required_attrs()) - |> validate_required(required_attrs()) + |> cast(params, registration_attrs()) + |> validate_required(registration_attrs()) |> unique_constraint(:email) |> hash_password() end + def profile_changeset(struct, params \\ %{}) do + struct + |> cast(params, profile_attrs()) + |> validate_required(profile_attrs()) + |> unique_constraint(:email) + end + + def password_changeset(struct, params \\ %{}) do + struct + |> cast(params, [:password]) + |> validate_required([:password]) + |> hash_password() + end + def opponents(user) do from user in "users", where: user.id != ^user.id, @@ -45,5 +59,6 @@ defmodule Chess.Store.User do end end - defp required_attrs, do: ~w[name email password]a + defp registration_attrs, do: ~w[name email password]a + defp profile_attrs, do: ~w{name email}a end diff --git a/lib/chess_web/controllers/password_controller.ex b/lib/chess_web/controllers/password_controller.ex new file mode 100644 index 0000000..569c72e --- /dev/null +++ b/lib/chess_web/controllers/password_controller.ex @@ -0,0 +1,29 @@ +defmodule ChessWeb.PasswordController do + @moduledoc false + + use ChessWeb, :controller + + import Chess.Auth, only: [current_user: 1] + + alias Chess.Store.User + + def edit(conn, _params) do + changeset = User.changeset(current_user(conn), %{}) + + conn + |> render("edit.html", changeset: changeset) + end + + def update(conn, %{"user" => user}) do + changeset = User.password_changeset(current_user(conn), user) + + case Repo.update(changeset) do + {:ok, _user} -> + conn + |> put_flash(:info, gettext("Password updated successfully.")) + |> redirect(to: page_path(conn, :index)) + {:error, changeset} -> + render(conn, "edit.html", changeset: changeset) + end + end +end diff --git a/lib/chess_web/controllers/profile_controller.ex b/lib/chess_web/controllers/profile_controller.ex new file mode 100644 index 0000000..11b2603 --- /dev/null +++ b/lib/chess_web/controllers/profile_controller.ex @@ -0,0 +1,29 @@ +defmodule ChessWeb.ProfileController do + @moduledoc false + + use ChessWeb, :controller + + import Chess.Auth, only: [current_user: 1] + + alias Chess.Store.User + + def edit(conn, _params) do + changeset = User.changeset(current_user(conn), %{}) + + conn + |> render("edit.html", changeset: changeset) + end + + def update(conn, %{"user" => user}) do + changeset = User.profile_changeset(current_user(conn), user) + + case Repo.update(changeset) do + {:ok, _user} -> + conn + |> put_flash(:info, gettext("Profile updated successfully.")) + |> redirect(to: page_path(conn, :index)) + {:error, changeset} -> + render(conn, "edit.html", changeset: changeset) + end + end +end diff --git a/lib/chess_web/router.ex b/lib/chess_web/router.ex index 69c1f30..7f13675 100644 --- a/lib/chess_web/router.ex +++ b/lib/chess_web/router.ex @@ -40,6 +40,10 @@ defmodule ChessWeb.Router do resources "/games", GameController, only: [:index, :new, :create, :show, :delete] + resources "/profile", ProfileController, + only: [:edit, :update], singleton: true + resources "/password", PasswordController, + only: [:edit, :update], singleton: true end # Other scopes may use custom stacks. diff --git a/lib/chess_web/templates/layout/app.html.eex b/lib/chess_web/templates/layout/app.html.eex index 4f3716a..7255282 100644 --- a/lib/chess_web/templates/layout/app.html.eex +++ b/lib/chess_web/templates/layout/app.html.eex @@ -18,7 +18,8 @@