defmodule DaProductApp.Accounts do @moduledoc """ Accounts context: users, organizations, roles. """ import Ecto.Query, warn: false alias DaProductApp.Repo alias DaProductApp.Accounts.{User, Organization, Role} # Organizations def list_organizations do Repo.all(Organization) end def get_organization!(id), do: Repo.get!(Organization, id) def create_organization(attrs \\ %{}) do %Organization{} |> Organization.changeset(attrs) |> Repo.insert() end def update_organization(%Organization{} = organization, attrs) do organization |> Organization.changeset(attrs) |> Repo.update() end def delete_organization(%Organization{} = organization), do: Repo.delete(organization) def change_organization(%Organization{} = organization, attrs \\ %{}) do Organization.changeset(organization, attrs) end # Roles def list_roles do Repo.all(Role) end def get_role!(id), do: Repo.get!(Role, id) def create_role(attrs \\ %{}) do %Role{} |> Role.changeset(attrs) |> Repo.insert() end # Users def list_users do Repo.all(User) |> Repo.preload([:organization, :role]) end def get_user!(id), do: Repo.get!(User, id) |> Repo.preload([:organization, :role]) def get_user_by_email(email) when is_binary(email) do Repo.get_by(User, email: email) |> Repo.preload([:organization, :role]) end def create_user(attrs \\ %{}) do %User{} |> User.changeset(attrs) |> Repo.insert() end def update_user(%User{} = user, attrs) do user |> User.changeset(attrs) |> Repo.update() end def delete_user(%User{} = user), do: Repo.delete(user) def change_user(%User{} = user, attrs \\ %{}) do User.changeset(user, attrs) end def assign_role(%User{} = user, %Role{} = role) do update_user(user, %{role_id: role.id}) end end