Skip to content

Commit

Permalink
Merge branch 'debug'
Browse files Browse the repository at this point in the history
* debug:
  comeonin 1.5
  serialize entities
  more jwt stuff
  some more jwt business
  unconfirm emails etc
  getting there
  first prototype of new Hr.Model system for JWT login
  • Loading branch information
Zen Savona committed Nov 13, 2015
2 parents c229765 + 24473e9 commit 2a5eb1f
Show file tree
Hide file tree
Showing 7 changed files with 316 additions and 203 deletions.
125 changes: 66 additions & 59 deletions lib/hr/jwt_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -13,47 +13,51 @@ defmodule Hr.BaseJWTController do
def create_session(conn, %{"email" => email, "password" => password}) do
{entity, model, repo, app} = Hr.Meta.stuff conn

case Hr.UserHelper.authenticate_with_email_and_password(model, repo, email, password) do
{:ok, user} ->
token = Hr.JWT.create(conn, entity, user)
conn |> render("authenticate.json", token: token)
{:error, _reason} ->
case model.get_with_credentials(email, password) do
nil ->
conn
|> put_status(:unauthorized)
|> render("error.json", errors: ["Invalid credentials"])
user ->
token = Hr.JWT.create(conn, entity, user)
response = %{token: token, entity: user}
conn |> json(response)
end
end

@doc """
Create a new user if the email address isn't already taken.
"""
def create_signup(conn, data) do
def create_signup(conn, params) do
{entity, model, repo, app} = Hr.Meta.stuff conn

params = data[entity]
confirmable? = Enum.member? model.hr_behaviours, :confirmable

if confirmable? do
{changeset, token} = Hr.Model.confirmable_signup_changeset(model.__struct__, params)
else
changeset = Hr.Model.signup_changeset(model.__struct__, params)
end

case repo.insert(changeset) do
{:ok, user} ->
if confirmable? do
link = Hr.Meta.confirmation_url(conn, user.id, token)
Hr.Meta.mailer(app).send_confirmation_email(user, link)
conn
|> render("generic_flash.json", flash: Hr.Meta.i18n(app, "registrations.signed_up_but_unconfirmed", email: user.unconfirmed_email))
else
token = Hr.JWT.create(conn, entity, user)
conn |> render("authenticate.json", token: token)
case model.confirmable? do
true ->
{changeset, token} = model.confirmable_signup_changeset(params)
case model.repo.insert(changeset) do
{:ok, user} ->
user = model.repo.update!(model.unconfirm_email(user))
link = Hr.Meta.jwt_confirmation_url(user.id, token)
Hr.Meta.mailer(app).send_confirmation_email(user, link)
conn |> render("generic_flash.json", flash: Hr.Meta.i18n("registrations.signed_up_but_unconfirmed", email: user.unconfirmed_email))
{:error, changeset} ->
conn
|> put_status(:unprocessable_entity)
|> render("error.json", errors: changeset)
end
_ ->
changeset = model.signup_changeset(params)
case model.repo.insert(changeset) do
{:ok, user} ->
token = Hr.JWT.create(conn, entity, user)
user = user |> model.get_for_me |> model.repo.one
IO.inspect user
json(conn, %{token: token, entity: user})
{:error, changeset} ->
conn
|> put_status(:unprocessable_entity)
|> render("error.json", errors: changeset)
end
{:error, changeset} ->
conn
|> put_status(:unprocessable_entity)
|> render("error.json", errors: changeset)
end
end

Expand All @@ -63,61 +67,64 @@ defmodule Hr.BaseJWTController do
def confirmation(conn, params = %{"id" => user_id, "confirmation_token" => _}) do
{entity, model, repo, app} = Hr.Meta.stuff conn

user = repo.get! model, user_id
changeset = Hr.Model.confirmation_changeset(user, params)

