lib/openagents_web/controllers/label_controller.ex

main at 58e6347eeb72 · 2 KB

defmodule OpenAgentsWeb.LabelController do
  use OpenAgentsWeb, :controller

  alias OpenAgents.Labels
  alias OpenAgents.Labels.Label
  alias OpenAgents.Repositories
  alias OpenAgentsWeb.ApiError

  def index(conn, %{"owner" => owner, "repo" => repo}) do
    repository = Repositories.get_visible_by_path!(owner, repo, conn.assigns[:current_user])
    labels = Labels.list_labels(repository)
    render(conn, :index, labels: labels, owner: owner, repo: repo)
  rescue
    Ecto.NoResultsError -> not_found(conn)
  end

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

    case Labels.create_label(repository, params, conn.assigns.current_user) do
      {:ok, %Label{} = label} ->
        conn
        |> put_status(:created)
        |> render(:show, label: label, owner: owner, repo: repo)

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

  def show(conn, %{"owner" => owner, "repo" => repo, "name" => name}) do
    repository = Repositories.get_visible_by_path!(owner, repo, conn.assigns[:current_user])
    label = Labels.get_label_by_name!(repository, name)
    render(conn, :show, label: label, owner: owner, repo: repo)
  rescue
    Ecto.NoResultsError -> ApiError.not_found(conn)
  end

  def update(conn, %{"owner" => owner, "repo" => repo, "name" => name} = params) do
    repository = Repositories.get_writable_by_path!(owner, repo, conn.assigns.current_user)
    label = Labels.get_label_by_name!(repository, name)

    # GitHub renames through `new_name`; without this the path's name always
    # won and the rename was silently dropped.
    attrs =
      case params["new_name"] do
        nil -> params
        new_name -> Map.put(params, "name", new_name)
      end

    case Labels.update_label(label, attrs) do
      {:ok, %Label{} = label} ->
        render(conn, :show, label: label, owner: owner, repo: repo)

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

  def delete(conn, %{"owner" => owner, "repo" => repo, "name" => name}) do
    repository = Repositories.get_writable_by_path!(owner, repo, conn.assigns.current_user)
    label = Labels.get_label_by_name!(repository, name)

    case Labels.delete_label(label) do
      {:ok, %Label{}} ->
        send_resp(conn, :no_content, "")

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

  defp not_found(conn), do: ApiError.not_found(conn)
end