diff --git a/publisher/src/net/deertopia/publisher/cached_file.clj b/publisher/src/net/deertopia/publisher/cached_file.clj index 515271d..995b28e 100644 --- a/publisher/src/net/deertopia/publisher/cached_file.clj +++ b/publisher/src/net/deertopia/publisher/cached_file.clj @@ -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) diff --git a/publisher/src/net/deertopia/publisher/server.clj b/publisher/src/net/deertopia/publisher/server.clj index e1012eb..df4beb4 100644 --- a/publisher/src/net/deertopia/publisher/server.clj +++ b/publisher/src/net/deertopia/publisher/server.clj @@ -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 diff --git a/publisher/test/net/deertopia/publisher/server_test.clj b/publisher/test/net/deertopia/publisher/server_test.clj index 89e4431..9e8ff4b 100644 --- a/publisher/test/net/deertopia/publisher/server_test.clj +++ b/publisher/test/net/deertopia/publisher/server_test.clj @@ -3,22 +3,27 @@ [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))))