From ffebff516e4f182c3f04e55e15748ee95e121792 Mon Sep 17 00:00:00 2001 From: nelsonic Date: Mon, 14 Sep 2020 08:57:58 +0100 Subject: [PATCH] mix format --- lib/rbac.ex | 38 ++++++++++++++++++++++---------------- test/rbac_test.exs | 26 ++++++++++++++++---------- test/test_helper.exs | 2 +- 3 files changed, 39 insertions(+), 27 deletions(-) diff --git a/lib/rbac.ex b/lib/rbac.ex index 2d1bd0b..be4c46b 100644 --- a/lib/rbac.ex +++ b/lib/rbac.ex @@ -44,6 +44,7 @@ defmodule RBAC do def get_approles(auth_url, client_id) do url = "#{auth_url}/approles/#{client_id}" HTTPoison.start() + HTTPoison.get(url) |> parse_body_response() end @@ -52,21 +53,27 @@ defmodule RBAC do `parse_body_response/1` parses the response so your app can use the resulting JSON (list of roles). """ - @spec parse_body_response({atom, String.t}) :: String.t + @spec parse_body_response({atom, String.t()}) :: String.t() def parse_body_response({:error, err}), do: {:error, err} + def parse_body_response({:ok, response}) do body = Map.get(response, :body) # IO.inspect(body) + # make keys of map atoms for easier access in templates if body == nil do {:error, :no_body} - else # make keys of map atoms for easier access in templates + else {:ok, str_key_map} = Jason.decode(body) - atom_key_map = Enum.map(str_key_map, fn role -> - for {key, val} <- role, into: %{}, - do: {String.to_atom(key), val} - end) + + atom_key_map = + Enum.map(str_key_map, fn role -> + for {key, val} <- role, into: %{}, do: {String.to_atom(key), val} + end) + {:ok, atom_key_map} - end # https://stackoverflow.com/questions/31990134 + end + + # https://stackoverflow.com/questions/31990134 end @doc """ @@ -83,7 +90,7 @@ defmodule RBAC do # insert full list: :ets.insert(:roles_cache, {"roles", roles}) # insert individual roles for fast lookup: - Enum.each(roles, fn role -> + Enum.each(roles, fn role -> :ets.insert(:roles_cache, {role.name, role}) :ets.insert(:roles_cache, {role.id, role}) end) @@ -94,8 +101,9 @@ defmodule RBAC do """ def get_role_from_cache(term) do case :ets.lookup(:roles_cache, term) do - # not found + # not found: [] -> %{id: 0} + # extract role: [{_term, role}] -> role end end @@ -104,15 +112,13 @@ defmodule RBAC do `has_role/2 confirms if the person has the given role """ def has_role(conn, role_name) do - # IO.inspect(conn, label: "conn") - # IO.inspect(role_name, label: "role_name") role = get_role_from_cache(role_name) - # IO.inspect(role) - person_roles = - String.split(conn.assigns.person.roles, ",", trim: true) - |> Enum.map(&String.to_integer/1) - # IO.inspect(person_roles, label: "person_roles") + person_roles = + conn.assigns.person.roles + |> String.split(",", trim: true) + |> Enum.map(&String.to_integer/1) + Enum.member?(person_roles, role.id) end end diff --git a/test/rbac_test.exs b/test/rbac_test.exs index 28dc153..8a73fe3 100644 --- a/test/rbac_test.exs +++ b/test/rbac_test.exs @@ -73,15 +73,17 @@ defmodule RBACTest do end test "transform_role_list_to_string/1" do - roles = [%{ - __meta__: "#Ecto.Schema.Metadata<:loaded", - desc: "Subscribes for updates e.g. newsletter", - id: 6, - inserted_at: ~N[2020-08-21 16:40:22], - name: "subscriber", - person_id: 1, - updated_at: ~N[2020-08-21 16:40:22] - }] + roles = [ + %{ + __meta__: "#Ecto.Schema.Metadata<:loaded", + desc: "Subscribes for updates e.g. newsletter", + id: 6, + inserted_at: ~N[2020-08-21 16:40:22], + name: "subscriber", + person_id: 1, + updated_at: ~N[2020-08-21 16:40:22] + } + ] assert RBAC.transform_role_list_to_string(roles) == "6" end @@ -98,7 +100,7 @@ defmodule RBACTest do client_id = AuthPlug.Token.client_id() RBAC.init_roles(auth_url, client_id) - # confirm full roles inserted + #  confirm full roles inserted {_, list} = :ets.lookup(:roles_cache, "roles") |> List.first() assert length(list) == 9 @@ -127,6 +129,7 @@ defmodule RBACTest do test "RBAC.has_role/1 returns boolean true/false" do init() + fake_conn = %{ assigns: %{ person: %{ @@ -134,11 +137,13 @@ defmodule RBACTest do } } } + assert RBAC.has_role(fake_conn, "superadmin") end test "RBAC.has_role/1 returns false when doesn't have role" do init() + fake_conn = %{ assigns: %{ person: %{ @@ -146,6 +151,7 @@ defmodule RBACTest do } } } + assert not RBAC.has_role(fake_conn, "non_existent_role") end end diff --git a/test/test_helper.exs b/test/test_helper.exs index e89e5ff..869559e 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -1 +1 @@ -ExUnit.start() \ No newline at end of file +ExUnit.start()