Skip to content

Commit

Permalink
[FORGOT PWD]: initial commit with controller and email test
Browse files Browse the repository at this point in the history
  • Loading branch information
snewcomer committed Mar 19, 2017
1 parent 33d7235 commit a265a13
Show file tree
Hide file tree
Showing 7 changed files with 102 additions and 1 deletion.
14 changes: 14 additions & 0 deletions lib/code_corps/emails/forgot_password_email.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
defmodule CodeCorps.Emails.ForgotPasswordEmail do
import Bamboo.Email
import Bamboo.PostmarkHelper

alias CodeCorps.Emails.BaseEmail

def create(user) do
BaseEmail.create
|> to(user.email)
|> template(template_id(), {})
end

defp template_id, do: Application.get_env(:code_corps, :postmark_receipt_template)
end
25 changes: 25 additions & 0 deletions test/controllers/password_controller_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
defmodule CodeCorps.PasswordControllerTest do
@moduledoc false

use CodeCorps.ApiCase, resource_name: :password
use Bamboo.Test

test "creates and renders resource when email is valid", %{conn: conn} do
user = insert(:user)
attrs = %{"email" => user.email}
conn = post conn, password_path(conn, :forgot_password), attrs
response = json_response(conn, 200)
assert response == %{ "email" => user.email }
assert_delivered_email CodeCorps.Emails.ForgotPasswordEmail.create(user)
end

test "does not create resource and renders 200 when email is invalid", %{conn: conn} do
user = insert(:user)
attrs = %{"email" => "random_email@gmail.com"}
conn = post conn, password_path(conn, :forgot_password), attrs
response = json_response(conn, 200)
assert response == %{ "email" => nil }
refute_delivered_email CodeCorps.Emails.ForgotPasswordEmail.create(user)
end

end
14 changes: 14 additions & 0 deletions test/lib/code_corps/emails/forgot_password_email_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
defmodule CodeCorps.Emails.ForgotPasswordEmailTest do
use CodeCorps.ModelCase
use Bamboo.Test

alias CodeCorps.Emails.ForgotPasswordEmail

test "forgot password email works" do
user = insert(:user)

email = ForgotPasswordEmail.create(user)
assert email.from == "Code Corps<team@codecorps.org>"
assert email.to == user.email
end
end
37 changes: 37 additions & 0 deletions web/controllers/password_controller.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
defmodule CodeCorps.PasswordController do
use CodeCorps.Web, :controller

alias CodeCorps.{Emails, Mailer, User, AuthToken}
alias Ecto.Changeset

@doc"""
forgot_password should take an email and generate an AuthToken model and send an email
"""
def forgot_password(conn, %{"email" => email}) do
with %User{} = user <- Repo.get_by(User, email: email),
%Changeset{valid?: true} <- AuthToken.changeset(%AuthToken{}, user) do

try_create_forgot_password(user)
|> send_forgot_password_email

conn
|> put_status(200)
|> render("show.json", email: user.email)

else
nil ->
conn
|> put_status(200)
|> render("show.json", email: nil)
end
end

defp try_create_forgot_password(user) do
Emails.ForgotPasswordEmail.create(user)
end

defp send_forgot_password_email(email) do
email |> Mailer.deliver_now
end

end
2 changes: 1 addition & 1 deletion web/controllers/password_reset_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ defmodule CodeCorps.PasswordResetController do
"""
def reset_password(conn, %{"token" => token, "password" => password, "password_confirmation" => password_confirmation}) do
user = conn.assigns.current_user
with %AuthToken{value: auth_token} <- Repo.get_by(CodeCorps.AuthToken, %{ value: token, user_id: user.id }),
with %AuthToken{value: auth_token} <- Repo.get_by(AuthToken, %{ value: token, user_id: user.id }),
{:ok, _} <- Phoenix.Token.verify(CodeCorps.Endpoint, "user", auth_token, max_age: 1209600) do
with %Changeset{valid?: true} <- User.reset_password_changeset(user,
%{password: password, password_confirmation: password_confirmation}) do
Expand Down
1 change: 1 addition & 0 deletions web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ defmodule CodeCorps.Router do
resources "/comments", CommentController, only: [:index, :show]
resources "/donation-goals", DonationGoalController, only: [:index, :show]
resources "/organizations", OrganizationController, only: [:index, :show]
post "/password/forgot", PasswordController, :forgot_password
resources "/project-categories", ProjectCategoryController, only: [:index, :show]
resources "/project-skills", ProjectSkillController, only: [:index, :show]
resources "/project-users", ProjectUserController, only: [:index, :show]
Expand Down
10 changes: 10 additions & 0 deletions web/views/password_view.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
defmodule CodeCorps.PasswordView do
use CodeCorps.Web, :view

def render("show.json", %{email: email}) do
%{
email: email
}
end

end

0 comments on commit a265a13

Please sign in to comment.