lib/sql_membership_provider/role.ex

defmodule SqlMembershipProvider.Role do
  @moduledoc """
  Struct for representing a security role that a user may assume
  """

  use TypedEctoSchema
  import Ecto.Query, only: [from: 2]

  @primary_key {:role_id, :binary_id, autogenerate: true, null: false}
  @field_source_mapper fn name -> name |> Atom.to_string() |> Macro.camelize() end

  typed_schema "aspnet_Roles" do
    field(:application_id, :binary_id, null: false)
    field(:role_name, :string, null: false)
    field(:lowered_role_name, :string, null: false)
    field(:description, :string)

    many_to_many(:users, SqlMembershipProvider.User,
      join_keys: [RoleId: :role_id, UserId: :user_id],
      join_through: "aspnet_UsersInRoles"
    )
  end

  @doc """
  Fetch all roles that a user belongs to.
  """
  @spec find_by_user_id(String.t()) :: Ecto.Query.t()
  def find_by_user_id(user_id) when is_binary(user_id) do
    from(r in SqlMembershipProvider.Role,
      join: u in assoc(r, :users),
      where: u.user_id == ^user_id
    )
  end
end