summaryrefslogblamecommitdiff
path: root/lib/matrix_app_service/bridge_config.ex
blob: 68723c6b9f2a02926d323738dce38b227272ac9d (plain) (tree)
1
2
3
4
5
6




                                          
                                   




































                                                              




                                                                                   









































































































                                                                                        




                                                                                   



































































                                                               
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) || %Room{local_id: local_id}

      def get_room_by_remote_id(remote_id),
        do: @repo.get_by(Room, remote_id: remote_id) || %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