if changeset && changeset.valid? do
repo.update!(changeset)
conn
|> render("generic_flash.json", flash: Hr.Meta.i18n(app, "confirmations.confirmed"))
else
conn
|> put_status(:unprocessable_entity)
|> render("error.json", errors: changeset)
case model.repo.get(model, user_id) do
nil ->
conn
|> put_status(:unprocessable_entity)
|> render("error.json", errors: ["Something went wrong"])
user ->
changeset = model.confirmation_changeset(user, params)
case model.repo.update(changeset) do
{:ok, _} ->
conn
|> render("generic_flash.json", flash: Hr.Meta.i18n("confirmations.confirmed"))
{:error, changeset} ->
conn
|> put_status(:unprocessable_entity)
|> render("error.json", errors: changeset)
end
end
end

@doc """
If the email exists, send a reset link
"""
def create_password_reset_request(conn, %{"reset" => %{"email" => email}}) do
def create_password_reset_request(conn, %{"email" => email}) do
{entity, model, repo, app} = Hr.Meta.stuff conn
user = repo.get_by! model, email: email

case user do
case model.repo.get_by(model, email: email) do
nil ->
nil
user ->
{changeset, token} = Hr.Model.reset_changeset(user)
{changeset, token} = model.reset_changeset(user)
repo.update!(changeset)
link = Hr.Meta.reset_url(conn, user.id, token)
link = Hr.Meta.jwt_reset_url(user.id, token)
Hr.Meta.mailer(app).send_reset_email(user, link)
end
render(conn, "generic_flash.json", flash: Hr.Meta.i18n(app, "passwords.send_instructions"))
render(conn, "generic_flash.json", flash: Hr.Meta.i18n("passwords.send_instructions"))
end

@doc """
Reset the user's password
"""
def create_password_reset(conn, %{"reset" => params}) do
def create_password_reset(conn, params = %{"id" => user_id, "reset_token" => token}) do
{entity, model, repo, app} = Hr.Meta.stuff conn

case Hr.UserHelper.get_with_id_and_token(repo, model, params["id"], params["password_reset_token"]) do
case model.get_with_id_and_token(user_id, token) do
{:ok, user} ->
changeset = Hr.Model.new_password_changeset(user, params)
if changeset.valid? do
repo.update!(changeset)
render(conn, "generic_flash.json", flash: Hr.Meta.i18n(app, "passwords.updated"))
else
conn
|> put_status(:unauthorized)
|> render("error.json", errors: changeset)
# |> put_flash(:error, Hr.Meta.i18n(app, "passwords.invalid"))
changeset = model.new_password_changeset(user, params)
case model.repo.update(changeset) do
{:ok, _} ->
render(conn, "generic_flash.json", flash: Hr.Meta.i18n("passwords.updated"))
{:error, changeset} ->
conn
|> put_status(:unauthorized)
|> render("error.json", errors: changeset)
end
{:error, _} ->
conn
|> put_status(:unauthorized)
|> render("error.json", errors: Hr.Meta.i18n(app, "passwords.no_token"))
|> render("error.json", errors: Hr.Meta.i18n("passwords.no_token"))
end
end

Expand All @@ -126,7 +133,7 @@ defmodule Hr.BaseJWTController do

case Hr.JWT.refresh(conn, token) do
{:ok, fresh} ->
conn |> render("authenticate.json", token: fresh)
render(conn, "authenticate.json", token: fresh)
{:error, error} ->
conn
|> put_status(:unprocessable_entity)
Expand Down
29 changes: 2 additions & 27 deletions lib/hr/jwt_view.ex
Original file line number Diff line number Diff line change
Expand Up @@ -9,33 +9,8 @@ end
defmodule Hr.JWTView do
use Hr.BaseFormView, "priv/templates/html"

@doc """
def render("index.json", %{posts: posts}) do
%{posts: render_many(posts, PeepBlogBackend.PostView, "post.json")}
end
def render("show.json", %{post: post}) do
%{post: render_one(post, PeepBlogBackend.PostView, "post.json")}
end
defmodule PeepBlogBackend.ChangesetView do
use PeepBlogBackend.Web, :view
def render("error.json", %{changeset: changeset}) do
# When encoded, the changeset returns its errors
# as a JSON object. So we just pass it forward.
%{errors: changeset}
end
end
"""


def render("authenticate.json", %{token: token}) do
%{token: token}
def render("authenticate.json", map) do
map
end

def render("generic_flash.json", %{flash: message}) do
Expand Down
Loading

0 comments on commit 2a5eb1f

Please sign in to comment.