Skip to content

Instantly share code, notes, and snippets.

@sillypog
Created November 29, 2016 23:45
Show Gist options
  • Save sillypog/ab878f68fb29fad594f02642ea3a2f94 to your computer and use it in GitHub Desktop.
Save sillypog/ab878f68fb29fad594f02642ea3a2f94 to your computer and use it in GitHub Desktop.
Portmeirion.IdentifyController V4
defp find_user(params) do
if params["login_id"] || params["device_id"] || params["prism_id"] do
query = Portmeirion.User.find_query(params)
{:ok, result} = Ecto.Adapters.SQL.query(Repo, query, [])
row = List.first(result.rows)
if row do
id = row
|> List.first
|> Base.encode16
|> String.downcase
|> Portmeirion.Formats.uuid_hyphenate
struct(Portmeirion.User, [warehouse_id: id])
else
nil
end
else
nil
end
end
def find_query(params) do
query = "SELECT warehouse_id FROM users AS u"
query
|> join_device_clause(params)
|> where_clause(params)
|> order_clause(params)
end
defp join_device_clause(query, %{"device_id" => _device_id}) do
query <> " FULL JOIN devices AS d ON d.user_id = u.id"
end
defp join_device_clause(query, _) do
query
end
defp order_clause(query, %{"device_id" => _device_id}) do
query <> " ORDER BY u.login_id, u.facebook_id, d.device_id, u.prism_id"
end
defp order_clause(query, _) do
query <> " ORDER BY u.login_id, u.facebook_id, u.prism_id"
end
defp where_clause(query, params) do
clause = params
|> Map.take(["login_id", "facebook_id", "device_id", "prism_id"])
|> Enum.map_join(" OR ", fn{key, value} -> "#{key} = '#{value}'" end)
query <> " WHERE " <> clause
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment