wip: feat: html 캐시
All checks were successful
build / build (push) Successful in 35s

This commit is contained in:
2026-03-24 17:49:50 -06:00
parent e02b77e1e4
commit 97b83f3516
3 changed files with 47 additions and 16 deletions

View File

@@ -20,5 +20,6 @@
(when (or (not *use-cache?*) stale?)
(let [r (compute)]
(assert (string? r))
(fs/create-dirs (fs/parent file))
(spit file r)))
file)

View File

@@ -24,6 +24,8 @@
[babashka.fs :as fs]
[aero.core :as aero]))
(def ^:const html-dir (-> cfg/*cfg* ::publisher/state-directory))
;;; Routes
@@ -42,11 +44,35 @@
response/response
(response/content-type "text/html")))
(defn node-by-slug [{{{:keys [slug]} :path} :parameters}]
(let [html (-> slug slug/from-string roam/get-node
roam/org-file doerg-render/to-html)]
(-> html response/response
(response/content-type "text/html"))))
(defn- html-dir []
(-> cfg/*cfg* ::publisher/state-directory (fs/file "html")))
(defn not-found [req]
(response/not-found "not found"))
(defn org-file->html-file [org-file]
(fs/file (html-dir)
(-> org-file
fs/file-name
(fs/strip-ext {:ext "org"})
(str ".html"))))
(defn node-by-slug [{{:keys [slug]} :path-params :as req}]
(if-some [node (some-> slug slug/from-string roam/get-node)]
(let [org-file (roam/org-file node)
html-file (org-file->html-file org-file)]
(cached-file/cached-file
:file html-file
:stale? (cached-file/newer-than? org-file html-file)
:compute #(doerg-render/to-html org-file))
(-> (str html-file)
response/file-response
(response/content-type "text/html")))
(not-found req))
#_(let [html (-> slug slug/from-string roam/get-node
roam/org-file doerg-render/to-html)]
(-> html response/response
(response/content-type "text/html"))))
(defn node-by-id [req]
(hello req))
@@ -64,9 +90,7 @@
(reitit.ring/router
#{["/" {:get hello}]
["/n/:slug"
{:get {:handler #'node-by-slug
:parameters
{:path {:slug ::slug/slug}}}}]
{:get {:handler #'node-by-slug}}]
["/id/:id" {:get #'node-by-id}]}
{:validate reitit.spec/validate
:exception reitit.dev.pretty/exception

View File

@@ -3,22 +3,28 @@
[reitit.ring]
[clojure.test :as t]
[clojure.set :as set]
[net.deertopia.publisher.server :as server]
[net.deertopia.publisher.config :as cfg]
[net.deertopia.publisher :as-alias publisher]))
(t/deftest server-is-running
;; 서버가 벌써 시작한 다음에 이 테스트 하면 잘못됩니다.
(assert (not= :running (server/status)))
(server/start!)
(t/is (= :running (server/status)))
(server/stop!))
(assert (not= :running (sut/status)))
(sut/start!)
(t/is (= :running (sut/status)))
(sut/stop!))
(t/deftest can-get-real-server-root
;; 서버가 벌써 시작한 다음에 이 테스트 하면 잘못됩니다.
(assert (not= :running (server/status)))
(server/start!)
(assert (not= :running (sut/status)))
(sut/start!)
(t/is (->> (format "http://localhost:%d" (::publisher/port cfg/*cfg*))
slurp
string?))
(server/stop!))
(sut/stop!))
#_
(t/deftest get-nonexistent-node
(t/is (= 404
(-> {:request-method :get
:uri "/n/68XqhHerTWCbE--RYLEdHw"}
sut/app :status))))