lib/openagents_web/controllers/forge_user_controller.ex

58e6347eeb72 · 1 KB

defmodule OpenAgentsWeb.ForgeUserController do
  @moduledoc "Reports the authenticated GitHub identity and eligible repository namespaces."

  use OpenAgentsWeb, :controller

  alias OpenAgents.Repositories.GitHubProjection

  def show(conn, _params) do
    user = conn.assigns.current_user

    case GitHubProjection.available_namespaces(user) do
      {:ok, namespaces} ->
        json(conn, %{
          "id" => user.github_id,
          "login" => user.github_login,
          "token_expires_at" => DateTime.to_iso8601(conn.assigns.api_token.expires_at),
          "namespaces" =>
            Enum.map(namespaces, fn namespace ->
              %{
                "id" => namespace.provider_account_id,
                "login" => namespace.slug,
                "type" => namespace.kind
              }
            end)
        })

      {:error, reason} ->
        render_error(conn, reason)
    end
  end

  defp render_error(conn, :github_connection_required),
    do: error(conn, :forbidden, "github_connection_required", "Connect GitHub to continue")

  defp render_error(conn, :github_scope_required),
    do: error(conn, :forbidden, "github_scope_required", "Reconnect GitHub with required access")

  defp render_error(conn, _reason),
    do: error(conn, :service_unavailable, "github_unavailable", "GitHub is unavailable")

  defp error(conn, status, code, message) do
    conn
    |> put_status(status)
    |> put_resp_header("cache-control", "no-store")
    |> json(%{
      "code" => code,
      "message" => message,
      "request_id" => List.first(get_resp_header(conn, "x-request-id"))
    })
  end
end