Skip to content

Commit

Permalink
use :ets to store roles list in cache dwyl/auth#110
Browse files Browse the repository at this point in the history
  • Loading branch information
nelsonic committed Sep 14, 2020
1 parent e05a58a commit 7c41353
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 4 deletions.
4 changes: 2 additions & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
language: elixir
elixir:
- 1.10.2
- 1.10.4
otp_release:
- 22.1.8
- 23.0.3
env:
- MIX_ENV=test
script:
Expand Down
16 changes: 15 additions & 1 deletion lib/rbac.ex
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ defmodule RBAC do
end

@doc """
`get_approles/1` fetches the roles for the app
`get_approles/2` fetches the roles for the app
"""
def get_approles(auth_url, client_id) do
url = "#{auth_url}/approles/#{client_id}"
Expand Down Expand Up @@ -69,4 +69,18 @@ defmodule RBAC do
end # https://stackoverflow.com/questions/31990134
end

@doc """
`init_roles/2
"""
def init_roles(auth_url, client_id) do
{:ok, roles} = RBAC.get_approles(auth_url, client_id)
:ets.new(:roles_cache, [:set, :protected, :named_table])
# insert full list:
:ets.insert(:roles_cache, {"roles", roles})
# insert individual roles for fast lookup:
Enum.each(roles, fn role ->
:ets.insert(:roles_cache, {role.name, role})
:ets.insert(:roles_cache, {role.id, role})
end)
end
end
2 changes: 1 addition & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ defmodule Rbac.MixProject do
def project do
[
app: :rbac,
version: "0.3.0",
version: "1.0.0",
elixir: "~> 1.10",
start_permanent: Mix.env() == :prod,
deps: deps(),
Expand Down
17 changes: 17 additions & 0 deletions test/rbac_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -102,4 +102,21 @@ defmodule RBACTest do
assert length(roles) > 7
end

test "init_roles/2 inserts roles list into ETS cache" do
auth_url = "https://dwylauth.herokuapp.com"
client_id = AuthPlug.Token.client_id()
RBAC.init_roles(auth_url, client_id)

# confirm full roles inserted
{_, list} = :ets.lookup(:roles_cache, "roles") |> List.first()
assert length(list) == 9

# lookup role by id:
{_, role} = :ets.lookup(:roles_cache, 1) |> List.first()
assert role.name == "superadmin"

# lookup role by name:
{_, role} = :ets.lookup(:roles_cache, "admin") |> List.first()
assert role.id == 2
end
end

0 comments on commit 7c41353

Please sign in to comment.