host: typed relations — Phase 4 cleanup, registry-driven render + /tags
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 21s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 21s
Replace the hard-coded related/tagged blocks with iteration over the registry, so adding a kind renders automatically — no handler edit. - host/blog--relation-blocks: iterates host/blog-rel-kinds; each kind contributes its outgoing block (label) and, if it has an inverse, its incoming block (inverse-label, e.g. tagged -> "Tagged with this", is-a -> "Instances"). Empty blocks dropped; one kv-keys read up front, relation lookups in-memory. host/blog--relations-or-hint adds the logged-in "add some" hint when empty. - host/blog--relation-editors: one editor per registry kind on the edit page (Related / Types / Subtype of / Tags), replacing the hard-coded two. - GET /tags: index of every tag (a post that is-a tag), each linking its own page. - dropped host/blog--related-block / --kind-block / --tagged-with-block (folded into host/blog--edges-block + the registry iteration). - GOTCHA (4th time): host/blog-tags-index called host/blog-get INSIDE the item quasiquote -> VmSuspended/500 live (conformance in-memory store can't see it); pre-fetch records before the quasiquote. 5 tests (relations-section hint, registry render of Related+Tags, inverse block for a tag, /tags lists + 200). 265/265; Playwright 4/4. Verified live: /tags, post pages show registry blocks, tag page shows Types + Tagged-with-this, edit page has a picker per kind. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -276,10 +276,11 @@
|
||||
"application/javascript; charset=utf-8")
|
||||
(host-bl-test "relate-picker.js carries the fetch glue"
|
||||
(contains? (dream-resp-body (host-bl-app (host-bl-req "/relate-picker.js"))) "relate-options") true)
|
||||
(host-bl-test "related block: hint when logged-in + no relations"
|
||||
(contains? (str (host/blog--related-block "gamma-post" true)) "add some") true)
|
||||
(host-bl-test "related block: empty when anonymous + no relations"
|
||||
(= (host/blog--related-block "gamma-post" false) "") true)
|
||||
(host/blog-put! "hint-post" "Hint Post" "(p \"h\")" "published")
|
||||
(host-bl-test "relations section: hint when logged-in + no relations"
|
||||
(contains? (str (host/blog--relations-or-hint "hint-post" true)) "add some") true)
|
||||
(host-bl-test "relations section: empty when anonymous + no relations"
|
||||
(= (host/blog--relations-or-hint "hint-post" false) "") true)
|
||||
|
||||
;; -- Phase 1: relations carry a kind --
|
||||
(host-bl-test "symmetric kind (related) reads from both sides"
|
||||
@@ -395,6 +396,21 @@
|
||||
(host/blog-is-tag? "pdoc"))
|
||||
true)
|
||||
|
||||
;; -- Phase 4: registry-driven render + /tags index --
|
||||
(host-bl-test "relation-blocks renders Related + Tags from the registry"
|
||||
(begin
|
||||
(host/blog-relate! "hint-post" "ppost" "related")
|
||||
(host/blog-relate! "hint-post" "ocaml" "tagged")
|
||||
(let ((body (str (host/blog--relation-blocks "hint-post"))))
|
||||
(list (contains? body "Related posts") (contains? body "Tags"))))
|
||||
(list true true))
|
||||
(host-bl-test "relation-blocks shows an inverse block (Tagged with this) for a tag"
|
||||
(contains? (str (host/blog--relation-blocks "ocaml")) "Tagged with this") true)
|
||||
(host-bl-test "/tags lists the tag posts"
|
||||
(contains? (dream-resp-body (host-bl-app (host-bl-req "/tags"))) "OCaml") true)
|
||||
(host-bl-test "/tags is 200 (not shadowed by /:slug)"
|
||||
(dream-status (host-bl-app (host-bl-req "/tags"))) 200)
|
||||
|
||||
;; -- experimental unguarded create-only route (POST /new, no auth) --
|
||||
(define host-bl-oapp (host/make-app (list host/blog-open-create-routes host/blog-routes)))
|
||||
(host/blog-use-store! (persist/open))
|
||||
|
||||
Reference in New Issue
Block a user