diff --git a/apps/commandboard-api/src/contract.test.ts b/apps/commandboard-api/src/contract.test.ts index ba3d3d1..82fd32e 100644 --- a/apps/commandboard-api/src/contract.test.ts +++ b/apps/commandboard-api/src/contract.test.ts @@ -22,6 +22,15 @@ afterAll(async () => { }); describe("CommandBoard API contracts", () => { + it("exposes root API index", async () => { + const response = await fetch(`${baseUrl}/`); + const body = await response.json() as { ok: boolean; service: string; endpoints: string[] }; + + expect(response.status).toBe(200); + expect(body).toMatchObject({ ok: true, service: "commandboard-api" }); + expect(body.endpoints).toEqual(expect.arrayContaining(["/health", "/api/boards", "/api/plugins"])); + }); + it("exposes health contract", async () => { const response = await fetch(`${baseUrl}/health`); const body = await response.json() as { ok: boolean; service: string }; diff --git a/apps/commandboard-api/src/index.ts b/apps/commandboard-api/src/index.ts index 88f541f..d49f175 100644 --- a/apps/commandboard-api/src/index.ts +++ b/apps/commandboard-api/src/index.ts @@ -54,6 +54,15 @@ export function createCommandBoardServer() { async function route(request: IncomingMessage, response: ServerResponse) { const url = new URL(request.url ?? "/", "http://localhost"); + if (request.method === "GET" && url.pathname === "/") { + json(response, 200, { + ok: true, + service: "commandboard-api", + endpoints: ["/health", "/api/boards", "/api/tasks", "/api/plugins", "/api/schemas"] + }); + return; + } + if (request.method === "GET" && url.pathname === "/health") { json(response, 200, { ok: true, service: "commandboard-api" }); return;