Powered by AppSignal & Oban Pro

Connect to Bugzilla API

src/bugzero/livebook/connect.livemd

Connect to Bugzilla API

Mix.install([
  {:req, "~> 0.5.10"}
])

Setup Req

json_req =
  [
    base_url: "https://bugs.freebsd.org/bugzilla/rest",
    params: [api_key: System.fetch_env!("LB_BUGZILLA_API_KEY")]
  ]
  |> Req.new()
  |> Req.Request.put_header("accept", "application/json")
  |> Req.Request.put_header("content-type", "application/json")

json_rpc_req =
  [
    base_url: "https://bugs.freebsd.org/bugzilla/jsonrpc.cgi",
  ]
  |> Req.new()
  |> Req.Request.put_header("accept", "application/json")
  |> Req.Request.put_header("content-type", "application/json")

Request version

Req.get!(json_req, url: "/version")

Request a single bug

Req.get!(json_req, url: "/bug/277488?include_fields=id,summary,tags,last_change_time")

Saved searches

%Req.Response{status: 200, body: body} = Req.get!(json_req, url: "/user/pat@patmaddox.com")
%{"users" => [user]} = body
searches = Enum.reduce(Map.fetch!(user, "saved_searches"), %{}, fn s, acc ->
  Map.put(acc, Map.fetch!(s, "name"), s)
end)
search = Map.fetch!(searches, "untracked (base)")
search_params = Map.fetch!(search, "query")
bugs_resp = Req.get!(json_req, url: "/bug?limit=10&#{search_params}")
bugs = bugs_resp.body["bugs"]
Enum.at(bugs, 0)

Update bug

update_resp = Req.put!(json_req, url: "/bug/282634", body: JSON.encode!(%{"cc" => %{"remove" => ["pat@patmaddox.com"]}}))

update_tags_resp = Req.post!(json_rpc_req, body: JSON.encode!(%{"id" => "update_tags", "method" => "Bug.update_tags", "params" => [%{"Bugzilla_api_key" => System.fetch_env!("LB_BUGZILLA_API_KEY"), "ids" => [282634], "tags" => %{"add" => ["test"]}}]}))