Edit

kmx.io/kmxgit/lib/kmxgit_web/controllers/user_settings_controller.ex

Branch :

  • lib/kmxgit_web/controllers/user_settings_controller.ex
  • ## kmxgit
    ## Copyright 2022 kmx.io <contact@kmx.io>
    ##
    ## Permission is hereby granted to use this software granted
    ## the above copyright notice and this permission paragraph
    ## are included in all copies and substantial portions of this
    ## software.
    ##
    ## THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
    ## PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
    ## AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
    ## THIS SOFTWARE.
    
    defmodule KmxgitWeb.UserSettingsController do
      use KmxgitWeb, :controller
    
      alias Kmxgit.UserManager
      alias KmxgitWeb.UserAuth
    
      plug :assign_email_and_password_changesets
    
      def edit(conn, _params) do
        render(conn, "edit.html")
      end
    
      def update(conn, %{"action" => "update_email"} = params) do
        %{"current_password" => password, "user" => user_params} = params
        user = conn.assigns.current_user
    
        case UserManager.apply_user_email(user, password, user_params) do
          {:ok, applied_user} ->
            UserManager.deliver_update_email_instructions(
              applied_user,
              user.email,
              &Routes.user_settings_url(conn, :confirm_email, &1)
            )
    
            conn
            |> put_flash(
              :info,
              "A link to confirm your email change has been sent to the new address."
            )
            |> redirect(to: Routes.user_settings_path(conn, :edit))
    
          {:error, changeset} ->
            render(conn, "edit.html", email_changeset: changeset)
        end
      end
    
      def update(conn, %{"action" => "update_password"} = params) do
        %{"current_password" => password, "user" => user_params} = params
        user = conn.assigns.current_user
    
        case UserManager.update_user_password(user, password, user_params) do
          {:ok, user} ->
            conn
            |> put_flash(:info, "Password updated successfully.")
            |> put_session(:user_return_to, Routes.user_settings_path(conn, :edit))
            |> UserAuth.log_in_user(user)
    
          {:error, changeset} ->
            render(conn, "edit.html", password_changeset: changeset)
        end
      end
    
      def confirm_email(conn, %{"token" => token}) do
        case UserManager.update_user_email(conn.assigns.current_user, token) do
          :ok ->
            conn
            |> put_flash(:info, "Email changed successfully.")
            |> redirect(to: Routes.user_settings_path(conn, :edit))
    
          :error ->
            conn
            |> put_flash(:error, "Email change link is invalid or it has expired.")
            |> redirect(to: Routes.user_settings_path(conn, :edit))
        end
      end
    
      defp assign_email_and_password_changesets(conn, _opts) do
        user = conn.assigns.current_user
    
        conn
        |> assign(:email_changeset, UserManager.change_user_email(user))
        |> assign(:password_changeset, UserManager.change_user_password(user))
      end
    end