prop/lib/microwaveprop_web/controllers/api_docs_controller.ex
Graham McIntire c56b55d5af
feat: serve API docs at /docs/api
- /docs/api → LiveView rendering README.md as HTML
- /docs/api/openapi.yaml → raw OpenAPI 3.1 spec
- /docs/api/README.md → raw markdown source
2026-05-09 09:09:45 -05:00

35 lines
1.2 KiB
Elixir

defmodule MicrowavepropWeb.ApiDocsController do
@moduledoc """
Serves the static `docs/api/` artifacts:
* `GET /docs/api/openapi.yaml` — OpenAPI 3.1 spec as `application/yaml`.
* `GET /docs/api/README.md` — raw markdown source (for agents that
prefer markdown over the rendered LiveView page).
The human-facing rendered docs live at `/docs/api` via
`MicrowavepropWeb.ApiDocsLive`.
"""
use MicrowavepropWeb, :controller
@external_resource "docs/api/openapi.yaml"
@external_resource "docs/api/README.md"
@openapi_yaml File.read!("docs/api/openapi.yaml")
@readme_markdown File.read!("docs/api/README.md")
@spec openapi_yaml(Plug.Conn.t(), map()) :: Plug.Conn.t()
def openapi_yaml(conn, _params) do
conn
|> put_resp_content_type("application/yaml", "utf-8")
|> put_resp_header("cache-control", "public, max-age=3600")
|> send_resp(200, @openapi_yaml)
end
@spec readme_markdown(Plug.Conn.t(), map()) :: Plug.Conn.t()
def readme_markdown(conn, _params) do
conn
|> put_resp_content_type("text/markdown", "utf-8")
|> put_resp_header("cache-control", "public, max-age=3600")
|> send_resp(200, @readme_markdown)
end
end