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?) (when (or (not *use-cache?*) stale?)
(let [r (compute)] (let [r (compute)]
(assert (string? r)) (assert (string? r))
(fs/create-dirs (fs/parent file))
(spit file r))) (spit file r)))
file) file)

View File

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

View File

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