#elixir #phoenix
#elixir #phoenix-framework
Вопрос:
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
Три маршрута confirm_email, reset_password и change_password не работают.
Ниже приведена ошибка, которую я вижу:
Запрос: GET / confirm_email/zDiFgI09YDdcdNpkyXiONF2VkXuWVRqv
(Ошибка неопределенной функции) функция TexasTechWeb.TokenController.confirm_email/4 не определен или является частным. Вы имели в виду один из:
Это работало раньше. Эта ошибка возникает после добавления административных маршрутов.
Кто-нибудь, пожалуйста, помогите?
Комментарии:
1. Вы добавили что-нибудь странное в свой
TexasTechWeb.__using__/1
? Я не видел этого раньше, но, похоже, вероятным местом для изменения арности действий вашего контроллера является вашTexasTechWeb.TokenController.action/2
: hexdocs.pm/phoenix /…2. Может быть полезно отменить критические изменения, а затем медленно добавлять их обратно одно за другим, чтобы точно определить, какое изменение вызывает проблему.