defmodule MatrixAppService.BridgeConfig do @moduledoc """ The Bridge config. """ defmacro __using__(repo: repo) do quote bind_quoted: [repo: repo] do @repo repo import Ecto.Query, warn: false # alias MatrixAppService.Repo alias MatrixAppService.Bridge.User @doc """ Returns the list of users. ## Examples iex> list_users() [%User{}, ...] """ def list_users do @repo.all(User) end @doc """ Gets a single user. Raises `Ecto.NoResultsError` if the User does not exist. ## Examples iex> get_user!(123) %User{} iex> get_user!(456) ** (Ecto.NoResultsError) """ def get_user!(id), do: @repo.get!(User, id) def get_user_by_local_id(local_id), do: @repo.get_by(User, local_id: local_id) || %User{local_id: local_id} def get_user_by_remote_id(remote_id), do: @repo.get_by(User, remote_id: remote_id) || %User{remote_id: remote_id} @doc """ Creates a user. ## Examples iex> create_user(%{field: value}) {:ok, %User{}} iex> create_user(%{field: bad_value}) {:error, %Ecto.Changeset{}} """ def create_user(attrs \\ %{}) do %User{} |> User.changeset(attrs) |> @repo.insert() end def upsert_user(attrs, selectors) do with %User{} = user <- @repo.get_by(User, selectors) do update_user(user, attrs) else _ -> create_user(Enum.into(selectors, attrs, fn {k, v} -> {to_string(k), v} end)) end end @doc """ Updates a user. ## Examples iex> update_user(user, %{field: new_value}) {:ok, %User{}} iex> update_user(user, %{field: bad_value}) {:error, %Ecto.Changeset{}} """ def update_user(%User{} = user, attrs) do user |> User.changeset(attrs) |> @repo.update() end @doc """ Deletes a user. ## Examples iex> delete_user(user) {:ok, %User{}} iex> delete_user(user) {:error, %Ecto.Changeset{}} """ def delete_user(%User{} = user) do @repo.delete(user) end @doc """ Returns an `%Ecto.Changeset{}` for tracking user changes. ## Examples iex> change_user(user) %Ecto.Changeset{data: %User{}} """ def change_user(%User{} = user, attrs \\ %{}) do User.changeset(user, attrs) end alias MatrixAppService.Bridge.Room @doc """ Returns the list of rooms. ## Examples iex> list_rooms() [%Room{}, ...] """ def list_rooms do @repo.all(Room) end @doc """ Gets a single room. Raises `Ecto.NoResultsError` if the Room does not exist. ## Examples iex> get_room!(123) %Room{} iex> get_room!(456) ** (Ecto.NoResultsError) """ def get_room!(id), do: @repo.get!(Room, id) def get_room_by_local_id(local_id), do: @repo.get_by(Room, local_id: local_id) def get_room_by_remote_id(remote_id), do: @repo.get_by(Room, remote_id: remote_id) @doc """ Creates a room. ## Examples iex> create_room(%{field: value}) {:ok, %Room{}} iex> create_room(%{field: bad_value}) {:error, %Ecto.Changeset{}} """ def create_room(attrs \\ %{}) do %Room{} |> Room.changeset(attrs) |> @repo.insert() end @doc """ Updates a room. ## Examples iex> update_room(room, %{field: new_value}) {:ok, %Room{}} iex> update_room(room, %{field: bad_value}) {:error, %Ecto.Changeset{}} """ def update_room(%Room{} = room, attrs) do room |> Room.changeset(attrs) |> @repo.update() end @doc """ Deletes a room. ## Examples iex> delete_room(room) {:ok, %Room{}} iex> delete_room(room) {:error, %Ecto.Changeset{}} """ def delete_room(%Room{} = room) do @repo.delete(room) end @doc """ Returns an `%Ecto.Changeset{}` for tracking room changes. ## Examples iex> change_room(room) %Ecto.Changeset{data: %Room{}} """ def change_room(%Room{} = room, attrs \\ %{}) do Room.changeset(room, attrs) end end end end