Last active
November 30, 2016 01:16
-
-
Save sillypog/dd74e29337e2dba48c78ceb03f50481d to your computer and use it in GitHub Desktop.
Portmeirion.IdentifyController V3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
defp where_clause(query, params) do | |
# Get just the credentials params from the full params - can I use a struct for that? | |
# Turn that into a key value list | |
# Pass to a where_fragment method that matched on list length | |
# Return fragment of appropriate size | |
allowed_params = ~w(login_id facebook_id device_id prism_id) | |
key_values = params | |
|> Enum.filter(fn({key, _}) -> Enum.member?(allowed_params, key) end) | |
|> Enum.map(fn({key, value}) -> [String.to_existing_atom(key), cast_param(key, value)] end) | |
|> Enum.sort # Ensure device_id is always first if present | |
|> List.flatten | |
where_fragment(query, key_values) | |
end | |
defp where_fragment(query, [:device_id, v1]), do: from [u, d] in query, where: fragment("? = ?", d.device_id, ^v1) | |
defp where_fragment(query, [k1, v1]), do: from u in query, where: fragment("? = ?", field(u, ^k1), ^v1) | |
defp where_fragment(query, [:device_id, v1, k2, v2]) do | |
from [u, d] in query, where: fragment("? = ? OR ? = ?", d.device_id, ^v1, field(u, ^k2), ^v2) | |
end | |
defp where_fragment(query, [k1, v1, k2, v2]) do | |
from u in query, where: fragment("? = ? OR ? = ?", field(u, ^k1), ^v1, field(u, ^k2), ^v2) | |
end | |
defp where_fragment(query, [:device_id, v1, k2, v2, k3, v3]) do | |
from [u, d] in query, where: fragment("? = ? OR ? = ? OR ? = ?", d.device_id, ^v1, field(u, ^k2), ^v2, field(u, ^k3), ^v3) | |
end | |
defp where_fragment(query, [k1, v1, k2, v2, k3, v3]) do | |
from u in query, where: fragment("? = ? OR ? = ? OR ? = ?", field(u, ^k1), ^v1, field(u, ^k2), ^v2, field(u, ^k3), ^v3) | |
end | |
defp where_fragment(query, [:device_id, v1, k2, v2, k3, v3, k4, v4]) do | |
from [u, d] in query, where: fragment("? = ? OR ? = ? OR ? = ? OR ? = ?", d.device_id, ^v1, field(u, ^k2), ^v2, field(u, ^k3), ^v3, field(u, ^k4), ^v4) | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment