defmodule Philomena.Forums do @moduledoc """ The Forums context. """ import Ecto.Query, warn: false alias Philomena.Repo alias Philomena.Forums.Forum alias Philomena.Forums.Subscription alias Philomena.Notifications @doc """ Returns the list of forums. ## Examples iex> list_forums() [%Forum{}, ...] """ def list_forums do Repo.all(Forum) end @doc """ Gets a single forum. Raises `Ecto.NoResultsError` if the Forum does not exist. ## Examples iex> get_forum!(123) %Forum{} iex> get_forum!(456) ** (Ecto.NoResultsError) """ def get_forum!(id), do: Repo.get!(Forum, id) @doc """ Creates a forum. ## Examples iex> create_forum(%{field: value}) {:ok, %Forum{}} iex> create_forum(%{field: bad_value}) {:error, %Ecto.Changeset{}} """ def create_forum(attrs \\ %{}) do %Forum{} |> Forum.changeset(attrs) |> Repo.insert() end @doc """ Updates a forum. ## Examples iex> update_forum(forum, %{field: new_value}) {:ok, %Forum{}} iex> update_forum(forum, %{field: bad_value}) {:error, %Ecto.Changeset{}} """ def update_forum(%Forum{} = forum, attrs) do forum |> Forum.changeset(attrs) |> Repo.update() end @doc """ Deletes a Forum. ## Examples iex> delete_forum(forum) {:ok, %Forum{}} iex> delete_forum(forum) {:error, %Ecto.Changeset{}} """ def delete_forum(%Forum{} = forum) do Repo.delete(forum) end @doc """ Returns an `%Ecto.Changeset{}` for tracking forum changes. ## Examples iex> change_forum(forum) %Ecto.Changeset{source: %Forum{}} """ def change_forum(%Forum{} = forum) do Forum.changeset(forum, %{}) end def subscribed?(_forum, nil), do: false def subscribed?(forum, user) do Subscription |> where(forum_id: ^forum.id, user_id: ^user.id) |> Repo.exists?() end def create_subscription(_forum, nil), do: {:ok, nil} def create_subscription(forum, user) do %Subscription{forum_id: forum.id, user_id: user.id} |> Subscription.changeset(%{}) |> Repo.insert(on_conflict: :nothing) end @doc """ Deletes a Subscription. ## Examples iex> delete_subscription(subscription) {:ok, %Subscription{}} iex> delete_subscription(subscription) {:error, %Ecto.Changeset{}} """ def delete_subscription(forum, user) do clear_notification(forum, user) %Subscription{forum_id: forum.id, user_id: user.id} |> Repo.delete() end def clear_notification(_forum, nil), do: nil def clear_notification(forum, user) do Notifications.delete_unread_notification("Forum", forum.id, user) end end