Files
self 4658b76241
CI / Test (push) Failing after 22s
feat: prefix Kobold plugin slug
Rename Kobold and Trust plugin identity references to tribe-one-prefixed slugs across runtime API, e2e fixtures, and docs.
2026-06-17 22:33:25 +02:00

80 lines
2.5 KiB
Elixir

defmodule TribeOne.TribesPlugin.KoboldWeb.APIPlug do
@moduledoc """
Local-only JSON API for Kobold smoke and supertest scenarios.
"""
import Plug.Conn
def init(opts), do: opts
def call(conn, _opts) do
if loopback?(conn.remote_ip) do
dispatch(conn, kobold_path(conn.path_info), conn.method)
else
send_json(conn, 403, %{ok: false, error: "local-only"})
end
end
defp dispatch(conn, ["health"], "GET") do
conn |> send_result(TribeOne.TribesPlugin.Kobold.API.health())
end
defp dispatch(conn, ["schema"], "GET") do
conn |> send_result(TribeOne.TribesPlugin.Kobold.API.schema())
end
defp dispatch(conn, ["reset"], "POST") do
conn |> send_result(TribeOne.TribesPlugin.Kobold.API.reset(conn.body_params))
end
defp dispatch(conn, ["datasets"], "POST") do
conn |> send_result(TribeOne.TribesPlugin.Kobold.API.create_dataset(conn.body_params))
end
defp dispatch(conn, ["datasets", dataset_id, "resources"], "POST") do
params = Map.put(conn.body_params, "dataset_id", dataset_id)
conn |> send_result(TribeOne.TribesPlugin.Kobold.API.create_resource_definition(params))
end
defp dispatch(conn, ["datasets", dataset_id, "records"], "POST") do
params = Map.put(conn.body_params, "dataset_id", dataset_id)
conn |> send_result(TribeOne.TribesPlugin.Kobold.API.upsert_record(params))
end
defp dispatch(conn, ["projections", "rebuild"], "POST") do
conn |> send_result(TribeOne.TribesPlugin.Kobold.API.rebuild_projections(conn.body_params))
end
defp dispatch(conn, ["state"], "GET") do
conn |> send_result(TribeOne.TribesPlugin.Kobold.API.state(conn.query_params))
end
defp dispatch(conn, _path, _method) do
send_json(conn, 404, %{ok: false, error: "not-found"})
end
defp send_result(conn, {:ok, payload}), do: send_json(conn, 200, payload)
defp send_result(conn, {:error, reason}) do
send_json(conn, 422, %{ok: false, error: inspect(reason)})
end
defp send_json(conn, status, payload) do
body = Jason.encode!(payload)
conn
|> put_resp_content_type("application/json")
|> send_resp(status, body)
|> halt()
end
defp kobold_path(["plugins-api", "tribe-one-kobold" | rest]), do: rest
defp kobold_path(["tribe-one-kobold" | rest]), do: rest
defp kobold_path(path), do: path
defp loopback?({127, _second, _third, _fourth}), do: true
defp loopback?({0, 0, 0, 0, 0, 0, 0, 1}), do: true
defp loopback?({0, 0, 0, 0, 0, 65_535, high, _low}) when high in 0x7F00..0x7FFF, do: true
defp loopback?(_remote_ip), do: false
end