lib/openagents_web/controllers/issue_assignee_controller.ex

main at 58e6347eeb72 · 2 KB

defmodule OpenAgentsWeb.IssueAssigneeController do
  use OpenAgentsWeb, :controller

  alias OpenAgents.Issues
  alias OpenAgents.Repositories
  alias OpenAgentsWeb.ApiError

  def index(conn, %{"owner" => owner, "repo" => repo, "issue_number" => issue_number}) do
    repository = Repositories.get_visible_by_path!(owner, repo, conn.assigns[:current_user])

    issue =
      Issues.get_issue_by_number!(
        repository,
        OpenAgentsWeb.ControllerHelpers.integer_param!(issue_number)
      )

    json(conn, %{assignees: issue.assignees || []})
  rescue
    Ecto.NoResultsError -> ApiError.not_found(conn)
  end

  def create(
        conn,
        %{
          "owner" => owner,
          "repo" => repo,
          "issue_number" => issue_number
        } = params
      ) do
    repository = Repositories.get_writable_by_path!(owner, repo, conn.assigns.current_user)

    issue =
      Issues.get_issue_by_number!(
        repository,
        OpenAgentsWeb.ControllerHelpers.integer_param!(issue_number)
      )

    logins = params["assignees"] || []

    case Issues.add_assignees(issue, logins, conn.assigns.current_user) do
      {:ok, %Issues.Issue{} = issue} ->
        json(conn, %{assignees: issue.assignees})

      {:error, %Ecto.Changeset{} = changeset} ->
        ApiError.changeset(conn, changeset)
    end
  rescue
    Ecto.NoResultsError -> ApiError.not_found(conn)
  end

  def delete(
        conn,
        %{
          "owner" => owner,
          "repo" => repo,
          "issue_number" => issue_number
        } = params
      ) do
    repository = Repositories.get_writable_by_path!(owner, repo, conn.assigns.current_user)

    issue =
      Issues.get_issue_by_number!(
        repository,
        OpenAgentsWeb.ControllerHelpers.integer_param!(issue_number)
      )

    logins = params["assignees"] || []

    case Issues.remove_assignees(issue, logins, conn.assigns.current_user) do
      {:ok, %Issues.Issue{} = issue} ->
        json(conn, %{assignees: issue.assignees})

      {:error, _reason} ->
        ApiError.refuse(conn, "delete_failed", message: "Could not remove assignees")
    end
  rescue
    Ecto.NoResultsError -> ApiError.not_found(conn)
  end
end