diff --git a/lib/real_estate_web/roles.ex b/lib/real_estate_web/roles.ex new file mode 100644 index 0000000..e1b7e2c --- /dev/null +++ b/lib/real_estate_web/roles.ex @@ -0,0 +1,21 @@ +defmodule RealEstateWeb.Roles do + @moduledoc """ + Defines roles related functions. + """ + + alias RealEstate.Accounts.User + alias RealEstate.Properties.Property + + @type entity :: struct() + @type action :: :new | :index | :edit | :show | :delete + @spec can?(%User{}, entity(), action()) :: boolean() + + def can?(user, entity, action) + def can?(%User{role: :admin}, %Property{}, _any), do: true + def can?(%User{}, %Property{}, :index), do: true + def can?(%User{}, %Property{}, :new), do: true + def can?(%User{}, %Property{}, :show), do: true + def can?(%User{id: id}, %Property{user_id: id}, :edit), do: true + def can?(%User{id: id}, %Property{user_id: id}, :delete), do: true + def can?(_, _, _), do: false +end