🛡 Terminator 🛡

Coverage Status Build Status Version

Terminator is toolkit for granular ability management for performers

WIP: NOT INTENDED FOR PRODUCTION USE

Installation

def deps do
  [
    {:terminator, "~> 0.1.5"}
  ]
end
# In your config/config.exs file
config :terminator, Terminator.Repo,
  username: "postgres",
  password: "postgres",
  database: "terminator_dev",
  hostname: "localhost"

Granting abilities

Let's assume we want to create new Role - admin which is able to delete accounts inside our system. We want to have special Performer who is given this role but also he is able to have Ability for banning users.

  1. Create performer
iex> {:ok, performer} = %Terminator.Performer{} |> Terminator.Repo.insert()
  1. Create some abilities
iex> {:ok, ability_delete} = Terminator.Ability.build("delete_accounts", "Delete accounts of users") |> Terminator.Repo.insert()
iex> {:ok, ability_ban} = Terminator.Ability.build("ban_accounts", "Ban users") |> Terminator.Repo.insert()
  1. Create role
iex> {:ok, role} = Terminator.Role.build("admin", [], "Site administrator") |> Terminator.Repo.insert()
  1. Grant abilities to a role
iex> Terminator.Role.grant(role, ability_delete)
  1. Grant role to a performer
iex> Terminator.Performer.grant(performer, role)
  1. Grant abilities to a performer
iex> Terminator.Performer.grant(performer, ability_ban)
iex> performer |> Terminator.Repo.preload([:roles, :abilities])
%Terminator.Performer{
  abilities: [
    %Terminator.Ability{
      identifier: "ban_accounts"
    }
  ]
  roles: [
    %Terminator.Role{
      identifier: "admin"
      abilities: ["delete_accounts"]
    }
  ]
}

Revoking abilities

Same as we can grant any abilities to models we can also revoke them.

iex> Terminator.Performer.revoke(performer, role)
iex> performer |> Terminator.Repo.preload([:roles, :abilities])
%Terminator.Performer{
  abilities: [
    %Terminator.Ability{
      identifier: "ban_accounts"
    }
  ]
  roles: []
}
iex> Terminator.Performer.revoke(performer, ability_ban)
iex> performer |> Terminator.Repo.preload([:roles, :abilities])
%Terminator.Performer{
  abilities: []
  roles: []
}

License

MIT © Milos Mosovsky