From 64985ff6f7cd9eecb87aaa839a8eb7b7d06998e9 Mon Sep 17 00:00:00 2001 From: giles Date: Fri, 19 Jun 2026 19:29:06 +0000 Subject: [PATCH] host: blog home page GET / -> HTML post index, 179/179 GET / renders an HTML index listing every post (title linking to //), built from host/blog-list; empty -> 'No posts yet'. GET /posts stays the JSON API. Live: blog.rose-ash.com/ lists the welcome post linking to /welcome/. Co-Authored-By: Claude Opus 4.8 --- lib/host/blog.sx | 18 +++++++++++++++++- lib/host/tests/blog.sx | 14 ++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/lib/host/blog.sx b/lib/host/blog.sx index 775bb97e..61c6e031 100644 --- a/lib/host/blog.sx +++ b/lib/host/blog.sx @@ -104,9 +104,24 @@ (str "Not found" "

404

No published post: " slug "

"))))))) -;; GET /posts -> JSON list of posts. +;; GET /posts -> JSON list of posts (API). (define host/blog-index (fn (req) (host/ok (host/blog-list)))) +;; GET / -> HTML index page listing posts, each linking to //. +(define host/blog--li + (fn (acc p) + (str acc "
  • " (get p :title) "
  • "))) +(define host/blog-home + (fn (req) + (let ((posts (host/blog-list))) + (dream-html + (str + "Blog" + "

    Posts

    " + (if (> (len posts) 0) + (str "
      " (reduce host/blog--li "" posts) "
    ") + "

    No posts yet.

    ")))))) + ;; POST /posts -> create from JSON {slug,title,body}. 409 if it exists. (define host/blog-create (fn (req) @@ -151,6 +166,7 @@ ;; pattern matches any single-segment path, so domain routes take precedence). (define host/blog-routes (list + (dream-get "/" host/blog-home) (dream-get "/posts" host/blog-index) (dream-get "/:slug" host/blog-post))) diff --git a/lib/host/tests/blog.sx b/lib/host/tests/blog.sx index 91531ef8..08d7088f 100644 --- a/lib/host/tests/blog.sx +++ b/lib/host/tests/blog.sx @@ -99,6 +99,13 @@ (host-bl-test "list empty -> data:[]" (contains? (dream-resp-body (host-bl-wapp (host-bl-send "GET" "/posts" nil ""))) "\"data\":[]") true) +;; HTML home page when empty +(host-bl-test "home / -> 200 html" + (contains? (dream-resp-header (host-bl-wapp (host-bl-send "GET" "/" nil "")) "content-type") "text/html") + true) +(host-bl-test "empty home says no posts" + (contains? (dream-resp-body (host-bl-wapp (host-bl-send "GET" "/" nil ""))) "No posts yet") + true) ;; create requires auth (host-bl-test "create no auth -> 401" @@ -121,6 +128,13 @@ (host-bl-test "list shows created post" (contains? (dream-resp-body (host-bl-wapp (host-bl-send "GET" "/posts" nil ""))) "Hello World") true) +;; home page lists it with a link to // +(host-bl-test "home lists post title" + (contains? (dream-resp-body (host-bl-wapp (host-bl-send "GET" "/" nil ""))) "Hello World") + true) +(host-bl-test "home links to the post" + (contains? (dream-resp-body (host-bl-wapp (host-bl-send "GET" "/" nil ""))) "href=\"/hello/\"") + true) ;; create duplicate -> 409 (host-bl-test "create duplicate -> 409" (dream-status (host-bl-wapp (host-bl-send "POST" "/posts" "Bearer good"