diff --git a/lib/towerops_web/controllers/page_controller.ex b/lib/towerops_web/controllers/page_controller.ex index 18a760b3..b18a4118 100644 --- a/lib/towerops_web/controllers/page_controller.ex +++ b/lib/towerops_web/controllers/page_controller.ex @@ -4,7 +4,8 @@ defmodule ToweropsWeb.PageController do use ToweropsWeb, :controller def home(conn, _params) do - # If user is authenticated, redirect to organization list + conn = put_link_headers(conn) + if conn.assigns.current_scope && conn.assigns.current_scope.user do redirect(conn, to: ~p"/dashboard") else @@ -12,6 +13,20 @@ defmodule ToweropsWeb.PageController do end end + defp put_link_headers(conn) do + link_value = + Enum.join( + [ + ~s(; rel="api-catalog"), + ~s(; rel="service-doc"), + ~s(; rel="status") + ], + ", " + ) + + put_resp_header(conn, "link", link_value) + end + def privacy(conn, _params) do render(conn, :privacy, current_scope: conn.assigns[:current_scope], diff --git a/test/towerops_web/controllers/page_controller_test.exs b/test/towerops_web/controllers/page_controller_test.exs index edf5b768..76fe6d96 100644 --- a/test/towerops_web/controllers/page_controller_test.exs +++ b/test/towerops_web/controllers/page_controller_test.exs @@ -9,6 +9,17 @@ defmodule ToweropsWeb.PageControllerTest do assert html_response(conn, 200) =~ "network event" end + test "homepage includes RFC 8288 Link discovery headers", %{conn: conn} do + conn = get(conn, ~p"/") + link_header = conn |> get_resp_header("link") |> List.first() + assert link_header =~ ~s(rel="api-catalog") + assert link_header =~ ~s(rel="service-doc") + assert link_header =~ ~s(rel="status") + assert link_header =~ "/.well-known/api-catalog" + assert link_header =~ "/docs/api" + assert link_header =~ "/health" + end + test "GET / redirects to organizations when authenticated", %{conn: conn} do user = user_fixture() conn = log_in_user(conn, user)