lib/openagents/project_items.ex

58e6347eeb72 · 2 KB

defmodule OpenAgents.ProjectItems do
  @moduledoc """
  The ProjectItems context.
  """

  import Ecto.Query, warn: false
  alias OpenAgents.Repo

  alias OpenAgents.ProjectItems.ProjectItem
  alias OpenAgents.Projects.Project
  alias OpenAgents.Repositories.Repository

  @doc """
  Returns the list of project_items.

  ## Examples

      iex> list_project_items()
      [%ProjectItem{}, ...]

  """
  def list_project_items(%Repository{id: repository_id}) do
    Repo.all(from item in ProjectItem, where: item.repository_id == ^repository_id)
  end

  @doc """
  Gets a single project_item.

  Raises `Ecto.NoResultsError` if the Project item does not exist.

  ## Examples

      iex> get_project_item!(123)
      %ProjectItem{}

      iex> get_project_item!(456)
      ** (Ecto.NoResultsError)

  """
  def get_project_item!(%Repository{id: repository_id}, id) do
    Repo.get_by!(ProjectItem, id: id, repository_id: repository_id)
  end

  @doc """
  Creates a project_item.

  ## Examples

      iex> create_project_item(%{field: value})
      {:ok, %ProjectItem{}}

      iex> create_project_item(%{field: bad_value})
      {:error, %Ecto.Changeset{}}

  """
  def create_project_item(%Repository{} = repository, attrs) do
    attrs = for {key, value} <- attrs, into: %{}, do: {to_string(key), value}
    repository_id = repository_id_for(repository, Map.get(attrs, "project_id"))

    %ProjectItem{}
    |> ProjectItem.changeset(
      attrs
      |> Map.put("repository_id", repository_id)
      |> Map.put_new("issue_repository_id", repository.id)
    )
    |> Repo.insert()
  end

  @doc """
  Updates a project_item.

  ## Examples

      iex> update_project_item(project_item, %{field: new_value})
      {:ok, %ProjectItem{}}

      iex> update_project_item(project_item, %{field: bad_value})
      {:error, %Ecto.Changeset{}}

  """
  def update_project_item(%ProjectItem{} = project_item, attrs) do
    project_item
    |> ProjectItem.changeset(attrs)
    |> Repo.update()
  end

  @doc """
  Deletes a project_item.

  ## Examples

      iex> delete_project_item(project_item)
      {:ok, %ProjectItem{}}

      iex> delete_project_item(project_item)
      {:error, %Ecto.Changeset{}}

  """
  def delete_project_item(%ProjectItem{} = project_item) do
    Repo.delete(project_item)
  end

  @doc """
  Returns an `%Ecto.Changeset{}` for tracking project_item changes.

  ## Examples

      iex> change_project_item(project_item)
      %Ecto.Changeset{data: %ProjectItem{}}

  """
  def change_project_item(%ProjectItem{} = project_item, attrs \\ %{}) do
    ProjectItem.changeset(project_item, attrs)
  end

  defp repository_id_for(%Repository{id: repository_id}, nil), do: repository_id

  defp repository_id_for(%Repository{id: repository_id}, project_id) do
    case Repo.get_by(Project, id: project_id, repository_id: repository_id) do
      %Project{repository_id: repository_id} -> repository_id
      nil -> repository_id
    end
  end
end