Маршрутизация не работает после добавления некоторых маршрутов администратора - эликсир - PullRequest
0 голосов
/ 05 апреля 2019

router.ex

defmodule TexasTechWeb.Router do
  use TexasTechWeb, :router
  use Plug.ErrorHandler
  use Sentry.Plug

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    plug :protect_from_forgery
    plug :put_secure_browser_headers
    plug Guardian.Plug.VerifySession
    plug Guardian.Plug.LoadResource
  end

  pipeline :api do
    plug :accepts, ["json"]
  end

  pipeline :graphql do
    plug Guardian.Plug.VerifyHeader, realm: "Bearer"
    plug Guardian.Plug.LoadResource
    plug TexasTechWeb.AbsintheContextPlug
  end

  pipeline :require_login do
    plug Guardian.Plug.EnsureAuthenticated, [handler: TexasTechWeb.Admin.Auth.ErrorHandler]
    plug Guardian.Plug.LoadResource
  end

  scope "/", TexasTechWeb do
    pipe_through :browser

    get "/confirm_email/:code", TokenController, :confirm_email
    get "/reset_password/:code", TokenController, :reset_password
    post "/change_password", TokenController, :change_password # ADDED!
  end

  scope "/admin", TexasTechWeb.Admin, as: :admin do
    pipe_through :browser

    get "/",                                        SessionController, :index
    get "/login",                                   SessionController, :new
    get "/logout",                                  SessionController, :delete
    resources "/sessions",                          SessionController

    pipe_through :require_login

    resources "/users",                             UserController
    resources "/comments",                          CommentsController
    resources "/photos",                            PhotosController
  end

  scope "/api/" do
    pipe_through :graphql
    forward "/graphql", Absinthe.Plug, schema: TexasTechWeb.API.Schema

    forward "/graphiql", Absinthe.Plug.GraphiQL,
    schema: TexasTechWeb.API.Schema
  end

  if Mix.env == :dev do
    forward "/sent_emails", Bamboo.EmailPreviewPlug
  end
end

token_controller.ex

defmodule TexasTechWeb.TokenController do
  use TexasTechWeb, :controller
  alias TexasTech.{Repo, User, Token, UserService}
  import Ecto.Query

IO.inspect "##############Token Controller#############"
  def confirm_email(conn, %{"code" => code}) do
    case Repo.one(fetch_valid_token_q(code, "email_confirmation")) do
      %Token{user: user} = token ->
        case UserService.confirm_and_update_token(user, token, :email_verified_at) do
          {:ok, %{user: _u, token: _t}} ->
            render(conn, "email_confirmed.html")
          {:error, _, _, _} ->
            text(conn, "there was a problem")
        end
      nil ->
        conn
        |> put_status(404)
        |> render(TexasTechWeb.ErrorView, :"404")
    end
  end

  def reset_password(conn, %{"code" => code}) do
    IO.inspect "##########inside rest_password###########"
    case Repo.one(fetch_valid_token_q(code, "password_reset")) do
      %Token{} = token ->
        changeset = User.changeset(%User{}, %{})
        render(conn, "reset_password.html", code: code, changeset: changeset)
      nil ->
        conn
        |> put_status(404)
        |> render(TexasTechWeb.ErrorView, :"404")
    end
  end


  def to_hash(ast) do
    :sha256
    |> :crypto.hash(ast)
    |> Base.encode16
  end

  def change_password(conn, %{"user" => %{"code" => code, "password" => password, "repeated_password" => repeated_password}}) do
    token = Repo.one(fetch_valid_token_q(code, "password_reset"))
    changeset = User.change_password_changeset(token.user, %{password: String.downcase(to_hash(password)), repeated_password: String.downcase(to_hash(repeated_password))})
    if changeset.valid? do
      Repo.update(changeset)
      render(conn, "password_changed.html")
    else
      changeset = User.changeset(%User{}, %{})
      conn
      |> put_flash(:info, "Wrong, try again!")
      |> render("reset_password.html", code: code, changeset: changeset)
    end
  end

  def fetch_valid_token_q(code, type) do
    from t in Token,
      where:    t.code == ^code,
      where:    t.type == ^type,
      where:    t.used == false,
      where:    t.expires_at >= ^Timex.now(),
      join:     assoc(t, :user),

      preload:  :user
  end
end

Три маршрута verify_email, reset_password и change_password не работают.

Ниже приведена ошибка, которую я вижу:

Запрос: GET / verify_email / zDiFgI09YDdcdNpkyXiONF2VkXuWVRqv

(UndefinedFunctionError) функция TexasTechWeb.TokenController.confirm_email / 4 не определено или является конфиденциальным. Вы имели в виду один из:

Это работало раньше. Эта ошибка возникает после добавления административных маршрутов.

Кто-нибудь, пожалуйста, помогите?

...