From 089bf0d9b99a222b1bff55cff157c9230194b55d Mon Sep 17 00:00:00 2001 From: Ryan Linton Date: Thu, 8 Jun 2017 22:15:10 -0700 Subject: [PATCH 1/2] Add alternate_unique_identifiers to config and include in query --- lib/addict/configs.ex | 3 ++- lib/addict/interactors/get_user_by_email.ex | 16 +++++++++++++++- lib/addict/interactors/login.ex | 5 ++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/lib/addict/configs.ex b/lib/addict/configs.ex index e5d9695..9bbbce2 100644 --- a/lib/addict/configs.ex +++ b/lib/addict/configs.ex @@ -20,7 +20,8 @@ defmodule Addict.Configs do :email_reset_password_template, :reset_password_path, :repo, - :password_reset_token_time_to_expiry + :password_reset_token_time_to_expiry, + :alternate_unique_identifiers ] |> Enum.each(fn key -> def unquote(key)() do Application.get_env(:addict, unquote(key)) diff --git a/lib/addict/interactors/get_user_by_email.ex b/lib/addict/interactors/get_user_by_email.ex index 6ba7b3b..7a54d60 100644 --- a/lib/addict/interactors/get_user_by_email.ex +++ b/lib/addict/interactors/get_user_by_email.ex @@ -4,7 +4,21 @@ defmodule Addict.Interactors.GetUserByEmail do Returns `{:ok, user}` or `{:error, [authentication: "Incorrect e-mail/password"]}` """ def call(email, schema \\ Addict.Configs.user_schema, repo \\ Addict.Configs.repo) do - repo.get_by(schema, email: email) |> process_response + ids = Addict.Configs.alternate_unique_identifiers + + if ids && !Enum.empty?(ids) do + query = Enum.reduce(ids, schema, fn key, user -> + from u in user, or_where: field(u, ^key) == ^email + end) + + query + |> repo.one + |> process_response + else + schema + |> repo.get_by(email: email) + |> process_response + end end defp process_response(nil) do diff --git a/lib/addict/interactors/login.ex b/lib/addict/interactors/login.ex index c27ea5a..88ab71e 100644 --- a/lib/addict/interactors/login.ex +++ b/lib/addict/interactors/login.ex @@ -1,5 +1,8 @@ defmodule Addict.Interactors.Login do - alias Addict.Interactors.{GetUserByEmail, VerifyPassword} + alias Addict.Interactors.{ + GetUserByEmail, + VerifyPassword + } @doc """ Verifies if the `password` is correct for the provided `email` From 3ab6661def090ecf1928b5d364ba183f302358f6 Mon Sep 17 00:00:00 2001 From: Ryan Linton Date: Fri, 9 Jun 2017 11:09:17 -0700 Subject: [PATCH 2/2] Support alternate unique identifiers --- lib/addict/interactors/get_user_by_email.ex | 8 +++-- mix.exs | 4 +-- mix.lock | 36 ++++++++++----------- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/lib/addict/interactors/get_user_by_email.ex b/lib/addict/interactors/get_user_by_email.ex index 7a54d60..c5e6a81 100644 --- a/lib/addict/interactors/get_user_by_email.ex +++ b/lib/addict/interactors/get_user_by_email.ex @@ -1,13 +1,15 @@ defmodule Addict.Interactors.GetUserByEmail do + import Ecto.Query, only: [from: 2] + @doc """ Gets user by e-mail. Returns `{:ok, user}` or `{:error, [authentication: "Incorrect e-mail/password"]}` """ def call(email, schema \\ Addict.Configs.user_schema, repo \\ Addict.Configs.repo) do - ids = Addict.Configs.alternate_unique_identifiers + alt_ids = Addict.Configs.alternate_unique_identifiers - if ids && !Enum.empty?(ids) do - query = Enum.reduce(ids, schema, fn key, user -> + if alt_ids && !Enum.empty?(alt_ids) do + query = Enum.reduce(alt_ids ++ [:email], schema, fn key, user -> from u in user, or_where: field(u, ^key) == ^email end) diff --git a/mix.exs b/mix.exs index a186975..0cee266 100644 --- a/mix.exs +++ b/mix.exs @@ -26,9 +26,9 @@ defmodule Addict.Mixfile do defp deps do [{:cowboy, "~> 1.0"}, {:phoenix, "~> 1.1"}, - {:ecto, "~> 2.0"}, + {:ecto, "~> 2.1"}, {:comeonin, "~> 2.1" }, - {:mailgun, "~> 0.1"}, + {:mailgun, github: "chrismccord/mailgun"}, {:mock, "~> 0.1.3", only: :test}, {:postgrex, "~> 0.11", only: :test}, {:earmark, "~> 0.2", only: :dev}, diff --git a/mix.lock b/mix.lock index 6e6c058..4e2924d 100644 --- a/mix.lock +++ b/mix.lock @@ -1,20 +1,20 @@ -%{"comeonin": {:hex, :comeonin, "2.1.1", "6187c3764e98c3a963650f64cef067e01daed2f2de4177f666f60b50c14e9981", [:mix, :make, :make], []}, - "connection": {:hex, :connection, "1.0.3", "3145f7416be3df248a4935f24e3221dc467c1e3a158d62015b35bd54da365786", [:mix], []}, - "cowboy": {:hex, :cowboy, "1.0.4", "a324a8df9f2316c833a470d918aaf73ae894278b8aa6226ce7a9bf699388f878", [:rebar, :make], [{:cowlib, "~> 1.0.0", [hex: :cowlib, optional: false]}, {:ranch, "~> 1.0", [hex: :ranch, optional: false]}]}, - "cowlib": {:hex, :cowlib, "1.0.2", "9d769a1d062c9c3ac753096f868ca121e2730b9a377de23dec0f7e08b1df84ee", [:make], []}, - "db_connection": {:hex, :db_connection, "1.0.0-rc.3", "d9ceb670fe300271140af46d357b669983cd16bc0d01206d7d3222dde56cf038", [:mix], [{:sbroker, "~> 1.0.0-beta.3", [hex: :sbroker, optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, optional: true]}, {:connection, "~> 1.0.2", [hex: :connection, optional: false]}]}, - "decimal": {:hex, :decimal, "1.1.2", "79a769d4657b2d537b51ef3c02d29ab7141d2b486b516c109642d453ee08e00c", [:mix], []}, - "earmark": {:hex, :earmark, "0.2.1", "ba6d26ceb16106d069b289df66751734802777a3cbb6787026dd800ffeb850f3", [:mix], []}, - "ecto": {:hex, :ecto, "2.0.2", "b02331c1f20bbe944dbd33c8ecd8f1ccffecc02e344c4471a891baf3a25f5406", [:mix], [{:poison, "~> 1.5 or ~> 2.0", [hex: :poison, optional: true]}, {:sbroker, "~> 1.0-beta", [hex: :sbroker, optional: true]}, {:mariaex, "~> 0.7.7", [hex: :mariaex, optional: true]}, {:postgrex, "~> 0.11.2", [hex: :postgrex, optional: true]}, {:db_connection, "~> 1.0-rc.2", [hex: :db_connection, optional: true]}, {:decimal, "~> 1.0", [hex: :decimal, optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, optional: false]}]}, +%{"comeonin": {:hex, :comeonin, "2.1.1", "6187c3764e98c3a963650f64cef067e01daed2f2de4177f666f60b50c14e9981", [:make, :mix], [], "hexpm"}, + "connection": {:hex, :connection, "1.0.4", "a1cae72211f0eef17705aaededacac3eb30e6625b04a6117c1b2db6ace7d5976", [:mix], [], "hexpm"}, + "cowboy": {:hex, :cowboy, "1.0.4", "a324a8df9f2316c833a470d918aaf73ae894278b8aa6226ce7a9bf699388f878", [:make, :rebar], [{:cowlib, "~> 1.0.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm"}, + "cowlib": {:hex, :cowlib, "1.0.2", "9d769a1d062c9c3ac753096f868ca121e2730b9a377de23dec0f7e08b1df84ee", [:make], [], "hexpm"}, + "db_connection": {:hex, :db_connection, "1.1.2", "2865c2a4bae0714e2213a0ce60a1b12d76a6efba0c51fbda59c9ab8d1accc7a8", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"}, + "decimal": {:hex, :decimal, "1.3.1", "157b3cedb2bfcb5359372a7766dd7a41091ad34578296e951f58a946fcab49c6", [:mix], [], "hexpm"}, + "earmark": {:hex, :earmark, "0.2.1", "ba6d26ceb16106d069b289df66751734802777a3cbb6787026dd800ffeb850f3", [:mix], [], "hexpm"}, + "ecto": {:hex, :ecto, "2.1.4", "d1ba932813ec0e0d9db481ef2c17777f1cefb11fc90fa7c142ff354972dfba7e", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"}, "ecto_fixtures": {:hex, :ecto_fixtures, "0.0.2"}, - "ex_doc": {:hex, :ex_doc, "0.11.4", "a064bdb720594c3745b94709b17ffb834fd858b4e0c1f48f37c0d92700759e02", [:mix], [{:earmark, "~> 0.1.17 or ~> 0.2", [hex: :earmark, optional: true]}]}, - "mailgun": {:hex, :mailgun, "0.1.2", "37c1306675cf27a66a13dea3c9d479da2a990f0aed296b5addbd0b07529b667d", [:mix], [{:poison, "~> 1.4", [hex: :poison, optional: false]}]}, - "meck": {:hex, :meck, "0.8.4", "59ca1cd971372aa223138efcf9b29475bde299e1953046a0c727184790ab1520", [:rebar, :make], []}, - "mock": {:hex, :mock, "0.1.3", "657937b03f88fce89b3f7d6becc9f1ec1ac19c71081aeb32117db9bc4d9b3980", [:mix], [{:meck, "~> 0.8.2", [hex: :meck, optional: false]}]}, - "phoenix": {:hex, :phoenix, "1.1.4", "65809fba92eb94377372a5fb5a561197654bb8406e773cc47ca1a031bbe58019", [:mix], [{:poison, "~> 1.5 or ~> 2.0", [hex: :poison, optional: false]}, {:plug, "~> 1.0", [hex: :plug, optional: false]}, {:cowboy, "~> 1.0", [hex: :cowboy, optional: true]}]}, - "plug": {:hex, :plug, "1.1.2", "7ed5cdc0245a56fcc9ad905c059dd2314cea9d043e6d0b8fd99b4845a3e220d5", [:mix], [{:cowboy, "~> 1.0", [hex: :cowboy, optional: true]}]}, - "poison": {:hex, :poison, "1.5.2", "560bdfb7449e3ddd23a096929fb9fc2122f709bcc758b2d5d5a5c7d0ea848910", [:mix], []}, - "poolboy": {:hex, :poolboy, "1.5.1", "6b46163901cfd0a1b43d692657ed9d7e599853b3b21b95ae5ae0a777cf9b6ca8", [:rebar], []}, - "postgrex": {:hex, :postgrex, "0.11.2", "139755c1359d3c5c6d6e8b1ea72556d39e2746f61c6ddfb442813c91f53487e8", [:mix], [{:connection, "~> 1.0", [hex: :connection, optional: false]}, {:db_connection, "~> 1.0-rc", [hex: :db_connection, optional: false]}, {:decimal, "~> 1.0", [hex: :decimal, optional: false]}]}, - "ranch": {:hex, :ranch, "1.2.1", "a6fb992c10f2187b46ffd17ce398ddf8a54f691b81768f9ef5f461ea7e28c762", [:make], []}, + "ex_doc": {:hex, :ex_doc, "0.11.4", "a064bdb720594c3745b94709b17ffb834fd858b4e0c1f48f37c0d92700759e02", [:mix], [{:earmark, "~> 0.1.17 or ~> 0.2", [hex: :earmark, repo: "hexpm", optional: true]}], "hexpm"}, + "mailgun": {:git, "https://github.com/chrismccord/mailgun.git", "ace116f37a86b3b11cecad6f37c4599f4552452b", []}, + "meck": {:hex, :meck, "0.8.4", "59ca1cd971372aa223138efcf9b29475bde299e1953046a0c727184790ab1520", [:make, :rebar], [], "hexpm"}, + "mock": {:hex, :mock, "0.1.3", "657937b03f88fce89b3f7d6becc9f1ec1ac19c71081aeb32117db9bc4d9b3980", [:mix], [{:meck, "~> 0.8.2", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm"}, + "phoenix": {:hex, :phoenix, "1.1.4", "65809fba92eb94377372a5fb5a561197654bb8406e773cc47ca1a031bbe58019", [:mix], [{:cowboy, "~> 1.0", [hex: :cowboy, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}, {:poison, "~> 1.5 or ~> 2.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm"}, + "plug": {:hex, :plug, "1.1.2", "7ed5cdc0245a56fcc9ad905c059dd2314cea9d043e6d0b8fd99b4845a3e220d5", [:mix], [{:cowboy, "~> 1.0", [hex: :cowboy, repo: "hexpm", optional: true]}], "hexpm"}, + "poison": {:hex, :poison, "2.2.0", "4763b69a8a77bd77d26f477d196428b741261a761257ff1cf92753a0d4d24a63", [:mix], [], "hexpm"}, + "poolboy": {:hex, :poolboy, "1.5.1", "6b46163901cfd0a1b43d692657ed9d7e599853b3b21b95ae5ae0a777cf9b6ca8", [:rebar], [], "hexpm"}, + "postgrex": {:hex, :postgrex, "0.13.3", "c277cfb2a9c5034d445a722494c13359e361d344ef6f25d604c2353185682bfc", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm"}, + "ranch": {:hex, :ranch, "1.2.1", "a6fb992c10f2187b46ffd17ce398ddf8a54f691b81768f9ef5f461ea7e28c762", [:make], [], "hexpm"}, "uuid": {:hex, :uuid, "1.1.3"}}